动手实践丨基于 ModelAtrs 使用 A2C 算法制作登月器着陆小游戏
本文分享自华为云社区《使用A2C算法控制登月器着陆》,作者:HWCloudAI 。
LunarLander 是一款控制类的小游戏,也是强化学习中常用的例子。游戏任务为控制登月器着陆,玩家通过操作登月器的主引擎和副引擎,控制登月器降落。登月器平稳着陆会得到相应的奖励积分,如果精准降落在着陆平台上会有额外的奖励积分;相反地如果登月器坠毁会扣除积分。
A2C 全称为 Advantage Actor-Critic,在本案例中,我们将展示如何基于 A2C 算法,训练一个 LunarLander 小游戏。
整体流程:基于 gym 创建 LunarLander 环境->构建 A2C 算法->训练->推理->可视化效果
A2C 算法的基本结构
A2C 是 openAI 在实现baseline过程中提出的,是一种结合了 Value-based (比如 Q learning) 和 Policy-based (比如 Policy Gradients) 的强化学习算法。
Actor 目的是学习策略函数π(θ)以得到尽量高的回报。 Critic 目的是对当前策略的值函数进行估计,来评价。
Policy Gradients
Policy Gradient 算法的整个过程可以看作先通过策略π(θ)让 agent 与环境进行互动,计算每一步所能得到的奖励,并以此得到一局游戏的奖励作为累积奖励 G,然后通过调整策略π,使得 G 最大化。所以使用了梯度提升的方法来更新网络参数θ,利用更新后的策略再采集数据,再更新,如此循环,达到优化策略的目的。
Actor Critic
agent 在于环境互动过程中产生的 G 值本身是一个随机变量,可以通过 Q 函数去估计 G 的期望值,来增加稳定性。即 Actor-Critic 算法在 PG 策略的更新过程中使用 Q 函数来代替了 G,同时构建了 Critic 网络来计算 Q 函数,此时 Actor 相关参数的梯度为:
而 Critic 的损失函数使用 Q 估计和 Q 实际值差的平方损失来表示:
A2C 算法
A2C 在 AC 算法的基础上使用状态价值函数给 Q 值增加了基线 V,使反馈可以为正或者为负,因此 Actor 的策略梯变为:
同时 Critic 网络的损失函数使用实际状态价值和估计状态价值的平方损失来表示:
LunarLander-v2 游戏环境简介
LunarLander-v2,是基于 gym 和 box2d 提供的游戏环境。游戏任务为玩家通过操作登月器的喷气主引擎和副引擎来控制登月器降落。
gym:开源强化学习 python 库,提供了算法和环境交互的标准 API,以及符合该 API 的标准环境集。
box2d:gym 提供的一种环境集合
注意事项
本案例运行环境为 TensorFlow-1.13.1,且需使用 GPU 运行,请查看《ModelAtrs JupyterLab 硬件规格使用指南》了解切换硬件规格的方法;
如果您是第一次使用 JupyterLab,请查看《ModelAtrs JupyterLab使用指导》了解使用方法;
如果您在使用 JupyterLab 过程中碰到报错,请参考《ModelAtrs JupyterLab常见问题解决办法》尝试解决问题。
实验步骤
1. 程序初始化
第 1 步:安装基础依赖
要确保所有依赖都安装成功后,再执行之后的代码。如果某些模块因为网络原因导致安装失败,直接重试一次即可。
第 2 步:导入相关的库
2. 参数设置
本案例设置的 游戏最大局数 MAX_EPISODE = 100,保存模型的局数 SAVE_EPISODES = 20,以便快速跑通代码。
你也可以调大 MAX_EPISODE 和 SAVE_EPISODES 的值,如 1000 和 100,可以达到较好的训练效果,训练耗时约 20 分钟。
3. 游戏环境创建
4. Actor-Critic 网络构建
5. 创建训练函数
6. 开始训练
训练一个 episode 大约需 1.2 秒
7.使用模型推理
由于本游戏内核可视化依赖于 OpenGL,需要桌面化操作系统的窗口显示,但当前环境暂不支持弹窗,因此无法可视化,您可将代码下载到本地,取消 env.render() 这行代码的注释,查看可视化效果。
8.可视化效果
下面的视频为训练 1000 episode 模型的推理效果,该视频演示了在三个不同的地形情况下,登月器都可以安全着陆
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/bbdf264730c58019cac70c15f】。文章转载请联系作者。
评论