跳转至

Neural ODE

在 Physics-informed Neural Networks (PINNs) 中,神经常微分方程(Neural Ordinary Differential Equations, Neural ODEs)是一个绕不开的话题。在阅读NewtonGen 的过程中,我觉得我有必要把 Neural ODE 是什么搞清楚,所以我以这篇文章作为笔记。

可能有用的资料

Neural ODE 的思想

Neural ODE 是一种特殊 ResNet 的连续情况;Neural ODE 的梯度计算使用了伴随方程的性质。

Neural ODE 与 ResNet

ResNet 的缘起虽然最初来自于解决“梯度消失”这个问题,但是也可以用一种“差分”的思想去理解它:

一个 \(K\) 层残差神经网络定义了一个离散动态系统(discrete dynamical system)

\[ \mathbf{h}_{k+1}= \mathbf{h}_k + \Delta t_k , f_{\theta_k}(\mathbf{h}_k), \quad k = 0, \dots, K-1 \]
  • \(\mathbf{h}_k \in \mathbb{R}^d\): 第 \(k\) 层的隐藏状态
  • \(f_{\theta_k}\): 每层都不同的神经网络
  • \(\Delta t_k\): 步长,一般为隐式,\(=1\)

而相比之下,一个 Neural ODE 定义了一个连续动态系统

\[ \begin{gather} \frac{d\mathbf{h}(t)}{dt} = f_\theta(\mathbf{h}(t), t), \quad t \in [t_0, t_1] \\ \mathbf{h}(t_1) = \text{ODESolve}(f_\theta, \mathbf{h}(t_0)). \end{gather} \]
  • \(f_\theta\) 是一个向量场
  • “深度”是连续的

都是某种迭代计算

\[ \begin{aligned} \text{ResNet:} &\quad\mathbf{h}_K = \mathbf{h}_0 + \sum_{k=0}^{K-1}\Delta t_k f_{\theta_k}(\mathbf{h}_k) \\ \text{NODE:} &\quad\mathbf{h}(t_1) = \mathbf{t_0} + \int_{t_0}^{t_1}f_{\theta}(\mathbf{h}(t),t) \mathrm dt \end{aligned} \]

不同的是,ResNet 的计算图是固定的,ResNet 的每一层隐状态可能是不同的空间,每一层也可能捕捉完全不同的信息;而 NODE 的步长由数值求解器(如 odeint)决定,所有隐状态都共享一空间。

伴随方程与 Neural ODE 的求导

伴随方程

对于下面一个 Neural ODE:

\[ \begin{gather} \begin{cases} \displaystyle \frac{d\mathbf{h}(t)}{dt} = f_\theta(\mathbf{h}(t), t), \quad t \in [t_0, t_1], \\ \mathbf{h}(t_0) = \mathbf{h}_0(\mathbf{x}), \end{cases} \\ \mathcal{L} = \ell(\mathbf{h}(t_1))\\ \end{gather} \]

我们要求:

\[ \frac{d\mathcal L}{d\mathcal \theta},\quad\frac{d\mathcal L}{d\mathbf{h}_0} \]

定义伴随变量(adjoint variable):

\[ \mathbf{a}(t) \triangleq \frac{\partial \mathcal L}{\partial \mathbf{h}(t)} \in \mathbb R^d \]

则该伴随变量满足以下的微分方程:

\[ \begin{cases} \displaystyle \frac{d \mathbf{a}(t)}{dt} =-\mathbf{a}(t)^T\frac{\partial f_{\theta}(\mathbf{h}(t), t)}{\partial \mathbf{h}},\quad t\in[t_0, t_1], \\ \displaystyle\mathbf{a}(t_1) = \frac{\partial \ell}{\partial \mathbf{h}(t_1)} \end{cases} \]

这个方程称为伴随方程(adjoint equation),具体由 Neural ODE 推出伴随方程的过程比较复杂,见数学原理部分。

Neural ODE 的求导

\(\mathbf{a}(t)\) 的定义,该过程就很显然了:

\[ \frac{d\mathcal L}{d\theta}=-\int_{t_1}^{t_0}\mathbf{a}(t)^T\frac{\partial f_{\theta}(\mathbf{h}(t),t)}{\partial \theta}\mathrm dt \]

这个积分又可以使用 odeint 这样的微分方程库求解,这样我们就可以避免在求解器内进行梯度传播;可以认为,它是 ResNet 在时间连续时的极限:

\[ \mathbf{a}_k = \mathbf{a_{k+1}}\left(I+\Delta t\frac{\partial f}{\partial \mathbf{h}_k}\right) \]

Play Neural ODE

目前待完成,可以先参考 Deep Implicit Layers 上的Chapter 3 – Neural ordinary differential equations (colab)

可以看到,Neural ODE 拟合的曲线相比 ResNet 更为平滑;貌似可以更适合 Physics-informed AI 的使用。

Neural ODE 的数学原理

伴随方程的推导

Neural ODE 与基于流的生成模型

参考:维基百科中的 Flow-based generative model

流式生成模型

标准流

\[ \begin{gather} \mathbf{z}_0 \sim p_0(\mathbf{z}) \\ \mathbf{z}_1 = T(\mathbf{z_0}) \\ p_1(\mathbf{z}_1) = p_0(\mathbf{z}_0) \left|\det\frac{\partial T^{-1}}{\partial \mathbf{z}_1}\right| \end{gather} \]
  • \(p_0(\mathbf{z})\) 是一个初始分布
  • \(T\) 是一个标准流
  • 第三行的公式就是概率密度变换公式

连续标准流

\[ \frac{d\mathbf{z}(t)}{dt}= f_{\theta}(\mathbf{z}(t),t) \]

\(p(\mathbf{z},t)\)\(\mathbf{z}(t)\) 的概率密度函数,则 \(p\) 满足连续性方程(Liouville 方程):

\[ \frac{\partial p}{\partial t}+\nabla\cdot(pf_{\theta})=0 \]

这也是为什么这种概率模型被称为“流”,这种模型的主要思想就是通过一系列的变换将一个初始分布逐步“调整”为我们想要的分布。

\[ \frac{d}{dt}\log p(t) = -\operatorname{tr}\left(\frac{\partial f_{\theta}}{\partial z}\right) \]

论文中给出了以上这个重要的定理(Instantaneous change of variables)的证明;这个定理的作用是,我们不需要计算完整的 Jacobian 矩阵,而只需要计算它的迹;

评论