我们已经讨论了可微编程的想法,即我们将现有的程序合并到深度学习模型中。本文展示了∂P可以为一些简单但经典的控制问题带来什么,在这些问题中,我们通常会使用黑盒强化学习(RL)。基于∂P的模型不仅学习更有效的控制策略,而且训练速度更快几个数量级。这些代码都可以自己运行--它们在任何笔记本电脑上都能在几秒钟内完成训练。
差异化是深度学习的关键;给定函数[[y=f(X)]],我们使用梯度[[\frac{dy}{dx}]]来计算[[x]]的变化将如何影响[[y]]。尽管穿着数学服装,但渐变实际上是一个非常普遍和直观的概念。忘掉你在学校里必须看的公式吧;让我们做一些更有趣的事情,比如扔东西。
当我们用投石机扔东西时,我们的[[x]]代表一个设置(例如,配重的大小,或释放的角度),[[y]]是投射物在落地前行进的距离。如果你试图瞄准,渐变会告诉你一些非常有用的东西--改变目标会增加还是减少距离。要最大化距离,只需跟随渐变即可。
好的,但是我们怎么才能得到这个神奇的数字呢?诀窍是一个被称为算法微分的过程,它不仅可以区分你在学校学到的简单公式,还可以区分任何复杂的程序-比如我们的投石机模拟器。其结果是,我们可以使用一个用Julia和DiffEq编写的简单模拟器,而不需要深入学习,并在单个函数调用中获得它的渐变。
#你在学校做的渐变(x->;3 x^2+2 x+1,5)#(32,)#一些更高级的渐变((风,角度,重量)->;Trebuchet。射击(风、角度、重量),-2,45,200)#(4.02,-0.99,0.051)。
使用它的一种简单方式是将投石机对准目标,使用梯度微调释放角度;这种事情在参数估计的名义下很常见,我们以前已经介绍过类似的例子。我们可以让事情变得更有趣:我们将优化一个神经网络,它可以在给定任何目标的情况下瞄准投石机,而不是给出一个单一的目标。它的工作原理是这样的:神经网络接受两个输入,以米为单位的目标距离和当前的风速。网络输出投石机设置(配重的质量和释放角度),这些设置被送入模拟器,由模拟器计算实现的距离。然后,我们与我们的目标进行比较,并端到端地反向传播整个链,以调整网络的权重。我们的“数据集”是随机选择的一组目标和风速。
这个简单模型的一个很好的属性是训练它很快,因为我们已经以一种完全可区分的方式准确地表达了我们想要从模型中得到的东西。最初看起来是这样的:
经过大约5分钟的培训(在我笔记本电脑CPU的一个内核上),它看起来是这样的:
为了演示这项技术,我们观察了钟摆环境,在这个环境中,任务是摆动一个钟摆,直到它直立起来,以最小的努力保持它的平衡。这对于RL模型来说是困难的;在大约20集的培训之后,问题就解决了,但通常情况下,解决方案的路线显然是次优的。相比之下,BPTT可以在单集培训中击败RL排行榜。实际观看这一集的展开是有指导意义的;在录制开始时,策略是随机的,模型会随着时间的推移而改进。学习的速度几乎令人担忧。
尽管只经历了一次插曲,但该模型很好地概括了任何初始角度,并且有一些非常接近最优策略的东西。重新启动时,模型看起来更像这样。
这只是个开始;将DP应用到RL根本难以处理的环境中,在那里已经存在丰富的模拟和模型(如在许多工程和科学中),在可解释性是一个重要因素(如在医学中)的环境中,我们将获得真正的胜利。
这些玩具模型的局限性在于,它们将模拟的训练环境等同于测试环境;当然,现实世界是不可区分的。在一个更现实的模型中,模拟给我们提供了一个粗略的行为轮廓,并通过数据进行了细化。该数据通知(比方说)风的模拟效果,进而改善模拟器传递给控制器的渐变的质量。模型甚至可以构成控制器前向传递的一部分,使其能够改进其预测,而不必从头开始学习系统动力学。探索这些新的体系结构将有助于激动人心的未来工作。
核心思想是可微编程,我们只需编写一个任意的数值程序,并通过梯度对其进行优化,是提出更好的深度学习(如模型和体系结构)的强大方法,特别是当我们手头有大量可微代码库的时候。所描述的玩具模型实际上只是一个预览,但我们希望它们能直观地说明如何以更现实的方式应用这些想法。
正如函数式编程涉及到使用函数模式来推理和表示算法一样,可微编程涉及到使用可微分模式来表示算法。深度学习社区已经开发了许多这样的设计模式,例如用于处理控制问题或序列和树结构的数据。随着这一领域的成熟,还会有更多的发明,由此产生的程序很可能会让目前最先进的深度学习体系结构相比之下看起来也很粗糙。