深度强化学习:Pongs from Pixels

原文: http://karpathy.github.io/2016/05/31/rl/

作者:Andrej Karpathy

翻译:@Chen Quan

这是有关“强化学习”(RL)的早就应该发表的博客文章。RL很热!您可能已经注意到,计算机现在可以自动学习玩ATARI游戏(从原始游戏像素开始!),它们在Go(译者注:Alpha Go)上击败了世界冠军,模拟的四足动物正在学习奔跑和跳跃,机器人正在学习如何执行复杂的操纵任务,违了显式编程。事实证明,所有这些进展都属于RL研究的范畴。在过去的一年中,我自己也对RL产生了兴趣:我研究了Richard Sutton的书,阅读了David Silver的课程,观看了John Schulmann的演讲用Javascript编写的RL库,整个夏天,在DeepMind的DeepRL小组实习,最近又在新RL基准测试工具包OpenAI Gym的设计/开发投入了一些精力。因此,我肯定已经从事了至少一年,但直到现在我还没有写一篇简短的文章来介绍RL为何如此重要,它的意义,发展的方式以及发展的方向去。

在这里插入图片描述

疯狂RL的例子。从左到右:深度Q学习网络播放ATARI,AlphaGo,伯克利机器人堆叠的乐高积木,物理模拟的四足动物跨越地形。

反思RL近期进展的性质很有趣。我大致想考虑阻碍AI的四个独立因素:

  1. 计算(显而易见的一个:摩尔定律,GPU,ASIC),
  2. 数据(一种很好的形式,而不仅仅是Internet上的某个地方,例如ImageNet),
  3. 算法(研究和思路,例如backprop,CNN,LSTM)和
  4. 基础架构(您之下的软件-Linux,TCP / IP,Git,ROS,PR2,AWS,AMT,TensorFlow等)。

与“计算机视觉”中发生的情况类似,RL的进步并没有像你可能期望的被那些令人惊奇的想法推动。在《计算机视觉》中,2012年的AlexNet主要是1990年代ConvNets的放大版本(更深更宽)。同样,2013年发布的ATARI深度Q学习论文是一种标准算法的实现(带函数逼近的Q学习,您可以在Sutton 1998的标准RL书中找到),其中函数逼近器恰好是ConvNet。AlphaGo将策略梯度与蒙特卡洛树搜索(MCTS)结合使用-这些也是标准组件。当然,要使其运作,需要大量的技巧和耐心,并且在旧算法的基础上已经开发出了许多巧妙的调整,

现在回到RL。每当看起来神奇的东西和它的内幕多么简单之间存在脱节时,我都会感到非常恼火,并且让我真的想写一篇博客文章。在这种情况下,我见过很多人,他们不敢相信我们可以通过一种算法,通过像素,从头开始使用一种算法来自动学习玩人类级别的大多数ATARI游戏-太神奇了,我体会过!但从根本上讲,我们使用的方法实际上也非常愚蠢(尽管我知道回想起来很容易得出这样的主张)。无论如何,我想带您了解Policy Gradients(PG),这是我们目前最喜欢的解决RL问题的默认选择。如果您来自RL以外的地方,您可能会很好奇为什么我不介绍DQN,它是一种替代的且知名度更高的RL算法,已被RL广泛使用ATARI游戏纸。事实证明,Q学习不是一个很好的算法(您可以说DQN在2013年是如此(好吧,我有一半是开玩笑的)。实际上,大多数人都喜欢使用Policy Gradients,包括原始DQN论文的作者,他们在调优后显示 Policy Gradients比Q Learning更好地工作。首选PG,因为它是端到端的:有一个明确的政策和一种有原则的方法可以直接优化预期的回报。无论如何,作为一个正在运行的示例,我们将学习使用PG,从头开始,从像素开始,通过深度神经网络来玩ATARI游戏(Pong!),整个过程是仅使用numpy作为依赖项的130行Python(要点链接)。让我们开始吧。

像素球

在这里插入图片描述
在这里插入图片描述

**左:**乒乓球比赛。右图: Pong是Markov决策过程(MDP)的特例:一个图形,其中每个节点都是特定的游戏状态,每个边缘都是可能的(通常是概率性的)过渡。每条边都给与奖励,目标是计算在任何状态下的最佳行为方式,以使奖励最大化。

Pong的游戏是简单的RL任务的一个很好的例子。在ATARI 2600版本中,我们将使用您作为球拍之一(另一个由不错的AI控制),并且您必须将球弹回另一位球员(我真的不必解释Pong,对吗? )。在低端,游戏的工作方式如下:我们收到一个图像帧(一个210x160x3字节数组(从0到255的整数,给出像素值)),然后我们决定是否要向上或向下移动操纵杆(即二进制选择) )。每次选择后,游戏模拟器都会执行动作并给予我们奖励:如果球超过了对手,则为+1奖励;如果我们错过球,则为-1奖励;否则为0。当然,我们的目标是移动球拍,以便获得很多回报。

在进行解决方案时,请记住,我们将对Pong做出很少的假设,因为我们暗中并不真正关心Pong。我们关心复杂的高维问题,例如机器人操纵,组装和导航。Pong只是一个有趣的玩具测试用例,我们在研究如何编写非常通用的AI系统(可以一天完成任意有用的任务)的过程中使用。

策略网络。首先,我们将定义一个实施我们的播放器(或“代理”)的策略网络。该网络将获取游戏状态,并决定我们应该做什么(向上或向下移动)。作为我们最喜欢的简单计算模块,我们将使用一个2层神经网络,该网络获取原始图像像素(总共100,800个数字(210 * 160 * 3)),并生成一个表示上升概率的数字。请注意,使用随机策略是标准做法,这意味着我们只会产生向上移动的可能性。每次迭代,我们将从该分布中采样(即扔一个有偏差的硬币)以获得实际的移动。一旦我们讨论训练,为什么这样做的原因将会更加清晰。

在这里插入图片描述

我们的策略网络是2层全连接网络。

并在此处具体说明如何在Python / numpy中实现此策略网络。假设我们得到了一个x保存(预处理)像素信息的向量。我们将计算:

h = np.dot(W1, x) # compute hidden layer neuron activations
h[h<0] = 0 # ReLU nonlinearity: threshold at zero
logp = np.dot(W2, h) # compute log probability of going up
p = 1.0 / (1.0 + np.exp(-logp)) # sigmoid function (gives probability of going up)

在此代码段中W1W2是我们随机初始化的两个矩阵。我们没有使用阈值(biases),因为 meh 。请注意,我们在最后使用了S形非线性,将输出概率压缩到范围[0,1]。直观地讲,隐藏层中的神经元(权重沿的行排列的W1)可以检测各种游戏场景(例如,球在顶部,我们的球拍在中间),然后权重W2可以确定是否在每种情况下,我们都应该向上或向下。现在,初始随机W1W2会造成玩家当场痉挛。因此,现在唯一的问题就是寻找W1W2导致Pong的专家级比赛!

精细印刷:预处理。理想情况下,您希望将至少2个帧馈送到策略网络,以便它可以检测到运动。为了使事情变得更简单(我在Macbook上进行了这些实验),我将做一些预处理,例如,我们实际上会将差异帧馈送到网络(即减去当前帧和最后一帧)。

听起来是不可能的。在这一点上,我希望您了解RL问题有多么困难。我们得到100,800个数字(210 * 160 * 3),并前向传播我们的策略网络(这很容易涉及到对一百万的参数顺序W1W2)。假设我们决定上升。游戏可能会回应,这一次我们将获得0奖励,并为下一帧再提供100,800个数字。在获得任何非零奖励之前,我们可以重复此过程一百个时间步!例如,假设我们最终得到+1。太好了,但是我们怎么知道是什么原因导致的呢?这是我们刚才所做的吗?还是76帧前?还是与第10帧,是第90帧有关?为了将来做得更好,我们如何找出百万个旋钮中的哪一个以及如何更改?我们称此为信用分配问题。在Pong的特定情况下,我们知道如果球越过对手,我们将获得+1。在真正原因是我们碰巧以良好的轨迹弹跳球,但实际上我们之前做过很多帧-例如,在Pong的情况下大概是20帧,此后我们执行的每一个动作对我们是否结束都无效得到奖励。换句话说,我们面临着一个非常棘手的问题,情况看起来非常昏暗。

监督学习。在我们深入探讨Policy Gradients解决方案之前,我想简短地提醒您有关监督学习的知识,因为正如我们将看到的那样,RL非常相似。请参考下图。在普通的有监督的学习中,我们会将图像馈送到网络并获得一些概率,例如对于UP和DOWN两类。我显示的是UP和DOWN的对数概率(-1.2,-0.36),而不是原始概率(在这种情况下为30%和70%),因为我们总是优化正确标签的对数概率(这使数学更好,并且等效于优化原始概率,因为对数是单调的。现在,在监督学习中,我们将可以访问标签。例如,我们可能被告知当前正确的操作是向上运动(标签0)。在一个实现中,我们将以UP的对数概率输入1.0的梯度,然后运行backprop来计算梯度矢量$ \nabla_{W} \log p(y=UP \mid x)$ 0.001``2.1 * 0.001

在这里插入图片描述

策略梯度。好的,但是如果我们在“强化学习”设置中没有正确的标签,该怎么办?这是“策略梯度”解决方案(再次参考下图)。我们的策略网络计算出上升为30%(logprob -1.2)和下降为70%(logprob -0.36)的概率。现在,我们将从该分布中采样一个动作;例如,假设我们采样DOWN,然后在游戏中执行它。此时,请注意一个有趣的事实:我们可以像在监督学习中一样立即为DOWN填充1.0的渐变,并找到将鼓励网络将来更有可能执行DOWN动作的渐变矢量。因此,我们可以立即评估此梯度,这很好,但是问题在于,至少到目前为止,我们尚不知道下降是好的。但关键是没关系,因为我们可以稍等一下看看!例如,在Pong中,我们可以等到游戏结束,然后获取我们获得的奖励(如果我们赢了,则奖励+1;如果我们输了,则奖励-1),然后输入该标量作为我们采取的动作的梯度(在这个案例中是DOWN)。在下面的示例中,下降导致我们输掉了游戏(-1奖励)。因此,如果为DOWN的对数概率填写-1并进行反向传播,我们将发现一个梯度不鼓励网络将来为该输入采取DOWN动作(正确的做法是,因为采取该动作导致我们输掉了比赛)。

在这里插入图片描述

就是这样:我们有一个随机策略,对行动进行抽样,然后在将来会鼓励最终会导致良好结果的行动受到鼓励,而导致不良结果的行动则受到挫败。另外,如果我们最终赢得比赛,奖励甚至不必为+1或-1。它可以是某种最终质量的任意度量。例如,如果情况确实很好,则可能是10.0,然后我们将其输入为梯度而不是-1,以开始反向传播。那就是神经网络的美。使用它们就像是作弊:您可以在1万亿次的计算中嵌入100万个参数,并且可以使用SGD使其做任意事情。它不应该起作用,但是有趣的是,我们生活在它起作用的宇宙中。

**训练规则。**因此,这是训练的详细工作方式。我们将使用一些初始化策略网络W1W2并玩100个Pong游戏(我们称这些策略为“推广”)。让我们假设每个游戏都由200帧组成,因此我们总共做出了20,000个向上或向下决策,对于其中每一个,我们都知道参数梯度,这告诉我们,如果我们想要改变参数,鼓励将来在该状态做改做的决定。现在剩下的就是将我们所做的每个决定贴上好坏的标签。例如,假设我们赢了12场比赛而输了88场。我们将对获胜游戏做出的所有200 * 12 = 2400个决定进行一次积极的更新(为示例动作填充梯度为+1.0,进行反向执行,和参数更新鼓励我们在所有这些州采取的行动)。然后,我们将在输掉的游戏中做出其他200 * 88 = 17600个决定,并进行消极的更新(使我们所做的一切变得模糊)。而且…就是这样。现在,网络将更有可能重复执行有效的操作,而不太可能重复执行无效的操作。现在,我们通过略有改进的新政策又玩了100场游戏,并进行冲洗和重复。

策略梯度:运行策略一段时间。看看哪些行为导致了高额回报。增加他们的可能性。

在这里插入图片描述
4个游戏的卡通图。每个黑色圆圈是游戏状态(底部显示了三个示例状态),每个箭头都是过渡状态,并带有采样的动作。在这种情况下,我们赢了2场,输了2场。使用Policy Gradients,我们将赢得两场比赛,并稍微鼓励我们在那集中进行的每个动作。相反,我们也将丢掉的两局游戏,并稍微劝阻我们在该集中进行的每项操作。

如果您认为通过此过程,您将开始发现一些有趣的属性。例如,如果我们在第50帧采取了良好的动作(正确地将球弹回),但随后在第150帧错过了球怎么办?如果现在将每个动作都标记为不良(因为我们输了),那会不会阻碍第50帧的正确弹跳?您是对的-的确如此。但是,当您考虑成千上万的游戏过程时,正确地进行第一次跳出会让您更有可能赢得胜利,因此平均而言,对于正确的跳出和策略,您会看到比消极更新更积极的信息最终会做正确的事。

更新:2016年12月9日-替代视图。在上面的说明中,我使用了诸如“填充渐变和反向传播”之类的术语,如果您习惯于编写自己的反向传播代码,或者使用渐变明显且开放的Torch,则我意识到这是一种特殊的思考方式。修补。但是,如果您习惯使用Theano或TensorFlow,您可能会有些困惑,因为代码围绕指定的损失函数而编排,并且反向执行是全自动的,很难修改。在这种情况下,以下替代视图可能更直观。在香草监督学习中,目标是使 ∑ i l o g p ( y i ∣ x i

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值