查看原文
其他

Unity游戏开发中的AI(二):基于Q-Learning的强化学习

2017-08-30 Unity官方 Unity官方平台

我们曾经为大家分享了游戏开发中的AI(入门篇),今天这篇文章将延续之前的内容,探讨如何将上下文老虎机(Contextual Bandits)问题扩展为完全的强化学习问题。在此过程中,我们将演示如何利用Q函数学习过的代理来预估长期在特定条件下采取特定行为的值。本例仅使用一个简单的网状世界以及Q-Representation列表。其中的基本理念可以应用于任意游戏。

 

 

您可以点击【阅读原文】下载Q-Learning Demo。


Q-Learning算法


上下文老虎机(Contextual Bandit)回顾

强化学习(Reinforcement Learning)的目的是在特定环境下训练一个代理,通过学习以实现特定环境的最大化预期利益。在游戏开发中的AI(入门篇)一文中,环境是相对静态的,环境状态也很简单,就是代理可能会在3个箱子其中之一,而行为就是选择打开哪个宝箱。我们的算法为每一对状态-行为学习Q函数,Q函数则对应在该状态下随着时间推移采取某种行为而获得的预期利益。这个问题被称作“上下文老虎机”。

 


强化学习问题

要将前面的上下文老虎机问题转换为强化学习问题,还缺少两个关键因素:稀有奖励与状态转换。稀有奖励是指代理并非每次采取行为都可以获得奖励。有时奖励会“延迟”,因为有些行为可能不是必须的,也可能要在一系列非必须行为之后才能获得奖励。更具体的示例是,代理可能跟随正确路径,但只有到达终点才能获得奖励,而非走过的每一步都有奖。尽管中途没有奖励,但走过的每一步对到达终点来说都至关重要。我们需要一种方式来执行“信用分配”,即让代理知道早期的行为是有价值的,尽管只是间接价值。

 

第二个缺失的因素是强化学习中状态之间的转换。有了状态转换之后,我们的行为不再是仅根据奖励函数R(s, a) ⇨  r来获得奖励,还会根据状态转换函数P(s, a) ⇨ s’来生成新的状态。具体示例是,沿着路径走过的每一步都会使代理到达路径的新位置,也就是新的状态。因此我们希望代理不仅要学习采取行动优化目前可能的奖励,还要采取行动向可能提供更多奖励的状态移动。

 

 

 

贝尔曼更新

虽然新增的两个复杂元素初看起来并不相关,但确是直接相关联的。两个元素都隐含了影响代理的未来最终状态及其可能获得的奖励。通过这种质朴的理解,我们可以利用这种关系来学习在这些情形下应采取的最优行为。即在一个“真正”最优的Q-函数(只存在于理论)中,当前状态的估值和行为可以被分解为直接奖励r加上在下一状态中代理采取行动的最大预期奖励乘以一个折扣系数:

这就是贝尔曼方程(Bellman Equation)( 也被称作动态规划方程(Dynamic Programming Equation),由理查·贝尔曼(Richard Bellman)发现),可以按如下形式表述:

此处的𝛄 (gamma)是一个折扣因子,决定了代理对未来可能获得奖励的关注程度。如果其值为1.0,则代理对未来所有的奖励一视同仁,在永无止境的训练中,估值可能会增加到无穷大。为此,𝛄应在0到1之间取值,典型取值范围是0.7-0.99。


贝尔曼方程有效的原因在于:它提供了一种自动更新Q-函数的方法。Q*(s, a)是一个优化Q-函数。但即使当前的下一状态的次优Q-value估值也有助于让当前状态的估值更加精确。由于每一步都主要依赖于真正的奖励,所以可以相信Q-value估值自身会缓慢改进,并不断趋近真实值。我们可以使用贝尔曼方程进行新的Q-Learning更新:

这个方程和之前上下文老虎机中使用的更新算法类似,不同点是Q-target现在包含下一步中未来期望奖励的折扣值。


 

探索

为了让代理更充分地探索状态空间,我们使用了一种名为epsilon-greedy的探索更新形式。使用时将epsilon-greedy中ϵ初值设置为1.0,每次代理采取行动将该值减少一部分,而当代理选择行动时,可选最贪婪的行动argmax(Q(s, a)),或者采用概率为ϵ的随机行动(在搜索初期增加随机性,提高搜索范围空间,随着代理积累经验,逐步降低随机影响)。直觉就是训练开始时,代理的Q-value 估值与真实值相差较大,但通过对整个世界的学习后,ϵ值减少,Q-函数就慢慢与真实环境的Q-函数更一致,而使用Q函数采取行动的精确性也不断提高。


Unity GridWorld


 

蓝色的方块是代理,红色是障碍物,绿色是目标位置,绿色和红色的球体代表GridWorld中每种状态的估值。


为了演示Q-Learning代理,我们使用Unity创建了一个简单的GridWorld环境。其中包含:


  1. 一个在世界中随机位置出现的代理;

  2. 一个随机的目标位置,我们希望代理通过学习向目标移动;

  3. 随机放置的障碍物,我们希望代理学会躲避;


环境状态(s)是一个整数,代表网格位置,四个行为(a)包括上、下、左、右,奖励(r)规则为:移动到带有目标的状态时+1,移动到带有障碍物的状态时-1,为了鼓励代理快速移动到目标,每次移动时-0.05。每个阶段会在移动100次后,或者在代理到达既非目标又非障碍物的状态时(碰到障碍时)结束。代理的Q-value存储在表中,行代表状态,列代表可采取的行为。

 


大家可以点击【阅读原文】在浏览器中测试上述环境及代理,也可以从此处下载对应的Unity工程,自行修改用并应用于自己的游戏。随着代理不断探索环境,不同颜色的球将会出现在网格世界的每个状态中,这对应当前状态下代理的平均Q-value估值,一旦代理完成优化策略的学习,这些球就会形成从开始到目标位置的直接值渐变。


后续计划


此处的代理和环境代表了Q-Learning问题的经典表格,无需为演示环境和常见游戏场景不一致而揪心,Q-Learning算法从90年代被提出至今,它已经历了一系列重大的改进,Q学习可被应用于更加多变的动态场景中。Deepmind的Deep Q网络的一个主要示例,就是用于学习直接从像素中进行几十种不同的ATARI游戏,像这里仅用一个查找表根本不可能实现的壮举。为了实现这个目标,他们用到了一个由Deep Neural Network(DNN)网络控制的代理。通过神经网络,它可以学习将广义Q-函数应用于完全不可见的状态,例如显示器上少见的像素组合。


在后面的几周中,我们会公布一系列算法的接口和示例工程,可以在Unity游戏和仿真应用中训练类似的深度强化学习代理。您可以查看视频,先简要了解这些工具的功能。初次发布版本将有些限制,主要用于研究、工业以及游戏的QA测试。我们非常乐于看到在Unity中利用现代深度学习方法来学习游戏行为,希望当此项技术成熟时,可以引爆机器学习技术在游戏开发中的潜力,例如控制游戏中复杂的NPC行为与游戏动态等等。我们尚处于探索深度学习技术应用于游戏开发的初期阶段,也希望大家陪伴我们一起踏入后续的旅程。

 

推荐阅读

游戏开发中的AI (入门篇)

Asset Store好玩又好用的AI脚本插件

Unity粒子遇上着色器,引爆视觉特效

Unity如何打造免费移动游戏盈利宝典?

告别UnityScript,Unity将仅支持C#脚本编程


近期Unity官方活动


今晚8点Unity官方技术团队直播课程,全面解析使用Unity与ARkit开发AR游戏,带大家进一步了解Unity与ARKit合璧为AR应用带来的神奇魅力。扫描二维码,直达直播页面:



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

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

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