强化学习,第3部分:策略和学习算法
从系列中:强化学习
布莱恩•道格拉斯
本视频将介绍驻留在代理中的算法。我们将介绍为什么使用神经网络来表示函数,以及为什么必须在一个称为actor-critic的强大方法家族中建立两个神经网络。
在上一集视频中,我们主要关注了环境的设置:环境包括什么以及环境中的奖励如何用于指导代理的行为。在本视频中,我们将重点介绍代理的设置——具体来说,是RL工作流中的最后三个步骤。
要完全讲完这些步骤,很容易就有好几个学期的内容了。幸运的是,这不是这段17分钟视频的目的。相反,我想在高层次上介绍几个主题,让你对正在发生的事情有一个大致的了解,这样当你深入研究其他更完整的资源时,它就更有意义了。因此,在这个视频中,我将解决这两个主要问题:
第一,为什么使用神经网络来表示函数而不是其他东西,比如表格或传递函数?第二,为什么你必须建立两个神经网络,以及它们如何在一个被称为演员-评论家的强大方法家族中相互补充。让我们开始吧。我是Brian,欢迎来到MATLAB技术讲座。
上次,我们解释了策略是如何接受状态观察并输出操作的函数。然后我简要介绍了为什么表和特定定义的函数在很多情况下不是很好的解决方案。这是因为当状态和操作空间变得非常大时,表是不切实际的,而且还因为很难为复杂的环境设计正确的函数结构。然而,使用神经网络可以解决这两个问题。
神经网络是一组节点或人工神经元,它们以一种允许它们成为通用函数逼近器的方式连接起来。这意味着给定正确的节点和连接组合,我们可以设置网络来模拟任何输入和输出关系。这对我们很有好处,因为我们可以使用机器人视觉系统中的数百个像素值作为这个函数的输入,而输出可以是驱动机器人手臂和腿的执行器命令。尽管这个函数可能非常复杂,但我们知道有某种神经网络可以实现它。
如果你不熟悉神经网络的数学,我强烈推荐3 Blue 1 Brown关于这个主题的四部分系列。他对网络中发生的事情提供了一个奇妙的可视化,所以我将在这里跳过大部分讨论。然而,我确实想强调几件事。
左边是输入节点,对应函数的每个输入,右边是输出节点。中间是被称为隐藏层的节点列。该网络有2个输入,2个输出和2个隐藏层,每个隐藏层有3个节点。对于完全连接的网络,从每个输入节点到下一层的每个节点,然后从这些节点到再下一层,直到输出节点,都有一个箭头或加权连接。节点的值等于每个输入节点乘以其各自的权重因子加上偏置的和。我们可以对层中的每个节点进行计算,并将其写成线性方程组的紧凑矩阵形式。
现在,如果我们像这样简单地计算节点的值,然后将它们作为输入输入到下一层执行相同类型的线性操作,然后再输入到输出层,您可能会担心。一堆线性方程怎么能作为通用函数逼近器呢?具体来说,它如何表示一个非线性函数?好吧,那是因为我漏掉了一个步骤,这可能是人工神经网络最重要的方面之一。计算出节点的值后,应用激活函数以某种方式改变节点的值。两个流行的激活函数是sigmoid,它将节点值压缩到0到1之间,以及ReLU函数,它基本上将任何负节点值归零。有许多不同的激活函数,但它们都有一个共同点,那就是它们都是非线性的,这对于构建一个可以近似任何函数的网络至关重要。
至于为什么会这样。我真的很喜欢Brendon Fortuner和Michael Neilson的解释,他们分别展示了如何用ReLU和sigmoid激活来证明它。我在描述中链接了他们的博客。
好,现在提醒一下我们讲到哪了。我们想要找到一个函数,它可以接受大量的观察结果,并将它们转化为一组动作,从而控制一些非线性环境。由于这个函数的结构通常太复杂,我们无法直接求解,所以我们想用一个神经网络来近似它,这个神经网络可以随着时间的推移来学习这个函数。人们很容易认为,我们可以把任何一个网络放进去,然后让强化学习算法找到权重和偏差的正确组合,然后我们就完成了。不幸的是,和往常一样,情况并非如此。
我们必须提前对我们的神经网络做出一些选择,以确保它足够复杂,可以近似我们正在寻找的函数,但又不会太复杂,以至于训练不可能或慢得不可思议。例如,正如我们已经看到的,我们需要选择一个激活函数,以及隐藏层的数量,以及每层中的神经元数量。但除此之外,我们还可以控制网络的内部结构。它是应该像我画的网络那样完全连接,还是应该像剩余神经网络那样跳过层?它们是否应该自我循环,用循环神经网络创造内部记忆?一组神经元是否应该像卷积神经网络那样一起工作?等等。
我们有很多选择,但与其他控制技术一样,没有一种方法是正确的。很多时候,这可以归结为从一个已经适用于您试图解决的问题类型的网络结构开始,并在此基础上进行调整。
现在我一直在说,我们使用这些神经网络来表示代理中的策略,但至于这到底意味着什么,我们需要看看几个不同类别的强化学习算法的高级描述:基于策略函数的,基于价值函数的,和行动者-评论家。下面的内容肯定是过于简化了,但是如果您只是试图对RL的方法有一个基本的理解,我认为这将帮助您开始。
在高层次上,我认为基于策略函数的学习算法很有意义,因为我们正在尝试训练一个神经网络,它接受状态观察并输出一个动作。这与控制器在控制系统中的作用密切相关。我们称这个神经网络为行为人,因为它直接告诉代理如何行动。
结构看起来很简单,现在的问题是,我们如何训练这种类型的网络?让我们看看雅达利游戏《Breakout》。
如果你不熟悉《Breakout》这款游戏,你将尝试着使用球拍去引导一个弹跳的球去清除砖块。这款游戏只有三个动作:向左、向右移动球拍,或者根本不移动,以及一个近乎连续的状态空间,包括球拍的位置、球的位置和速度,以及剩余砖块的位置。
在这个例子中,我们假设观察是游戏的屏幕截图,每次输入一帧,因此每个像素都有一个输入到我们的神经网络中。现在,对于网络集合有很多方法来训练它,但我要强调的是一种有很多变化的广泛方法,那就是策略梯度方法。策略梯度方法可以用于随机策略,这意味着策略输出向左或向右的概率,而不是确定性策略(向左或向右)。随机策略处理的是勘探/开发问题,因为勘探已经包含在概率中。现在,当我们学习时,智能体只需要更新概率。左拐比右拐更好吗?在这种情况下左转的概率要大一些。然后随着时间的推移,智能体会将这些概率推到产生最大回报的方向。
那么它怎么知道这些行为是好是坏呢?其理念是:执行当前策略,沿途收集奖励,并更新网络以增加增加奖励的行动概率。如果球拍向左,没有击中球,导致负奖励?然后改变神经网络,以增加下一次智能体处于这种状态时正确移动桨的概率。从本质上讲,它是对每个权重和偏差对奖励求导,并将它们调整为正向奖励增加的方向。通过这种方式,学习算法正在移动网络的权重和偏差,以上升到奖励斜率。这就是为什么在名称中使用术语梯度。
这背后的数学知识在这集视频中我不打算讲,但我鼓励你们阅读策略梯度定理看看如何在不求导的情况下求出梯度。我在描述区留下了链接。
政策梯度方法的一个缺点是,只沿着最陡峭的上升方向的幼稚方法可能会收敛到局部最大值,而不是全局最大值。由于它们对噪声测量的敏感性,它们也可以缓慢收敛,例如,当需要大量连续行动才能获得奖励,而所产生的累积奖励在事件之间具有很高的方差时,就会发生这种情况。想象一下,在代理收到一个奖励之前,必须将数百或数千个连续的动作串在一起。你可以看到,使用这种极其稀疏的奖励系统来训练一个代理是多么耗时。记住这一点,在这集视频的最后我们会回到这个问题上。
让我们转到基于值函数的学习算法。对于这些问题,让我们从一个使用流行的网格世界作为环境的示例开始。在这个环境中,有两个离散的状态变量:X网格位置和Y网格位置。在网格世界中,只有一种状态具有积极的奖励,其他状态都具有消极的奖励。我们的想法是,我们希望我们的智能体收集最多的奖励,这意味着在尽可能少的移动中获得积极的奖励。智能体一次只能移动一个方格,向上、向下、向左或向右,对于我们这些强大的人类来说,很容易看到该走哪条路才能获得奖励。然而,我们必须记住,代理对环境一无所知。它只知道它可以采取四种行动中的一种,并在采取行动后从环境中获得它的位置和奖励。
使用基于值函数的代理,函数将接受状态和来自该状态的一个可能操作,并输出采取该操作的值。这个值是这个状态的总折现奖励的总和就像我们在第一个视频中讲的那样。通过这种方式,策略将简单地检查每个可能的操作的值,并选择值最高的操作。我们可以把这个函数想象成一个评论家,因为它观察可能的行为,并批评代理的选择。由于网格世界中有有限数量的状态和操作,我们可以使用查找表来表示这个函数。这被称为q表,其中每个状态和操作配对都有一个值。
那么代理如何学习这些值呢?首先我们可以把它初始化为全0,所以所有的动作在代理看来都是一样的。这就是探索速率的作用,它允许代理采取随机行动。在它采取行动后,它会进入一个新的状态,并从环境中收集奖励。智能体使用这个奖励,这个新信息,来更新它刚刚采取的行动的价值。它是用著名的贝尔曼方程来计算的。
Bellman方程允许智能体通过将整个问题分解为多个更简单的步骤来随时间求解q表。因此,通过动态编程,代理将在每次访问时更新状态/操作对,而不是一步求解状态/操作对的真实值。我试着用语言描述一下这个方程希望它有意义。
在代理执行了一个动作之后,它会收到一个奖励。价值不仅仅是行动带来的即时回报;它是未来的最大预期收益。因此,状态/动作对的值是代理刚刚收到的奖励,加上代理期望获得的奖励。我们用未来的回报折现,就像我们说的,代理人不会太依赖未来的回报。这现在是状态/动作对的新值s, a。所以我们将这个值与q表中的值进行比较,以得到误差,或者智能体的预测有多远。误差乘以学习率,得到的增量值加上旧的估计值。
当代理发现自己第二次回到相同的状态时,它将有这个更新的值,当它选择相同的操作时,它将再次调整它们。它会一遍又一遍地这样做,直到每个状态/动作对的真实值都足够清楚,可以利用最优路径。
让我们把这个想法推广到倒立摆上,这里仍然有两种状态,角度和角速度,只不过这两种状态是连续的。值函数可以处理连续状态空间,但不能使用查找表。所以我们需要一个神经网络。道理是一样的。我们输入状态观察和一个动作,神经网络返回一个值。
你会发现这种设置并不适用于连续的动作空间,因为你怎么可能尝试每一个无限的动作并找到最大值呢?即使对于一个大的行动空间,这也需要大量的计算,但我已经说得有点超前了。现在,我们假设动作空间是离散的agent可以从5个可能的扭矩值中选择一个。这似乎很合理。
这就是我的想法。当你向网络提供观察到的状态和一个动作时,它会返回一个值,我们的策略将再次检查每个可能的动作的值,并选择值最高的那个。就像网格世界一样,我们的神经网络最初将被设置为垃圾值,学习算法将使用Bellman方程的一个版本来确定新的值应该是什么,并相应地更新网络中的权重和偏差。一旦智能体探索了足够的状态空间,那么它就会很好地近似于值函数,并且可以选择最优的动作,给定任何状态。
这很简洁,对吧?但我们确实遇到了一个缺点,那就是动作空间需要相对较小。但通常在控制问题中我们有一个连续的动作空间能够将一个连续的力矩范围应用到倒立摆问题中。
这使我们将这两种技术合并为一种称为演员/评论家的算法。行动者是一个网络,它试图在给定的当前状态下采取它认为最好的行动,就像我们用政策函数方法做的那样,而评论家是第二个网络,它试图估计状态的价值和行动者所采取的行动,就像我们用基于价值的方法做的那样。这适用于连续的动作空间,因为评论家只需要关注单个动作,即演员所采取的动作,而不是试图通过评估所有动作来找到最佳动作。
下面是它的基本工作原理。参与者以与策略函数算法相同的方式选择操作,并将其应用于环境。评论家估计它认为状态和行动对的价值,然后使用来自环境的奖励来确定其价值预测的准确性。该误差是评论家网络对前一状态的新估计值与前一状态的旧值之间的差值。新的估算值基于收到的奖励和当前状态的折扣值。它可以利用这种错误来判断事情比评论家预期的更好还是更差。
评论家使用这个错误以与价值函数相同的方式更新自己,以便它在下次处于这种状态时有更好的预测。actor还会使用评论家的响应更新自己,如果可以的话,还会更新错误项,这样它就可以调整未来再次采取该操作的概率。
也就是说,现在政策的奖励斜率是按照评论家建议的方向上升的,而不是直接使用奖励。
行动者和评论家都是试图学习最佳行为的神经网络。执行者通过评论家的反馈来学习正确的行为,以知道什么是好的行为,什么是坏的行为,评论家则从收到的奖励中学习价值函数,以便正确地批评执行者所采取的行动。这就是为什么你可能需要在你的代理中建立两个神经网络;每一个都扮演着非常具体的角色。
使用行动者-评论家方法,代理可以利用策略和值函数算法的最佳部分。行动者-评论家可以处理连续的状态和行动空间,并在返回的奖励具有高方差时加速学习。在下一个视频中,我将展示一个使用基于演员批评的算法来让一个双足机器人行走的例子。
在结束这个视频之前,我想简要地讨论一下RL工作流中的最后一步:在目标硬件上部署算法。到目前为止,智能体通过与模拟环境交互进行离线学习。但是一旦策略足够最优,学习就会停止静态策略就会被部署到目标上就像任何已开发的控制律一样。但是,我们也有能力将强化学习算法与策略一起部署,并可以根据实际环境继续对目标进行学习。这对于难以精确建模或随着时间缓慢变化的环境非常重要,因此智能体需要偶尔继续学习,以便能够适应这些变化。
好了,这节课就讲到这里。如果你不想错过任何未来的Tech Talk视频,不要忘记订阅这个频道。此外,如果你想看看我的频道,控制系统讲座,我在那里介绍了更多的控制主题。感谢收看,我们下期见。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。