OpenAI基准DQN及三个变体:最佳实践确保DQN正确性
选自Open AI Blog
机器之心编译
参与:黄小天、微胖
我们开源了 OpenAI 基准(https://github.com/openai/baselines),努力再现与已发表论文成绩相当的强化学习算法。接下来几个月,我们将发布算法;今天发布的是 DQN 和它的三个变体。
重现强化学习结果非常复杂:性能非常嘈杂,算法有很多活动部分,因此会有微妙漏洞,而且很多论文都没有报告所有必要的技巧。通过发布正确的实现(Know-good)(以及创造这些的最佳实践),我们希望确保强化学习的显著优势与现有算法的错误或未调试版本的比较结果绝对无关。
强化学习算法的正确实现正面临着挑战;好结果通常只来自对貌似不重要的漏洞的修复。本文包含一些修改强化学习算法实现的最佳实践方法以及 DQN 发布的一些细节内容。
查看代码:https://github.com/openai/baselines
最佳实践
与随机基准比较:在下面的视频中,在游戏 H.E.R.O 中,智能体的行动是随机的;如果在训练早期看到这个,很容易以为智能体正在学习。因此,你要始终证实你的智能体的表现胜过随机智能体。
警惕不可破解(non-breaking )的漏洞:当研究了一个包含 10 个流行强化学习算法再实现的样本之后,我们注意到其中 6 个含有微妙的漏洞,由社区成员发现并经作者确认。这些漏洞包括忽略了一些样本梯度或错误实现因果卷积的轻微漏洞,也有严重漏洞,比如报告的得分比真实结果更高。
像你的智能体一样看世界:与大多数深度学习方法一样,对于 DQN,我们倾向于将环境的图像转换为灰度,以减少训练过程中所需的计算量。这又会带来这方面的问题:在 Seaquest 运行 DQN 算法时,我们注意到我们的部署表现很差。检查环境时,我们找到了原因——就像这张图片显示的,后处理过的(post-processed)图像不包含鱼。
把屏幕图像转化为灰度时,我们错误地校准了绿色值系数,导致了鱼的消失。注意到这个错误后,我们调整了颜色值,算法又能看到鱼了。
为了未来调试这样的问题,Gym 现在包含了一个 play 功能,研究人员就能像智能体一样,很容易看到相同的观察结果。
修复漏洞,然后是超参:修复漏洞后,开始调校超参。最终我们发现:为控制探索率(exploration rate)的超参 epsilon 设定退火程序显著影响了性能,最后我们将这个超参在头一百万步后降低到 0.1,接下来的 2400 万步后减低到 0.01。如果实践中有漏洞,我们可能会想出不同的超参设定来解决我们还没诊断出来的问题。
再检查一遍论文解释:在 DQN 的那篇《自然》论文中,作者写道「我们也发现这有助于「从更新中剪辑误差项至 -1 到 1 之间。」这一表述有两种解释方法:计算梯度时,剪辑物体,或者剪辑乘法项。前者看起来更加自然些,不过转换(tanstitions)时,梯度会为零还带有高度误差,性能也是次优的,就像我们在 DQN 实现中发现的。后一个解释是对的,也有简单的数学解释——Huber Loss。通过检查符合预期的梯度,你可以找到类似这些的漏洞。在 TensorFlow 中使用 compute_gradients (https://www.tensorflow.org/api_docs/python/tf/train/GradientDescentOptimizer#compute_gradients),检查符合预期的梯度很简单。
多次浏览代码,然后考虑每行代码可能有什么问题,我们找到了这篇博文中提到的大多数漏洞。虽然有点事后诸葛,但是,即使是经验丰富的研究人员也容易低估一个实现中需要过多少次代码才能发现所有漏洞。
Deep Q-Learning
我们用的是 Python 3 和 TensorFlow。这次发布包括:
DQN:这个强化学习算法可以将 Q-Learning 和深度神经网络结合起来,让强化学习在复杂、高维环境中工作,比如游戏或者机器人技术。
Doubel Q Learning:有时,现有 DQN 算法容易过高评估与特定行动有关的值,纠正这个问题。
Prioritized Replay (https://arxiv.org/abs/1511.05952):通过学习回放内存,将 DQN 回放函数的经验扩展到真实回报显著不同于预测回报的地方,让智能体自己调整对不正确假设的响应。
Dueling DQN: 神经网络一分为二,一个学习评估每个时间步的值,另一个计算每一个步骤的潜在优势,然后结合成一个单独的 action-advantage Q 函数。
启动时,运行:
pip install baselines
# Train model and save the results to cartpole_model.pkl
python -m baselines.deepq.experiments.train_cartpole
# Load the model saved in cartpole_model.pkl and visualize the learned policy
python -m baselines.deepq.experiments.enjoy_cartpole
我们也提供了训练的智能体,运行方式如下:
python -m baselines.deepq.experiments.atari.download_model --blob model-atari-prior-duel-breakout-1 --model-dir /tmp/models
python -m baselines.deepq.experiments.atari.enjoy --model-dir /tmp/models/model-atari-prior-duel-breakout-1 --env Breakout --dueling
基准
我们还有一个 iPython notebook,用来展示 DQN 部署在游戏 Atari 上 的表现。各位可以比较一下不同算法的表现。带有 Prioritized Replay( 黄色)的 Dueling Double Q learning , 带有 Prioritized Replay(蓝色)的 Double Q learning,Dueling Double Q Learning(绿色)以及 Double Q learning(红色)。