实现了“世界模型”,机器可以一步步掌握赛车和躲避火球的技能。

前段时间,谷歌大脑研究科学家大卫哈(David Ha)和瑞士AI实验室IDSIA负责人于尔根施密德胡伯(Jrgen Schmidhuber)提出的“世界模型”(他也是LSTM的提出者)在《梦》中关于人工智能训练的论文引起了人们的热议。本文将带你一步步实现本文所研究的赛车和火球规避智能体。
简而言之,这篇论文被称为杰作有三个原因:
1.它结合了多种深度/strong化学习技术,以获得惊人的结果。——第一个解决当前流行的“赛车”强化学习环境的已知代理;
2.模型编写方法简单易懂,因此对于任何对前沿AI技术感兴趣的人来说都是很好的学习资源;
3.你可以自己写解决方案的代码。
本文是一个循序渐进的指南。
本文涵盖了该模型的技术细节,以及如何获得可以在您自己的机器上运行的版本。
正如我在文章alpha zero(3359 medium . com/applied-data-science/how-to-build-your-own-alpha zero-ai-using-python-and-keras-7f 664945 c 188)中所说,我与文章作者无关。我只是想分享一些关于他们的事情。
第一步:问题
我们将建立一个强化学习算法(一个“代理”),它可以在2D赛道上很好地驾驶车辆。你可以通过开放AI健身房(https://gym.openai.com/)获得这个(赛车)环境。
在每个时间步中,算法将被馈送一个观察值(车辆和即时环境的64 * 64像素的彩色图像),并且需要返回接下来要采取的一系列行为参数——,即转向(-1到1)、加速度(0到1)和制动(0到1)。
然后把这个行为传递给环境,回到下一个观察,开始下一个循环。
对于要访问的N个跟踪块,每个智能代理可以得1000/N分,每一个时间步长会减0.1分。例如,如果代理必须通过732帧才能完成跟踪,则分数为10000.1 * 732=926.8。
这是一个代理的例子:在前200个时间步选择行为[0,1,0],然后其他随机…显然这不是一个好的驾驶策略。
这个项目的目标是训练代理人理解他们可以通过使用他们周围的信息在下一步采取最佳行动。
第二步:解决方案
作者世界模型写了一个在线互动解释(https://worldmodels.github.io/)关于它的方法,所以我不会在这里重复相同的细节。相反,我将专注于如何组装这些片段的高层次问题,并与真实的驾驶过程进行类比,以直观地解释为什么这样的解决方案是有意义的。
该解决方案包括三个部分,将分别进行培训:
可变自编码器(VAE)
当你在开车时做决定时,你不会分析你视野中的每一个“像素”。3354相反,你的大脑会将这些视觉信息浓缩成少量的“潜在”实体,比如道路的笔直度、即将到来的弯道以及你相对于道路的位置。你将利用这些信息来决定你的下一步行动。
这也是VAE在训练后会做的事情。——将64*64*3(RPG)输入图像压缩成一个服从高斯分布的32维潜在向量(Z)。
这是非常有用的,因为代理可以在一个较小的环境中表现他们的工作,从而使学习过程更加有效。
具有混合密度网络输出层的循环神经网络(MDN-RNN)
如果决策时没有MDN-RNN的成分,你的驾驶过程可能是这样的。
当你开车时,出现在你视野中的每一个观察都不会让你特别惊讶。你知道如果当前的观察显示前方有左转的路,你会左转,你期待的下一次观察显示你还在沿着路走。
这种前瞻性思维是RNN ——的作用,具体来说,是一个有256个隐藏单元的LSTM。h代表隐藏状态的向量。
与VAE类似,RNN试图捕捉对环境中车辆当前状态的潜在理解,但这一次是基于上一个“Z”和行为来预测下一个“Z”可能是什么样子。
事实上,MDN输出层允许从几个高斯分布中的任何一个获得下一个“Z”。
生成手写的MDN
在同一作者写的这篇文章中,使用了相同的技术生成笔迹(http://blog . otoro . net/2015/12/28/recurring-net-dreams-up-fake-Chinese-characters-in-vector-format-with-tensor flow/),表示笔的下一个点可以落在不同的地方。
类似地,在文章世界模型中,下一个观察的潜在状态可以从五个高斯分布中的任何一个获得。
控制器
到目前为止,我们还没有提到任何关于行为选择的内容,行为选择是由控制器执行的。
简单来说,控制器就是一个密集连接的神经网络。该网络的输入是级联的Z(从VAE获得的潜在状态3354的长度为32)和H(H的隐藏状态3354(RNN的长度为256))。这三个输出神经元对应三种行为,被缩放到合适的范围。
对话
为了理解这三个组件扮演的不同角色以及它们是如何工作的,我们可以想象它们之间发生的对话:
世界模型建筑插图(来源:https://arxiv.org/pdf/1803.10122.pdf)
VAE(看着64*64*3的最新观察):汽车(Z)方向的道路就像一条直路,有轻微的左转。
RNN:根据描述(Z)和控制者在最后一个时间步选择加速(act)的事实,我会更新我的隐藏状态(H),这样下一次观察可以预测为直路,但视野中有轻微的左转。
控制器:基于来自VAE的描述(Z)和来自RNN的当前隐藏状态(H),我的神经网络的下一个行为的输出将是[0.34,0.8,0]。
然后把这个行为传输到环境,环境会返回一个更新的观察,开始下一个循环。
现在我们来看看如何建立一个环境,让你可以训练你的赛车代理。
接下来我们来写代码吧!
第三步:建立你自己的环境
如果你用的是高配笔记本,可以在本地运行,但是我建议用谷歌云计算(https://cloud.google.com/compute/),它可以让你在短时间内使用一台功能强大的电脑。
以下代码已经在Linux(Ubuntu 16.04) ——中测试过。如果在Mac或Windows上运行,只需更改相关安装包的命令即可。
1.复制github项目(https://github.com/AppliedDataSciencePartners/WorldModels)
以下命令行可以帮助您导航到项目位置并输入项目:
git clone https://github.com/AppliedDataSciencePartners/WorldModels.git这个项目是通过世界模型文章的第一作者David Ha开发的有用的estool库(https://github.com/hardmaru/estool)重写的。
在训练神经网络的过程中,使用了带有TensorFlow后端的Keras,但在原文中,作者使用的是原TensorFlow。
2.设置虚拟环境
创建一个Python3虚拟环境(我用的是virutalenv和virtualenvwrapper)。
sudo apt-get install python-pip sudo pip install virtualenvsudo pip install virtualenvwrapperexport work on _ HOME=~/。virtualenvsource/usr/local/bin/virtualvwrapper . shmkvirtualenv-python=/usr/bin/python 3 world models S3。安装依赖包
sud apt-get install cmake swig python 3-dev zlib 1g-dev python-OpenGL mpich xvfbx server-xe phyr VNC 4 server 4。安装要求. txt
CD WorldmodelPip Install-R requirements . txt与赛车示例中的要求相比,这里的依赖包更多。建议您在Open AI Gym中为其他测试安装每个包,这可能需要额外的依赖包。
步骤4:生成随机事件。
对于赛车环境,VAE和RNN都可以在随机事件数据上训练3354,即每个时间步上随机行为产生的观察数据。其实我们用的是伪随机行为,可以在一开始就强制车辆加速,使其离开起跑线。
因为VAE和RNN独立于做出决策的控制者,所以我们需要确保在遇到不同的观察结果后选择不同的行为,并将它们存储为训练数据。
要生成随机事件,请运行以下命令行:
python 01 _ Generate _ data . pycar _ Racing-Total _ Episodes 2000-Start _ Batch 0-Time _ Steps 300如果在未显示的服务器上运行,请运行以下命令行:
XVB-Run-A-S \ ‘-screen 0 1400 x900 x24 \ ‘ python 01 _ Generate _ data . pycar _ Racing-Total _ Episodes 2000-Start _ Batch 0-Time _ Steps 300这将生成2000个事件(保存在10个批次中),每个事件最多有300个时间步长。
中存在两个文件。/data (*是批号)
Obs_data_*。npy(将64*64*3图形保存为numpy数组)
动作_数据_*。npy(存储3D行为)
第五步:训练VAE
只有obs_data_*。培训VAE需要npy文件。确保您已经完成了步骤4,以便这些文件位于。/data文件夹。
运行:
python 02 _ train _ VAE . py-start _ batch 0-max _ batch 9-new _ model这将在从0到9的每个批次中训练一个新的vae。
模型权重将存在于。/vae/weights.h5和- new_model标记告诉脚本从头开始训练模型。
如果weights.h5已经存在于这个文件夹中,并且没有- new_model标记,那么脚本将从这个文件中加载权重,并重新训练现有的模型。这样,你就可以成批地反复训练VAE。
VAE模式在。/vae/arch.py文件。
步骤6:生成RNN数据
现在我们已经训练了VAE,我们可以使用VAE来生成RNN的训练集。
Rn需要编码来自VAE的图像数据(z)和行为(a)作为输入,编码VAE在下一时间步的图像数据作为输出。
运行命令行以生成数据:
Python 03 _ generate _ RNN _数据. py-start _ batch0-max _ batch9从批次0到批次9会用到obs_data_*。npy和obs_data_*。npy文件,并将这两个文件转换成正确的格式,用于训练RNN。
两个文件将保存在。/data (*是批号)
Rn _ input _ *。npy(级联向量[z,a]被存储)
Rn _ output _ *。npy(存储下一个时间步长的矢量z)
第七步:训练RNN
RNN训练只需要rnn_input_*。npy和rnn_output_*。npy文件。确保您已经完成了第6步,这样您就可以在。/data文件夹。
运行命令行:
python 04 _ train _ rnn . py-start _ batch 0-max _ batch 9-new _ model这个可以在每批0到9的数据上训练新rnn。
模型重量将存储在中。/rnn/weights . h 5 . 3354 new _ model标签告诉脚本从头开始训练模型。
类似于VAE,如果文件夹中没有weights.h5,- new_model标记,也没有特殊说明,脚本会从文件中加载权重,继续训练现有模型。这样,你可以反复训练RNN。
Rn架构设置另存为。/RNN/arch.py文件。
第八步:训练管制员。
现在是有趣的部分!
到目前为止,我们只使用深度学习方法构建了可以将高维图像压缩到低维势空间的VAE,RNN可以预测势空间如何随时间变化。我们可以通过随机事件数据为VAE和RNN创建一个训练集。
为了训练控制器,我们可以使用强化学习,使用一种叫做CMA-ES(协方差矩阵自适应-进化策略)的算法。
由于输入是维数为288(=32 ^ 256)的向量,输出是维数为3的向量,因此我们有288 * 3 ^ 1=867个参数要训练。
CMA-ES的工作原理是:首先创建这867个参数的多个随机初始化副本(即“总体”)。然后在环境中测试该组中的每个元素,并记录其平均分。其实这和自然选择的原理是一样的,让得分最高的权重被“复制”,产生下一次迭代。
要在您的计算机上启动此过程,请使用适当的参数运行以下命令:
python 05 _ train _ controller . pycar _ racing-num _ worker 16-num _ worker _ trial 4-num _ epic 16-max _ length 1000-eval _ steps 25如果您正在未显示的服务器上运行,请运行以下命令:
xvb-run-s \ ‘-screen 0 1400 x900 x24 ‘ python 05 _ train _ controller . py car _ racing-num _ worker 16-num _ worker _ trial 2-num _ episode 4-max _ length 1000-eval _ steps
-num _ work _ trial 2:每个内核中要测试的总体中的元素数量(num_worker * num_work_trial给出每次迭代后的总体大小)
-num _ epic 4:组内各元素的epic得分数(此得分为epic得分的平均奖励)
-max _ length 1000:epic中的最大时间步数。
-eval _ steps 25:100个情节中的最佳权重集的评估之间的迭代次数。
-init _ opt。/controller/car _ racing . CMA . 4.32 . es . PK默认情况下,控制器会从头开始运行脚本,并将进程的当前状态保存在控制器目录的pickle文件中。此参数允许用户通过指向相关文件,从最后一个存储点继续训练。
每次迭代后,算法的当前状态和最佳权重集将作为输出存储在。/控制器文件夹。
步骤9:可视化代理
本文写作期间,我成功训练了代理人,经过200代的训练,我得到了833.13的平均分。本文提到的步骤和参数都是使用Ubuntu 16.04、18 vCPU和67.5GB RAM机器在Google Cloud上训练的。
论文作者经过2000代的训练,得到了906的平均分,这是目前为止这个环境下的最高分,但是他们使用的配置稍高一些(比如在数据上训练10000集,组数达到64,64核,每个实验16集等等。).
要显示控制器的当前状态,请运行:
python model . pycar _ racing-filename。/controller/car _ racing . CMA . 4.32 . best . json-render _ mode-record _ video-filename:你要附加到控制器上的权重的JSON的路径。
– render_mode:在屏幕上渲染环境。
– record_video:将mp4文件输出到。/video文件夹,每集播放一次。
– final_mode:控制器运行100集测试输出的平均结果。
演示如下!
第十步:梦想学习
这已经很酷了,但是这篇文章接下来的部分令人印象深刻,我认为对人工智能意义重大。
在另一个环境中,Doomtakecove(https://github . com/PP aquette/gym-doom),这篇文章显示了惊人的结果。在这里,目标是移动代理,以避免火球,并尽可能长的时间生活。
作者展示了代理如何在受VAE/RNN启发的梦境(虚拟环境)中学习玩游戏,而不是在真实环境中。
只需要训练RNN预测下一时间步死亡的可能性。通过这种方式,VAE/RNN联合体可以独立打包成一个环境,用于训练管制员。这是“世界模式”的核心理念。
我们可以把梦的学习总结如下:
一个代理的初始训练数据只是与真实环境的随机交互。通过这种方式,代理建立了对世界如何“工作”的潜在理解。——世界的自然分组,物理和代理人的行为将如何影响世界。
给定一项任务,智能将使用这种潜在的理解来建立最佳策略,而无需在现实世界中测试该任务。因为它会把它所理解的环境的模型作为“场地”,并试图解决问题。
也可以简单解释为婴儿学走路。这两者之间有惊人的相似之处,但也许比简单的类比更深刻,这使它成为一个真正迷人的研究领域。

其他教程

送一面锦旗给男警,他们被认定为逃犯。今年一季度沙雕新闻来袭哈哈哈。

2022-8-21 8:47:21

其他教程

托福必备词汇表(托福写作常用词汇)

2022-8-21 8:49:30

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索