❝知乎:Flood Sung DRL研究员 兼 AGI布道师 链接:https://zhuanlan.zhihu.com/p/21547911 ❞
DQN 发表于 NIPS 2013,在此之后 DeepMind 不断对 DQN 进行改进,首先在 2015 年初发布了 Nature 文章,提出了 Nature 版本的 DQN,然后接下来在 2015 年一年内提出了 Double DQN,Prioritied Replay,还有 Dueling Network 三种主要方法,又极大的提升了 DQN 的性能,目前的改进型 DQN 算法在 Atari 游戏的平均得分是 Nature 版 DQN 的三倍之多。因此,在本文中,我们将介绍一下各个改进的方法,并在最后给出用 Nature-DQN 的实现方法。
NIPS DQN 在基本的 Deep Q-Learning 算法的基础上使用了 Experience Replay 经验池。通过将训练得到的数据储存起来然后随机采样的方法降低了数据样本的相关性。提升了性能。接下来,Nature DQN 做了一个改进,就是增加 Target Q 网络。也就是我们在计算目标 Q 值时使用专门的一个目标 Q 网络来计算,而不是直接使用预更新的 Q 网络。这样做的目的是为了减少目标计算与当前值的相关性。

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

这就是 Nature DQN 的改进。
在 Nature DQN 出来之后,肯定很多人在思考如何改进它。那么 DQN 有什么问题呢?
的方法来探索状态空间,有没有更好的做法?
那么现在的事实发现 DeepMind 确实在思考解决上面的几个问题,并且基本上每一个问题都有一定的解决方法。下面罗列一下各个问题的解决文章:
除了上面的问题,其他的就是将 DQN 应用到其他领域比如文字理解,目标定位等等,也就是 DQN 的拓展研究,这里就不罗列相关文章了。上面的这些成果基本出自 DeepMind 之手,只有一两篇出自其他大牛,比如 Pieter Abbeel,Ruslan Salakhutdinov。
大幅度提升 DQN 玩 Atari 性能的主要就是 Double DQN,Prioritised Replay 还有 Dueling Network 三大方法。
David Silver 在 ICML 2016 中的 Tutorial 上做了介绍:深度增强学习 Tutorial 下图引用其 PPT:

简单说明一下:

还是用之前的排班调度问题,我们来试一下 Nature-DQN。
需要修改的地方非常少:
对应代码:
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 模型。