DQN算法及其三大改进

未分类 2019-04-02 649 次浏览 0 条评论

本文部分图片、内容来自《莫烦python》,仅作记录总结,著作权归原作者所有

DQN

Deep Q Network 简称为 DQN

Q表格的极限

Q-learning中,对每一个状态下的每一个动作,都要存储一个Q值用来估计与记忆。在一些状态、动作复杂且离散的问题中,Q-表格的大小会爆炸式增长,Q-learning无法处理这样的问题。

与深度学习的合作

对于高维度且离散的状态-动作信息,神经网络处理起来得心应手。所以我们用神经网络来代替Q-表格,用每一步的误差来更新神经网络,以达到学习的目的。用神经网络来计算每一个state和action对应的Q值。

DQN的制取胜法宝

如果仅仅是简单的用神经网络来代替表格存储状态-动作-奖励,会出现很多问题,神经网络的更新在离线学习中表现得很低下,因此,DQN还有一些优化措施。

Experience replay 学会反省)

由之前的内容可知,Q-learning是一种离线学习,每一次更新的学习过程并不是未来一定会做的,那么为什么我们不可以学习过去的行为呢?如果构建一个记忆库,用来存储以前的经历,每一次更新,都随机取出一些记忆来更新神经网络。这样更新的效率会大大提升。也可以打断经历之间的相关性。

Fixed Q-targets(学会总结)

搭建两个神经网络, target_net(现实网络)用于预测 q_target(预期的未来奖励)值, 不会及时更新参数。eval_net (估计网络)用于预测 q_eval,来决定当前状态选择的动作, 这个神经网络拥有最新的神经网络参数。每一次训练时,神经网络都是从记忆库中取出经历来更新网络,而不是利用当前的经历来更新网络。在一定学习次数后,将估计网络复制给现实网络,让现实网络对未来的估计更准确。

算法

Double DQN

Natural DQN 的缺陷

DQN 是一个双网络学习,其中eval_net是实时更新的,而target_net是周期性更新的。我们计算Q_target时,用target_net来预测下一步动作的预期奖励,这一步进行了一个最大化操作max(s',a)用于估计。最大化操作会导致过于乐观的值估计,用由target_net产生的过于乐观的估计值来更新本来就不准确的target_net,就容易导致过估计。

改进方法

为了解决这个问题,最好是用另外一个网络来预测下一步的预期动作,由于DQN先天就具有两个神经网络,可以充分利用起来。于是用eval_net来预测下一个状态的的预期动作,然后用target_net来预测这个动作的预期奖励。这样就平衡了过估计的情况。
从原来的

变为

原本的 Q_next = max(Q_next(s', a_all))

Double DQN 中的 Q_next = Q_next(s', argmax(Q_eval(s', a_all)))

效果对比

从图中分析可以看到,在完成学习以后,Natural DQN 在立起来时, 大部分时间都是 估计的 Q值 要大于0, 这时就出现了 overestimate, 而 Double DQN 的 Q值 就消除了一些 overestimate, 将估计值保持在 0 左右。

PER-DQN

宝贵的经验

在DQN的算法中,每一次学习,都会从记忆库中取出一批记忆用来更新网络,选择的方法是众生平等-随机选择的。假如这个智能体在完成一个艰难的任务,它尝试了很久才取得了一次奖励,但是取得这次奖励的宝贵经历还没来得及被选出来被学习,就被新的经历覆盖掉了,这样显然是不利于智能体学习的。

Prioritized Experience Replay (DQN)

针对这个问题,可以使用Prioritized Experience Replay,那些记忆库中宝贵的、稀有的记忆会被重视

这一套算法重点就在我们 batch 抽样的时候并不是随机抽样, 而是按照 Memory 中的样本优先级来抽. 所以这能更有效地找到我们需要学习的样本.

样本的优先级是由 TD-error确定的, 也就是 Q现实 - Q估计 来规定优先学习的程度. 如果 TD-error 越大, 就代表我们的预测精度还有很多上升空间, 那么这个样本就越需要被学习, 也就是优先级 p 越高.

根据p来进行排序时,最好的方法就是通过p来对样本进行排序,如果每次抽样都需要针对 p 对所有样本排序, 这将会是一件非常消耗计算能力的事。 好在我们还有其他方法, 这种方法不会对得到的样本进行排序. 这就是这篇 paper 中提到的 SumTree.

SumTree 是一种树形结构, 每片树叶存储每个样本的优先级 p, 每个树枝节点只有两个分叉, 节点的值是两个分叉的合, 所以 SumTree 的顶端就是所有 p 的合. 正如下面图片(来自Jaromír Janisch), 最下面一层树叶存储样本的 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 下面有两个 child nodes, 拿着手中的24对比左边的 child 29, 如果 左边的 child 比自己手中的值大, 那我们就走左边这条路, 接着再对比 29 下面的左边那个点 13, 这时, 手中的 24 比 13 大, 那我们就走右边的路, 并且将手中的值根据 13 修改一下, 变成 24-13 = 11. 接着拿着 11 和 13 左下角的 12 比, 结果 12 比 11 大, 那我们就选 12 当做这次选到的 priority, 并且也选择 12 对应的数据.

Dueling DQN

只要稍稍修改 DQN 中神经网络的结构, 就能大幅提升学习效果, 加速收敛. 这种新方法叫做 Dueling DQN. 用一句话来概括 Dueling DQN 就是. 它将每个动作的 Q 拆分成了 state 的 Value 加上 每个动作的 Advantage.

算法表示

下面这个公式解释了不同之处. 原来 DQN 神经网络直接输出的是每种动作的 Q值, 而 Dueling DQN 每个动作的 Q值 是有下面的公式确定的.

它分成了这个 state 的值, 加上每个动作在这个 state 上的 advantage. 因为有时候在某种 state, 无论做什么动作, 对下一个 state 都没有多大影响。在这种状态下,选择动作的影响不打,而在另外一些状态下,动作的选择显得极为重要。

简而言之,传统的Q值只代表着在当前状态下选择某一动作带来的预期收益,但是Dueling DQN 每个动作的 Q值是由当前状态的收益加上下一动作的收益增加(动作优势)共同组成的。

微信扫一扫,分享到朋友圈

DQN算法及其三大改进
梓沨

站长 INTP,生物搬砖工

Leave a Reply

Your email address will not be published.