007_SSSSS_ Neural Ordinary Differential


本文是 2018 最佳文章, 作者的想法可以用《赤壁赋》中的一句话来微妙的体现:盖将自其变者而观之,则天地曾不能以一瞬, 自其不变者而观之, 则物与我皆无尽也 。
作者提出了一种新的深度神经网络模型, 主要的思路是:原来的神经网络通常需要依靠若干多个残差网络堆叠起来, 而本文提出的可以仅用一个与之前残差块类似的网络来达到若干多个残差块堆叠的效果, 从而大大降低了网络的参数量和并且可以看作只需要常数的存储空间.
1.
的想法归根结底来自于传统的神经网络 。在传统的的残差网络( ), 循环神经网络(), 标准化流( Flow)等经典的网络中, 数据都可以用一个式子来表示:
h t + 1 = h t + f ( h t , θ t ) h_{t+1} = h_t + f(h_t, \) ht+1?=ht?+f(ht?,θt?)
其中h t ∈ R D h_t \in R^D ht?∈RD,t ∈ { 0 , 1 , . . . T } t \in \ 0,1,...T \ t∈{0,1,...T}. 这些堆叠起来的网络块可以看做是连续变换的欧拉离散化. 于是上式其实还可以看成:
h t + 1 = h t + f ( h t , θ t ) d t h_{t+1} = h_t + f(h_t, \) dt ht+1?=ht?+f(ht?,θt?)dt
只是这里的d t = 1 dt = 1 dt=1. 这两种看法, 第一种是将网络输出看作是变化量, 而后一种则是看作变化率, 形式上相近, 但是意义却有很大的不同.
那么当T T T 无限大, 即d t dt dt 无线小, 也就是说有无穷多的网络块连接的时候, 上式就可以看成是一种由神经网络决定的常微分方程的形式:
d h ( t ) d t = f ( h ( t ) , t , θ ) \frac{dh(t)}{dt} = f(h(t), t, \theta) dtdh(t)?=f(h(t),t,θ)
这个式子也就是本文的根源. 这样有了初始的状态h ( 0 ) h(0) h(0), 就可以通过求解常微分方程(, ODE)来求解出任意时刻的输出h ( T ) h(T) h(T), 如果中间求解过程用的是欧拉离散化求解的话, 那么离散化的步骤有多少步, 其实就可以看作是多少个块的堆叠.
简单一句话, 虽然并不全面, 但是可以帮助理解, 就是残差网络的连续化.
作者的主要贡献包括:
提出了新的深度神经网络模型, 拥有O ( 1 ) O(1) O(1) 的空间复杂度. 而且作者给出了反向传播更新参数的方法.作者将用在了 Flow中, 提出了一种连续的流模型(Flow).作者将用在了时间序列模型中. 2. 反向传播
【007_SSSSS_ Neural Ordinary Differential】现在的神经网络基本都需要完成两个内容, 首先是前向传播得到结果, 然后通过得到的结果反向传播来更新网络参数. 那么作为一种新的网络结构, 也需要具备这两个基本的功能.
的前向过程已经很明了, 就是求解上面已经给出的常微分方程, 求解的方法可以用现有的求解器ODE , 目前已经有多种ODE 可以直接使用. 最简单的就是欧拉离散化来求解, 也就是每次取很小的d t dt dt 然后不断的累加即可.
但是如何进行反向传播?
首先来考虑优化通过损失函数L ( ) L() L() 得到的损失向量, 损失函数的输入便是从初始的输入z ( t 0 ) z(t_0) z(t0?) 通过前向过程的ODE 得到的输出结果z ( t 1 ) z(t_1) z(t1?):
那么为了优化参数, 就需要求出损失L L L 关于参数θ \theta θ 的梯度, 也就是d L d θ \frac{dL}{d\theta} dθdL?.
这里再强调一下, 传统的残差网络, 每个残差块有自己的参数, 这些残差块串行的连接在一起, 前向的时候每个残差块只运行了一次, 所以反向传播的时候, 可以直接串行的计算出损失L L L 关于中间任意的第t t t 层输出结果h ( t ) h(t) h(t) 的梯度d L / d h ( t ) dL/dh(t) dL/dh(t) , 然后根据这个梯度来计算损失关于第t t t 层的参数θ t \ θt? 的梯度d L / d θ t dL / d\ dL/dθt?. 也就是最简单的链式法则.
但是只有一个类似于残差网络中的一个残差块的网络, 而的这一个块在前向的ODE 中被运行了多少次是未知的, 这个值通常很大, 那么用传统的链式法则求梯度显然是不可行的, 于是就需要通过其他方法来求梯度.