强化学习,第5部分:克服强化学习的实际挑战
从系列中:强化学习
布莱恩•道格拉斯
本视频介绍了在生产系统中使用强化学习时遇到的一些挑战,并提供了一些减轻这些挑战的方法。即使没有直接的方法来解决你将面临的一些挑战,至少它会让你思考它们。
本视频将介绍验证学到的解决方案的困难,确定故障的位置,并手动修复策略。它将展示一些使策略更健壮和整个系统更安全的解决方案。最后,它将展示如何使用强化学习来学习传统控制系统中的参数,以及为什么在目前,这可以是两全其美的。
本系列的前四个视频介绍了强化学习的重要性,以及如何使用它来解决一些真正困难的控制问题。所以你可能会有这样的想法,你可以建立一个环境,在其中放置一个RL代理,然后让计算机解决你的问题,而你去喝咖啡或其他东西。不幸的是,即使你设置了一个完美的代理和一个完美的环境,然后学习算法收敛于一个解,这个方法仍然有我们需要讨论的缺点。所以在这个视频中,我将解决RL中一些可能不明显的问题,并试图提供一些方法来缓解它们。即使没有直接的方法来解决你将面临的一些挑战,至少它会让你思考它们。让我们开始吧。我是Brian,欢迎来到MATLAB技术讲座。
本视频中我们要解决的问题可以归结为两个主要问题:第一个是一旦你有了一个学习过的策略,如果它不太完美,是否有办法手动调整它?第二个问题是,你怎么知道解决方案是否有效?
让我们从第一个问题开始。为了回答这个问题,让我们假设我们已经学习了一个可以让机器人用两条腿走路的策略,并且我们准备将这个静态策略部署到目标硬件上。想想这个政策在数学上是什么。它是由一个神经网络组成的可能有成千上万的权重,偏差和非线性激活函数。这些值和网络结构的组合创建了一个复杂的函数,将高级观察映射到低级操作。
对于设计师来说,这个函数本质上是一个黑匣子。我们可能对这个函数的作用有一个直观的感觉。你知道把观察结果转化为行动的数学。我们甚至可以理解这个网络所发现的一些隐藏的特征。然而,我们不知道任何给定权重或偏差值背后的原因。因此,如果策略不符合规范,或者如果工厂或运行环境的其余部分发生了变化,您如何调整策略来解决这个问题?你要改变哪个权重或偏差?问题是,使解决问题变得更容易的东西——即,将所有困难的逻辑压缩到一个黑盒函数——使我们的最终解决方案变得不可理解。由于人类并没有创建这个函数,也不知道它的每一个细节,所以很难手动瞄准问题区域并修复它们。
现在,有活跃的研究试图推动可解释人工智能的概念。它的思想是,您可以设置您的网络,使其易于被人类理解和审计。然而,目前,大多数rl生成的策略仍然被归类为黑箱,设计师无法解释为什么输出是这样的。因此,至少在目前,我们需要学会如何处理这种情况。
与传统设计的控制系统相比,传统设计的控制系统通常有一个带有循环和级联控制器的层次结构,每个控制器的设计目的是控制系统的一个非常特定的动态质量。想想增益是如何从物理属性中获得的,比如附件长度或运动常数。如果物理系统发生变化,改变这些增益是多么简单。
此外,如果系统没有按照你预期的方式运行,在传统设计中,你通常可以将问题定位到特定的控制器或循环,并专注于那里进行分析。您可以隔离一个控制器,独立地测试和修改它,以确保它在指定的条件下执行,然后将该控制器带回更大的系统中。
当解是神经元、权重和偏差的整体集合时,这是很难做到的。因此,如果我们最终得到了一个不太正确的策略,而不是能够修复策略中有问题的部分,我们必须重新设计代理或环境模型,然后再次训练它。这个重新设计、培训和测试,再重新设计、培训和测试的循环可能很耗时。
但还有一个更大的问题正在逼近,它超出了训练一名特工所需的时间长度。这取决于环境模型所需的准确性。
问题是,要开发一个充分现实的模型是非常困难的,这个模型要考虑到系统中所有重要的动态以及干扰和噪声。在某种程度上,它并不能完美地反映现实。这就是为什么我们仍然要做物理测试,而不是用模型来验证一切。
现在,如果我们用这个不完美的模型来设计一个传统的控制系统,那么我们的设计就有可能在真正的硬件上不能完美地工作,我们就必须做出改变。因为我们能够理解自己创造的功能,所以我们能够调整控制器并对系统做出必要的调整。
然而,有了神经网络政策,我们就没有这种奢侈了。由于我们无法真正建立一个完美的模型,我们用它进行的任何训练都不会完全正确。因此,唯一的选择是在物理硬件上完成对代理的培训。正如我们在之前的视频中所讨论的,这本身就具有挑战性。
减少这个问题规模的一个好方法就是缩小RL代理的范围。就像我在上个视频中展示的那样,我们可以将传统控制器包裹在RL代理周围,这样它只解决一个非常专门的问题,而不是学习一个接受最高级别观察并命令最低级别操作的策略。通过使用RL代理针对一个更小的问题,我们将无法解释的黑箱缩小到系统中难以用传统方法解决的部分。
缩小代理显然不能解决我们的问题,它只是降低了问题的复杂性。该策略更加集中,因此更容易理解它在做什么,培训时间减少了,环境不需要包含那么多动态。然而,即使这样,我们仍然有第二个问题:您如何知道RL代理将不管其大小如何工作?例如,它对不确定性是否稳健?有稳定的保证吗?你能核实系统是否符合规格要求吗?
为了回答这个问题,让我们从如何验证传统控制系统开始。最常见的方法之一就是通过测试。就像我们所说的,这是使用模拟和模型以及物理硬件进行测试,我们验证系统在整个状态空间以及存在干扰和硬件故障的情况下满足规范——也就是说,它做了正确的事情。
我们可以使用rl生成的策略进行同样级别的验证测试。同样,如果我们发现了一个问题,我们必须重新训练策略来解决它,但测试策略似乎是类似的。然而,有一些非常重要的差异使得测试神经网络策略非常困难。
首先,对于学习过的策略,很难根据系统在另一个状态中的行为来预测系统在一个状态中的行为。例如,如果我们训练一个代理来控制电机的速度,让它学习从0到100转/分的步进输入,我们不能确定,如果没有测试,同样的策略将遵循从0到150转/分的类似步进输入。这是正确的,即使电机的行为是线性的。这个细微的变化可能会导致一组完全不同的神经元被激活,并产生一个不希望的结果。除非我们进行测试,否则无法确定。
用传统的方法,如果电机的行为是线性的,那么我们有一些保证,在线性范围内的所有步进输入将表现相似。我们不需要单独运行这些测试。因此,使用RL策略我们必须运行的测试数量通常比使用传统方法要大。
第二个原因是神经网络策略很难通过测试进行验证,因为可能存在非常大且难以定义的输入空间。记住,深度神经网络的好处之一是它们可以处理丰富的传感器,比如相机的图像。例如,如果您试图验证您的系统可以使用图像感知障碍物,请考虑障碍物可以以多少种不同的方式出现。如果图像有数千个像素,并且每个像素的范围从0到255,那么考虑一下这些数字的排列结果是多少,以及对它们进行全部测试的可能性有多大。就像步进输入的例子一样,仅仅因为你的网络已经学会了在图像的某一部分在某些光照条件,方向和比例下识别障碍,它并不能保证它在图像的其他方式下工作。
我想提出的最后一个困难是正式验证。这些方法包括通过提供正式的证明来保证满足某些条件,而不是使用测试。
事实上,通过正式的验证,即使我们不能通过测试做出这样的声明,我们也可以宣称将满足某个规范。例如,使用电机速度控制器,我们测试了0到100 RPM和0到150 RPM的步进输入。但是其他的呢,比如50到300,或者75到80?即使我们对10000种速度组合进行采样,也不能保证每一种组合都有效,因为我们无法测试所有的组合。它只是降低了风险。但如果我们有办法检查代码或执行一些覆盖整个范围的数学验证,那么我们不能测试每个组合也就没有关系了。我们仍然有信心它们会起作用。
例如,如果在软件中执行一个信号的绝对值,我们不必测试以确保该信号总是正的。我们可以通过检查代码并显示条件总是满足来验证它。其他类型的形式验证包括计算鲁棒性和稳定性因素,如增益和相位裕度。
但对于神经网络来说,这种形式的验证更加困难,在某些情况下甚至是不可能的。由于我前面解释过的原因,很难检查代码并保证它的行为方式。我们也没有方法来确定它的鲁棒性或稳定性,我们也无法推理出如果传感器或执行器失效会发生什么。这一切都回到了一个事实,即我们无法解释函数在内部做什么。
这些就是学习神经网络使设计变得困难的一些方法。很难在一系列的规格中验证它们的性能。如果系统确实发生了故障,就很难找出故障的根源,然后,即使你能找出根源,也很难手动调整参数或结构,只剩下重新设计和重新开始训练过程的唯一选择。
但我不想破坏您对强化学习作为生产系统的有用工具的信心,因为,尽管说了这么多,还是有方法建立学习,以便在不确定性存在的情况下产生更健壮的策略。还有一些方法可以提高安全性,并使强化学习成为生产系统的可行选择。我们甚至可以用强化学习来解决一个稍微不同的问题,一个从一开始就避免了很多这类问题的问题。让我们以一个积极的音符来结束这个视频并讨论这三个。我们将从使政策更加稳健开始。
尽管我们无法量化鲁棒性,但我们可以通过在agent学习时主动调整环境中的参数,使系统更鲁棒。
例如,对于我们的步行机器人,假设制造公差导致关节电机的最大扭矩在2到2.1牛米之间。我们将建造几十个这样的机器人,我们想学习一个单一的政策,为所有的机器人都是强健的这些变化。我们可以通过在每次运行模拟时调整电机转矩值的环境中训练代理来做到这一点。我们可以在每一集开始时一致地选择一个不同的最大扭矩值,这样随着时间的推移,政策将收敛到对这些制造公差的健壮性。通过以这种方式调整所有重要的参数——比如附件长度、系统延迟、障碍和参考信号等等——我们将最终得到一个总体稳健的设计。我们可能不能声称一个特定的增益或相位裕度,但我们将更有信心,结果可以处理操作状态空间内更广泛的范围。
这解决了健壮性问题,但仍然不能保证策略在硬件上做正确的事情。我们不想要的一件事就是硬件被损坏,或者有人因为不可预测的政策而受伤。所以我们还需要提高系统的整体安全性。我们可以提高安全性的一种方法是确定你希望系统避免的情况,然后在策略之外构建软件来监控这种情况。如果该监视器触发,那么就限制系统或接管系统,在它有机会造成破坏之前将其置于某种安全模式。这并不能阻止您部署危险的策略,但它将保护系统,让您了解它是如何失败的,并调整奖励和培训环境以解决该失败。
提高鲁棒性和安全性的修复都是对学习神经网络策略的局限性的一种变通。然而,有一种方法可以使用强化学习,并且仍然能够利用与传统体系结构控制系统一样健壮、安全、可更改和可验证的结果。那就是将它简单地用作传统架构控制系统的优化工具。让我这样解释。想象一下,设计一个具有数十个嵌套循环和控制器的体系结构,每个循环和控制器都有几个增益。最后可能会出现这样的情况:有100个或更多的增益值要调优。您可以设置一个RL代理,以便一次性了解所有这些增益的最佳值,而不是尝试手动调优每个增益。
代理会根据系统表现的好坏和它为达到这一表现所付出的努力而获得奖励,而行为则是系统中的100个左右的收益。所以,当你开始训练时,代理中的随机初始化神经网络只会生成随机值,然后你就可以用这些值来进行控制增益的模拟。现在很有可能第一集会产生一些垃圾的结果,但在每一集之后,学习算法会调整神经网络,使增益朝着增加奖励的方向移动,也就是说,它提高了性能,降低了努力。
以这种方式使用强化学习的好处在于,一旦你学会了最优控制增益集,你就完成了;你不需要其他任何东西。我们不需要部署任何神经网络或验证它们或担心必须改变它们。我们只需要将最终的静态增益值编码到我们的系统中。通过这种方式,您仍然拥有一个传统的体系结构系统(一个可以在硬件上进行验证和手动调整的系统,就像我们习惯的那样),但您使用使用强化学习优化选择的增益值填充它。这是一种两全其美的方法。
所以希望你们能看到强化学习对于解决困难问题是非常强大的,而且它绝对值得学习并弄清楚如何将它与传统方法结合在一起,以一种你对最终产品感到舒适的方式。在理解解决方案和验证它是否有效方面存在一些挑战,但正如我们所说的,我们现在确实有一些方法来解决这些挑战。
这是我想留给你们的想法。学习算法、RL设计工具(如MATLAB)和验证方法一直在进步。我们还远远没有达到强化学习的全部潜能。也许用不了多久,它就会成为所有复杂控制系统的首选设计方法。感谢收看本期视频。
如果你不想错过未来的Tech Talk视频,不要忘记订阅这个频道。另外,如果你想查看我的频道,控制系统讲座,我也在那里涵盖了更多的控制主题。我们下期见。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。