简介

DQN 算法敲开了深度强化学习的大门,但是作为先驱性的工作,其本身存在着一些问题以及一些可以改进的地方。于是,在 DQN 之后,学术界涌现出了非常多的改进算法。本文将介绍其中两个非常著名的算法:Double DQN 和 Dueling DQN。这两个算法的实现非常简单,只需要在 DQN 的基础上稍加修改,它们能在一定程度上改善 DQN 的效果。如果读者想要了解更多、更详细的 DQN 改进方法,可以阅读 Rainbow 模型的论文及其引用文献。

Overestimate

普通的 DQN 算法通常会导致对QQ值的过估计(overestimation)。传统 DQN 优化的 TD 误差目标为

r+γmaxaQθ(s,a)r+\gamma\,\underset{a'}{\mathrm{max}}\,Q_{\theta^-}(s',a')

其中 maxaQθ(s,a)\underset{a'}{\mathrm{max}}\,Q_{\theta^-}(s',a') 由目标网络(参数为θ\theta^-)计算得出,考虑到训练的实际情况,可能会对 QQ 值有高估和低估,这个 max\mathrm{max} 会保留高估,并“不断强化”,下面这个例子可以说是很形象了:

实际上由于算法最终是为了得到一个策略,所以从理论上来说,如果每一个估计都 overestimate 相同的程度,对最后最优策略的选择是没有影响的。但是,显然这只是美好愿望而已。在 max\mathrm{max} 表达式的作用下,那些与 Q(s,a)Q^*(s,a) 随机误差大于0的 Q(s,a)Q(s,a) 会有更大概率被选作为 maxaQ(s,a)\underset{a}{\mathrm{max}}\,Q(s,a)。用公式表示就是:

E[maxa(Q(s,a)+ϵs,a)]E[maxaQ(s,a)]E[\underset{a}{\mathrm{max}}\,(Q(s,a)+\epsilon_{s,a})]\geq E[\underset{a}{\mathrm{max}}\,Q(s,a)]

所以估计的 maxaQ(s,a)\underset{a}{\mathrm{max}}\,Q(s,a) 总是会比真实的 maxaQ(s,a)\underset{a}{\mathrm{max}}\,Q(s,a) 大。本来只是随机的误差,一旦经过了 max\mathrm{max} 表达式,就很有可能变成一种“系统性误差”。更危险的是,这种对于 max\mathrm{max} 表达式的 overestimate 具有“滚雪球”的过程。在计算出 r+γmaxaQ(s,a)r+\gamma\,\underset{a'}{\mathrm{max}}\,Q(s',a') 之后要将其作为目标。如果目标被高估了,则训练出的 Q(s,a)Q(s,a) 也会被高估,继而导致对于 maxaQ(s,a)\underset{a'}{\mathrm{max}}\,Q(s',a') 的进一步高估。正是因为这种“滚雪球”的过程,Q-learning 和 DQN 中经常对 Q 值发生普遍性高估

Overestimate 的本质原因在于选择和评估使用了同一套 Q 网络进行计算,在选择动作 aa 时,被高估了的 aa 就有更大概率被选出,而之后的更新又使用了 Q(s,argmaxaQθ(s,a))Q(s',\mathrm{arg}\,\underset{a'}{\mathrm{max}}\,Q_{\theta^-}(s',a')),导致随机误差被进一步强化。

Double DQN

为了解决过估计问题,Double DQN 算法提出利用两个独立训练的神经网络计算maxaQ(s,a)\underset{a'}{\mathrm{max}}\,Q_*(s',a')(真实值)。具体做法是将原有的 maxaQθ(s,a)\underset{a'}{\mathrm{max}}\,Q_{\theta^-}(s',a') 更改为 Qθ(s,argmaxaQθ(s,a))Q_{\theta^-}(s',\mathrm{arg}\,\underset{a'}{\mathrm{max}}\,Q_{\theta}(s',a')),即利用一套神经网络 QθQ_\theta 的输出选取价值最大的动作,但在更新该动作的价值时,用另一套神经网络 QθQ_\theta^- 计算该动作的价值。这样即使其中一套神经网络的某个动作存在比较严重的过估计问题,由于另一套神经网络的存在,这个动作最终使用的 QQ 值不会存在很大的过估计问题。

在传统的 DQN 算法中,本来就存在两套 QQ 函数的神经网络——目标网络和训练网络,只不过 maxaQθ(s,a)\underset{a'}{\mathrm{max}}\,Q_{\theta^-}(s',a') 的计算只用到了其中的目标网络。则恰好可以直接将训练网络作为Double DQN算法中的第一套神经网络来选择动作,将目标网络作为第二套神经网络计算 QQ 值,也就是将选择 argmaxaQ(s,a)\mathrm{arg}\,\underset{a'}{\mathrm{max}}\,Q(s',a') 的任务从 QtargetQ_{target} 网络转移到 QevalQ_{eval} 上,这便是 Double DQN 的主要思想。当然,这两个网络并不是毫不相干,DQN 中 QtargetQ_{target} 只是 QevalQ_{eval} 的滞后,所以从严格意义上讲,对过估计的减少效果是不完全的,但是因为几乎没增加计算量,所以这种方法几乎成为了 DQN 训练的必备技术。

将训练网络的参数记为 θ\theta,将目标网络的参数记为 θ\theta^-,则Double DQN的优化目标为:

r+γQθ(s,argmaxaQθ(s,a))r+\gamma Q_{\theta^-}\Big(s',\mathrm{arg}\,\underset{a'}{\mathrm{max}}\,Q_\theta(s',a')\Big)

Double DQN小结

DQN 与 Double DQN 的差别只是在于计算状态 ss'QQ 值时如何选取动作:

  • DQN 的优化目标可以写成 r+γQθ(s,argmaxaQθ(s,a))r+\gamma Q_{\theta^-}(s',\mathrm{arg}\,\underset{a'}{\mathrm{max}}\,Q_{\theta^-}(s',a')),动作的选取依靠目标网络 QθQ_{\theta^-}
  • Double DQN 的优化目标为 r+γQθ(s,argmaxaQθ(s,a))r+\gamma Q_{\theta^-}(s',\mathrm{arg}\,\underset{a'}{\mathrm{max}}\,Q_\theta(s',a')),动作的选取依靠训练网络 QθQ_{\theta}

所以 Double DQN 的代码实现可以直接在 DQN 的基础上进行,无需做过多修改。

优势函数

优势函数是什么?为什么要引入优势函数?这是基于这样一种情况:当我们算出某个 Q(s,a)Q(s,a) 比较大的时候,我们会产生一个疑问:这是因为这个状态 ss 比较好,还是因为 aa 比较好?有时候状态 ss 本身就已经很好了,导致这时候采取什么动作都能得到很好的 QQ 值。为了区分上述两种情况,引入优势函数 A(s,a)A(s,a) ——在强化学习中,将状态动作价值函数 QQ 减去状态价值函数 VV 的结果定义为优势函数 AA

A(s,a)=Q(s,a)V(s)A(s,a)=Q(s,a)-V(s)

在同一个状态下,所有动作的优势值之和为0,因为所有动作的动作价值的期望就是这个状态的状态价值。优势函数表达在状态 ss 下,某动作 aa 相对于平均而言的优势。从数量关系来看,就是随机变量相对均值的偏差。优势函数是深度强化学习的一种极其重要的策略,尤其对于基于策略的学习。

Dueling DQN

Dueling DQN 是 DQN 另一种的改进算法,它在传统 DQN 的基础上只进行了微小的改动,但却能大幅提升 DQN 的表现。在 Dueling DQN 中,Q 网络被建模为:

Qη,α,β(s,a)=Vη,α(s)+Aη,β(s,a)Q_{\eta,\alpha,\beta}(s,a)=V_{\eta,\alpha}(s)+A_{\eta,\beta}(s,a)

其中,Vη,α(s)V_{\eta,\alpha}(s) 为状态价值函数,而 Aη,β(s,a)A_{\eta,\beta}(s,a) 则为该状态下采取不同动作的优势函数,表示采取不同动作的差异性。η\eta 是状态价值函数和优势函数共享的网络参数,一般用在神经网络中,用来提取特征的前几层;而 α\alphaβ\beta 分别为状态价值函数和优势函数的参数。在这样的模型下,不再让神经网络直接输出 QQ 值,而是训练神经网络的最后几层的两个分支,分别输出状态价值函数和优势函数,再求和得到 QQ 值。Dueling DQN 的网络结构如图所示:

然而我看到的代码实现中价值函数和优势函数前面的网络都是一样的,网络结构如图所示:

将状态价值函数和优势函数分别建模的好处在于:某些情境下智能体只会关注状态的价值,而并不关心不同动作导致的差异,此时将二者分开建模能够使智能体更好地处理与动作关联较小的状态。在下图所示的驾驶车辆游戏中,智能体注意力集中的部位被显示为黄色。当智能体前面没有车时,车辆自身动作并没有太大差异,此时智能体更关注状态价值;而当智能体前面有车时(智能体需要超车),智能体开始关注不同动作优势值的差异。

对于 Dueling DQN 中的公式 Qη,α,β(s,a)=Vη,α(s)+Aη,β(s,a)Q_{\eta,\alpha,\beta}(s,a)=V_{\eta,\alpha}(s)+A_{\eta,\beta}(s,a),它存在对于 VV 值和 AA 值建模不唯一性的问题。例如,对于同样的 QQ 值,如果将 VV 值加上任意大小的常数 CC,再将所有 AA 值减去 CC ,则得到的 QQ 值依然不变,这就导致了训练的不稳定性。为了解决这一问题,Dueling DQN 强制最优动作的优势函数的输出为0,即:

Qη,α,β(s,a)=Vη,α(s)+Aη,β(s,a)maxaAη,β(s,a)Q_{\eta,\alpha,\beta}(s,a)=V_{\eta,\alpha}(s)+A_{\eta,\beta}(s,a)-\underset{a'}{\mathrm{max}}\,A_{\eta,\beta}(s,a')

此时 V(s)=maxaQ(s,a)V(s)=\underset{a}{\mathrm{max}}\,Q(s,a),可以确保 VV 值建模的唯一性。在实现过程中,还可以用平均代替最大化操作,即:

Qη,α,β(s,a)=Vη,α(s)+Aη,β(s,a)1AaAη,β(s,a)Q_{\eta,\alpha,\beta}(s,a)=V_{\eta,\alpha}(s)+A_{\eta,\beta}(s,a)-\frac{1}{|\mathcal{A}|}\sum_{a'}A_{\eta,\beta}(s,a')

此时 V(s)=1AaQ(s,a)V(s)=\frac{1}{|\mathcal{A}|}\sum_{a'}Q(s,a'),虽然它不再满足贝尔曼最优方程,但实际应用时更加稳定。

Dueling DQN 与 DQN 的差异只在网络结构上。Dueling DQN 比 DQN 好的部分原因在于 Dueling DQN 能更高效学习状态价值函数。每次更新时,函数 VV 都会被更新,这也会影响到其他动作的 QQ 值。而传统的 DQN 只会更新某个动作的 QQ 值,其他动作的 QQ 值就不会更新。因此,Dueling DQN 能够更加频繁、准确地学习状态价值函数。

代码(略)

可以参考DQN改进算法

参考文章

DQN改进算法

基于值函数逼近的强化学习方法

强化学习 优势函数(Advantage Function)