深度学习

理解和使用深度学习网络

使用强化学习演奏乒乓球

以下帖子来自Christoph Stockhammer,今天在这里展示如何使用强化学习,为一项非常严重的任务:玩游戏。如果您想了解有关强化学习的更多信息,请查看一个自由,2小时训练叫加固学习ondramp.

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

之后出现了单人模式的《Breakout》,即球能够摧毁屏幕上方的一些砖块,而球棒则会移动到屏幕底部。结果,蝙蝠现在是水平移动,而不是垂直移动。

在这篇文章中,我想描述如何教导AI来发挥乒乓球的变化,只需使用球反弹的天花板。

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

粗略地说,实施强化学习通常涉及这四个步骤:

  1. 建模环境
  2. 定义培训方法
  3. 提出奖励功能
  4. 培训代理人

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

建模环境

这实际上需要所有4个步骤的最多工作:您必须实施基础物理学,即如果球击中游戏的边界或蝙蝠或跨越屏幕移动,则会发生什么。此外,您还希望可视化当前状态(确定 - Matlab中的一个非常简单)。加固学习工具箱提供了一种基于MATLAB代码或SIMULINK模型来定义自定义环境的方法,我们可以利用以模拟PONG环境。金宝app为此,我们继承从rl.env.matlabenentionvironment并实现系统的行为。

classdef环境属性(相应地设置属性的属性)特性%指定和初始化环境的必要属性%x球运动限制XLim = [-1 1]球运动的%y限制YLim = [-1.5 1.5]球的半径Ballradius = 0.04%恒定球速度球速度= [2 2]

整个源代码可以在本帖子的末尾找到。虽然我们可以轻松地可视化环境,但我们没有使用游戏屏幕截图作为用于加强学习的信息。这样做会是另一种选择,并将更接近一个依赖视觉信息的人类播放器。但它也需要卷积神经网络需要更多的培训努力。相反,我们在我们呼叫观察的七个元素的向量中编码游戏的当前状态:

1 2 3. 4. 5. 6. 7.
当前球的X位置 当前球的Y位置 球的x轴位置的改变 变化在球的Y位置 球棒的x位置 蝙蝠的X位置的变化 对球棒施加的力

很容易查看如何捕获有关游戏当前状态的所有相关信息。第七个元素(“力”)可能需要更详细的解释:

力基本上是动作的缩放版本,即将蝙蝠左右移动。这意味着我们将代理人的最后一个动作作为观察的一部分,引入了一些内存概念,因为代理可以以这种方式访问​​以前的决定。

我们可以从球的随机初始方向开始,并模拟球撞到地板。如果球击中地板,游戏结束了。

定义培训方法

通常,培训算法的选择受到动作和观察空间的影响。在我们的情况下,观察(带有七个元素的向量)和动作空间(标量值)是连续的,这意味着它们可以在特定范围内承担任何浮点数的值。例如,我们将动作限制在范围内[-1,1]。类似地,球的X和Y位置不允许超过某些阈值,因为球必须保持在游戏的边界内。

对于此示例,我们使用DDPG(深度确定性政策梯度)代理。这个名字指的是一种具体的培训方法,会有的其他选择也是。对于培训本身,我们需要两个组件:一个演员A.评论家

演员

行动者决定在任何给定情况下采取何种行动。在每个时间步骤中,它接收来自环境的7个观察结果(如上表所列),并输出一个动作,一个介于-1和1之间的数字。这个动作对应于将蝙蝠快速移向左边(-1),移向右边(+1)或完全不移动(0),所有中间关卡都是可能的。行动者是一个三层完全连接的神经网络和relu激活,初始化的随机值从一个正态分布。输出被缩放,使其值范围在-1到1之间。

评论家

评论家是一个实例,根据最后的行动和最后的观察,计算参与者长期行动的预期回报。因此,评论家接受了两个输入论点。与actor类似,critic由几个完全连接的层组成,然后是reLu层。现在,我们还没有讨论任何奖励,但很明显,演员的表现可以非常好(不会错过一个球)或糟糕(无法击中一个球)。评论家应该预测演员的决定会产生什么样的长期结果。

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

提出奖励功能

一般来说,找到合适的奖励功能(这个过程叫做奖励塑造)可以相当棘手。我的个人经历是,这很容易成为时间汇。最近有一些结果建议自动化过程的方法。原则上,正是为了努力表现出来,就像你想要的一样:你奖励“良好”的行为(如击球),你惩罚“坏”行为(如错过球)。

实质上,代理商试图尽可能多地累积,并且底层的神经网络的参数相应地连续更新,只要游戏没有达到终端状态(球丢弃)。

为了加强“击中”行为,当桨撞击球时,我们奖励具有较大的正价值的代理。另一方面,我们通过提供负面奖励来惩罚“小姐”行为。我们还通过在未命中的时间内与球与桨叶之间的距离成比例来塑造这种负值。当它即将错过时,这激励了代理人更接近球(并最终击打它)!

培训代理人

最后一步很简单,因为它只是归结为Matlab,Trainnetwork的单一功能。但是,培训本身可能需要一段时间,具体取决于您的终止标准和可用的硬件(在许多情况下,可以在GPU的帮助下加速培训)。所以拿一杯咖啡,坐下来放松,而Matlab显示一个进展显示,包括最后一集的奖励的总和(即播放比赛,直到球撞到地板)。您可以随时中断并使用中间结果或让它运行直到完成。训练将在终止标准等最大次数或特定奖励价值时停止。

如果我们在早期阶段手动终止培训,代理人仍然表现得非常笨拙:

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

结论

显然,您可以轻松设计算法而没有任何强化学习的播放有效地说,这实际上是用大锤砸开一个坚果——这很有趣。然而,如今人们正在用强化学习解决实际问题,这些问题很难或根本无法用传统方法解决。

此外,许多人具有现有的Simulink模型,非常精确地描述复杂的金宝app环境,并且可以轻松地重新估算步骤1 - 建模环境。可以找到使用强化学习的客户申请的视频这里.当然,这些问题是更复杂的,通常需要更多的时间来在上述工作流程中的每一步。

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

下载完整的代码

所以现在轮到你了:有没有任何领域,您正在考虑应用强化学习?请在评论中告诉我。

|
  • 打印
  • 发送电子邮件

注释

请点击留下评论这里登录您的MathWorks帐户或创建新的。