DQL: Dueling Double DQN, Prioritized Experience Replay, and fixed Q-targets(三下)

https://www.freecodecamp.org/news/improvements-in-deep-q-learning-dueling-double-dqn-prioritized-experience-replay-and-fixed-58b130cc5682/

DQL是2014年提出的。自那以后提出了很多改进。所以,今天我们来看看四种极大提升DQN agents的训练和结果的方法:

  • fixed Q-targets
  • double DQNs
  • dueling DQN (aka DDQN)
  • Prioritized Experience Replay (aka PER)

Fixed Q-targets

Theory

在Deep Q Learning的文章中,当我们想要计算TD error(loss)的时候,我们是通过计算TD target(Q_target)和当前Q value(Q的估计)的差来得到的。
在这里插入图片描述
但是其实对于真实的TD target,我们是不知道的,没有概念的。我们也是需要预测的。使用Bellman 方程,我们发现TD target仅仅是当前动作的reward加上通过衰减的下一个state的最高Q value。
在这里插入图片描述
然而,问题是我们使用同样的参数(网络权重)来估计target和Q value。这就使得网络权重和TD target具有很强的相关性。
因此,这就意味着训练的每一步,我们的Q value偏移了,同时Q target也偏移了。所以,我们离我们的目标更近了,但是目标同时又移动了。就像是在追逐一个移动的目标!这就导致了训练过程中的振荡。
就像假设你是一个牛仔(Q估计),然后你想要抓住牛(Q target),你必须不断缩小与牛的距离(减小error)。
在这里插入图片描述
在每个时间步,你努力去接近牛,但是牛同时也在移动(因为使用了同样的参数)。
在这里插入图片描述
在这里插入图片描述
这就导致会有一个奇怪的追逐路径(训练时的振荡)
在这里插入图片描述
为了解决这个问题,我们使用DeepMind提出的fixed Q-targets的思想:

  • 使用一个单独的固定参数的网络(w-)来预测TD target
  • 在每个 τ \tau τ步骤,我们复制我们DQN网络的参数来更新目标网络。

在这里插入图片描述
由于添加了这个步骤,我们的学习过程更加稳定,因为目标函数会固定一段时间。

Implementation

fixed Q-targets 的实现是很直接的:

  • 首先,我们创建两个网络(DQNetwork,TargetNetwork)
  • 然后,我们创建一个函数来复制我们的DQNetwork的参数给TargetNetwork
  • 最后,在训练的时候,我们使用TargetNetwork计算TD target。每 τ \tau τ步之后,用DQNetwork的参数更新TargetNetwork参数( τ \tau τ是超参数)

Double DQNs

Theory

由Hado van Hasselt提出的Double DQNs,或者Double Learning。该方法主要用来解决Q-values的过分估计。
为了理解这个问题,我们重新看下我们是如何计算TD target:
在这里插入图片描述
通过计算TD target,我们面临一个简单问题:我们如何确保下一个state的最优动作就是Q-value最高的动作呢?
我们知道Q values的准确性依赖于我们尝试的action和我们探索的相邻states。
在训练的最初,我们并没有足够的信息来确定最优动作。因此,选择最大Q value(充满噪声的)最为最优action会导致false positives。如果并不是最优的actions被经常赋予比最优动作更高的Q value,那么学习就会变得复杂。
解决方法是:当我们计算Q target时,我们使用两个网络来解耦合actions选择和目标Q value生成。

  • 使用DQN网络来选择下一个state所要执行的最优action(最高Q value)
  • 使用target网络计算下一个state执行该动作的目标Q value

在这里插入图片描述
因此,Double DQN帮助我们减少Q values的过分估计,从而帮助我们训练更快更稳定。

Implementation

在这里插入图片描述

Dueling DQN (aka DDQN)

Theory

记住Q values对应的是在该state采取一个动作的好坏程度, Q ( s , a ) Q(s,a) Q(s,a)
所以我们可以分解 Q ( s , a ) Q(s,a) Q(s,a)

  • V ( s ) V(s) V(s):位于该state的value
  • A ( s , a ) A(s,a) A(s,a):在该state下采取该action的优势(在该state下,与其他所有可能actions相比,该action有多好)

在这里插入图片描述
使用DDQN,我们想要使用两个分支来分别估计这两个因素
在这里插入图片描述
然后我们通过一个特殊的聚合层来结合这两个分支最终来得到Q value的估计。
那为什么我们要大费周折的先分别计算再进行合并呢?反正我们要的都是Q value,这似乎和直接预测Q value没什么区别。
通过对Q value估计进行解耦合,直观上来说,我们的DDQN可以学习到哪个states是有价值的,并不需要学习在每个state的每个action的值。
如果是普通的DQN,我们需要计算每个state的每个action的值。但是如果一个state的value很低代表什么呢?为什么我们要去计算一个state的所有actions的值,当所有actions都指向死亡?
因此,通过解耦合,我们可以计算 V ( s ) V(s) V(s)。这会有助于对actions并不影响env的场景。在这样的场景下,并不需要去计算每个action。例如,左移和右移只有在有碰撞风险的时候才会去关注,大部分的时间,选择哪种action其实是没有影响的。
我们举paper Dueling Network Architectures for Deep Reinforcement Learning 里的例子会更加清晰。
在这里插入图片描述
我们发现value network分支将注意力放在了道路上(橘色的地方),尤其是车辆出现的地平线位置,同时它还注意分数。
另一方面,第一帧的右图,该分支并不注意道路,因为这时候前面没有车辆(所以动作选择实际没什么关联)。但是第二帧,由于前方有车,这时候动作选择就有关联且很重要。
考虑聚合层,我们想要生成该state的每个action的Q values。我们可能想要通过下面的方式起来结合:
在这里插入图片描述
但是如果我们这样做的话,我们就会引入识别性的问题,也就是通过Q value,我们无法对应回action和state。这就导致无法回传梯度。为了避免这个问题,我们可以强制我们的advantage函数对于所选择的action预测为0。
为了达成这个目的,我们对于state的所有actions都减去平局advantage。
在这里插入图片描述
这个结构帮助我们加快训练。我们可以计算state的value而不是去计算state的每个action的Q value。同时也可以通过解耦合预测来帮助我们找到更可靠的Q value。

Implementation

只需要改变DQN结构,添加新的分支。

Prioritized Experience Replay

Theory

Prioritized Experience Replay(PRE)是2015年有Tom Schaul提出的。它的思想是,在训练的时候,有些经历是比别的经历要重要的,而且它们发生的频率很低。
因为我们是均匀采样的,在这么多的经历中要选中发生频率很低的样本实际是很难的。
这就是我们使用PER,我们尝试去通过对每个样本定义优先级来改变样本分布。
我们想要优先的学习我们的预测和TD Target有很大差异的样本,因为差异大代表我们需要更多的来学习它。
我们使用我们TD error的绝对值来表征每个经验回放的优先级:
在这里插入图片描述
在这里插入图片描述
但是我们不仅仅是做贪婪优先,因为这会使得我们总是训练同样的样本(拥有巨大差异的样本),然后就会导致多拟合。
所以我们引入随机优先,也就是从一个生成一个选择回放的分布。
在这里插入图片描述
因此,每个时间步,我们可以通过这个概率分布来得到一个样本batch,然后训练我们的网络。
但是这里依然有一个问题。在使用一般的经验回放的时候,我们采取随机更新规则。因此,我们采样样本的方法必须要和它们的潜在分布匹配才行。
对于一般的经验回放,我们是均匀采样,没有偏置,所以我们更新参数也是正常更新。
但是,因为我们使用了非均匀采样。因此,我们对于高优先级的样本引入了偏置(更大的几率被选中)。
如果我们正常更新参数,我们会有过拟合的风险。
为了纠正这个偏置,我们使用importance sampling weights(IS)来调整更新策略,减低经常训练样本的权重。
在这里插入图片描述
参数b是用来控制这些重要样本影响学习的程度。实际操作中,b随着训练的进行逐步上升到1,这是因为权重在学习的最后更重要,因为Q values开始收敛。在接近收敛的时候,无偏置的更新尤为重要,原因请参考

Implementation

这次实现就会比较复杂。
首先我们不能简单的对所有的经验缓存进行排序。这非常低效,因为 O ( n log ⁡ n ) O(n\log n) O(nlogn)的插入操作和 O ( n ) O(n) O(n)的采样操作。
使用一种新的数据结构来解决这个问题——一个步排序的sumtree
sumtree是一个二叉树,每个节点只有最多两个子节点。叶节点是优先级,每个对应一个样本。
更新和采样都只需要 O ( log ⁡ n ) O(\log n) O(logn).
在这里插入图片描述
然后,我们开辟存储来保存我们的sumtree和数据。
然后,我们要采样k大小的minibatch,我们将 [ 0 , total_priority ] [0,\text{total\_priority}] [0,total_priority]分成k段,然后均匀从每段里面采样。
最后,从sumtree中检索对应于这些采样值中的每一个样本。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值