DQN注意事项

DQN注意事项

本文的内容主要来自论文 Implementing the Deep Q-Network(arxiv:1711.10748)。

DQN比较难训练,为了得到较好的实验结果,可能需要用到许多技巧。这篇文章复现了Mnih et al. 的实验,并总结了需要注意的关键细节。

Q-Learning

根据Bellman方程,最优策略\(\pi^*\)对应的的Q函数\(Q^*\)可以递归地表示为 \[ Q^*(s,a) = \sum_{s'\in S}T(s,a,s')[R(s,a,s')+\gamma\max_{a'} Q^*(s',a')], \] 在Q-Learning中,通过不断地根据策略采取行动、探索环境,依据Bellman方程迭代更新,来估计最优策略的Q函数 \[ Q_{t+1}(s_t,a_t)\leftarrow Q_t(s_t, a_t)+\alpha_t[r_{t+1}+\gamma\max_{a'}Q_t(s_{t+1},a')-Q_{t}(s_t,a_t)], \] Q-Learning的收敛性是有保证的,如果:Q函数是用表格法表示,每个状态和动作会被无限多次访问,且学习率\(\alpha_t\)随着时间\(t\)增长趋于\(0\),那么我们可以保证按上式迭代的\(Q\)会收敛到最优策略的Q函数\(Q^*\)

Deep Q-Learning

DQN与普通的Q-Learning有如下不同:

  1. 用深度网络近似Q函数。但这样收敛性就没了保证,并且降低稳定性。
  2. 经验回放。
  3. 区分Q-value network和target network,并对target network的参数缓慢更新。
  4. 把梯度裁剪到[-1,1]区间

后三点都是为了增加训练的稳定性。但即便如此,在训练过程中仍会发生灾难性遗忘(catastrophic forgetting),也就是经过一段时间训练后performance不上升,反而突然下降。

一些关键的实现细节

  1. 每一个episode开始时,先执行随机数目个(0~30)no-op atari low-level 操作;

每经过4个atari帧agent才感知一次,因此经验回放的是agent感知的帧,每次动作持续4个atari帧;

梯度下降之前,先用随机策略填充50000步,以免对早期的经验过拟合;

更新频率:agent每感知4次环境才执行一次梯度下降。

  1. 预分配经验回放等数组的内存以提高速度。

  2. 在有生命值得游戏里,每当损失生命值时视为episode结束。

  3. 如果使用RMSprop optimizer, 学习率设为0.00005,而不是Minh et al. 提到的0.00025,后者的RMSprop的实现与caffe的RMSprop实现有区别。