可微编程


通过四个参数,我可以问大象,而通过五个参数,我可以让他移动树干。
-约翰·冯·诺依曼

差异化编程 ”的思想在机器学习领域非常流行。 对于许多人来说,尚不清楚该术语是否反映了研究人员对机器学习的理解的真正转变,还是“深度学习”的品牌重塑。 这篇文章解释了机器学习表中什么是差异化编程(或orP)。


最重要的是,差异化编程是与深度学习方向相反的转变。 从参数化的模型到更广泛使用问题结构的简单模型。


接下来,我们翻阅不感兴趣的文本画布,我们想要找出什么是自动分化的,甚至是用弹射器填充它!


蛮力与利益


差异性是使深度学习如此成功的基本概念。 在即使要搜索数百个模型参数的情况下,蛮力搜索都过于昂贵的情况下,梯度允许伪随机遍历参数空间中有趣的部分并找到一个好的集合。 执行这种看似幼稚的算法,我们获得了很好的通用性,但是显然,我们需要通过在语言翻译中使用序列来进行区分,但这显然还很简单,但我们却显示出一点独创性。


那生物神经元呢 y=σW\乘x+b ? 这个公式没有什么特别的。 这是高参数非线性函数的简单而灵活的示例。 实际上,在大多数情况下,这可能是最糟糕的功能。 原则上,神经网络的一层可以对猫的图像进行分类,但只能使用相对不有趣的技巧。 它完美地工作! -但小字警告说,您可能需要比宇宙中原子更多的参数。 为了使这项工作真正起作用,您需要在模型中编写有问题的结构-在这里,它开始看起来更像传统编程。


例如, ConvNet与感知器相比具有巨大的优势,因为它们与图像内核一起使用,而图像内核已知使用平移不变性。 人脸-无论是在图像的左上角还是在中心显示,它都是人脸,但是在每种情况下感知器都应该研究这种情况的地方,内核可以立即响应图像的任何部分。 用统计术语分析卷积网络很困难,但是将其视为图像处理专家手写内容的自动版本要容易得多。 映像的内核是第一个也是最简单的可区分程序。


编码结构,Redux


ML工具箱越来越多地支持算法微分(AD),这使我们能够使用循环,分支和递归(或基于一组可微分的数学基元构建的任何程序)来区分模型。 这导致了更复杂的体系结构:NLP模型越来越像具有堆栈增强模型的经典语法解析器,您甚至可以区分图灵机的类似物或编程语言解释器


差异化编程所采取的最后一步是不再将矩阵乘法,卷积和RNN视为深度学习的基本组成部分,而只是作为特殊情况。 我们可以将深度学习方法应用于任何参数化的微分函数 fx 。 与物理模拟器或光线跟踪器一样复杂的功能也可以加以区分和优化。 甚至量子计算也可以适合这种结构。



科学家们长期使用机械模型,这些模型位于显式编程和机器学习之间。 在物理,流行病学或药效学中使用的具有自由参数的微分方程在除术语外的所有事物上均等效于神经网络 。 它们只是旨在提供更窄的功能,因为它是如此简单。


真正强大的进步是:普遍的差异性意味着所有这些方法都像乐高积木一样连接在一起。
不必总是为ML编写新程序,我们可以通过在深度学习机器人模型中使用物理引擎来重用现有程序。 在现代强化学习算法仅需要基于获得奖励的东西(诸如蛮力之类的声音)来构建外部世界的详细模型的情况下,我们可以在学习甚至开始之前简单地应用物理系统的详细,准确的知识。


即使是最成熟的深度学习领域也不能忽视。 在卷积核之后,图像模型的自然下一步就是可微分的射线追踪器 。 3D渲染包含许多有关如何以像素显示场景的结构性知识,这些知识仍将在我们的厨房中发挥作用。 假设模型是在模拟环境中以像素显示的决策,模型将其用作输入。 原则上,现在我们可以使整个周期具有差异性,这将使我们可以直接看到环境对模型决策的影响,反之亦然。 这可以显着提高训练模型(例如具有自动驾驶功能的汽车)的逼真的模拟环境的功能。


与科学一样,混合模型可以提高效率,并解决深度学习与显式编程之间的某些折衷。 例如,无人驾驶飞机飞行路线规划器可能具有神经网络组件,该组件只能对可靠的显式程序进行略微的校正更改,从而分析其总体行为,同时适应经验数据。 这也有利于解释:机械模型和模拟的参数通常具有清晰的物理解释,因此,如果模型评估内部的参数,则可以清楚地说明外部发生的情况。


如果一切都那么美好,为什么每个人都没有放弃并着急学习差异化? 不幸的是, 现有框架的局限性使得难以构建这种复杂性的模型,并且不可能重复使用现有科学代码中嵌入的大量知识。 需要以一种非常有限的建模语言从头开始重新实现物理引擎的需求,将十行脚本变成了一个多年研究项目。 但是语言和编译技术的进步 ,尤其是自动区分 技术的进步,使我们更接近圣杯:“请区分我的游戏引擎。”


那么什么是差异化编程?


差异化编程允许您将深度学习方法应用于复杂的现有程序,并在其中重用嵌入其中的大量知识。 深度学习,统计学,程序设计和科学-试图在模拟我们周围世界的过程中说出一切的一切-是时候将其结合起来,像强子对撞机中的粒子一样将其推到一起。 这不仅可以改善当前模型,还可以将ML应用到其当前限制(可解释性或计算和数据要求)使其无法单独应用的领域。


可区别的管理问题


接下来,我们展示了差异性可以带来一些简单但经典的管理任务,其中我们通常将强化学习(RL)用作黑匣子。 可微模型(∂P模型)不仅揭示了更为有效的控制策略,而且还可以更快地学习几个数量级。 该代码可供研究-在大多数情况下,可以在任何笔记本电脑上学习几秒钟。


跟随渐变


差异是深度学习几乎每个步骤的推动力; 为此功能 y=fx 我们使用渐变  fracdydx找出x的变化将如何影响y 。 尽管具有数学性质,但梯度实际上是一个非常笼统且直观的概念。 忘了你在学校要看的公式; 让我们做些更有趣的事情,例如沿着抛物线扔东西。



当我们通过三发投掷弹丸时,我们的x (输入)代表设置(例如,配重的大小或弹射角度),而y是弹丸着陆前的行进距离。 如果您要瞄准,则渐变会告诉您一些非常有用的信息-增大或减小某个参数。 要最大化距离,只需遵循渐变即可。


好的,但是如何获得正确的参数? 但是,借助一个棘手的东西- 算法微分 ,可以使您不仅对您在学校学到的简单公式进行微分,而且还可以对任何复杂度的程序(例如我们的Trebuchet模拟器)进行微分。 结果,我们可以使用一个用Julia写的简单模拟器以及diff diffDiffEq,而无需深入研究,并在一个函数调用中获得其梯度。


 # what you did in school gradient(x -> 3x^2 + 2x + 1, 5) # (32,) # something a little more advanced gradient((wind, angle, weight) -> Trebuchet.shoot(wind, angle, weight), -2, 45, 200) # (4.02, -0.99, 0.051) 

扔东西


我们需要将投石机对准目标,并使用梯度微调喷射角度。 这称为参数估计, 我们已经研究了类似的示例 。 通过转到元方法,我们可以使任务变得更有趣:我们将神经网络而不是将投石机瞄准一个目标,而是将神经网络瞄准任何目标。 它是这样工作的:神经网络接受两个输入,以米为单位的目标距离和当前风速。 在网络中,布置投石机的设置(配重的质量和跳闸角度),然后将其输入到模拟器中,以计算行进距离。 然后,我们将目标与目标进行比较,并沿着整个链条移动以调整网络的权重。 我们的“数据集”是随机选择的一组目标和风速。



这个简单模型的一个优点是学习速度很快,因为我们以一种完全可区分的方式准确表达了我们从模型中想要的东西。 最初,它看起来像这样:



经过大约五分钟的训练(在我的笔记本电脑的同一处理器内核上),看起来像这样:



如果要影响轨迹,请提高风速:



偏离16厘米,或大约0.3%。 直接针对投石机呢? 鉴于我们有梯度,这对于梯度下降很容易做到。 但是,这是一个缓慢的迭代过程,每次大约需要100毫秒。 相反,神经网络的操作耗时5 s(快2万倍),而准确性略有下降。 这种技巧称为“通过梯度近似函数求逆”,这种技巧非常普遍,不仅可以用于动态系统,还可以用于快速样式转换算法


这是最简单的可能的管理问题,主要用于说明目的。 但是,我们可以将更先进的方法应用于经典的RL问题。


购物车,碰杆


更加可识别的管理挑战是CartPole ,即强化学习的“ Hello world”。 挑战是学习如何通过向左或向右推动垂直支柱来平衡垂直支柱。 我们的设置通常与Trebuchet的情况类似: Julia实现使我们可以直接将环境获得的收益视为损失。 ∂P使我们能够从简单模型无缝转换为RL模型。



一个精明的读者可能会发现一个障碍。 地板的操作区域(向左或向右偏移)是离散的,因此无法区分。 我们通过引入可区分的离散化来解决此问题,定义如下


f(x)= \左\ {\开始{矩阵} \,1,\,x \ geqslant0 \\ -1,\,x <0 \结束{matrix} \右。

f(x)= \左\ {\开始{矩阵} \,1,\,x \ geqslant0 \\ -1,\,x <0 \结束{matrix} \右。


 fracdfdx=1


换句话说,我们使渐变的行为就像 f 是一个相同的功能。 鉴于在ML中已经使用了多少可微性的数学思想,我们可以简单地在这里欺骗也许并不奇怪。 对于训练,我们需要的只是一个信号,通知我们围绕参数空间的伪随机游走,剩下的就是细节。 结果不言而喻。 如果在解决问题之前需要对RL方法进行几百集训练,则∂P模型只需约5集即可最终获胜。



时光倒流


强化学习( RL )的一个重要目标是在某项行动无法帮助我们改善连续几个步骤的结果时处理递延报酬。 当环境是可区分的时,∂P允许您像递归网络一样及时地训练代理反向传播! 在这种情况下,环境状态变为“隐藏状态”,该状态在时间步长之间发生变化。



为了演示该技术,我们考虑一个模型,其中的任务是摆动摆直到直立并保持不稳定的平衡。 对于RL模型很难做到; 经过大约20次训练后,问题得以解决,但是通常解决方案的路径显然不是最佳的。 相比之下,BPTT可以在一堂训练中击败RL 领导者排名 。 观察该情节如何发展是有益的。 在录制开始时,策略是随机的,并且模型会随着时间的推移而改进。 学习的速度几乎令人震惊。



该模型非常适合于加工任何初始角度,并且具有接近最佳策略的特性。 重新启动时,模型看起来像这样。



这仅仅是开始; 通过将DP应用于通常难以使​​用RL的环境,已经存在丰富的模拟和模型(如在大多数工程和自然科学中)以及可解释性是重要因素(如在医学中)的环境中,我们将取得真正的成功。


地图不是领土


这些玩具模型的局限性在于它们将模拟学习环境与测试环境等同起来。 当然,现实世界是无法区分的。 在更现实的模型中,仿真为我们提供了行为的粗略模式,并通过数据对其进行了细化。 例如,这些数据告知风的模拟效果,从而提高了模拟器传递给控制器​​的坡度的质量。 模型甚至可以构成控制器直接传递的一部分,从而使控制器可以改进其预测,而不必从头开始研究系统动态。 学习这些新的体系结构将使未来的工作更加令人兴奋。


尾田


基本思想是,微分编程(其中我们只需编写任意数值程序并使用梯度对其进行优化)是一种创建类似于深度学习的更好的模型和体系结构的有效方法,尤其是当我们手头有一个大的可微分程序库时。 所描述的模型只是预览,但我们希望它们能对如何以更现实的方式实现这些想法有所帮助。


正如功能编程涉及使用功能模式进行推理和表达算法一样,差异编程也涉及使用差异模式来表达算法。 深度学习社区已经开发了许多这样的设计模式,例如,用于处理管理问题或一致的树状数据结构。 随着领域的发展,将会发明更多的东西,并且由于这些计划的结果,即使是最先进的深度学习体系结构也可能看起来很粗鲁和落后。


参考文献



Source: https://habr.com/ru/post/zh-CN459562/


All Articles