目录
简介
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了。
为什么会出现这种情况?这是由于我们的估计值是目标网络自己估计,然后又自己选择出来的。假使在选择动作的时候,某个动作a在状态s下的Q值函数被高估了(即出现误差,本来Q值只有20,结果目标网络估计为25),就会偏向于选择那个动作,在之后的迭代过程中导致误差一步步放大(最终甚至到达100)。
Double DQN能解决这个问题。Double DQN改变了什么?他不再是用同一个网络估计与选择动作,而是将其分成两个网络和进行。换言之,他的估计值变成了:
这样用了两个Q Network,所以叫Double DQN。为什么这么做能有作用?它相当于添加了两个开关。在原先的DQN中,我们是穷举所有行为a,然后找出Q值最大的行为;而在Double DQN中,我们先用寻找在网络累积奖赏最大的行为a,找到之后,再用网络来计算他的Q值有多大。假设网络出错了,找到了一个不是那么大的行为a,那么会有网络压低这个行为a的Q值;假如网络高估了某个行为的Q值,那么网络也可能不去选择那个行为,避免了错误的出现over-estimate。
Double DQN就是用两个Q Network来分解“选择-估计”这个过程。如果一个Q网络出错了,只要另一个不同时出错,那Q估计值就不会错的太离谱。
实际操作中我们会用Target Network来做的工作,估计值函数,而用实际update参数的网络来选择最大的行为a。
相较于原先的DQN,Double DQN只需要改动对行为a的Q值估计,代码变动最小。
下图是DQN和Double DQN的在不同游戏下的估计效果图,折线是网络的Q估计值,横线是实际操作得到的Q值,红色的是DQN,蓝色的是Double DQN。可以看出来DQN的估计值远高出实际值,而Double之后就接近许多了。
Dueling DQN
Dueling DQN的变动同样不算大,他只改变了神经网络的输出架构。DQN的神经网络,输入状态s,输出每一个行为a的;而Dueling DQN则改变输出为和(优势函数,在前几篇中讲过),然后再将输出加起来得到。
其中,是一个具体的值,是对每一个动作的优势值向量。比如说某个游戏有3个动作,假设在状态s下得到的,,那么可以得到。
具体改变见下图:
这么做的好处是什么?以表格的形式来表示,如下图:
下面的和是网络输出的结果,假如我们对输出的某列中的数值不满意,比如说第二列的,我们希望把前两项拟合变动成,那么这个网络就有可能直接改变的输出为1,这样会将第二列的值改变为。也就是说,我们原先只采样了前两个状态的动作值,但是神经网络能帮我们把第三个动作的值也改了。
但也可能不是变动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的值。
总结
DQN大概就是这些,其他还有诸如Priority Replay(从Replay Buffer采样的时候给难train的样本加权,让他更容易被采样)、Multi-step(在Replay Buffer里不止存一步的经验,而是存多步的经验)、Noisy Net(在参数上加噪音,类似之前q-learning里讲的exploration策略)就不多讲了,有兴趣的可以看李宏毅的视频。下次讲连续空间的Q-learning。