【李宏毅深度强化学习笔记】4、Q-learning更高阶的tip (Advanced Tips)

【李宏毅深度强化学习笔记】1、深度强化学习算法 策略梯度方法(Policy Gradient)

https://blog.csdn.net/ACL_lihan/article/details/104020259

【李宏毅深度强化学习笔记】2、深度强化学习 Proximal Policy Optimization (PPO) 算法

https://blog.csdn.net/ACL_lihan/article/details/103989581

【李宏毅深度强化学习笔记】3、深度强化学习算法 Q-learning(Basic Idea)

https://blog.csdn.net/ACL_lihan/article/details/104041905

【李宏毅深度强化学习笔记】4、Q-learning更高阶的tip (Advanced Tips)

https://blog.csdn.net/ACL_lihan/article/details/104056542

-------------------------------------------------------------------------------------------------------

【李宏毅深度强化学习】视频地址:https://www.bilibili.com/video/av63546968?p=4

课件地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS18.html

-------------------------------------------------------------------------------------------------------

使用Double DQN的原因是因为Q-value往往是被高估的,如下图

上图为四个游戏的训练结果的对比。

橙色的曲线代表DQN估测的Q-value橙色的直线代表DQN训练出来的policy实际中获得的Q-value

蓝色的曲线代表Double DQN估测的Q-value,蓝色的直线代表Double DQN训练出来的policy实际中获得的Q-value

由图可以看出两点:

  1. 从橙色的曲线和橙色的直线可以看出,DQN估测出来的Q-value,往往会高于实际中的Q-value 
  2. 从橙色的直线和蓝色的直线可以看出,Double DQN训练出来的policy,一般会好过DQN训练出来的policy

从第三篇笔记(https://blog.csdn.net/ACL_lihan/article/details/104041905)中Q-function的概念可以得出,Q(s_t,a_t)的结果会接近于。但是maxQ(s_{t+1},a)往往容易会得到高估的结果,以下图为例子:

 4个柱子代表4个action得到的Q-value,实际上都是相同的;右图绿色的部分表示高估的部分。

因为Q-function本身就是一个network,估测出来的值本身是有误差的,所以原本4个action都相等的Q-value就变成右图的样子。而因为maxQ(s_{t+1},a),所以又往往会选择Q-value最大的那个结果。所以就会导致Q(s_{t+1},a_t) = r_t + maxQ(s_{t+1},a)的结果总是偏大。

 在右边中,决定采取Q-value最大的action,然后由算出Q-value。

好处:

  1. 即便Q过估计了某个值,只要Q^'没有高估,最后的结果还是正常的
  2. 即便Q^'过估计了某个值,只要Q没有选到那个action,最后的结果还是正常的

 Q^'可以采用Target network去算Q-value,这样就不用训练额外的network。

Dueling DQN

Dueling DQN做得唯一一件事就是改network的架构 。如下图,上半部分为DQN,下半部分为Dueling DQN。

 Dueling DQN中,输出结果变成Q(s,a) = A(s,a) + V(s),因为有时候在某种state,无论做什么动作,对下一个state都没有多大的影响,所以将Q-function分解为两部分。比如,在一个好的state,无论做什么action,都能得到很高的value;在一个很差的state,无论做什么action,都只会得到一个很低的value。

举个例子:

 上表中,Q(s,a) = A(s,a) + V(s)

初始状态为左图所示。假设现在我们sample到新的Q-value Q(s_2,a_1)Q(s_2,a_2)如中间图所示。这时network可以选择不更新A(s_2,a_1)A(s_2,a_2),而去更新V(s_2),如中间图所示。

更新完V(s_2)后,可以看到Q(s_2,a_3)也跟着被更新了。这样的好处是,原本只sample到 Q(s_2,a_1)Q(s_2,a_2)的更新,但是由于V(s_2)被更新,就使得Q(s_2,a_3)也同样被更新,即便Q(s_2,a_3)没有在实际中被sample到。

(那Q(s_2,a_3)没有被sample到,然后也跟着更新会不会造成错误的结果呢?答案是不会,因为根据sample到的data,在s2无论采取a_1a_2都会使得Q(s_2,a_1)Q(s_2,a_2)进一步上升,所以可以把s2看成是一个好的state,无论采取什么action,都会得到好的结果)

为了防止network把V(s)直接调成0,然后导致Q(s,a) = A(s,a),这样Dueling DQN和普通的DQN就没区别了,所以需要对A(s,a)做一下限制。这样对A(s,a)进行参数更新比较麻烦,network就会倾向于对V(s)进行参数更新。

具体来说,所加的限制可以是:强制A(s,a)的每一列的和都为0,如上图所示。

加上这个限制后,按照刚才的例子,如果Q(s_2,a)这一列都加1,network如果不去调V(s_2)而去调A(s_2,a)的值都加1,就会导致最终A(s_2,a)这一列的和不为0,没办法符合上述的限制。所以加上这个限制后就防止network只调A(s,a)而不去调V(s)

这时V(s)可以看成Q(s,a)每一列的平均值,推导如下:

Q(s_1,a_1) + Q(s_1,a_2) + Q(s_1,a_3) =V(s_1)+A(s_1,a_1) + V(s_1)+A(s_1,a_2) + V(s_1)+A(s_1,a_3) =V(s_1) +V(s_1)+ V(s_1)

TODO。。

发布了12 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ACL_lihan/article/details/104056542
今日推荐