目录

深度强化学习目录

简介

DQN(Deep Q-Network),顾名思义,就是将Q-learning与深度学习相结合。具体点讲,就是把Q-learning中估算Q值函数的模型应用为神经网络,一般我们用的是三层CNN结构。
DQN在实际操作中会遇到一个问题,就是过度高估(over-estimate)Q值函数。于是我们使用Double DQN来缓解这个问题。

Double DQN

什么叫过度高估Q值函数?举个例子,我们用DQN玩游戏,在状态s的时候训练得到的Q值是100,而实际玩了一盘下来发现远不到100,可能只有20。这个现象是普遍存在的,所以说Q值经常被over-estimate了。
为什么会出现这种情况?这是由于我们的估计值yt=rt+maxaAQ^(st+1,a)y_t=r_t+\max_{a\in A}\hat{Q}(s_{t+1},a)是目标网络Q^\hat{Q}自己估计,然后又自己选择出来的。假使在Q^\hat{Q}选择动作的时候,某个动作a在状态s下的Q值函数被高估了(即出现误差,本来Q值只有20,结果目标网络估计为25),Q^\hat{Q}就会偏向于选择那个动作,在之后的迭代过程中导致误差一步步放大(最终甚至到达100)。
Double DQN能解决这个问题。Double DQN改变了什么?他不再是用同一个网络估计与选择动作,而是将其分成两个网络QQQQ'进行。换言之,他的估计值变成了:yt=rt+Q(st+1,argmaxaAQ(st+1,a))y_t=r_t+{Q'}(s_{t+1},arg\max_{a\in A}Q(s_{t+1},a))

这样用了两个Q Network,所以叫Double DQN。为什么这么做能有作用?它相当于添加了两个开关。在原先的DQN中,我们是穷举所有行为a,然后找出Q值最大的行为;而在Double DQN中,我们先用寻找在QQ网络累积奖赏最大的行为a,找到之后,再用QQ'网络来计算他的Q值有多大。假设QQ网络出错了,找到了一个不是那么大的行为a,那么会有QQ'网络压低这个行为a的Q值;假如QQ'网络高估了某个行为的Q值,那么QQ网络也可能不去选择那个行为,避免了错误的出现over-estimate。
Double DQN就是用两个Q Network来分解“选择-估计”这个过程。如果一个Q网络出错了,只要另一个不同时出错,那Q估计值就不会错的太离谱。
实际操作中我们会用Target Network来做QQ'的工作,估计值函数,而用实际update参数的QQ网络来选择最大的行为a。
相较于原先的DQN,Double DQN只需要改动对行为a的Q值估计,代码变动最小。
下图是DQN和Double DQN的在不同游戏下的估计效果图,折线是网络的Q估计值,横线是实际操作得到的Q值,红色的是DQN,蓝色的是Double DQN。可以看出来DQN的估计值远高出实际值,而Double之后就接近许多了。
6.DQN(Deep Q-Network)+Double DQN+Dueling DQN

Dueling DQN

Dueling DQN的变动同样不算大,他只改变了神经网络的输出架构。DQN的神经网络,输入状态s,输出每一个行为a的Q(s,a)Q(s,a);而Dueling DQN则改变输出为V(s)V(s)A(s,a)A(s,a)(优势函数,在前几篇中讲过),然后再将输出加起来得到Q(s,a)Q(s,a)
其中,V(s)V(s)是一个具体的值,A(s,a)A(s,a)是对每一个动作的优势值向量。比如说某个游戏有3个动作{a1,a2,a3}\{a_1,a_2,a_3\},假设在状态s下得到的A(s,a)={1,1,0}A(s,a)=\{1,-1,0\}V(s)=2V(s)=2,那么可以得到Q(s,a)={3,1,2}Q(s,a)=\{3,1,2\}
具体改变见下图:
6.DQN(Deep Q-Network)+Double DQN+Dueling DQN

这么做的好处是什么?以表格的形式来表示,如下图:
6.DQN(Deep Q-Network)+Double DQN+Dueling DQN
下面的VVAA是网络输出的结果,假如我们对输出的某列Q(s,a)Q(s,a)中的数值不满意,比如说第二列的{3,1,2}\{3,-1,-2\},我们希望把前两项拟合变动成{4,0,2}\{4,0,-2\},那么这个网络就有可能直接改变V(s)V(s)的输出为1,这样会将第二列的值改变为{4,0,1}\{4,0,-1\}。也就是说,我们原先只采样了前两个状态的动作值,但是神经网络能帮我们把第三个动作的值也改了。
6.DQN(Deep Q-Network)+Double DQN+Dueling DQN
但也可能不是变动V,而是变动A。变动A其实没什么不好,就怕神经网络过拟合,只修改A值,导致把所有的V都输出为0,这样整个网络又退化成原先的样子,A就变成了原先的Q。
怎么避免这种情况呢?我们需要给A加一些约束条件。
最直接的约束条件,就是令A的每一列总和为0。这样子,每一列V的值必然等于每一列Q值的平均值(因为Q=V+A,若A列总和为0,则V乘以行数要等于Q的列总和)。
换句话说,V相当于一个偏移值,同时训练V和A可以保证网络训练不要过拟合,也能加快网络训练的速度(只要训练了前两个动作,修改V就相当于训练了全部三个动作)。
实际操作如下,先通过训练给出A的值,然后规范化令其总和为0,得到Q值。通过将得到的Q值与采样Q值对比拟合,反向传播误差。由于A有比较大的约束,所以神经网络会倾向于更新V的值。
6.DQN(Deep Q-Network)+Double DQN+Dueling DQN

总结

DQN大概就是这些,其他还有诸如Priority Replay(从Replay Buffer采样的时候给难train的样本加权,让他更容易被采样)、Multi-step(在Replay Buffer里不止存一步的经验,而是存多步的经验)、Noisy Net(在参数上加噪音,类似之前q-learning里讲的exploration策略)就不多讲了,有兴趣的可以看李宏毅的视频。下次讲连续空间的Q-learning。

相关文章: