深度强化学习:从像素玩Pong!

强化学习(Reinforcement Learning,RL)特别火!你看过许多新闻:电脑能自动学习ATARI游戏,在围棋比赛中击败世界冠军,模拟四足动物学习跑和跳,机器人学习完成编程无法实现的复杂操作任务。这些进展都属于RL研究的范畴。我本人自去年起关注RL:我阅读了Richard Sutton的书,学习了David Silver的课程,看了John Schulmann的讲座,写了RL的Javascript库,整个夏天在DeepMind的DeepRL组实习,最近了解一些关于RL标准工具库OpenAI Gym的设计与开发。我涉足这个领域一年多,最近才有时间写一篇博文,来探讨为什么RL了不起,它是什么,怎样发展及未来展望。

上图 从左至右:深度Q学习网络玩ATARI,AlphaGo,Berkeley机器人搭乐高,物理模拟的四足动物跳跃

近期RL进展的性质值得反映。我认为制约AI发展有四个因素:

  1. 计算(明显者如:摩尔定律,GPU,ASIC)
  2. 数据(比较好的形式,不仅是在网上随便某处,如ImageNet)
  3. 算法(研究与思想,如:backprop,CNN,LSTM)
  4. 基础架构(底层软件:Linux,TCP/IP,Git,ROS,PR2,AWS,AMT,TensorFlow等)

同机器视觉类似,RL的发展不是由你想象的惊人新想法驱动的。在机器视觉上,2012年的AlexNet是1990年ConvNets的升级版(更深、广)。类似地,2013年ATARI深度Q学习论文是标准算法的一个应用(函数近似的Q学习,可以在1998年Sutton的标准RL书上找到),其函数近似恰好是ConvNet。AlphaGo使用策略梯度同蒙特卡罗树搜索(MCTS)—— 这些也是标准组件。当然花不少精力和耐心去实现,在旧算法上若干聪明的技巧被发明出来,但一阶近似的驱动力不是算法而是计算/数据/基础架构。

回到RL来,当我发现看起来奇妙实际却很简单的东西时总想记录到博客中。我看到许多人不敢相信机器能够通过算法学习ATARI游戏,从一个个像素、从零开始,达到人的级别,我也一度惊叹这十分不可思议。但使用的核心方法实际上很简单。总之,我会带你理解策略梯度(Policy Gradients,PG),这是解决RL问题最受欢迎的选项。如果你不了解RL你会问我为什么不讲DQN —— DQN是更知名的RL算法,因ATARI game论文而广泛流行。其实Q-学习并不是那么好,很多人更喜欢用策略梯度,包括DQN论文作者在内,证实策略梯度优于Q-学习。PG受欢迎由于它是端到端的:有显式策略及原则性的方法直接优化期望回报。总之,我们学习玩ATARI游戏(Pong!), 用策略梯度、从零开始、从一个个像素,构建深度神经网络,总共130行的依赖numpy的Python程序(gist链接),让我们开始吧!

从像素玩Pong

左图:Pong游戏 右图:Pong是 马尔科夫决策过程(Markov Decision Process,MDP)的特例:每个结点是个特定游戏状态,每条边是一种可能转换,每条边也给出奖励分,目标是计算某一状态下最大化奖励的最优解。

Pong游戏是简单RL任务的绝佳例子。在ATARI 2600版本中你玩一边的球拍(AI控制另一个),将球打到另一边。游戏的底层原理如下:有一个图片框(210x160x3字节的数组,0至255整数的像素值),我们决定球拍该移上还是移下(二元选项)。每次选择后游戏模拟器执行动作并给出得分:将球打回对手+1分,丢球-1分,对手丢球0分。目标是移动球拍得分。

策略网络 首先定义策略网络来操作球员。这个网络获取游戏状态并决定做什么(移上还是移下)。选择2层神经网络获取原始图片像素(一共100,800(210x160x3)个数),产生移上的概率。注意到一般会采用随机策略,只能产生移上的概率。每次迭代我们都从这个分布中取样实际移动。原因会在下面谈及训练时更为清晰。

使用2层完全链接的策略网络

下面介绍怎样在Python/numpy中实现这个策略。假设一个向量x表示(预处理过的)像素信息,计算:

h = np.dot(W1, x) # 计算隐藏层神经元激活值
h[h<0] = 0 # ReLU非线性:阈值设0
logp = np.dot(W2, h) # 计算向上移的对数概率
p = 1.0 / (1.0 + np.exp(-logp)) # sigmoid函数(向上的概率)

这段程序中W1W2是两个随机初始化的矩阵。没有采用偏差是由于最后使用了sigmoid非线性,将输出概率压缩至[0,1]区间。隐藏层的神经元(他们的权重排列在W1的每一行)能检测不同的游戏场景(如,球在上、拍在中间),W2决定每个场景中移上还是移下。初始随机的W1W2令球员阵颤,唯一的问题就是找出专业玩Pong的W1W2了!

说明:预处理 你需要至少提供2帧给策略网络检测动作。简单来说,我会做些预处理,例如将帧之间的差提供给网络(当前帧及前一帧相减)。

听起来不可能 我希望你意识到RL有多难。我们有100,800个数字(210x160x3),传递策略网络(很容易涉及到W1 W2数百万的参数)。假设决定移上,游戏响应这步得0分,并在下一帧给出另一组100,800个数字。在获得非0奖励之前,这个过程要重复数百次!终于获得了1分,但究竟怎样得分的?是因为刚才的做法,还是76帧之前?还是同第10帧与第90帧有关?如何算出上万次的扭转如何改进?这是信用分配问题。在Pong的特例中,球传给对手可得1分。将球弹到恰好的轨迹,实际的原因却发生在好几帧之前 —— Pong的例子中大约20帧,而之后的动作对是否得分毫无影响。换言之我们在面对一道困难的题目。

监督学习 深入策略梯度方案之前我想提起监督学习,因为同RL非常相似。下图中,在一般监督学习中将图片输入到网络中得到概率,比如上和下两类概率。这里是对数概率(-1.2, -0.36)而不是原始概率(30%, 70%),我们总是在优化正确标注的对数概率(令数字更加整洁,因对数函数的单调性,等同于优化原始概率)。在监督学习中,得到一个标注,比如向上移动(标注0)。在一次实现中,我们在向上的对数概率中输入1.0的梯度,执行backprop计算梯度向量$\nabla_{W} \log p(y=UP \mid x)$。这个梯度将告诉我们该如何改变上百万的参数来使网络更能预测向上。例如,网络中的一个参数的梯度为-2.1,意味着对该参数增加一点数值(e.g. 0.001),向上的对数概率会下降2.1*0.001(下降是由于负号)。更新这个参数,yay,当再次遇见类似图像时,网络会稍微更能预测向上。

策略梯度 如果没有正确标注,在强化学习中该怎样做?这里是策略梯度的方案(如下图)。策略网络计算向上的概率30%(对数概率-1.2)向下70%(对数概率-0.36)。现在从这个分布中取样动作;假设取样向下,然后在游戏中执行。注意到一个有趣的事实:我们能立即为向下加入1.0的梯度,就像在监督学习中一样,找到更能预测网络向下的梯度向量。这很好,我们可以立即衡量这个梯度,但问题是并不清楚向下移动是否正确。没关系,等等再说!在Pong游戏中,等到游戏得分(+1为赢或-1为输),再输入采取该动作(向下)的梯度值。下例中,向下会导致丢分,所以如果把向下的对数概率填充-1并执行backprop,找到梯度来阻止网络未来做移下的动作(应当如此,向下会输掉比赛)。

随机策略取样动作,偶然造成好结果的行动未来被促进,造成坏结果的行为被阻止。如果最终赢得比赛,奖励不一定是+1或-1,可以是对最终质量的任意衡量。如结果非常好,分数可以是10.0分,输入到梯度中而不是将-1作为backprop的开始。神经网络之美在此,就像在用秘技:你可以将1百万参数嵌入1万亿浮点运算,并用SGD来做任何事。这不应该有用,但有趣的是,我们住在的世界就能奏效。

训练协议 下面讲训练的细节。为策略网络初始化W1W2并玩100局Pong(我们叫这策略“首展”)。假设每个回合有200帧,总共要决定20,000次向上还是向下,每个参数梯度告知未来该情景下如何改善决策的参数,然后将每个决策标注为好或坏。假设赢12局输88局,我们为20012 = 2400个胜利的决策做正更新(在取样动作的梯度中填充+1.0,做backprop,更新参数来促进这些状态下的动作)。将另外20088 = 17600个失败的决策做负更新(阻止这些动作)。网络现在更能重复胜利的动作,减少输局的可能。用改进的策略再玩100局游戏并更新、反复。

策略梯度:执行一阵策略,看哪些动作易得高分,提高相应的概率。

4次游戏的图解。黑圈是游戏状态(三个状态示例在下面),箭头表示转化、注释取样的动作。此例中赢2局输2局。策略梯度将稍微促进赢局中的每一个动作,并稍微阻止输局中的动作。

在这一步会得到非常有趣的性质。如果在50帧做出对的行动(正确将球弹回),却在150帧丢掉球会怎样?如果每一步都被标为坏(因为输球),那会抑制50帧的正确弹球吗?答案是会的。但考虑在成千上万次游戏中,第一个正确反弹令你稍微更加能赢,因此总体正确弹球是正面更新的,策略会做出正确的事。

更多通用优势函数 我讲过还会讨论回报,现在基于是否赢得比赛已经判断了每一动作的优劣。在更通用的RL设定中每一时间步长中得到$r_t$奖励。通常选择用打折的奖励,因此上表中的最终奖励为$ R_t = \sum_{k=0}^{\infty} \gamma^k r_{t+k} $。其中$\gamma$是介于0到1之间的折扣因子。表达式说明促进取样行为的强度是这之后奖励的加权之和,而后奖励的重要性呈指数下降。实际上标准化也很重要。假设为上述首展中100个Pong游戏的所有20,000个行动计算$R_t$,一种方法是标准化这些回报(减去平均值,除以标准差),再插入标准值来执行backprop。这样总是促进或抑制大约一半的行为。数学上可解释为控制策略梯度估计方差的方法。更深入的探索在此

推导策略梯度 我想介绍一下策略梯度怎样在数学上得到。策略梯度是一种通用评分函数梯度估计的特例。通常表达式形式是$E_{x \sim p(x \mid \theta)} [f(x)] $ —— 即,在某个由$\theta$做参数的概率分布$p(x;\theta)$下,标量的评分函数$f(x)$的期望。提示是,$f(x)$将成为奖励函数(或通常点,优势函数),$p(x)$成为策略网络,给定任意图像$I$行为分布的真正的$p(a \mid I)$模型。然后(通过参数$\theta$)找到如何移动分布来增加取样的分数,由$f$评判(如何改变网络的参数行动取样来得到高分)。我们有:

我们有$p(x;\theta)$的分布(简写为$p(x)$)来取样(可以是高斯分布)。对于每个样本可以估计评分函数$f$给出标量的得分值。这个等式告知如何由$f$评判改变分布(通过参数$\theta$)来达到高分。详细讲是取一些$x$的样本,估计得分$f(x)$,并为每个$x$估计第二项$ \nabla_{\theta} \log p(x;\theta) $。第二项是什么?是个向量 —— 在参数空间中给出用来增加$x$概率方向的梯度。如果将$\theta$轻推至$ \nabla_{\theta} \log p(x;\theta) $的方向,会看到$x$的概率略微增加。回看公式中采取这个方向并乘上$f(x)$的标量分数。这将高分的样本拽向概率密度更强的低分样本。所以若基于$p$中的若干样本更新,概率密度将移向高分的方向,令高分样本更加可能。

得分函数梯度估计的的可视化视图。 :高斯分布及其样本(蓝点)。在每个蓝点上绘制关于高斯均值的对数概率的梯度。箭头指示分布的均值应该轻移至增加样本概率方向。 :得分函数的叠加,其中小部分区域+1,剩余区域-1(注意这个函数是任意值不一定可微)。更新的乘积令箭头染上色,均匀所有绿箭头,及 负的红箭头。 :参数更新后,绿箭头及反向的红箭头推至左下,这个分布的样本将有希望的更高得分。

我希望RL的关系讲清楚了。策略网络给出行为的取样,有些行为优于其它(由优势函数评定)。这些数学说明改变策略参数就是做首展,得到样本行为的梯度,乘以评分并加和,如前文描述。更详细的推导和讨论推荐看John Schulman的讲座

学习 好了,现在我们认识了策略网络,看了大致推导。全部过程由130行的Python程序执行完成,使用OpenAI Gym的ATARI 2600 Pong。我训练了一个有200隐藏层单元的2层策略网络,以10节为批次(每一节由若干游戏组成,游戏最高能得21分)使用RMSProp。我没有过多调整超参数,实验在Macbook上运行,我训练3个晚上得到的策略稍超过AI选手。共计训练约8,000节,算法玩了约200,000次Pong游戏(是不是很多!),更新了~800次。朋友告诉我如果在GPU上训练ConvNets,几天后你能经常打败AI选手,如果仔细优化超参数你就能始终控制AI选手(赢得每场比赛)。我没有计算或微调,但我们阐释了Pong AI的主要思想,运行起来十分奏效:

训练的选手(绿色,右)面对硬编码的AI对手(左)

学习的权重 我们来看下学习的权重。预处理后每项输入都是80x80的差分图(现一帧减前一帧)。取出W1的每一行,伸展为80x80的图。下图是(200个中的)40个神经元组成的格子。白像素点表示正权重,黑色表示负权重。许多神经元被调为弹球的特定轨迹,由沿线交替的黑与白编码。球只能在一点,所以这些神经元是多任务处理的并在沿球轨迹的多处“激活”。交替的黑白十分有趣,因为球会沿着轨迹,神经元的活动就像正弦曲线一样波动,使用ReLU函数令神经元在轨迹分离的位置“激活”。图像中有些噪音,使用L2正则化以缓解。

没有发生什么

我们由原始像素通过策略梯度学习如何玩Pong。这个方法是“猜测与检验”的华丽形式,“猜测”指从现在的策略中取样首展,“检测”指促进产生好结果的行为。余下的细节代表处理强化学习问题的先进水平。学习行为这件事令人印象深刻,但理解了算法后你会有些失望。特别是,它怎样工作的?

对比人类学习玩Pong的过程,你给他们展示游戏并解说“控制球拍,移上或移下,你的任务是将球弹给另一侧的AI球员”,于是你就准备好了。二者的差异是:

  • 人在交流时会持有某种态度,但在标准RL问题中你假设任意奖励函数并通过环境的交互查明。可以解释为人参与到Pong游戏中,无需了解奖励的机制(特别是当奖励函数是静态而不是随机的),人学习很困难但策略梯度却不在意,而且会工作得更好。相似地,如果要随机取出帧、交换像素,人容易失败,策略梯度则不辨差异(这里使用了全链接网络)。

  • 人类拥有大量的先验知识,如物理上(球弹起,不瞬移也不停止,保持匀速),心理上(AI对手“想要”赢,有明显向球移动的策略等)。你理解控制球拍的概念,响应向上/向下键的操作。相反地,算法从零开始,同时令人瞩目(因为它起作用)及沮丧的(我们不知道如何不这么做)。

  • 策略梯度是一种粗暴的解决方法,正确的做法最终被发现并被吸纳到策略中。人类构建丰富的抽象模型并通过它筹划。在Pong中,我通过发现对手行动慢,推断出加快垂直弹球速度这样有利的策略,令对手不能及时接到球。但似乎最终我们也将好的方法“吸收”到肌肉的记忆策略中。例如你在学习新的机动车任务(开车换档?),你经常觉得开始想许多但最后会自动地、无意识地完成任务。

  • 策略梯度要经常体验正激励,逐渐改变策略参数来重复高奖励的移动。通过抽象模型,人类不必经历失分得分就能发现如何得到奖励,就像不用经历几百次才能避免撞车。

左:蒙提祖玛的复仇:对RL算法有挑战的游戏。玩家需要跳下爬上去、取钥匙开门。人类知道获得钥匙很有用。计算机取样数亿次随机移动,99%的时间摔死或被怪兽杀死,很难撞进得分的状态。 右:另一个有难度的游戏叫做寒霜引擎,人类理解东西能移动,有些能摸,有些不能,目标是一砖一瓦地搭建冰屋。关于这个游戏人机方法区别的分析和讨论见 Building Machines That Learn and Think Like People

相反,需要特别指出的是,在许多游戏中策略梯度能够轻易击败人类。尤其是奖励信号频繁、要求精准快速的反应、又无需长期计划的游戏十分理想,因为奖励和行为间的短期相关性容易被策略梯度“注意到”,策略精心地实施。我们在Pong代理球员中看到了这样的迹象:它开发一种策略,等到球并快速地撞击边沿,给球以极快的垂直速度。代理重复这个策略连续得了若干分。在许多ATARI游戏中深度Q学习这样打破了人类的基线,如桌上弹球、打砖块等游戏。

总之,一旦你理解了这些算法的“诀窍”,就能推断出其长处和弱点。算法不能像人类一样对游戏建立抽象、丰富的表达,在其中计划和快速学习。总有一天,计算机看到一阵列的像素点,会注意到钥匙、门,并自己思考应该捡起钥匙打开门。现在离这样还远,是一项活跃的研究领域。

神经网络中的不可微计算

与游戏无关的策略梯度其它的有趣应用:它允许利用不可微计算(或与之交互)的成分设计和训练神经网络。这个想法在一系列中心凹扫视(由人自身启发)处理低分辨率图片的模型背景下,最初在Recurrent Models of Visual Attention上介绍。特别的是,RNN的每次迭代接收一小张图片取样一个位置再看下一个。例如,RNN查看位置(5, 30),接收一小部分图片,然后看(24, 50)。这个想法的问题是,有一部分网络会用于产生下一个取样位置的分布。不幸的是这个操作不可微,我们不知道取样下一位置会发生什么。考虑一个由输入到输出的神经网络:

注意到多数箭头(蓝色)是可微的,有些表示转换可选地包含不可微的取样操作(红色)。蓝色箭头可以backprop,红色箭头表示不能backprop的依赖项。

策略梯度来拯救了!我们认为取样的那部分网络是内置在更宽阔网络的小的随机策略。因此,在训练时我们产生若干样本(下图的分支),然后促进样本通向好结果(这个例子中最后由损失衡量)。换言之,我们像往常一样训练涉及backprop蓝色箭头的参数,涉及红色箭头的参数会独立于使用策略梯度的后向传递而更新,促进导致低损失的样本。这个想法在Gradient Estimation Using Stochastic Computation Graphs一文中正式化。

可训练的内存I/O 你会在许多文章中找到这个想法。如Neural Turing Machine中可读写的存储带。进行写操作来执行类似m[i] = x的语句,其中ix分别由RNN的控制网络预测。但是,这个操作不可微分,因为没有信号告诉我们如果将j != i写在不同位置,损失会怎样。因此,NTM要做读写操作。它预测注意力分布a(包括0到1的元素,总和为1,峰值在指标附近),然后跑for all i: m[i] = a[i]*x。这现在可微分,但要付出沉重的计算代价,因为每个存储单元只写一个位置。想想如果每个分配进入,电脑将占满整个RAM!

但(理论上)使用策略梯度可以回避这个问题,如RL-NTM中。仍旧预测注意力分布a,但作为软读写的替换,取位置写:i = sample(a); m[i] = x。训练时以小批量i为单元,最终可能令分支效果更好。巨大的计算优势是只需在测试时读/写一个位置。正如文章中指出这个策略很难起作用,因为要在取样时意外地进入起作用的状态。现在的共识是PG在只有少数间断的选择时有效,不必无助地在巨大的搜索空间中取样。

但是使用策略梯度,在许多数据/计算可用的案例中,原则上都可以大胆想象 —— 例如设计神经网络同大型、不可微的模块交互,像Latex编译器(char-rnn产生可编译的latex),SLAM系统,LQR解算器,或者其他。例如超智能学习通过TCP/IP(不幸的是不能微分)同互联网交互来访问掌控世界的关键信息。这是个很好的例子。

总结

策略梯度是强大的、通用的算法,我们从原始像素、从零开始训练ATARI Pong代理球员作为例子,用130行python实现。一般同样的算法可为任意游戏训练代理,希望有一天可以解决实际有价值的控制问题。我想在结束前加一些笔记:

先进的AI 此算法通过暴力搜索,开始时球拍随机抖动,偶然撞入得分状态,然后不停地重复这个状态,移动策略分布的参数以重现这个可靠的动作。人用不同的方式解决这些问题,就像快速建模 —— 在研究中仅仅涉及皮毛(很多人在尝试)。这些抽象模型很难明确解释,这是为什么最近的(非监督)生成模型和程序归纳很有吸引力。

复杂机器人学中的应用 算法不会简单地扩展,因为大量的探索很难得到。例如,在机器人学领域,有一个(或几个)机器人,实时同外界交互。这限制了本文中介绍的算法的原生应用。相关工作deterministic policy gradients试图缓和这个问题 —— 取代从随机策略中取样及促进增加得分,这个方法使用决定策略,由第二个网络(称为评论员)直接得到梯度信息,建立分数函数的模型。这个方法理论上在取样覆盖度低的高维动作时更加有效,但目前看实际工作起来有些苛求。另一相关的方法是增加机器人,参见Google机器人臂工厂或是Tesla Model S的自动驾驶

有一系列的工作添加附加监督,令搜索过程不那么无望。在许多实践案例中,举例来说,能从人那里获得专家轨迹。AlphaGo首先从专家Go游戏用监督学习预测人的移动,模仿人的决策结果随后被策略梯度以赢取游戏为“真实”目标精细地调整。某些情况下,只有很少的专家轨迹(如机器人远距离操作),利用这些数据的技术,属于apprenticeship learning的范围。最后,如果没有人提供无监督数据,计算则需要昂贵的优化方法,如在动态模型(比如物理仿真$F=ma$)中采用trajectory optimization,或某些情况下学习近似局部动态模型(非常有前景的Guided Policy Search框架)。

实际使用PG 最后,我最后讲下希望做的事情。我也许留下了RNN很神奇、能自动处理任意序列问题的印象。真相是这些模型工作起来十分复杂,需要注意和专业技术;它们在许多实例中过犹不及,简单的方法反而令你达到90%+的进度。策略梯度亦然。它不是自动的:需要有许多样本,永远在训练,不起作用时很难排错。一个人总应该在拿到火箭筒之前先尝试BB枪。在强化学习的例子中,cross-entropy method (CEM)是个有力的起点,它是一种单纯随机爬坡、由进化启发的“猜测与检验”方法。如果坚持要尝试用策略梯度解决问题,你要确保仔细阅读文章中的技巧一节,先由简单的开始,用PG的变种方法TRPO,它几乎总比普通PG在实践中更好更持续。其核心思想是避免过多更新改变策略的参数,通过批量数据上新旧策略预测分布之间的KL散度限制(取代共轭梯度的最简单实例是采用线搜索并一直监测KL)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值