请选择 进入手机版 | 继续访问电脑版

查看: 698|回复: 4

[技术] 使用Unity ML-Agents Toolkit训练的可爱柯基犬Puppo

[复制链接]

1216

主题

1921

帖子

2万

贡献

管理员

Rank: 9Rank: 9Rank: 9

积分
25235
QQ
发表于 2018-10-10 04:08:42 | 显示全部楼层 |阅读模式
创作游戏是一个充满创造性的过程,涉及许多具有挑战性的步骤,包括定义游戏内容和逻辑,构建资源和动画,指定NPC行为,调整难度和平衡,以及发布前通过真实玩家进行测试游戏。我们相信机器学习可应用于游戏创作整个过程,本文将聚焦其中一个挑战:指定NPC行为。

传统意义而言,NPC行为是使用脚本和行为树硬编码实现的。其中,冗长的规则表会处理NPC周围环境的信息,决定下一步行为。随着游戏更新,编写和维护这些规则可能非常耗时。

强化学习为定义NPC行为提供了一个很好的替代方案,你可以通过在NPC实现预期目标时提供奖励来训练NPC,而不是手动定义观测到动作映射。

小狗的训练方法
使用强化学习训练NPC的过程非常类似我们训练小狗取物。

我们会给小狗展示一个零食,然后扔出木棍。起初小狗会四处游荡,不知道该怎么做,直到它最终捡起木棍并将其带回来,会得到零食奖励。经过几次训练后,小狗就知道取回木棍是得到奖励的最好方法,然后会继续这样做。

这就是强化学习训练NPC行为的方法。每当NPC正确完成任务时,我们会给NPC提供奖励。通过多次模拟该游戏,等同于多次取物训练,NPC会构建一个内部模型,用于定义每个实例中需要执行什么行为来获取最大化的奖励,从而得到理想行为。

因此,我们不用为NPC的每个观测制作并维护低级动作,我们只需要在正确完成任务时提供高级奖励,就可以让NPC学会合适的低级行为。

柯基犬Puppo
为了展示这种方法的有效性,我们制作了演示移动游戏“Puppo, The Corgi”(柯基犬Puppo),并在Unite Berlin上展示。

https://v.qq.com/x/page/e0738wbn7db.html

玩家可以滑动屏幕来给Puppo扔出木棍,然后Puppo会将木棍带回来。虽然更高级别的游戏逻辑使用了传统的脚本功能,但小狗是使用强化学习来学习行走、奔跑、跳跃和取回木棍的。而不是使用动画或脚本行为,柯基犬的运动仅通过强化学习进行训练。

Puppo不仅看起来非常可爱,而且它的动作完全受到物理引擎控制,这意味着小狗的动作会受周围刚体的影响。

Puppo在Unite Berlin上大受欢迎,许多开发者都想知道它是如何制作的。所以我们决定发表这篇文章,并提供该项目以供开发者进行尝试。

下载Unity项目:
https://s3.amazonaws.com/unity-ml-agents/demos/v0.5/PuppoDemo.zip

创作游戏Puppo
本文首先会介绍训练小狗前的要求和准备工作,然后分享训练小狗时得到的经验,最后说明使用Puppo制作游戏的详细步骤。

1、准备工作
首先,让我们定义强化学习中的几个重要概念。

强化学习的目标是让代理学习策略。代理是与环境交互的实体,每个学习阶段中,代理会收集有关环境状态的观测,执行动作,然后获得该动作的奖励。

策略会根据得到的观测定义代理的动作。在代理执行合适行为时,我们可以通过奖励代理来制定策略。

在我们的示例中,环境是游戏场景,代理是Puppo。Puppo需要学习一个策略,以便和我们一起玩取物游戏。类似我们训练真正的小狗,我们可以通过适当的奖励训练Puppo。

我们使用Unity内置的Ragdoll Wizard工具来制作Puppo,它的腿通过关节动力控制。因此,为了让Puppo学会如何到达目标位置,必须首先学会如何旋转关节动力来进行移动。

01.png


真正的小狗通过视觉和其它感官定位自己并决定去哪里,Puppo使用相同的方法。它会收集有关场景的观测结果,例如:与目标之间的距离,自己和目标的相对位置以及自己腿部的方向,从而决定下一步要执行什么动作。Puppo的示例中,动作会描述如何旋转关节动力来进行移动。

每次Puppo执行动作后,我们都会给代理提供奖励,奖励包括:

02.png

  • 方向增益:当Puppo朝着目标移动时,我们会给予奖励。该功能使用Vector3.Dot()方法来实现。
  • 时间惩罚:我们会在每个动作时给予Puppo固定惩罚。这样Puppo将学会尽可能快地取回棍子,避免过多的时间惩罚。
  • 旋转惩罚:如果Puppo旋转次数过多,它会受到惩罚。现实中,如果小狗转得太多,它会头晕目眩。为了使游戏更为真实,Puppo转身太快时会受到惩罚。
  • 获取目标奖励:最重要的是Puppo到达目标位置时会得到奖励。

2、训练Puppo
现在Puppo已准备好进行学习,我们在笔记本电脑上花费了二个小时让小狗学会有效地奔向目标。

在训练过程中,我们注意到一个有趣的行为。小狗只用了一分钟就学会了行走。随着训练的继续进行,小狗学会了奔跑。不久以后,当Puppo在奔跑过程中突然转弯时,它会开始翻转身体。小狗学会了如何返回,就像真正的小狗一样。这样笨拙的行为非常可爱,你可以在此时停止训练,将它直接应用在游戏中。

03.gif


如果你有兴趣自己训练Puppo,可以查看项目中的指南并进行操作,其中包含如何设置训练过程的详细步骤,以及应该选取的参数。

3、使用Puppo创建游戏
为了制作“Puppo, The Corgi”游戏,我们需要定义游戏逻辑,控制玩家与训练模型之间的交互。因为Puppo已经学会如何跑向目标,我们需要实现在游戏中修改Puppo目标的逻辑。

在游戏模式中,我们会在玩家扔出木棍后设置目标。当Puppo到达木棍位置后,我们会将Puppo的目标改为玩家在场景中的位置,于是Puppo会将木棍带给玩家。这样做是因为,使用脚本定义游戏流逻辑的话,训练Puppo向对象移动的过程会更简单。

我们相信,机器学习和传统游戏开发方法可以结合使用,从而发挥二个方法的最佳效果。“Puppo, The Corgi”包含小狗的预训练模型,可以直接使用,或部署到移动设备。

04.gif


小结
我们希望本文能帮助你了解ML-Agents Toolkit在游戏开发中能够实现什么功能,更多Unity机器学习相关内容尽在Unity官方中文论坛(UnityChina.cn)!

1

主题

5

帖子

100

贡献

初级UU族—2级

Rank: 2

积分
100
发表于 2018-10-10 04:39:41 | 显示全部楼层
看起来不错

0

主题

2

帖子

30

贡献

初级UU族—1级

Rank: 1

积分
30
发表于 2018-10-12 13:40:30 | 显示全部楼层
我使用2018.2.1.0发打开工程FetchTrainingScene场景后,运行报错“UnityAgentsException: The Communicator was unable to connect. ”,想知道是什么原因?需要科学上网吗?

0

主题

5

帖子

50

贡献

初级UU族—2级

Rank: 2

积分
50
发表于 2018-11-8 02:11:19 | 显示全部楼层
收藏了,多谢楼主

0

主题

2

帖子

25

贡献

初级UU族—1级

Rank: 1

积分
25
发表于 2018-11-29 05:40:56 | 显示全部楼层
guanxien 发表于 2018-10-12 13:40
我使用2018.2.1.0发打开工程FetchTrainingScene场景后,运行报错“UnityAgentsException: The Communicator ...

底层是用socket跟Python通信的,应该是你没有开启tensorflow
如果只是期望运行测试一下,把brain type设置为player即可
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表