深度强化学习6——DQN的改进方法

在上一篇文章我们提到了DQN还存在的问题:

1) 目标Q值的计算是否准确?全部通过max Q来计算有没有问题?

2) 随机采样的方法好吗?按道理不同样本的重要性是不一样的。

3) Q值代表状态,动作的价值,那么单独动作价值的评估会不会更准确?

相应的改进方法是Double DQN、Prioritised Replay DQN、Dueling DQN,下面我们将一一介绍这些方法。

Double DQN

在DDQN之前,基本上所有的目标Q值都是通过贪婪法直接得到的,无论是Q-Learning, DQN(NIPS 2013)还是 Nature DQN,都是如此,在 DQN(NIPS 2013)中,会出现Q值估计偏高的情形,因为这是一种off-policy的策略,我们每次在学习时,不是使用下一次交互使用的真实动作,而是使用当前策略认为的价值最大的动作,所以会出现对Q值的过高估计。而在Nature DQN中,我们也会面临同样的问题,因为我们选择下一时刻的动作以及计算下一时刻状态-动作Q值时,使用的都是target-net。

最初Thrun & Schwartz开始探讨该问题,证明了在使用函数逼近器时overestimation可能导致非最优解。之后van Hasselt发现即使用表格表示法的情况下,环境中的噪声也能导致overestimation,为了将动作选择和价值估计进行解耦,提出了解决方案Double Q-learning,在上一节里,Nature DQN对于非终止状态,其目标Q值的计算式子是:

                                                                     y_{j}=\left\{\begin{matrix} r_{j} & teminal &is& true\\ r_{j}+\gamma max_{a^{'}}Q(s_{j}^{'},a_{j}^{'},w) & teminal &is&false \end{matrix}\right.

在DDQN这里,其定义是将动作的选择和动作的评估分别用不同的值函数来实现,而在Nature DQN中正好我们提出了两个Q网络(Q,Q^{'}),其计算目标值yj的步骤可以拆分为两步:

1)先在当前Q网络中先找出最大Q值对应的动作,即

                                                                                   a_{j}^{max}(s_{j}^{'},w)=arg \underset{a^{'}}{max}(Q(s_{j}^{'},a_{j},w))

2)   然后用这个选择出来的动作a_{j}^{max}(s_{j}^{'},w),在目标网络里面去计算目标Q值,即

                                                                                     y_{j}=r_{j}+\gamma Q^{'}(s_{j}^{'},a_{j}^{max}(s_{j}^{'},w),w^{'})

结合起来就是

                                            y_{j}=\left\{\begin{matrix} r_{j} & teminal &is& true\\ r_{j}+\gamma Q^{'}(s_{j}^{'},arg \underset{a^{'}}{max}(Q(s_{j}^{'},a_{j},w)),w),w^{'}) & teminal &is&false \end{matrix}\right.

除了目标Q值的计算方式以外,DDQN算法和Nature DQN的算法流程完全相同。

Prioritised Replay DQN

在DQN中起到比较关键作用的experience replay算法灵感可以说部分来自生物学,它类似于大脑中海马体在我们休息的时候将近期的经验回放加深印象的机制。该方法不仅稳定了函数训练过程,也提高了经验数据的利用率。缺点是需要更多内存来存储经验池(experience pool)。 这种方法的效果很好,但目前的做法还是对以往经验均匀采样的。下一步自然是根据经验的重要程度进行有侧重的replay。

样本的优先级如何确定?注意到在经验回放池里面的不同的样本由于TD误差的不同,对我们反向传播的作用是不一样的。一个理想的标准是智能体学习的效率越高,权重越大。符合该标准的一个选择是TD偏差。TD偏差越大,说明该状态处的值函数与TD目标的差距越大,智能体的更新量越大,因此该处的学习效率越高,在Q网络中,TD偏差就是目标Q网络计算的目标Q值和当前Q网络计算的Q值之间的差距。

这样如果TD偏差的绝对值较大的样本更容易被采样,则我们的算法会比较容易收敛,下面我们看看Prioritized Replay DQN的算法思路:

1)为了方便优先回放存储与及采样,采用sumTree树来存储,sumTree 是一种树形结构, 叶子结点存储每个样本的优先级 p, 每个树枝节点只有两个分叉, 节点的值是两个分叉的和, 所以 sumTree 的顶端就是所有 p 的和。如下图所示,

最下面一层树叶存储样本的 p, 叶子上一层最左边的 13 = 3 + 10, 按这个规律相加, 顶层的 root 就是全部 p 的和了,抽样时,我们会将 p 的总和除以 batch size,分成 batch size 那么多区间, (n=sum(p)/batch_size)。如果将所有 node 的 priority 加起来是42的话,我们如果抽6个样本,这时的区间拥有的 priority 可能是这样

[0-7], [7-14], [14-21], [21-28], [28-35], [35-42]

然后在每个区间里随机选取一个数,比如在第区间 [21-28] 里选到了24,就按照这个24从最顶上的42开始向下搜索。首先看到最顶上42下面有两个子节点,拿着手中的24对比左子节点,因为29>24,那我们就走左边这条路;接着再对比29的左子节点13,因为24>13,那我们就走右边的路,并且将手中的值根据 13 修改一下, 变成 24-13 = 11。 接着拿着11和13的左子节点12比,结果 12 比11大, 那我们就选择12对应的数据作为该区间采样的结果。

2)目标函数在计算时根据样本的TD偏差添加了权重(权重和TD偏差有关,偏差越大,权重越大),之前的损失函数为:
                                                                                                 \frac{1}{m}\sum_{j=1}^{m}(y_{j}-Q(s_{j},a_{j},w))^{2}                                                               

考虑了样本优先级的损失函数为:

                                                                                                \frac{1}{m}\sum_{j=1}^{m}w_{j}(y_{j}-Q(s_{j},a_{j},w))^{2}

3) 在这里TD误差的计算:\delta _{j}=y_{j}-Q(s_{j},a_{j},w)。因此每次更新Q网络参数时,都需要重新计算TD误差。

实际上由于算法要构建sumTree,要计算的东西较多,而且每次都需要更新TD误差,因此算法的速度比较慢,完整流程如下(Double DQN with Prioritized Replay):

Dueling DQN

和前面所讲的各种DQN算法不同,Dueling DQN通过优化神经网络的结构来优化算法,将整个模型结构分成了两个部分,一个为状态值函数(value function),一个为优势函数(advantage function),第一部分是仅仅与状态S有关,与具体要采用的动作A无关,记作V(S,w,\alpha ),第二部分同时与状态状态S和动作A有关,记作A(S,A,w,\beta ),最终我们的价值函数可以重新表示为:

                                                                              Q(S,A,w,\alpha ,\beta )=V(S,w,\alpha )+A(S,A,w,\beta )

实际利用上面的式子计算Q值会出现一个unidentifiable问题:给定一个Q,是无法得到唯一的V和A的。比如,V和A分别加上和减去一个值能够得到同样的Q,但反过来显然无法由Q得到唯一的V和A,为了可以体现这种可辨识性(identifiability),对优势函数部分做了中心化的处理,实际使用的组合公式如下:

                                                        Q(S,A,w,\alpha ,\beta )=V(S,w,\alpha )+(A(S,A,w,\beta )-\frac{1}{\AA } \sum_{A^{'}\in \AA } A(S,A^{'},w,\beta))

优势函数的思想基于1993年Baird提出的advantage updating。除了传统的V函数外,引入的优势函数A(S,A,w,\beta )的定义是当采取动作A相比于采取当前最优动作能多带来多少累积折扣回报。简单粗暴得说,就是选这个动作比当前最优动作(或其它动作)好多少,我们来看下图

基于这个思想,同一个网络会同时估计状态值函数和优势函数,它们结合起来可以得到Q函数。从上图架构上来说,这是一个一分为二,再合二为一的过程。它的出发点是因为对于很多状态,其实并不需要估计每个动作的值。可以预见到,引入优势函数后,对于新加入的动作可以很快学习,因为它们可以基于现有的状态值函数来学习。它直觉上的意义在于将Q函数的估计分为两步。这样,可以先估计哪些状态更能获得更多回报,而不受该状态下不同动作的干扰。

在《Dueling Network Architectures for Deep Reinforcement》这篇论文也列举了赛车游戏的例子,我们看下图

可以看到状态值函数专注于远处(地平线)和分数,也就是长期目标,优势函数专注于附近障碍,也就是短期目标。这说明状态值函数和优势函数分别学习到了两个层次的策略。这种分层学习的做法有几个好处:一是状态值函数可以得到更多的学习机会,因为以往一次只更新一个动作对应的Q函数。二是状态值函数的泛化性更好,当动作越多时优势越明显。直观上看,当有新动作加入时,它并不需要从零开始学习。三是因为Q函数在动作和状态维度上的绝对数值往往差很多,这会引起噪声和贪婪策略的突变,而用该方法可以改善这个问题。

总结

目前介绍了主流的DQN改进方法,这些方法之间也可以相互结合,当然DQN改进方法也远不止这些,DQN算是深度强化学习的中的主流流派,代表了Value-Based这一大类深度强化学习算法。但是它也有自己的一些问题,就是绝大多数DQN只能处理离散的动作集合,不能处理连续的动作集合,比如一个机械臂同时有很多关节都在运动,DQN在这方面的处理很复杂,可以参考DQN从入门到放弃7 连续控制DQN算法-NAF,而深度强化学习的另一个主流流派Policy-Based而可以较好的解决这个问题,从下一篇我们开始讨论Policy-Based深度强化学习。

个人相关深度强化学习github地址:https://github.com/demomagic

PS: 如果觉得本篇本章对您有所帮助,欢迎关注、评论、赞!如果要转发请注明作者和出处

参考文献:

    [1]强化学习(十二) Dueling DQN

    [2]强化学习(十一) Prioritized Replay DQN

    [3]Deep Reinforcement Learning with Double Q-learning

    [4]Prioritized Experience Replay

    [5]Dueling Network Architectures for Deep Reinforcement Learning

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值