深度学习

理解和使用深度学习网络

使用强化学习玩乒乓

下面这篇文章来自Christoph Stockhammer,今天在这里展示如何将强化学习用于一项非常严肃的任务:玩游戏。如果您想了解更多关于强化学习的知识,请查看免费的2小时的培训强化学习入口

在20世纪70年代,《Pong》是一款非常流行的电子街机游戏。这是一款模拟乒乓球的2D电子游戏,即你拥有一个球拍(一个矩形),你可以垂直移动并尝试着去击打一个“球”(一个移动的正方形)。如果球击中了游戏的边界框,它会像台球一样反弹回来。如果你丢了球,对手得分。

随后,单人改编游戏《Breakout》问世,在这款游戏中,球可以摧毁屏幕上方的一些方块,球棒可以移动到屏幕下方。结果,蝙蝠现在是水平移动而不是垂直移动。

在这篇文章中,我将描述如何教会AI玩一种不同的《Pong》游戏,即在天花板上让球反弹回来。

正如标题所示,我们将使用强化学习来完成这项任务。在我们的场景中,这绝对是多余的,但谁在乎呢!简单的街机游戏是强化学习的第一步。如果你对RL不熟悉,看一看简短指南这个系列视频这解释了一些基本的概念。

粗略地说,实施强化学习通常包括以下四个步骤:

  1. 对环境建模
  2. 确定培训方法
  3. 提出了一个奖励函数
  4. 培训代理

对于实现,我们将使用强化学习工具箱它在MATLAB的R2019a版本中首次发布。完整的源代码可以在这里找到:https://github.com/matlab-deep-learning/playing-Pong-with-deep-reinforcement-learning.让我们开始吧。

模拟环境

这实际上需要4个步骤中最多的工作:你必须执行基本的物理机制,即如果球击中游戏边界或球棒或只是穿过屏幕会发生什么。另外,你想要可视化当前的状态(这在MATLAB中是非常简单的)。强化学习工具箱提供了一种基于MATLAB代码或Simulink模型定义自定义环境的方法,我们可以利用这些模型来建模Pong环境。万博1manbetx为此,我们继承了rl.env.MATLABEnvironment并实现了系统的行为。

classdef Environment < rl. Environment . matlabenvironment属性(相应地设置属性的属性)属性指定并初始化环境的必要属性球移动的极限XLim = [-1 1]球移动的极限YLim = [-1.5 1.5]%球的半径BallRadius = 0.04%恒定球速球速度= [2 2]

完整的源代码可以在这篇文章的末尾找到。虽然我们可以很容易地将环境可视化,但我们并没有使用游戏截图作为强化学习的信息。这样做是另一种选择,并且更接近于仅依靠视觉信息的人类玩家。但它也需要卷积神经网络,需要更多的训练。相反地,我们将游戏的当前状态编码为7个元素的向量,我们称之为观察:

1 2 3. 4 5 6 7
当前球的x位置 球当前的y位置 改变球的x坐标 球y轴位置的变化 球棒的x位置 球棒x位置的变化 对球棒施加的力

很容易看出这是如何捕捉到游戏当前状态的所有相关信息的。第7个元素(“Force”)可能需要更详细的解释:

力基本上是动作的缩放版本,即向右或向左移动球棒。这意味着我们将代理的最后一个动作作为观察的一部分进行反馈,引入一些记忆的概念,因为代理可以通过这种方式访问之前的决策。

我们可以从球的随机初始方向开始模拟,直到球触地。如果球落到地板上,比赛就结束了。

确定培训方法

一般情况下,训练算法的选择受动作和观察空间的影响。在我们的例子中,观察值(包含7个元素的向量)和操作空间(标量值)都是连续的,这意味着它们可以假设特定范围内任何浮点数的值。例如,我们将动作限制在[-1,1]的范围内。同样地,球的x和y位置不允许超过特定的阈值,因为球必须保持在游戏的边界内。

对于本例,我们使用DDPG (深度确定性政策梯度)代理。名称指的是具体的培训方法,会有其他的选择也对于培训本身,我们需要两个组成部分演员和一个评论家

这个演员

行为人决定在任何给定的情况下采取何种行动。在每个时间步中,它从环境中接收7个观察结果(如上表所示),并输出一个动作,一个介于-1到1之间的数字。这个动作对应于快速向左移动球棒(-1),向右移动球棒(+1)或完全不移动球棒(0),所有中间级别都是可能的。该actor是一个具有三层完全连接和重u激活的神经网络,该神经网络由从正态分布中采样的随机值初始化。输出的值在-1到1之间。

评论家

批评家是一个实例,计算行动者的行动在长期内的期望回报,基于最后的行动和最后的观察。因此,批评家接受两个输入参数。与actor类似,批评家由几个完全连接的层组成,然后是reLu层。现在,我们还没有讨论任何奖励,但很明显,演员的表现(没有双关语)可能非常好(没有错过一个球)或糟糕(没有成功击中一个球)。评论家应该预测演员的决定的长期结果会是什么。

我们可以用deepNetworkDesigner通过拖拽和连接库中的层来定义演员和评论家网络的应用程序。在截图中,你可以看到演员网络(左)和评论家网络(右,注意两个输入路径)。您还可以从应用程序导出代码,以编程方式构建网络。

提出了一个奖励函数

一般来说,找到合适的奖励函数(这个过程称为奖励塑造)可能相当棘手。我的个人经验是,这很容易成为一个时间消耗。最近的一些研究结果提出了自动化这一过程的方法。原则上,这都是关于推动代理按照您希望的方式进行行为:您奖励“好的”行为(如击球),并惩罚“坏的”行为(如错过球)。

本质上,只要游戏没有达到终端状态(球掉了),代理会试着积累尽可能多的奖励,而底层神经网络的参数也会相应地不断更新。

为了强化“击球”行为,当球拍击中球时,我们奖励代理一个较大的正数值。另一方面,我们通过提供消极奖励来惩罚“错过”的行为。我们还通过使其与击球时球与桨之间的距离成正比来塑造这个负值,这将激励代理在球即将失球时靠近它(并最终击中它)!

培训代理

最后一步非常简单,因为它可以归结为MATLAB中的一个函数trainNetwork。然而,训练本身可能需要一些时间,这取决于您的终止标准和可用的硬件(在许多情况下,训练可以在GPU的帮助下加速)。所以,喝杯咖啡,坐下来放松,MATLAB显示一个进度显示,包括最后一个完成的章节的奖励总和(即玩游戏,直到球击中地板)。您可以在任何时候中断并使用中间结果或让它运行直到完成。训练将停止时终止的标准,如最大数量的剧集或特定的奖励值满足。

如果我们在训练的早期阶段手动终止训练,代理的行为仍然非常笨拙:

最后,这是训练有素的特工在行动:

结论

显然,你可以很容易地设计算法,而无需进行任何强化学习发出难闻的气味有效地说,这真的是用大锤敲坚果——这很有趣。然而,如今人们正在用强化学习来解决真正的问题,这些问题是传统方法很难或根本无法解决的。

此外,许多人都有现有的Simulink模型,这些模型非常精确地描万博1manbetx述了复杂的环境,可以很容易地将其用于第一步——环境建模。可以找到使用强化学习的客户应用程序的视频在这里.当然,这些问题要复杂得多,通常需要以上工作流中的每一个步骤花费更多的时间。

然而,好消息是,这些原则是相同的,您仍然可以利用我们上面使用的相同的技术!

在这里下载完整代码

那么现在轮到你了:你是否考虑在哪些领域应用强化学习?请在评论中告诉我。

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。