查看原文
其他

Unity机器学习项目实战:3D平衡小球

2017-11-27 Unity官方 Unity官方平台

本文将分享如何安装Unity机器学习代理工具(Unity Machine Learning Agents),建立示例项目运行环境,并将训练好的模型载入到Unity环境中。

Unity机器学习代理工具包中含很多示例环境项目,它们可以用作新建项目时的模板,或是用于测试新的机器学习算法,以确保算法能正常运行。



在本文中使用的案例是3D平衡小球(3D Balance Ball)的运行环境。该环境包含多个平板和小球。这些平板可以通过自身的调整来平衡,保持小球不掉离平板。每个平板都是一个代理,通过保持小球在平板上的时间得到奖励。一旦小球掉出平板,则会扣除奖励。这个训练过程的目的在于让平板学习永远不丢球。 


开始准备

设置Unity环境

运行启动Unity 2017.1,在Unity中打开unity-environment文件夹。在启动窗口中,选择Open,并在弹出的文件浏览窗口中,选择unity-environment,点击Open。

注意:如遇见弹出警告信息为”Opening Project in Non-Matching Editor Installation”,请直接忽略。


打开项目后,在Project窗口,定位到文件夹Assets/ML-Agents/Examples/3DBall/,双击Scene文件的图标,载入所有环境资源。


点击菜单Edit -> Project Settings -> Player,选中Resolution and Presentation里的Run in Background属性。


将Resolution and Presentation中的Display Resolution Dialog属性,选择Disabled。


在左边的场景层级窗口中,展开Ball3DAcademy游戏对象,并选中它的子对象Brain3DBrain,在右边的检视窗口中查看属性。

注意:该对象的Type of Brain设置为External。


点击File -> Build Settings,选择构建的目标平台。可以勾选Development Build来记录调试信息。


点击Build,保存环境文件到python文件夹中。

用强化学习训练大脑

测试Python API

要启动jupyter,在命令行中输入:jupyter notebook。在浏览器中打开localhost:8888,访问notebook文件。



若要确保你的环境和Python API正常运行,你可以在上述窗口中打开python/Basics Jupyter notebook。这个笔记本文件包含一个Python API的简单演示。在这个笔记本文件中,请记得把env_name变量赋值为你刚刚生成的那个文件名。

 

用PPO训练模型

下一步我们训练代理,让它在平台上平衡小球的位置,我们会使用一个叫做近端策略优化(Proximal Policy Optimization),简称PPO的强化学习算法。这个算法经过实验,证明是十分安全、高效且比其他强化学习算法实用性更强的,所以我们选择这个算法来作为Unity机器学习代理的示例算法。

 

如果想要了解更多关于近端策略优化算法的信息,请参阅OpanAI发布的博客文章:

https://blog.openai.com/openai-baselines-ppo/



要在Ball Balance环境中训练代理,请按以下步骤操作:

  • 在Jupyter中打开python/PPO.ipynb

  • 修改env_name的值为刚刚生成的环境文件的文件名

  • 按自己需求修改run_path目录

  • 运行PPO.ipynb的代码,注意不要运行"Export the trained Tensorflow graph."这行文字后的代码。

观察训练过程

要更仔细地观察训练过程,你可以使用Tensorboard。在命令行中,切换到前面提到的python文件夹下,输入:tensorboard --logdir=summaries


然后在浏览器中打开localhost:6006。

 

 从Tensorboard上,你会看到以下6个变量的统计数据:

  • 累计回报(Cumulative Reward):所有代理各自的平均累计奖励。在成功的训练过程中,这个变量应该会增大。

  • 数值损失(Value Loss) :数值函数更新时的平均损失。这关系到模型是否能预测每个状态下的数值。在成功的训练过程中,这个变量会减小。

  • 策略损失(Policy Loss) :策略函数更新时的平均损失。这关系到策略(决定行为的过程)的变化大小。在成功的训练过程中,这个变量的大小会减小。

  • 事件长度(Episode Length) :设定环境下,所有代理中每个事件的平均长度。

  • 数值估计(Value Estimates) :代理所访问的所有状态下的平均数值估计。在成功的训练过程中,这个变量数值会增大。

  • 策略信息量(Policy Entropy):这个变量告诉你模型的决定随机度有多大。在成功的训练过程中,这个变量会缓慢减小。如果它减小得太快,beta hyperparameter应该会增大。


将训练好的模型载入Unity环境

当训练过程显示的平均回报大于等于75时,并且模型已经保存过后。你可以通过中止执行代码来停止训练。现在你就已经有训练好的TensorFlow模型。你必须将保存的模型转换为Unity可使用的格式,这样就可以直接通过以下步骤载入到Unity项目中。

  

配置对TensorFlowSharp的支持

因为对TensorFlowSharp的支持目前还处于实验阶段,默认情况下它是被禁用的。要打开它,你必须按如下步骤操作。


请注意Internal Brain模式只在完成以下步骤后才能使用。

  • 确保使用的是Unity 2017.1以上版本。

  • 确保TensorFlowSharp插件已导入到Assets文件夹中。包含这个插件的插件包可以在这里下载(https://s3.amazonaws.com/unity-agents/TFSharpPlugin.unitypackage)。双击打开该文件,导入到Unity中。

  • 菜单选择Edit -> Project  Settings -> Player。

  • 在Inspector检视窗口中对于你选择的所有平台(PC, Mac, Linux Standalone, iOS ,Android)这样操作:打开Other Settings; 在Scripting Runtime Version属性中选择Experimental (.NET 4.6 Equivalent);在Scripting Defined Symbols属性中,加入ENABLE_TENSORFLOW。

  • 重启Unity编辑器。

将训练好的模型载入Unity

  • 现在运行之前那个notebook文件脚本里"Export the trained TensorFlow graph"后的代码,创建出<env_name >.bytes文件(也就是用env_name变量作为文件名,格式为.bytes的文件)

  • 将<env_name >.bytes文件从python/models/ppo/目录下移动到unity-environment/Assets/ML-Agents/Examples/3DBall/ TFModels/目录中。

  • 打开Unity编辑器,选择上面提到的3DBall场景。

  • 从场景的层级窗口选择Ball3DBrain对象

  • 将Type of Brain改为Internal。

  • 将<env_name>.bytes文件从项目窗口拖到3DBallBrain 检视窗口的Graph Model中。

  • 将Graph Placeholder的size值设为1。

  • 添加名为epsilon的占位符,设定类型为floating  point,范围从0到0。

  • 点击编辑器上方的Play按钮。

    注意:第7步和第8步是有必要的,因为3DBall是个持续的控制环境,而TensorFlow模型会用噪音参数来决定行动。但那样的情况下控制过程是离散的,所以不需要epsilon变量)

小结

如果你按照步骤操作,现在可以看到在Unity中,训练好的模型已经能自行控制平衡小球的行为。你可以重新生成Unity文件,然后独立运行该模型,应用代理新学习的行为。后面我们还将继续为大家分享更多机器学习相关教程在Unity官方社区(unitychina.cn),请保持关注!


Unity官方活动

点击“阅读原文”进入Unity官方中文社区

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存