原作:David Foster
林鳞 栗子 编译自 Medium
量子位 出品 | 公众号 QbitAI
上月,量子位报道了Google Brain的David Ha和“LSTM之父”Jürgen Schmidhuber的论文World Models。论文中,好生厉害~
这篇文章就教你如何用Python和Keras搭建一个属于自己的“梦境修炼AI”。
开始教程前,先放上原研究的论文地址:
https://arxiv.org/abs/1803.10122
第一步:理解环境我们要搭建一个能在2D车道环境中开车的强化学习模型,那么这个环境从哪来呢?我推荐OpenAI GYM,可进入下方地址获取。
环境获取地址:
https://gym.openai.com/
在这个任务的每个时间步中,我们需要用64×64像素的车辆和环境的彩图喂算法,并且需要返回下一组操作,尤其当方向(-1到1),加速度(0到1)和制动(0到1)变化时。
这个动作将随后被传递到环境中,之后再返回下一组操作,如此循环。
得分会随着智能体跑过轨道而积累,随着时间步消耗,每个时间步得-0.1分。例如,如果一个智能体用732帧跑完了轨道,那么最后的得分就是1000-0.1×732=926.8分。
下面这张图展示的是一个智能体在前200个时间步中执行的[0,1,0]的动作,但之后画风一转突然变成了随机乱跑……不过这显然不是个好策略。
OK第一步已经完成,我们接下来的任务是,训练智能体理解它周围环境的信息,确定下一步的最佳行动。
第二步:解决方案开始第二步前先给大家推荐我们今天这篇论文的在线交互版~
交互版地址:
https://worldmodels.github.io/
接下来我将顺着上面的这个方案,重点其中的几部分是怎样组合起来的。这样吧,我们将虚拟环境与真实开车情况做对比,直观理解一下这个解决方案。
这个方案由三部分组成,每一部分都需要单独训练:
一种变分自编码器(VAE)
想象一下,当你在开车的同时考虑别的事情时,你不会分析视野中的每个“像素”。你的大脑会自动将视觉信息压缩成更少的“本征”实体,如道路的弯曲程度、即将到来的转弯和相对于道路的位置,指挥下一步动作。
这就是VAE要做的——将64×64×3(RGB)的输入图像遵循高斯分布压缩成一个32维的本征矢量latent vector(z)。
这一步非常重要,现在对智能体周围环境的表示变得更小了,因此学习过程将变得更加高效。
带混合密度网络输出层的循环神经网络(MDN-RNN)
如果你的决策中没有MDN-RNN组件,那么开车时可能是这样的情景。
当你在开车时,每个场景都不会完全出乎你的意料。在我们这个程序里,这种前瞻性的思考由RNN完成,在我们这个例子中,LSTM中总共有256个隐藏单元,这个隐藏状态的向量由h表示。
和VAE相似,RNN也试图对汽车当前在环境中的状态建立一个“本征”理解,但这一次带着一个目标:基于之前的“z”和之前的动作,预测下一个“z”可能是什么样子。
MDN输出层仅允许出现下一个“z”从任何一个高斯分布中提取的情况。