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