Puppo,柯基犬:使用Unity ML-Agents工具包的可爱过载

构建一个游戏是一个创造性的过程,涉及许多具有挑战性的步骤,包括定义游戏概念和逻辑、构建素材和动画、指定NPC行为、调整难度和平衡,最后在发布前与真实玩家测试游戏。我们相信机器学习可以应用于整个创造性过程,在今天的博客文章中,我们将重点关注这些挑战之一:指定NPC的行为。
传统上,NPC的行为是通过脚本和行为树硬编码的。这些(通常很长的)规则列表处理有关NPC周围环境的信息(称为观察),以决定其下一步行动。随着游戏的发展,这些规则的编写和维护可能会耗时。强化学习为定义NPC的行为提供了一种有前景的替代框架。更具体地说,您可以通过在NPC达到期望目标时给予奖励来训练NPC,而不是手动定义观察到的行动映射。
使用强化学习训练NPC与我们训练小狗玩接球非常相似。我们给小狗一个奖励,然后扔出棍子。起初,小狗四处游荡,不知道该做什么,直到它最终捡起棍子并带回来,迅速获得奖励。经过几次会话,小狗学会了取回棍子是获得奖励的最佳方式,并继续这样做。
这正是强化学习在训练NPC行为中的工作原理。每当NPC正确完成任务时,我们都会给它一个奖励。通过多次游戏模拟(相当于多次接球会话),NPC建立了一个内部模型,了解在每个实例中需要执行什么动作以最大化其奖励,从而实现理想的期望行为。因此,我们只需在任务正确完成时提供高层次的奖励,而不必为NPC的每个观察创建和维护低级动作,NPC就会学习适当的低级行为。
为了展示这种技术的有效性,我们构建了一个演示游戏,“小狗(读作‘Pup-o’),柯基犬”,并在Unite Berlin上展示。这是一款移动游戏,您可以与一只可爱的小柯基犬玩接球。通过在屏幕上滑动将棍子扔给小狗,小狗会把它带回来。虽然高级游戏逻辑使用传统脚本,但柯基通过强化学习学习走路、跑步、跳跃和捡球。柯基的动作完全通过强化学习训练,而不是使用动画或脚本行为。它不仅看起来超级可爱,而且柯基的运动完全由物理引擎驱动。这意味着例如柯基的运动可以受到周围刚体的影响。
Puppo在Unite Berlin变得如此受欢迎,以至于许多开发者问我们是如何制作它的。这就是我们决定写这篇博客文章并发布项目供您自己尝试的原因。
要开始,我们将介绍您需要做的要求和初步工作,以训练柯基。然后,我们将分享我们训练它的经验。最后,我们将介绍我们创建以Puppo为英雄的游戏所采取的步骤。
在我们进入细节之前,让我们定义强化学习中的几个重要概念。强化学习的目标是为代理学习一个策略。代理是与其环境交互的实体:每个学习步骤,代理收集关于环境状态的观察,执行一个动作,并为该动作获得奖励。策略定义了代理如何根据其感知的观察进行行动。我们可以通过在代理的行为适当时奖励它来开发策略。
在我们的案例中,环境是游戏场景,代理是Puppo。Puppo需要学习一个策略,以便它可以和我们一起捡球。类似于我们如何用零食训练真实的狗捡球,我们可以通过适当地奖励Puppo来训练它。
我们使用了一个布娃娃(系统)来创建Puppo,它的腿由关节电机驱动。因此,为了让Puppo学习如何到达目标,它必须首先学习如何旋转关节电机,以便能够移动。
一只真正的狗使用视觉和其他感官来定位自己并决定去哪里。Puppo遵循相同的方法。它收集关于场景的观察,例如与目标的接近程度、它与目标之间的相对位置以及它自己腿部的方向,以便决定接下来采取什么行动。在Puppo的情况下,行动描述了如何旋转关节电机以便移动。
在Puppo执行每个动作后,我们会给代理一个奖励。奖励包括:
- 方向奖励:当Puppo朝着目标移动时,我们会奖励它。为此,我们使用Vector3.Dot()方法。
- 时间惩罚:我们在每个动作中给Puppo一个固定的惩罚(负奖励)。通过这种方式,Puppo将学习尽快获取棍子,以避免严重的时间惩罚。
- 旋转惩罚:我们惩罚Puppo过度旋转。如果一只真正的狗旋转太多,它会感到头晕。为了让它看起来真实,当Puppo转身太快时,我们会惩罚它。
- 到达目标奖励:最重要的是,我们奖励Puppo到达目标。


现在小狗准备好学习了。我们花了两个小时在笔记本电脑上让狗有效地学会朝目标奔跑。在训练过程中,我们注意到一个有趣的行为。狗在大约1分钟内学会了相当快地走路。然后,随着训练的继续,狗学会了奔跑。不久之后,当它试图在奔跑时突然转弯时,它开始翻倒。幸运的是,狗学会了像真正的狗一样重新站起来。这种笨拙的行为是如此可爱,以至于你可以在这一点上停止训练,并直接在游戏中使用它。
如果你有兴趣自己训练小狗,可以按照项目中的指示进行。它包括如何设置训练和你应该选择哪些参数的详细步骤。有关如何训练代理的更详细的操作指引,请访问ML-Agents文档网站。
要创建“柯基犬小狗”游戏,我们需要定义游戏逻辑,让玩家与训练好的模型互动。因为小狗已经学会了奔向目标,我们需要在游戏中实现改变小狗目标的逻辑。
在游戏模式中,我们将目标设置为玩家刚扔出的棍子。当小狗到达棍子时,我们将小狗的目标更改为场景中玩家的位置,以便小狗将棍子还给玩家。我们这样做是因为在用脚本定义游戏流程逻辑时,训练小狗朝目标移动要容易得多。我们相信机器学习和传统游戏开发方法可以结合起来,以获得两种方法的最佳效果。“柯基犬小狗”项目包括一个预训练的模型,你可以立即使用,甚至可以在移动设备上部署。
我们希望这篇博客文章能阐明使用ML-Agents工具包进行游戏开发所能实现的目标。
想深入了解这个项目的代码吗?我们发布了该项目,您可以在这里下载。要了解如何使用ML-Agents工具包,您可以找到我们的官方文档和一步一步的初学者指南在这里。如果您有兴趣深入了解强化学习背后的数学、算法和理论,我们与Udacity合作提供了一个强化学习纳米学位。
我们希望听到您使用ML-Agents工具包为您的游戏的体验。欢迎通过我们的GitHub问题页面或直接给我们发邮件与我们联系。
祝创作愉快!
