大家好,我是讯享网,大家多多关注。
这是一张神奇的纸。似乎过去一层层叠加的神经网络突然变得连续了,似乎反向传播不再需要一点一点向前传播,一层一层更新参数。在最近结束的NeruIPS 2018中,来自多伦多大学的陈天琦等研究人员成为最佳论文的获奖者。他们提出了一种叫做神经常微分方程的模型,这是一种新型的深度神经网络。常微分方程不局限于对现有架构的修修补补,而是从另一个角度考虑如何借助神经网络对数据进行连续的建模。在陈天琦的讲解下,《机器之心》将向读者介绍这个令人兴奋的神经网络新家族。
在接受《机器之心》采访时,陈天琦的导师大卫·杜文瑙(David Duvenaud)教授对这位学生给予了高度评价。Duvenaud教授认为陈天骐不仅是一个理解能力超强的学生,而且是一个研究问题透彻认真的学生。他说:“天奇喜欢出新点子。他有时会在我建议一周后给出反馈:“老师,你之前建议的方法不太合理。但是我想出了另一个合理的方法,我做到了。「Ducenaud教授评论道,如今,人工智能的普及程度越来越高。教授能找到优秀博士生的问题,基本和“鸡生蛋还是蛋生鸡”是一样的。顶尖学校的教授通常能很快招到博士生。”事业之初能遇到陈天骐这样优秀的学生,我很幸运。」
本文主要介绍神经常微分方程背后的缜密思考和直观理解。很多扩展概念没有详细解释,比如大大降低计算复杂度的连续流模型和官方PyTorch代码实现。本文主要对神经常微分方程和残差网络进行比较。通过这一部分,不仅可以了解如何从大家熟悉的ResNet演进到ODEnet,还可以了解新模型的正向传播过程和特点。
其次,论文比较关注ODEnet的反向传播过程,即如何通过求解常微分方程直接求梯度。这部分和传统的反向传播有很多区别,所以先了解反向传播再看源代码可能是更好的选择。值得注意的是,ODEnet的反向传播只有一个不变的内存开销。
ODEnet 的 PyTorch 实现地址:https://github.com/rtqichen/torchdiffeqODEnet 论文地址:https://arxiv.org/abs/1806.07366
文章的主要结构如下所示:
常微分方程从残差网络到微分方程 从微分方程到残差网络 网络对比神经常微分方程 反向传播 反向传播怎么做连续型的归一化流 变量代换定理
常微分方程
其实刚看这篇论文的时候还是有一些疑惑的,因为很多概念我们并不熟悉。所以如果你想理解这个模型,那么同学们,你需要先回忆一下高数上的微分方程。有了这样的概念,我们就可以愉快地延续神经网络层次,构造出完整的神经常微分方程。
常微分方程是只包含单个自变量x、未知函数f(x)和未知函数的导数f’(x)的方程,所以f’(x)= 2x也是常微分方程。但更常见的可以表示为df(x)/dx = g(f(x),x),其中g(f(x),x)表示由f(x)和x组成的表达式,这个公式是扩展一般神经网络的关键。我们将在后面讨论这个公式如何使神经网络层次连续。
对于常微分方程,我们要求解未知的f(x)。比如f'(x) = 2x的通解是f (x) = x 2+c,其中c代表任意常数。在工程中,比较常用的是数值解法,即给定一个初值f(x_0),我们希望求解最终值f(x_1),所以不需要求解完整的f(x),只需要逐步逼近即可。
现在让我们回到熟悉的神经网络。本质上,无论是全连通、循环还是卷积网络,都类似于一个非常复杂的复合函数,复合数等于层次的深度。例如,一个两层全连接网络可以表示为Y=f(f(X,θ1),θ2),所以每个神经网络层次都类似于一个通用函数逼近器。
因为整体是复合函数,所以很容易接受复合函数的求导方法:链式法则,将梯度从最外层函数转移到内层函数,每次转移到函数时更新层的参数θ。现在的问题是,我们需要在正向传播后保留所有层的激活值,并在梯度沿计算路径反向传播时使用这些激活值。这占用了大量内存,所以限制了深度模型的训练过程。
常微分方程走另一条路,用神经网络参数化隐态导数,而不是像往常一样直接参数化隐态。这里,参数化隐藏状态的导数类似于连续的层次和参数,而不是离散的层次。所以参数也是连续空区间,我们不需要逐层传播梯度和更新参数。总之,神经微分方程在前向传播过程中不存储任何中间结果,因此只需要近似恒定的存储开销。
从残差网络到微分方程
残差网络是一种特殊的卷积网络,它通过残差连接解决了梯度反向传播的问题,即当神经网络层次很深时,梯度仍然可以有效地传回输入端。下图是原论文中剩余模块的结构。残差块的输出将输入信息与内部卷积运算的输出信息相结合。这种剩余连接或身份映射表明深度模型的精度至少不低于浅层网络的精度。堆叠几十个或者几百个这样的残差模块,就是一个非常深的残差神经网络。
如果我们将上述剩余模更正式地表示为下面的等式:
其中h_t是t层隐单元的输出值,f是θ _ t参数化的神经网络,方程表示上图的整个残差模,如果我们改写成残差的形式,即h_t+1-h_t = f(h_t,θ_t)。那么我们可以看到,神经网络F参数化了隐层之间的残差,F也没有直接参数化隐层。
NET假设层次结构是离散的,T层和t+1层之间没有定义。那么如果中间有定义呢?剩余项h_t0-h_t1应该小到接近无穷大吗?这里我们较少关注分母,即剩余项应该表示为(h_t+1-h_t )/1,分母为1表示两个离散水平的差为1。所以再一次考虑层与层之间的定义,我们会发现残差项最终会收敛到隐层对t的导数,而这个导数实际上是被神经网络参数化的。
所以如果我们在级别之间增加更多的层,并最终倾向于增加无限层,那么神经网络将是连续的。可以说,残差网络实际上是连续变换的欧拉离散化,是一个特例。我们可以将这种连续变换正式表示为一个常微分方程:
从导数定义的角度来看,当t的变化趋于无穷大时,隐态dh(t)的变化可以用神经网络来建模。当t从起始点变化到终点时,h(t)的变化最终代表正向传播结果。这样用神经网络来参数化隐含层的导数,神经网络层次确实是连续的。
如果现在能得到常微分方程的数值解,就相当于完成了正向传播。具体地,如果h(0)=X是输入图像,则在终止时间的隐藏层输出h(T)是推断结果。这是一个常微分方程的初值问题,可以用黑盒子中的ODE求解器直接求解。这样的求解器可以控制数值误差,所以我们总是可以在计算能力和模型精度之间做出权衡。
形式上,现在需要对方程(2)进行变换以找到数值解,即,在给定初始状态h(t_0)和神经网络的情况下,找到最终状态h(t_1):
如上图,常微分方程h(t_1)的数值解需要神经网络F从t_0到t_1的积分。我们完全可以用ODE求解器来求解这个值,在数学物理领域有非常成熟的解决方案。我们只需要把它当作一个黑盒工具。
从微分方程到残差网络
如前所述,残差网络是神经常微分方程的特例,因此可以说残差网络是欧拉方法的离散化。三百年前欧拉解常微分方程的方法很直观,就是h (t+δ t) = h (t)+δ t× f (h (t),t)。每当隐藏层沿着T迈出一小步δT时,新的隐藏层状态h(T+δT)应该近似地在现有方向上迈出一小步。如果这样一个小步长从t0到t1,那么就得到了ODE的数值解。
如果我们每次都让δt等于1,那么离散化后的欧拉方法就等于剩余模的表达式h(t+1) = h(t)+f(h(t),t)。但欧拉方法只是求解常微分方程最基本的方法。它走的每一步都会产生一些误差,误差不断积累。在过去的百年中,数学家们构造了许多现代的ODE解,这些解既能保证收敛到真实解,又能控制误差水平。
陈天琦等研究人员构建的ODE网络使用了自适应ODE求解器,不像欧拉方法那样移动固定的步长。相反,它会根据给定的误差容限选择合适的步长来逼近真实解。如下图所示,左边的残差网络定义了一个有限变换的离散序列。它是从0到1到5的离散级数,通过激活函数在每一级进行非线性变换。另外,黑评价位可以看作是一个神经元,它会对输入进行一次转换,以修正传输的值。右边的ODE网络定义了一个向量场,隐藏状态会有一个连续的过渡,根据误差容限自动调整黑评点。
网络比较
在大卫的口头演讲中,他用两个伪代码展示了ResNet和ODEnet的区别。ResNet的主要流程如下图,其中f可以看作卷积层,ResNet是整个模型架构。在卷积层F中,H是前一层输出的特征图,T决定当前是哪个卷积层。ResNet中的回路是剩余连接,所以这个网络有T个剩余模块,最后返回T层的输出值。
F (h,t,θ): return nnet (h,θ_ t)def ResNet(h):for t in[1:t]:h = h+f(h,t,θ) return h与常见的ResNet相比,下面这段伪代码还是比较新颖的。首先,F和以前一样定义为神经网络,但是现在它的参数θ是一个整体,同时T作为一个独立的参数也需要馈入神经网络,这说明层次之间是有定义的,是一个连续的网络。整个ODEnet不需要通过一个循环建立一个离散的层次结构,只需要通过ODE求解器找到t_1时刻的h。
F (h,t,θ):返回NNET ([h,t],θ) DEF ODE NET (h,θ):返回ODE SOLVER (f,h,t _ 0,t _ 1,θ)除了计算过程的不同,陈天琦等研究人员还在MNSIT中测试了这两种模型的效果。他们使用带有六个剩余模块的ResNet和带有一个ODE求解器的ODEnet来代替这些剩余模块。下面显示了不同网络对MNSIT的影响、参数、内存占用和计算复杂度。
单隐层的MLP引用自1998年LeCun的研究,其隐层只有300个神经元,但ODEnet在参数相近的情况下可以得到明显更好的结果。上表中,L表示神经网络的层数,L tilde表示ODE Solver中的求值次数,可以近似表示ODEnet的“级别深度”。值得注意的是,ODEnet只有一个恒定的内存占用,这意味着无论层次结构增加多深,它的内存占用都不会有太大的变化。
常微分方程
在与ResNet的类比中,我们已经基本知道了ODEnet的正向传播过程。首先我们输入数据Z(t_0),可以通过一个连续变换函数(神经网络)对输入进行非线性变换,得到f,然后ODESolver对f进行积分,加上初始值,得到最终的推理结果。如下所示,残差网络只是用离散残差连接替换了ODE求解器。
在前向传播中,ODEnet还有几个非常重要的性质,即模型的层数和模型的误差控制。首先,它是一个连续的模型,没有明确的层数,只能用类似的度量来确定模型的“深度”。在本文中,作者使用ODE求解器评估的次数作为深度。
其次,深度与误差控制直接相关,ODEnet可以通过控制误差容差来确定模型的深度。因为ODE求解器可以确保在误差容限内逼近常微分方程的真实解,所以改变误差容限可以改变神经网络的行为。一般来说,降低ODE求解器的误差容差会增加函数的求值次数,所以类似于增加模型的“深度”。调整误差容限可以让我们在精度和计算成本之间做一个权衡,所以我们可以在训练中使用一个精度高的神经网络,学习得更好,在推理中根据实际计算环境调整到一个较低的精度。
如原论文上图所示,图A表明模型可以保证在误差范围内,并且随着误差的减小,正向传播的函数求值次数增加。图B显示了评估次数和相对计算时间之间的关系。图D显示,函数求值的次数会随着训练的增加而自适应增加,这表明模型的复杂度会随着训练的进行而增加。
图C更有意思。说明前向传播的函数求值次数大致是后向传播的两倍,这恰恰说明后向传播中的伴随灵敏度方法不仅内存效率高,而且比直接通过积分器的后向传播具有更高的计算效率。这主要是因为调整灵敏度不需要依次传递给正向传播中的每一个函数求值,即梯度是由后向前逐层传递的,不需要穿过模型的深度。
反向传播
同行教师杰西·贝当古(Jesse Bettencourt)向机器之心介绍,“天齐最擅长的是耐心解释。他遇到任何代码问题、理论问题、数学问题,一旦向同桌天奇请教,对方一定会花时间把问题解释清楚透彻。而ODEnet的反向传播就是这样一个需要耐心解释的问题。
ODE的反向传播与普通的反向传播有些不同。我们可能需要仔细查阅原论文和相应的附录证明,才能有更深入的理解。另外,作者给出了ODEnet的PyTorch实现,通过它我们也可以知道实现细节。
正如作者所说,训练一个连续的层次网络的主要技术难点在于通过ODE求解器实现梯度的反向传播。其实让梯度沿着正向传播的计算路径反向传播是很直观的,但是内存占用会比较大,数值误差无法控制。作者的解决方法是把正向传播ODE求解器看成一个黑箱操作,梯度很难或者没有必要传入,直接“绕过”就可以了。
作者采用一种称为伴随方法的梯度计算方法,在前向传播中“绕过”ODE求解器,即模型在反向传播中通过第二个增广的ODE求解器计算梯度,可以近似计算ODE求解器按照计算路径传回的梯度,因此可以用于进一步的参数更新。如上图C所示,这种方法不仅在计算和内存上有很大的优势,而且可以精确控制数值误差。
具体来说,如果我们的损失函数是L()并且它的输入是ODE求解器的输出:
第一步,求L对z(t)的导数,或者说模型损耗的变化如何依赖于隐态z(t)的变化。损失函数L对z(t1)的导数可以为整个模型的梯度计算提供一个入口。作者把这个导数伴随称为a(t) = -dL/z(t),实际上相当于隐层的梯度。
在传统的基于链式法则的反向传播中,我们需要从后层推导到前层传递梯度。在连续ODEnet中,我们需要从前面得到的a(t)导出连续T。因为a(t)是丢失的L对隐藏状态z(t)的导数,所以与传统链式法则中的传播概念基本一致。下面的公式给出了a(t)的导数,它可以沿着连续的t方向向前推进梯度。附录B.1介绍了该公式的具体推导过程。
在获得每个隐藏状态的梯度后,我们可以找到它们对参数的导数并更新参数。同样,在ODEnet中,在得到隐藏态的梯度后,对参数进行求导和积分就可以得到损失对参数的导数。这里需要积分的原因是“水平”t是连续的。该等式可以表示为:
综上所述,我们可以直观地把ODEnet的反向传播过程理解为三个步骤,即首先求出梯度入口的伴随a(t_1),然后求出a(t)的变化率da(t)/dt,这样就可以求出不同时刻的a(t)。最后,在a(t)和z(t)的帮助下,我们可以计算损耗对参数的梯度并更新参数。当然,这只是简单直观的理解,更完整的反向传播过程见原论文算法1。
反向传播呢?
在算法1中,陈天琦和其他研究人员展示了如何在另一个OED求解器的帮助下,一次性获得反向传播的各种梯度和更新。要理解算法1,首先要熟悉ODESolver的表达式。比如在ODEnet的正向传播中,求解过程可以表示为ODEsolver(z(t_0),f,t_0,t_1,θ),可以理解为从t_0时刻开始z(t_0)以变化率f的演化。这个进化是f对t的积分,ODESolver的目标是获得z (t _
我们也可以这样理解算法1。我们的目的是用ODESolver从z(t_1)求z(t_0),根据方程4从a(t_1)积a(t_0),根据方程5从0积dL/dθ。最后我们只需要用dL/dθ更新神经网络f(z(t),t,θ)就可以完成整个反向传播过程。
如上图,如果初始给定参数θ,正向初始时间t_0和终止时间t_1,终止状态z(t_1)和梯度入口l/z (t _ 1)。接下来我们可以把这三个积分合起来一次性求解所有的量,这样就可以定义初始状态s_0,这是求解常微分方程的初值。
注意,第一个初始值z(t_1),实际上在正向传播中已经从z(t_0)计算到z(t_1),但是模型不会保留计算结果,所以只有恒定的内存开销。另外,在计算a(t)时,我们需要知道对应的z(t),比如L/z(t_0)需要知道z(t_0)的值。如果不能保存中间状态,那么我们可以从z(t_1)到z(t_0)反过来重新计算中间状态。这个计算过程与正演过程基本相同,即z(t_0)是由z(t_1)以变化率f通过演化导出的。
定义了s_0之后,我们需要确定初态是如何“演化”到终态的。这些演变由先前方程(3)、(4)和(5)的被积函数定义,该被积函数由算法1中的aug_dynamics()函数定义。
其中f(z(t),t,θ)是z (t_0)当它是t_1到t_0的乘积时。这个第一个常微分方程是为第二个方程提供条件的。并且-a(t) * l/z (t)是从t1到t0的a (t_0),类似于传统神经网络中损失函数对第一隐层的导数,整个a(t)相当于隐层的梯度。只有获得积分路径中所有隐层的梯度,才能进一步求解损失函数对参数的梯度。
因此,反向传播中的第一和第二常微分方程为第三微分方程,即a(t)和z(t)提供了条件。最后从t1到t0对-a (t) * f (z (t),t,θ)/θ进行积分得到dL/dθ。只需要一个积分,所以我们不再逐层传递梯度,更新那一层的具体参数。
如下面的伪代码所示,完成反向传播的步骤很简单。先定义每个变量的演化方法,然后结合初始化状态传入ODESolver就可以了。
F _ and _ a ([z,a],t): return [f,-a * df/da,-a * df/dθ] [z0,dl/dx,dl/dθ] = ode求解器([z (t1),dl/dz (t),0
这种连续变换有一个很重要的属性,就是可以方便快捷地计算出流量模型中最基本的变量替换定理。在论文的第四部分,作者在推导结果的基础上构建了一个新的可逆密度模型,该模型可以克服Glow和train等归一化流量模型直接通过最大似然估计的缺点。
变量替换定理
对于概率密度估计中的变量替换定理,可以从单变量的情况入手。给定一个随机变量z及其概率密度函数z π (z),我们希望利用映射函数x=f(z)构造一个新的随机变量。函数f是可逆的,即z=g(x),其中f和g互为反函数。现在的问题是如何推断新变量的未知概率密度函数p(x)?
根据定义,积分项∫π(z)dz表示无限个无穷小矩形的面积之和,其中积分元素δ z为积分小矩形的宽度,小矩形在位置Z处的高度为概率密度函数π(z)定义的值。如果用f 1 (x)来表示f(x)的反函数,当我们替换变量时,z = f 1 (x)需要服从δ z/δ x = (f 1 (x))’。多变量的变量代换定理可以从单变量推广,其中det ∂f/∂z是函数f的雅可比行列式:
一般使用变量代换定理时需要计算雅可比矩阵f/z的行列式,这是主要的局限性。最近的研究工作一直在权衡标准化流模型隐含层的表达能力和计算成本。但是研究人员发现,用连续变换代替离散的层次结构可以简化计算,我们只需要计算雅可比矩阵的迹。的核心定理1如下:
在普通变量代换定理中,分布变换函数F(或神经网络)必须是可逆的,制作可逆的神经网络是非常复杂的。在陈天琦等研究者的定理中,无论哪种神经网络f都是自然可逆的,所以这种连续模型对流模型的应用应该是很方便的。
如下所示,随机变量z(t_0)及其分布可以通过连续变换演化为z(t_1)及其分布:
此外,连续流模型具有许多性质和优点,但这里不展开。变量替换定理1在附录a中有充分的证明,有兴趣的读者可以参考原文了解详情。
最后,神经常微分方程是一个全新的框架。除了流量模型,很多方法在连续变换的变化下有了新的属性,在离散激活的情况下可能很难获得。也许未来会有很多关于这种新模型的研究,连续神经网络会变得多样化。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/38608.html