双深度Q网络

本文主要讲一下 DQN 和 DDQN,以及它们的实验对比。

深度Q网络 (DQN)

回顾一下深度Q网络的过程。

  • 从经验池 \(\large R\) 中获取 \(\large n\) 个转移,\(\large (s_i, a_i, r_{i+1}, t_i, s_{i+1})\),其中 \(\large t_i=1\) 表示 \(\large s_i\) 是结束状态
  • 计算状态 \(\large s_i\) 的预测Q值,\(\large y_{pred}^i = Q(s_i)\),执行动作 \(\large a_i\) 时的值为 \(\large y_{pred}^{a_i}\)
  • 计算状态 \(\large s_{i+1}\) 的目标Q值,\(y_{target}^i=Q'(s_i)\),取最优动作对应的值,即最大Q值 \(\large y_{target}^{max}\)
  • 计算预期Q值 \(\large y_{expected}^i = r_{i+1} + (1-t_i) * \gamma * y_{target}^{max}\)
  • \(\large n\) 个转移的均方差损失函数 \(\large loss=\frac{1}{n}\sum_i (y_{pred}^{a_i} - y_{expected}^i)\)
  • 使用梯度下降最小化损失函数,更新 \(\large Q\) 网络的梯度值,注意这里不对目标网络 \(\large Q'\) 更新
  • 相隔一定步数后,更新目标网络的参数 \(\large Q' = Q\)

其中,最重要的部分是对于期望Q值的计算,我们把这部分提取出来,

\[ Y_t^{DQN}=R_{t+1} + \gamma \max_{a} Q'(S_{t+1}, a; w^-) \]

使用经验池进行经验重新(experience replay)早在1992年就已经提出,而使用目标网络是在2015年由Mnih等人提出。

双深度Q网络(Double DQN)

不同于DQN,我们的期望Q值的计算为,

\[ Y_t^{DDQN} = R_{t+1} + \gamma \max_{a} Q'(S_{t+1}, \mathop{argmax}\limits_a Q(S_{t+1}, a; w); w^-) \]

我们的目标网络输入的不再是指定的 \(\large a\),而是原本的Q网络的最大Q值对应的动作。

深度Q网络的过度估计

论文中提出,DQN存在普遍的过度估计(overestimations)问题。

假设预测Q值为 \(\large Q_t(s, a)\),最优价值为 \(\large V_*(s)\) ,每个状态有 \(\large m\) 个动作,则平均误差为

\[ \frac{1}{m}\sum_a(Q_t(s, a) - V_*(s))^2 = C \]

从误差公式上看,环境的噪声,近似函数等因素都是Q函数参数学习的一部分,意味着任何这些因素都可能导致估值偏差。

对于最大值的估计,

\[ \max_aQ_t(s,a) - V_*(s) \ge \sqrt{\frac{C}{m+1}} \]

随着 \(\large m\) 的增大,下界越来越小,而实验结果的表现是随着 \(\large m\) 的增大,估计误差会越来越大,即 \(\large Q_t(s,a)\) 越来越大,产生了所谓的过分乐观(Overoptimism)

过度乐观的实验

论文中选取的真值函数和近似函数分别为:

True Value \(\large Q_*(s,a)\) Approx Function \(\large Q_t(s,a)\)
\(\large sin(s)\) \(\large W^TX\) (d=6)
\(\large 2exp(-s^2)\) \(\large W^TX\) (d=6)
\(\large 2exp(-s^2)\) \(\large W^TX\) (d=9)

测试结果如下,其中每一行是一种真值函数,

  • 第一行第一幅图,描绘了其中一个动作,紫色是真值函数,绿色是拟合函数,可以看出6维的线性回归可以很好的拟合真值。
  • 第一行第二幅图,描绘了10个动作的拟合函数随着的Q值曲线,用黑色描绘的是对应的最大Q值,你会发现最大值普遍大于真值。
  • 第一行第三幅图,描绘了最大Q值与真值的误差,其中橙色曲线是DQN,蓝色曲线是DDQN。明显的,DQN的平均误差要远大于DDQN。
  • 第三行第三幅图,你会发现9维的线性回归的拟合效果远不如6维(第二行第三幅图)。所以说明,有时候复杂的近似函数不一定取得好的效果。

实际效果

在atari游戏上运行对比。

红色是DQN,蓝色是DDQN,其中横线表示无偏估计值。会发现DQN的估计值普遍大于DDQN,而且DQN的估计值偏离很严重。

从上图发现,使用DQN的估计值(浅色区域)非常的不稳地,所以过高的估计值会影响学习效率。

总结

注意一个问题,上面我们一直都在讨论估计值的问题,DDQN能够降低估计值,使得他更接近真值。在实际训练中得到的好处就是训练过程不会太过动荡,也就提高了训练的效率。强化学习与深度学习不同,深度学习会设法得到一个高的准确度。而强化学习中无论是DQN还是DDQN,一直训练下去都能收敛到一个值上,算法的区别更多体现在训练的过程和效率上。

代码实现

我用pytorch分别实现了DQN,DDQN以及用DDQN算法运行atari游戏。详见Github

测试结果

CartPole-v0

针对CartPole-v0问题,小车上面放着一个杆子,我们的任务是左右移动车子尽量使得杆子在车子上屹立得更久,每一步动作奖励为1,屹立时间越长得到的奖励越多,默认200步结束一个episode,gym认为一个最近100个episode的平均奖励大于195就认为解决。

我分别是用DQN和DDQN训练它,结果如下(蓝色是DQN,橙色是DDQN)

PongNoFrameskip-v4

Atari Pong 游戏就是两方在玩类似于乒乓球的游戏,当对方不能打回来,你就得分。目前,这是未解决问题,即没有一个奖励区间能说明解决该问题。

我用DDQN训练2百万帧,情况如下:

训练该环境时遇到了一些问题,一开始发现奖励曲线一直在-20左右徘徊,没有增长的趋势。后来我仔细对比了一下参数,发现Adam的学习率应该使用0.0001,而不是0.001。这也证明了调参的重要性,一个小数点就可能导致模型出现严重的偏差。

参考文献

深度确定性策略梯度 CentOS6升级gcc4.9

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×