神经了的ODE:Neural Ordinary Differential Equations

Abstract

我们介绍深度神经网络模型的一个新家族。我们使用神经网络参数化隐藏状态的导数,而不是指定一个离散的隐藏层序列。网络的输出使用一个黑盒微分求解器进行计算(blackbox differential equation solver)。这些连续深度模型需要的存储成本恒定、针对不同输入调整评估策略(evaluation strategy)、可以用数值精度换取速度。我们在 continuous-depth residual networks 和 continuous-time latent variable models 中证明这些性质。我们也构建了连续标准化流(continuous normalizing flows),可以使用 maximum likelihood 训练的生成模型,不需要对数据维度进行分区或排序。在训练过程中,我们展示了怎样通过 any ODE solver 可调节地进行反向传播, without access to its internal operations。

1、Introduction

残差网络(residual networks)、循环神经网络解码器(recurrent neural network decoders)、标准化流(normalizing flows)通过堆叠一系列的转换(transformations)形成一个隐状态来建立复杂的转换(transformations):
在这里插入图片描述
  其中, t ∈ { 0... T } t \in \lbrace0...T\rbrace t{0...T} h t ∈ R D h_t\in\Bbb{R}^D htRD。这些迭代更新可以看作为一个连续变换(continuous transformation)的 欧拉离散化(Euler discretization)。(Lu et al., 2017; Haber and Ruthotto, 2017; Ruthotto and Haber, 2018)
当我们添加更多的层、每一步更小的时候会发生什么?在极限的情况下,我们参数化隐藏神经元的连续动态(continuous dynamics)使用一个神经网络指定的 ordinary differential equation (ODE):
在这里插入图片描述
  从输入层 h ( 0 ) h(0) h(0)开始,我们可以将输出层 h ( T ) h(T) h(T)定义为在某时刻T上ODE初值问题的解。这个值可以由一个黑箱微分方程求解器计算,它评估隐藏神经元动力学 f f f在任何需要的地方求解符合精度要求的解。图1对比了这两种方法。
在这里插入图片描述
  左边:残差网络定义了一个有限变换的离散序列。右边:一个ODE网络定义了一个向量场(vector field),可以进行状态的连续转换。 B o t h Both Both:圆圈代表评估的位置。

使用ODE求解器定义和评估模型有几个好处:
内存优化
  不论是什么结构的神经网络,其本质就是在拟合一个复杂的复合函数,复合的次数就是神经网络的层数,要找到参数的梯度,很容易就想到链式法则,然而,在前向传播时我们需要保留所有层的激活值,并在反向传播时利用这些激活值,这对内存的占用非常大,对深度模型的训练过程来说是一个很大的限制。
  对于Neural ODE来说,若直接通过积分器来做反向传播,则需要对一个积分求微分,内存开销会很大,且计算的误差会逐渐累加,因此,作者给出了一个adjoint sensitivity method来计算ODE的梯度,该方法将梯度的计算归结为解一个ODE,该ODE能够ODE Solver求解,其思路来源于Pontryagin论文《The mathematical theory of optimal processes》中的庞特里亚金最大化原理,具体的公式比较复杂,这里就不给出了。我们将隐藏状态的导数作为参数,因此参数就不是一系列离散值,而是一个连续的空间,因此并不需要依次传递到前向传播中的每一个函数进行评估,也就不用耗费大量空间来存储中间结果了。
自适应计算
  绝大多数常微分方程都很难找到解析解,因此往往通过数值求解,比如最简单的方法Euler法(这样就又变成ResNet了),还有更复杂一点的Runge-Kutta法,近百年来,数学家对ODE的求解已经研究得很深入了,现代的ODE Solver也已经非常成熟,它们不仅能保证收敛到真实解,同时还能控制误差水平,会根据给定的误差容忍度选择适当的步长逼近真实解。在评估或训练过程中,通过显式地改变数值积分的精度,我们可以自由地调节模型的速度和精度,比如我们可以花更多的时间去训练一个高精度的模型,而在评估预测时降低精度以提高系统的响应速度。
公式简化
在这里插入图片描述
Continuous time-series models
  与RNN不同,RNN需要离散的观测值和观测间隔(emission intervals),continuously-defined dynamics can naturally incorporate data which arrives at arbitrary times. 连续定义的动力学模型可以很自然地合并在任意时刻观测的数据。在第5节,我们构建和演示了这样一个模型。

2、ODE解的Reverse-mode automatic differentiation

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
分数阶微分方程是一类比常见的线性微分方程更为复杂的方程,其被广泛应用于物理、生物、金融等领域。本文将介绍如何使用MATLAB编写解决分数阶微分方程的代码。 首先,将分数阶微分方程转化为常微分方程。这可以通过采用Caputo定义,或者Grünwald-Letnikov定义加权平均来实现。在这里,我们采用Caputo定义将分数阶微分方程转化为常微分方程。 接下来,我们可以使用MATLAB中的ode45函数解决常微分方程。ode45是一种常用的解决常微分方程的函数,它可以在一定时间范围内对微分方程进行数值解。 代码演示: % 定义分数阶微分方程 y(t) function dydt = fractional_deriv(t,y,alpha) dydt = zeros(1,1); dydt(1) = Caputo_derivative(y,alpha); % 定义Caputo导数 function result = Caputo_derivative(y,alpha) syms t p; f = laplace(y,t,p); result = real(ilaplace((p^alpha)*f,p,t)); % 定义初始值 y0 = 0.5; % 定义时间范围 tspan = [0 10]; % 定义分数阶参数 alpha = 0.5; % 使用ode45函数解决微分方程 [t,y] = ode45(@(t,y)fractional_deriv(t,y,alpha),tspan,y0); % 打印结果 plot(t,y); 在以上代码示例中,我们定义了分数阶微分方程和Caputo导数,然后使用ode45函数来解决得到结果。最后,我们绘制了图形以分析解决方案的有效性。 在MATLAB中解决分数阶微分方程并不困难,只要有一定的编程基础和问题领域的背景知识,就可以轻松地解决分数阶微分方程问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值