17

【强化学习】DQN 的各种改进

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzIwMDIzNDI2Ng%3D%3D&%3Bmid=2247488493&%3Bidx=1&%3Bsn=f68bd8da3cfc863284a783e682dd3a6c
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

知乎:Flood Sung   DRL研究员 兼 AGI布道师

链接:https://zhuanlan.zhihu.com/p/21547911

1 前言

DQN 发表于 NIPS 2013,在此之后 DeepMind 不断对 DQN 进行改进,首先在 2015 年初发布了 Nature 文章,提出了 Nature 版本的 DQN,然后接下来在 2015 年一年内提出了 Double DQN,Prioritied Replay,还有 Dueling Network 三种主要方法,又极大的提升了 DQN 的性能,目前的改进型 DQN 算法在 Atari 游戏的平均得分是 Nature 版 DQN 的三倍之多。因此,在本文中,我们将介绍一下各个改进的方法,并在最后给出用 Nature-DQN 的实现方法。

2 Nature DQN

NIPS DQN 在基本的 Deep Q-Learning 算法的基础上使用了 Experience Replay 经验池。通过将训练得到的数据储存起来然后随机采样的方法降低了数据样本的相关性。提升了性能。接下来,Nature DQN 做了一个改进,就是增加 Target Q 网络。也就是我们在计算目标 Q 值时使用专门的一个目标 Q 网络来计算,而不是直接使用预更新的 Q 网络。这样做的目的是为了减少目标计算与当前值的相关性。

EFNzumB.png!mobile

如上面的损失函数公式所示,计算目标 Q 值的网络使用的参数是 w-,而不是 w。就是说,原来 NIPS 版本的 DQN 目标 Q 网络是动态变化的,跟着 Q 网络的更新而变化,这样不利于计算目标 Q 值,导致目标 Q 值和当前的 Q 值相关性较大。因此提出单独使用一个目标 Q 网络。那么目标 Q 网络的参数如何来呢?还是从 Q 网络中来,只不过是延迟更新。也就是每次等训练了一段时间再将当前 Q 网络的参数值复制给目标 Q 网络。

这个做的效果还是很明显的,效果见下表(引用自 Nature 论文):

aMRnmiA.png!mobile

这就是 Nature DQN 的改进。

3 DQN 有什么问题?还可以如何改进?

在 Nature DQN 出来之后,肯定很多人在思考如何改进它。那么 DQN 有什么问题呢?

  • 目标 Q 值的计算准确吗?全部通过 max Q 来计算有没有问题?

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

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

  • DQN 中使用的方法来探索状态空间,有没有更好的做法?

  • 使用卷积神经网络的结构是否有局限?加入 RNN 呢?

  • DQN 无法解决一些高难度的 Atari 游戏比如 Montezuma's Revenge,如何处理这些游戏?

  • DQN 训练时间太慢了,跑一个游戏要好几天,有没有办法更快?

  • DQN 训练是单独的,也就是一个游戏弄一个网络进行训练,有没有办法弄一个网络同时掌握多个游戏,或者训练某一个游戏后将知识迁移到新的游戏?

  • DQN 能否用在连续动作输出问题?

那么现在的事实发现 DeepMind 确实在思考解决上面的几个问题,并且基本上每一个问题都有一定的解决方法。下面罗列一下各个问题的解决文章:

  • 改进目标 Q 值计算:Deep Reinforcement Learning with Double Q-learning

  • 改进随机采样:Prioritized Experience Replay

  • 改进网络结构,评估单独动作价值:Dueling Network Architectures for Deep Reinforcement Learning ( 本文为 ICML 最佳论文之一)

  • 改进探索状态空间方式:(1)Deep Exploration via Bootstrapped DQN (2)Incentivizing Exploration In Reinforcement Learning With Deep Predictive Models

  • 改变网络结构,增加 RNN:Deep Recurrent Q-Learning for Partially Observable MDPs(非 DeepMind 出品,效果很一般,谈不上改进,本文也不考虑讲解)

  • 实现 DQN 训练的迁移学习:(1)Policy Distillation (2) Actor-Mimic: Deep Multitask and Transfer Reinforcement Learning

  • 解决高难度游戏 Montezuma‘s Revenge:Unifying Count-Based Exploration and Intrinsic Motivation

  • 加快 DQN 训练速度:Asynchronous Methods for Deep Reinforcement Learning (这篇文章还引出了可以替代 DQN 的 A3C 算法,效果 4 倍 Nature DQN)

  • 改变 DQN 使之能够应用在连续控制上面:Continuous Deep Q-Learning with Model-based Acceleration

除了上面的问题,其他的就是将 DQN 应用到其他领域比如文字理解,目标定位等等,也就是 DQN 的拓展研究,这里就不罗列相关文章了。上面的这些成果基本出自 DeepMind 之手,只有一两篇出自其他大牛,比如 Pieter Abbeel,Ruslan Salakhutdinov。

4 Double DQN,Prioritised Replay,Dueling Network 三大改进

大幅度提升 DQN 玩 Atari 性能的主要就是 Double DQN,Prioritised Replay 还有 Dueling Network 三大方法。

David Silver 在 ICML 2016 中的 Tutorial 上做了介绍:深度增强学习 Tutorial 下图引用其 PPT:

z6Bn6vf.png!mobile

简单说明一下:

  • Double DQN:目的是减少因为 max Q 值计算带来的计算偏差,或者称为过度估计(over estimation)问题,用当前的 Q 网络来选择动作,用目标 Q 网络来计算目标 Q。

  • Prioritised replay:也就是优先经验的意思。优先级采用目标 Q 值与当前 Q 值的差值来表示。优先级高,那么采样的概率就高。

  • Dueling Network:将 Q 网络分成两个通道,一个输出 V,一个输出 A,最后再合起来得到 Q。如下图所示(引用自 Dueling Network 论文)。这个方法主要是 idea 很简单但是很难想到,然后效果一级棒,因此也成为了 ICML 的 best paper。

    uMzieqF.png!mobile

5 代码实战

还是用之前的排班调度问题,我们来试一下 Nature-DQN。

需要修改的地方非常少:

  • 在当前网络的基础上,再去初始化一个目标网络 model_Q;

  • 用目标网络去预测 Q 值,用当前网络去 fit 样本;

  • 定期用当前网络去更新 model_Q 的参数值。

对应代码:

class DQNAgent:
def __init__(self, state_size, action_size):
...
self.model = self._build_model() # 用于选择动作、更新参数
self.model_Q = self._build_model() # 用于计算 Q 值,定期从 model 中拷贝数据。

def update_model_Q(self):
# 更新参数
self.model_Q.set_weights(self.model.get_weights())

def replay(self, batch_size):
# 经验回放
minibatch = random.sample(self.memory, batch_size)
for state, action, reward, next_state in minibatch:
# 相比 DQN-13 改了这个:用 model_Q 来预测 Q 值
target = reward + self.discount_factor * np.amax(self.model_Q.predict(next_state)[0])
# 我在纠结当前状态是否需要用 model_Q?
# 因为感觉这也是计算 Q 值,所以就用了~
target_f = self.model_Q.predict(state)
target_f[0][action] = target
self.model.fit(state, target_f, epochs=1, verbose=0)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay

我们对比下 Q-Learning、DQN、Nature-DQN 三者的性能:

Q-Learning DQN Nature-DQN 时间 53 s 1h 20 min 1h 17 min 迭代次数 episodes=1 iter=10000 episodes=1 iter=10000 episodes=1 iter=10000 效果(最佳迭代) -0.372 (i=9717) -0.49 (i=9965) -0.44 (i=5493)

当然,我实验次数不够多,episode 也没加上去,但总体来看 Q-Learning 的效果要比另外两者要好,还在继续改进中 = =。

可能原因在于,问题过于简单,所以 DQN、Nature-DQN 在样本不大的情况下效果不如 Q-Learning。

不过此次实验也说明了 Nature-DQN 相比于 DQN 确实有所改进。

后面将从两方面入手:增大问题复杂度 和 改进 DQN 模型。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK