Unity机器学习项目实战:3D平衡小球
本文将分享如何安装Unity机器学习代理工具(Unity Machine Learning Agents),建立示例项目运行环境,并将训练好的模型载入到Unity环境中。
Unity机器学习代理工具包中含很多示例环境项目,它们可以用作新建项目时的模板,或是用于测试新的机器学习算法,以确保算法能正常运行。
在本文中使用的案例是3D平衡小球(3D Balance Ball)的运行环境。该环境包含多个平板和小球。这些平板可以通过自身的调整来平衡,保持小球不掉离平板。每个平板都是一个代理,通过保持小球在平板上的时间得到奖励。一旦小球掉出平板,则会扣除奖励。这个训练过程的目的在于让平板学习永远不丢球。
开始准备
下载Unity在GitHub上的ml-agents代码库。
地址:https://github.com/Unity-Technologies/ml-agents
使用Unity 2017.1 或以上版本
配置系统环境,请参考以下配置方式。
设置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官方活动
11月29日,Unity教育峰会武汉站, 报名仅剩最后2天!
11月29日晚8点,Unity着色器训练营第二期要开营了,快来参加吧!
订阅Unity年度最优折扣,更为中国用户提供发票!
Unity Pro专业版6折,折扣码:FS17PCNPRO40
Unity Plus加强版5折,折扣码:FS17PCNPLUS50
请访问下图中的二维码,立即购买!
点击“阅读原文”进入Unity官方中文社区!