天生一对,硬核微分方程与深度学习的「联姻」之路
微分方程真的能结合深度神经网络?真的能用来理解深度神经网络、推导神经网络架构、构建深度生成模型?我们将从鄂维南、董彬和陈天琦等研究者的工作中,窥探微分方程与深度学习联袂前行的路径。
近日,北京智源人工智能研究院开展了第一次论坛,其以「人工智能的数理基础」这一重大研究方向为主题,从数学、统计和计算等角度讨论了智能系统应该怎样融合数学系统。
在论坛中,北京大学董彬副教授、林伟研究院和张志华教授等研究者从基础出发介绍了「数学」眼中的机器学习是什么样的。而这些数理基础,正好是构建可计算、可泛化、可解释和稳健 ML 系统所必需的。
在众多演讲中,我们发现董彬老师介绍的微分方程非常有吸引力,它对于探索新的深度学习架构、构建更高性能的深度学习模型非常有帮助。因此在这篇文章中,我们重点关注微分方程在深度学习中的应用,看起来,它们确实是天生一对的组合。
微分方程与深度学习
深度学习还能与微分方程相结合?是的,这是一个很有意思的领域,近来也有非常多的研究成果,包括 NeurIPS 2018 的最佳论文。那么什么是微分方程,它结合深度学习又有什么用呢?
按照维基百科的描述:「微分方程是一种数学方程,用来描述某一类函数与其导数之间的关系」,因此一个方程如果同时包含函数及其导数,那么就可以称为微分方程。例如,f'(x) = 2x 就是一个常微分方程,我们可以「看出来」其通解为 f(x)=x^2 +C,其中 C 表示任意常数。
不过深度学习一般也就会用到概率论、线性代数和最优化等基础数学,似乎与微分方程没什么关系?其实并不然,如果我们探索网络架构到底与数学的哪些概念是相关的,那么会发现深度神经网络可以理解为一种微分方程。即,深度神经网络架构,就是离散化的微分方程。
因此如果能找到了微分方程与深度网络之间的关系,那么两个领域之间的研究成果就能互相借鉴,也就能找到更高效的深度模型。
此外,深度学习的模型设计缺少系统指导,大多数深度学习模型都缺少可解释性,这也限制了它的应用。如果加上了微分方程,那么网络架构就是数值微分方程,网络训练就是最优控制,神经网络的设计也就能有理论指导了。
如上图所示,比较受关注的是神经网络架构与数值微分方程之间的关系,这个领域早期比较有影响的就是北大、普林斯顿教授鄂维南老师的研究,它首次将残差网络理解为微分方程。北大董彬等研究者在 ICML 2018 中进一步表明 ResNet、PolyNet、FractalNet 和 RevNet 等网络都可以理解为微分方程的不同数值离散方式。
此外,在 NeurIPS 2018 的最佳论文中,陈天琦等研究者提出神经常微分方程,在近似常数级的内存成本上,ODENet 能实现高效的图像分类和生成任务。在 ICLR 2019 中,陈天琦等研究者进一步将微分方程应用到流模型中,从而获得内存效率更高的生成模型。
正如董彬老师所言,通过结合微分方程,我们可以从数学角度出发设计网络架构,并分析它们的泛化性能和可解释性。在这篇文章中,我们希望从基本概念到应用,介绍该领域的一些新想法。
数学老师眼中的 ResNet
鄂维南院士是一位主要关注数学领域的研究者,也是北京大学和普林斯顿大学的教授。在 17 年的《Communications in Mathematics and Statistics》中,鄂维南发表了一篇文章,他讨论了使用连续动力学系统建模高维非线性函数的想法,即微分方程与深度学习之间的关系。
以下是该工作的地址:
- 论文:A Proposal on Machine Learning via Dynamical Systems
- 论文地址:https://link.springer.com/article/10.1007/s40304-017-0103-z
在这篇「Proposal」中,鄂老师表示深度神经网络可以理解为离散的动力学系统。离散的动力学系统很难分析,但连续的动力学系统在数学上更易于分析,因此它可作为深度神经网络的数学基础。此外,因为有很多种方式离散化动力学系统,所以我们也许能构建更多有意思的模型。例如,动力学系统可以选择自适应的时间步大小,这对应于选择自适应的神经网络层级。
这一篇文章提出了非常多的新洞见,尤其是结合常微分方程与深度残差网络的新视角。下面让我们看看在数学家的眼中,残差网络到底该怎样推导。
离散动态系统:ResNet
因为 DNN 可以视为离散的动力学系统,那么每一步最基础的动力学过程即线性变换加上非线性激活函数,这是最简单的非线性离散动力学系统之一。具体而言对于深度残差网络,我们可以用离散动态系统描述为:
其中 Z_l 和 Z_l+1 为第 l 层的输入与输出,y_l 为第 l 层的辅助变量,h 和 g 为一些映射,它们可以是线性的,也可以是非线性的。对于深度神经网络,如果 g 和 h 是恒等映射,训练会非常顺畅,那么为什么会这样呢?为什么 g 和 h 是恒等映射就能减轻梯度爆炸或消失问题?
实际上,如果令 G 为 g 的逆向映射(inverse map),我们可以将上述动力学系统写为:
为了有一个稳定的训练过程,即梯度不爆炸、不消失,上述方程右边的梯度需要接近于恒等映射。也就是说,梯度由后向前传时,它在量上需要保持稳定。鄂老师表示若令 h 和 g 都为恒等映射,∇G∇h 就逼近恒等映射(F 为较小随机扰动),梯度的传递就非常平稳。
其实若 h 和 g 为恒等映射,那么方程 2.3 就可以写为:
这难道不就是标准的残差连接吗?它不就是如下动态系统的离散化吗?
这里 t 相当于层级 l 的连续化,如果 l 趋向于无穷小,那么按照导数的定义,z_l+1 与 z_l 两层之间的差就趋向于 z 对 t 的导数。所以,可以说残差网络其实就是连续变换的欧拉离散化,它是一个特例。
如果从导数定义的角度来看方程 2.7,当 t 的变化趋向于无穷小时,隐藏状态的变化 dz 可以通过神经网络建模。当 t 从初始一点点变化到终止,那么 z(t) 的改变最终就代表着前向传播结果。
从节选的几步推导,我们可以看到,ResNet 能天然理解为动力学系统,能用微分方程天然表示。但是所有的,或大多数深度神经网络都能这样理解吗?董彬老师做了进一步的研究,他们将这一观点推广到了更多的深度神经网络。
其它深度卷积网络又怎样?
北京大学董彬副教授等研究者做了进一步探讨,即 ResNet 与微分方程的这种关系是特例还是一般化的联系。如果数值 ODE 和网络构架的联系建立起来了,董彬老师表示我们就可以从数值 ODE 反推出一些有用的神经网络构架。因为 ODE 已经发展了几十年,有丰富的研究成果可以参考,反推的新架构可能取得更好的效果。
在 ICML 2018 的一项研究中,董彬等研究者表示很多高效的卷积神经网络都能解释为微分方程,并基于微分方程的线性多步解法提出新的线性多步架构,这种结构能提升 ImageNet 等的图像分类任务的性能。
- 论文:Beyond Finite Layer Neural Networks: Bridging Deep Architectures and Numerical Differential Equations
- 论文地址:https://arxiv.org/abs/1710.10121
微分方程的解法即网络架构
这里展示了其它卷积网络与微分方程之间的关系,它们在图像识别等任务上都非常有效。如下所示为 ResNet 及其它三种卷积网络架构。
图源:arXiv: 1710.10121
其中 PolyNet 为每个残差模块引入了 PolyInception 模块,从而加强模块的表达能力。PolyInception 模块是 Inception 单元的「多项式」组合,它会以并行或串行的方式集成多条计算路径。FractalNet 以自相似性为基准设计架构,它会重复引用简单的扩展规则,从而生成结构为截断分形(fractal)的深度网络。最后的 RevNet 是一种可逆网络,它不需要在前馈传播中储存中间激活值。
在下表中,董彬老师总结了不同卷积网络对应的微分方程数值解法。其中 ResNet 和 ResNeXt 可视为步长为 1 的前向欧拉离散化,其它卷积网络也对应着不同的离散化方式。
图源:arXiv: 1710.10121
PolyNet
这里我们先看看 PolyNet 怎样搭上微分方程这班车。PolyNet 主要希望提供多样性的架构,因此 PolyInception 除了常规残差模块的一阶路径,还添加了另一条二阶路径。具体而言,PolyInception 模块可以表示为:
其中 I 表示恒等映射,「·」表示作用于,即 F·x 表示非线性变换 F 作用于 x。我们可以看到,PolyInception 多了一个二阶的复合函数,也就是说,如果 F 表示某种 Inception 模块,那么二阶的路径会穿过串联的两个 Inception 模块。在 PolyNet 原论文中,作者展示了可能的 PolyInception 结构:
图源:arXiv: 1611.05725
如上所示,a 和 b 是等价的,F 和 G 表示是否共享参数。董彬老师表示,PolyNet 可以解释为时间步为 1 的反向欧拉方法,实际上前向传播就是在解一个反向欧拉。
不过本身反向欧拉要求解一个非常巨大的非线性方程组的逆,这样无法求解就只能用多项式去逼近解。也就是说,上式的求逆又可以写为:
因此,PolyNet 可以视为采用反向欧拉策略解常微分方程 u_t = f(u) 的逼近方法。如果这样理解,那么它暗示着允许更大的时间步大小,因此这表示我们可以采用更少的残差模块就能构建更好的效果。这正好解释了,为什么 PolyNet 能增加残差模块宽度而降低层级深度,从而实现更好的分类准确度。
此外,从微分方程的角度来说,反向欧拉法要比正向欧拉法有更好的稳定性。这也能从侧面说明为什么在相近参数和计算量下,PolyNet 能实现更好的效果。
FractalNet 与 RevNet
FractalNet 与 RevNet 也都有对应的微分方程「解法」,研究者发现 FractalNet 的宏观架构能解释为数值分析中著名的 Runge-Kutta 方法。例如对于复合次数小于等于 2 的 FractalNet,每一个模块都可以表示为:
其中 f_1 和 f_2 分别表示不同的 Fractal,如果我们看看二阶的 Runge-Kutta 方法,我们就会发现他们的表达式非常相似:
另外的 RevNet 也是一样,因为它是一种可逆的深度网络,所以它有从 X 到 Y 和 Y 到 X 的过程。如果它们分别对应着前向欧拉方法,那么就表示两条简单的动态系统就能描述整个神经网络。此外值得注意的是,虽然深度学习中很少有可逆的双向网络,但是在微分方程中,动态系统的正反向都是可行的。
最后,董彬老师还根据数值微分方程提出了一种新的结构:Linear Multi-step Architecture。他表明加上这种结构,残差网络只需要一半的参数量就能达到相同的训练效果,这表示新结构使卷积网络的训练更高效与稳定,希望了解的读者可查阅董老师的原论文。
神经化的微分方程
微分方程除了为深度网络提供理论解释,并启发架构创新,它还能做一些更炫酷的工作吗?多伦多大学陈天琦等研究者表示,既然残差连接就是常微分方程(ODE)的离散化,那么常规神经网络的前向传播过程岂不就是微分方程给定初值解末值的过程?如果我们用业界成熟的微分方程求解器(ODESolve)解某个 ODE,这不就能代替前传和反传么?
在他们的研究 ODENet 中,研究者使用神经网络参数化隐藏状态的导数,而不是如往常那样直接参数化隐藏状态。这里参数化隐藏状态的导数就类似构建了连续性的层级与参数,而不再是离散的层级。因此参数也是一个连续的空间,我们不需要再分层传播梯度与更新参数。
简而言之,ODENet 中的神经网络建模可以表示为下式:
其中 f 表示的是神经网络,h 表示的是隐藏状态。相比而言,常规卷积网络可表示为 h(t+1) = f(h(t), θ)。
如果参数化的是隐藏状态的变化,神经微分方程在前向传播过程中不储存任何中间结果,因此它只需要近似常数级的内存成本。
- 论文:Neural Ordinary Differential Equations
- 论文地址:https://arxiv.org/abs/1806.07366
- 实现地址:https://github.com/rtqichen/torchdiffeq
新颖的前传与反传
其实 ResNet 只不过是简单的欧拉离散化,而近百年来,数学家构建了很多现代 ODE 求解方法。这些新方法不仅能保证收敛到真实解,同时还能控制误差水平。
ODENet 就采用了一种适应性 ODESolver 代替前向传播过程,它不像欧拉法移动固定的步长,相反它会根据给定的误差容忍度选择适当的步长逼近真实解。
如下图所示,左边的残差网络定义有限转换的离散序列,它从 0 到 1 再到 5 是离散的层级数,且在每一层通过激活函数做一次非线性转换。此外,黑色的评估位置可以视为神经元,它会对输入做一次转换以修正传递的值。而右侧的 ODE 网络定义了一个向量场,隐藏状态会有一个连续的转换,黑色的评估点也会根据误差容忍度自动调整。
图源:arXiv: 1806.07366
所以 ResNet 采用的是固定的步长 1,适应性 ODESolver 可以自动估计不同的步长,它的自由度和误差控制都更强一些。
对于新颖的前向传播,我们可以通过两段伪代码了解它与常规方法的不同之处。如下是 ResNet 的简要伪代码,定义 f 为卷积层、T 为残差块的数量:
def f(h, t, θ): return nnet(h, θ_t) def resnet(h): for t in [1:T]: h = h + f(h, t, θ) return h
如下展示的是整个 ODEnet 的伪代码,f 表示的也是神经网络层级。不过它不需要层层堆叠离散的层级,只要通过 ODESolver 求出终止时刻 t_1 的 h 就行了,整个 ODESolver 就是一个黑箱过程。
def f(h, t, θ): return nnet([h, t], θ) def ODEnet(h, θ): return ODESolver(f, h, t_0, t_1, θ)
所以不同之处在于 ODESlover 代替了整个前传过程,这样岂不是无法进行反向传播了?为了「绕过」前向传播中的 ODESolver,陈天琦等研究者采用了一种名为 adjoint method 的梯度计算方法。也就是说,模型在反传中通过第二个增广 ODESolver 算出梯度,其可以逼近按计算路径从前向 ODESolver 传递回的梯度,因此可用于进一步的参数更新。
总之,通过一系列推导,反向传播在不知道中间激活值的情况下,直接求一个微分方程就行了。我们并不需要一层层反向传递梯度,就能直接获得更新参数的梯度。ODENet 的反向传播过程如下伪代码所示:
def f_and_a([z, a], t): return[f, -a*df/da, -a*df/dθ] [z0, dL/dx, dL/dθ] = ODESolver([z(t1), dL/dz(t), 0], f_and_a, t1, t0)
其中 f_and_a 为增广状态的动力学过程,用于求解微分方程。ODESlover 求出来的 dL/dθ 就可以直接用来更新神经网络的权重。
ODENet 采用了一种非常新颖的前向与反向传播过程,它和常规的神经网络训练完全不一样。它的优势也体现在这种差异上,因为反向传播不需要保留前传的中间计算结果,所以只需要常数级的内存要求。
微分方程也能搭生成模型
在 ODENet 中,研究者也展示了将微分方程应用到生成模型的前景。因此在 ICLR 2019 中,陈天琦等研究者进一步研究了微分方程如何用于流模型。
- 论文:FFJORD: Free-form Continuous Dynamics for Scalable Reversible Generative Models
- 论文地址:https://arxiv.org/abs/1810.01367
目前,最流行的生成模型 GAN 通过生成器与判别器的博弈,从而逼近真实数据的概率密度函数 p(x)。但流模型希望通过一系列可逆转换,明确地学习到数据分布 p(x)。因此,流模型会通过可逆神经网络将数据点从一个简单分布映射到复杂分布。
但基于似然度训练常规流模型需要限制它们的架构,从而使雅可比行列式的计算成本足够小。例如流模型 Real NVP 或 Glow 等,它们对矩阵维度进行分割或使用秩为 1 的权重矩阵进行限制。
ODENet 使用常微分方程定义了一种从隐变量到数据的映射,它可以使用相对低成本的迹运算计算雅可比行列式。后面提出的 FFJORD 进一步发扬了这种观点,它将迹估计和前向传播都定义为了常微分方程,并使用 ODESolver 直接求解。直观而言,FFJORD 的抽象过程可如下图所示:
图源:arXiv: 1810.01367
如上图所示,对于微分方程而言,我们知道初始的随机分布 z(t_0),并系统通过 ODESolver 解出真实图像分布 z(t_1)。如果知道了 z(t_1),那么从中采样就能生成真实图像。
最后,这些方向与成果都表明,微分方程真的可以和深度神经网络相结合。也许以后,微分方程乃至其它数理基础,都能帮助我们构建更鲁棒和可解释性的机器学习系统。