本系列文章板块规划
提示:以下内容仅为个人学习感悟,无法保证完全的正确和权威,大家酌情食用谢谢。
第一部分 torchdiffeq背后的数理逻辑
第二部分 torchdiffeq的基本用法
第三部分 trochdiffeq的升级用法
第四部分 torchdifffeq的案例和代码解析
第五部分 总结
第一部分的参考资料:
【1】关于数值方法如何求解(当解析方法不能被使用时):
https://tutorial.math.lamar.edu/Classes/DE/EulersMethod.aspx 欧拉方法
【2】关于NeuralODE和Resnet之间的联系:
https://zhuanlan.zhihu.com/p/77587163
https://www.jiqizhixin.com/articles/122302
torchdiffeq背后的数理逻辑
torchdiffeq 是一个针对PyTorch的库,它提供了用于解决常微分方程(ODEs)的求解器。这个库主要用于实现神经常微分方程(Neural Ordinary Differential Equations,或简称 Neural ODEs),这是一种深度学习模型,它在传统的残差网络(ResNet)基础上,将层间的映射视作连续的动态系统。
首先,我们来解释一下什么是ODEs。
ODE方程描述的是一个或多个函数及其导数之间的关系,依赖于单一的独立变量,而时间是最常见的独立变量。可以用以下公式来表述:
F
(
t
,
y
,
d
y
d
t
,
d
2
y
d
t
2
,
…
,
d
n
y
d
t
n
)
=
0
F\left(t, y, \frac{dy}{dt}, \frac{d^2y}{dt^2}, \ldots, \frac{d^ny}{dt^n}\right) = 0
F(t,y,dtdy,dt2d2y,…,dtndny)=0
在这个表达式中,
y
(
t
)
y(t)
y(t)即为我们想求解的函数,
y
′
,
y
′
′
,
…
,
y
(
n
)
y', y'', \ldots, y^{(n)}
y′,y′′,…,y(n)为这个函数的一阶,二阶,直至n阶导数。可以这样理解,常微分方程即只包含单个自变量
t
t
t,未知函数
y
y
y 和未知函数的导数
y
(
n
)
y^{(n)}
y(n) 的等式。
更常见的表示式为df(x)/dx = g(f(x), x)
d
f
(
t
)
d
x
=
g
(
f
(
x
)
)
\frac{d\mathbf{f}(t)}{dx} = g(\mathbf{f}(x))
dxdf(t)=g(f(x))
这个表达式就是扩展成为NeuralODE的关键。
然后,我们来解释一下Neural ODEs的基本思想。实际上,对于让人头疼的微分方程,解析求解是一个很难的事情,因为我们需要数学表达式刚好就是能够套用解析求解的形式。更多的我们会采用数值求解的逼近法,知道初始值,给定一个步长,毕竟这个初始值附近的下一个值处的导数值,然后逐步逼近我们感兴趣的表达式。
其实神经网络本身就是一个大的函数逼近器。他是一个多层嵌套的函数,因为有多层嵌套的性质,所以可以使用链式法则传递梯度,传递的同时更新网络的参数。最终得到我们要求解的
最后我们介绍一下ResNET。
ResNet的特点在于引入了残差学习,当我们考虑ResNet的深度趋向无限大时,可以把ResNet的每一层看作时间上的一个无限小的步长,此时网络就变成了NeuralODE。
d
h
(
t
)
d
t
=
f
(
h
(
t
)
,
t
,
θ
)
\frac{d\mathbf{h}(t)}{dt} = f(\mathbf{h}(t), t, \theta)
dtdh(t)=f(h(t),t,θ)
相比起其他神经网络而言,Neural ODE保存的不是所有层的激活值,而是保存每一层的导数值,降低了内存成本。