强化学习 学习心得(1)
-
Q-learning and Sarsa
Q-learning:(off-policy)
碎碎念:这个loss就相当于是她不断趋近于0,让Q完全拟合r+
maxQ‘ 吧 Sarsa: (on-policy)
碎碎念:这个Sarsa的不同就是 取得不是最大的Q值
所以在代码中一个取Q_max,另一个取任意一个Q。介于之前
不知道值的原因,代码中在提取下一个Q的时候,是先提前赋值了的。 on-policy and off-policy的区别:
On-policy 的目标策略和行为策略是同一个策略,其好处就是简单粗暴,直接利用数据就可以优化其策略,但这样的处理会导致策略其实是在学习一个局部最优。
Off-policy将目标策略和行为策略分开,可以在保持探索的同时,更能求到全局最优值。
Sarsa Lambda
$$
\begin{aligned}
&\delta \leftarrow R+\gamma Q\left(S^{\prime}, A^{\prime}\right)-Q(S, A)\
&Q(s, a) \leftarrow Q(s, a)+\alpha \delta E(s, a)\
&E(s, a) \leftarrow \gamma \lambda E(s, a)
\end{aligned}
$$代码在建立Q表的时候,还会建立一个E表。可以看到,上面的更新是乘了E表的值。对于具体如何处理E表,代码中写的很明白。
= lambda DQN,double-DQN,dueling-DQN(涉及到构建网络)
DQN:(deep Q network)
DQN的出现是为了解决在复杂的情况下,更新Q表的方法不太现实的问题。对于DQN为什么要有两个网络,我想是因为需要一个现实Q,一个估计Q来计算差值。从而达到两个现实个估计网络几乎相同。
两个网络,一个eval来预测Q表,一个target来计算现实的Q表(Q现实就是根据这个更新的)。两个网络的结构是一样的,只是参数更新的速度不一样。
eval网络输出的是当前s的所有a的q值,eval网络的 loss:
$$
y_i=r+\gamma*maxQ(s',a')\
y_i=Q(s,a)\
loss=\left(y_{j}-Q\left(\phi_{j}, a_{j} ; \theta\right)\right)^{2}
$$
这个Q(s',a')是由target网络预测得到的。而前面的Q-learning只是Q表的更新。target网络的输出下一个s的所有a的q值,没有loss。在learn 中有一个值替换函数,是用tf.assign实现的。
下一步a根据最大的Q‘值来选择
DQN开始有了经验回放的方法。
double-DQN:
用当前Q网络计算最大Q值对应的动作,用目标Q网络计算这个最大动作对应的目标Q值,进而消除贪婪法带来的偏差。
以下是改进的公式:
$$
Y_{t}^{\text {DoubleDQN }}= r+\gamma Q'\left(s', \underset{a}{\operatorname{argmax}} Q\left(s', a ; \boldsymbol{\theta}{t}\right), \boldsymbol{\theta}{t}'\right)
$$
double-DQN和DQN的网络结构并没有什么不同,只是q-target的计算方式不一样。下面给出差别部分的代码:
if self.double_q: max_act_for_next = np.argmax(q_eval_for_next, axis=1) #q_eval_for_next = q_eval selected_q_next = q_next[batch_index, max_act4next] # Double DQN else: selected_q_next = np.max(q_next, axis=1) # the natural DQN q_target[batch_index, eval_act_index] = reward + self.gamma * selected_q_next
**double-DQN的下一步的q值对应的a‘是根据eval网络来选择的。**这样就不会有很大的过拟合。
Prioriized Experience Replay DQN
PER 优先经验回放,改进了DQN中的经验回放策略,值得一看!
dueling-DQN
只要稍稍修改 DQN 中神经网络的结构, 就能大幅提升学习效果, 加速收敛 。 用一句话来概括 Dueling DQN 就是. 它将每个动作的 Q 拆分成了 state 的 Value 加上 每个动作的 Advantage.
下面是它q值的公式:
在网络中建立V与A两个输出
我们发现当可用动作越高, 学习难度就越大, 不过 Dueling DQN 还是会比 Natural DQN 学习得更快. 收敛效果更好.
value-based and policy-based 的区别:
value-based 的典型算法是DQN,policy-based是policy gradient,结合这两种具体算法可能会更好的理解。
-
处理的action space不同:value-based适合处理action space低维离散的,policy-based适合处理连续的action space。
-
针对action的价值输出不同:value-based计算出每个action的价值,policy-based一般情况下只给出较价值较高的actions。
-
更新频率不同:value-based每个action执行都可以更新,policy-based 每个episode完成之后才能更新一次。这里可以理解成下棋的时候,value-based每下一步就学习一次,而policy-based要在一盘棋下完之后再学习。
像DDPG,AC算法就是将两者都结合了起来。
单步更新(TD算法)和回合更新(蒙特卡洛算法)的区别:
这个就是字面的区别,主要是理解为什么单步是TD算法,回合是蒙特卡洛算法。
MC算法:蒙特卡罗方法又叫做统计模拟方法,它使用随机数(或伪随机数)来解决计算问题。在强化学习中,在为了能够从环境中学习,我们需要让agent与environment交互,得到一些经历(样本)。然后通过这些经历来进行策略评估与策略迭代。从而最终得到最优策略。这种做法的理论是从蒙特卡罗方法中来的。
TD算法:就是单步更新算法
有一个公式可以体现两者的差别:
$$
MC: V(S_t) \leftarrow V(S_t) + \alpha(G_t-V(S_t))\
TD: V(S_t) \leftarrow V(S_t)+ \alpha(R_{t+1} + \gamma V(S_{t+1})-V(S_t))
$$
DP(动态规划)算法:上面两个算法可以和DP算法相比较,因为这三种学习方法都是用来计算状态价值的。它们的区别在于,前两种是在不知道模型的情况下常用的方法,而MC方法又需要一个完整的episode来更新状态价值,TD则不需要完整的episode。DP方法则是基于Model(知道模型的运作方式)的计算状态价值的方法
我发现TD算法还是有一个大的种类,包括很多的东西,这个有时间可以一起总结一下。而且TD和MC是可以结合起来的,比如说A3C中的n-steps就是一个很好的结合的例子。还有一个统一的方法Eligibility traces(资格迹)。
eligibility traces 优于n-step的主要地方在于计算非常有效率,其只需要一个trace向量,而不需要储存n个特征向量。另外,eligibility trace的学习是逐步的,而不需要等到n-steps之后。
-