显式与隐式欧拉法(Explicit Euler and Implicit Euler)的个人理解

作为学习显式与隐式欧拉法的笔记,方便理解与复习。

一.动力学系统

1.深度学习中的动力学系统

在深度学习中的 "动力学系统",其实就是用微分方程来描述一个"状态随时间连续变化的系统"。

在该论文中,动力学系统大概就是指:

有一个状态 x(t)x(t)x(t)(比如神经元的膜电位、RNN 的隐藏状态),状态不会一下子跳到新值,而是按一个连续时间的演化规则 变化:
dx(t)dt=g(x(t),I(t),t,θ) \frac{dx(t)}{dt} = g(x(t), I(t), t, \theta) dtdx(t)=g(x(t),I(t),t,θ)举个例子,液态神经网络LTC中用到的动力系统形式如下:
dx(t)dt=−[1τ+f(x(t),I(t),t,θ)]+f(x(t),I(t),t,θ)A \frac{dx(t)}{dt} = -\left[ \frac{1}{\tau} + f(x(t), I(t), t, \theta) \right]+f(x(t), I(t), t, \theta)A dtdx(t)=−[τ1+f(x(t),I(t),t,θ)]+f(x(t),I(t),t,θ)A它被写成 x(t)x(t)x(t) 对时间 ttt 的导数形式。

也就是说,给定初始状态 x(0)x(0)x(0) 和随时间变化的输入 I(t)I(t)I(t),这个方程就决定了之后任意时刻的 x(t)x(t)x(t) 是多少------这就是一个典型的动力学系统。

所以简要一句话概括:

深度学习中的动力学系统,就是"用微分方程描述神经网络状态随时间演化"的连续时间模型------把神经网络当成一个物理意义上的随时间流动的系统来分析,比如看它的稳定性、平衡点、是否有界等等,即,状态 + 时间 + 微分方程 = 动力学系统

2.常见线性衰减模型

在很多动力系统控制系统中,常常用一个线性衰减模型来表示自然衰减的现象,比如:

  • 温度衰减:一个物体的温度随着时间逐渐降低,直到与环境温度相等。
  • 电池放电:电池的电量随着时间逐渐消耗。
  • 药物代谢:药物浓度随时间减少,最终消失。

这些现象都可以通过线性微分方程 来建模,其中 dxdt=−αx\frac{d\mathbf{x}}{dt} = -\alpha \mathbf{x}dtdx=−αx 是描述衰减的一种常见方程。这里的 α\alphaα 是衰减常数,决定了衰减的速率。

选择这个模型来说明数值方法的稳定性是因为它的解非常简单且容易分析,它是指数衰减 的,即:
x(t)=x(0)e−αt \mathbf{x}(t) = \mathbf{x}(0) e^{-\alpha t} x(t)=x(0)e−αt下面给出由该式子得到 dxdt=−αx\frac{d\mathbf{x}}{dt} = -\alpha \mathbf{x}dtdx=−αx 的过程:

给定的方程是:
x(t)=x(0)e−αt \mathbf{x}(t) = \mathbf{x}(0) e^{-\alpha t} x(t)=x(0)e−αt对这个式子求导,我们得到:
dx(t)dt=ddt(x(0)e−αt) \frac{d\mathbf{x}(t)}{dt} = \frac{d}{dt} \left( \mathbf{x}(0) e^{-\alpha t} \right) dtdx(t)=dtd(x(0)e−αt)其中:

  • x(0)\mathbf{x}(0)x(0) 是常数,直接放在外面。
  • 对 e−αte^{-\alpha t}e−αt 求导时,要用 链式法则

解得如下:
ddt(e−αt)=−αe−αt \frac{d}{dt} \left( e^{-\alpha t} \right) = -\alpha e^{-\alpha t} dtd(e−αt)=−αe−αt所以,原方程的求导结果为:
dx(t)dt=x(0)⋅(−αe−αt) \frac{d\mathbf{x}(t)}{dt} = \mathbf{x}(0) \cdot \left( -\alpha e^{-\alpha t} \right) dtdx(t)=x(0)⋅(−αe−αt)又因为原方程可以通过移项得到:
x(0)=x(t)e−αt \mathbf{x}(0) = \frac{\mathbf{x}(t)}{e^{-\alpha t}} x(0)=e−αtx(t)带入求导结果,可以将其化简为:
dx(t)dt=−αx(t) \frac{d\mathbf{x}(t)}{dt} = -\alpha \mathbf{x}(t) dtdx(t)=−αx(t)这就是标准的指数衰减 方程的导数,导数结果是衰减常数 −α-\alpha−α 乘以状态 x(t)\mathbf{x}(t)x(t) 本身。

二.显式与隐式欧拉法

从该常见线性衰减微分方程 开始:
dx(t)dt=−αx(t) \frac{d\mathbf{x}(t)}{dt} = -\alpha \mathbf{x}(t) dtdx(t)=−αx(t)它表示某个量 x(t)\mathbf{x}(t)x(t) 随时间 ttt 按照指数规律衰减。其解析解为:
x(t)=x(0)e−αt \mathbf{x}(t) = \mathbf{x}(0) e^{-\alpha t} x(t)=x(0)e−αt接下来,我们使用显式欧拉法隐式欧拉法来数值求解这个微分方程,看看它们的不同之处。

1.显式欧拉法(Explicit Euler)

显式欧拉法 的基本更新公式是:
x(t+Δt)=x(t)+Δt⋅f(x(t)) \mathbf{x}(t + \Delta t) = \mathbf{x}(t) + \Delta t \cdot f(\mathbf{x}(t)) x(t+Δt)=x(t)+Δt⋅f(x(t))其中,f(x(t))f(\mathbf{x}(t))f(x(t)) 是微分方程右边的导数部分。对于我们的方程 dx(t)dt=−αx(t)\frac{d\mathbf{x}(t)}{dt} = -\alpha \mathbf{x}(t)dtdx(t)=−αx(t),我们有:
f(x(t))=−αx(t) f(\mathbf{x}(t)) = -\alpha \mathbf{x}(t) f(x(t))=−αx(t)因此,显式欧拉法的更新公式变为:
x(t+Δt)=x(t)+Δt⋅(−αx(t)) \mathbf{x}(t + \Delta t) = \mathbf{x}(t) + \Delta t \cdot (-\alpha \mathbf{x}(t)) x(t+Δt)=x(t)+Δt⋅(−αx(t))可以进一步整理为:
x(t+Δt)=(1−αΔt)x(t) \mathbf{x}(t + \Delta t) = \left( 1 - \alpha \Delta t \right) \mathbf{x}(t) x(t+Δt)=(1−αΔt)x(t)这就给出了显式欧拉法的数值解,我们可以看出:

  • 每一步的更新因子是 1−αΔt1 - \alpha \Delta t1−αΔt ,即 x(t)\mathbf{x}(t)x(t) 每次更新时都乘上一个常数因子。
  • 由于这个因子小于 1(当 Δt\Delta tΔt 很小的时候),系统的数值解会逐渐衰减 ,但是如果 Δt\Delta tΔt 太大,解可能不稳定 (此时的 1−αΔt1 - \alpha \Delta t1−αΔt 可能小于0,会导致解出来的 x\mathbf{x}x 时而为正,时而为负)。

2.隐式欧拉法(Implicit Euler)

隐式欧拉法 的更新公式是:
x(t+Δt)=x(t)+Δt⋅f(x(t+Δt)) \mathbf{x}(t + \Delta t) = \mathbf{x}(t) + \Delta t \cdot f(\mathbf{x}(t + \Delta t)) x(t+Δt)=x(t)+Δt⋅f(x(t+Δt))这里,f(x(t+Δt))f(\mathbf{x}(t + \Delta t))f(x(t+Δt)) 依赖于新状态 x(t+Δt)\mathbf{x}(t + \Delta t)x(t+Δt),因此需要对新状态进行隐式计算。

对于我们给出的方程 dx(t)dt=−αx(t)\frac{d\mathbf{x}(t)}{dt} = -\alpha \mathbf{x}(t)dtdx(t)=−αx(t),右边的导数是 f(x(t))=−αx(t)f(\mathbf{x}(t)) = -\alpha \mathbf{x}(t)f(x(t))=−αx(t),代入隐式欧拉法的公式得到:
x(t+Δt)=x(t)+Δt⋅(−αx(t+Δt)) \mathbf{x}(t + \Delta t) = \mathbf{x}(t) + \Delta t \cdot (-\alpha \mathbf{x}(t + \Delta t)) x(t+Δt)=x(t)+Δt⋅(−αx(t+Δt))整理后得到:
x(t+Δt)+αΔtx(t+Δt)=x(t) \mathbf{x}(t + \Delta t) + \alpha \Delta t \mathbf{x}(t + \Delta t) = \mathbf{x}(t) x(t+Δt)+αΔtx(t+Δt)=x(t)即:
x(t+Δt)(1+αΔt)=x(t) \mathbf{x}(t + \Delta t) \left( 1 + \alpha \Delta t \right) = \mathbf{x}(t) x(t+Δt)(1+αΔt)=x(t)最后解得:
x(t+Δt)=x(t)1+αΔt \mathbf{x}(t + \Delta t) = \frac{\mathbf{x}(t)}{1 + \alpha \Delta t} x(t+Δt)=1+αΔtx(t)可以看到,隐式欧拉法的数值解 是:
x(t+Δt)=x(t)1+αΔt \mathbf{x}(t + \Delta t) = \frac{\mathbf{x}(t)}{1 + \alpha \Delta t} x(t+Δt)=1+αΔtx(t)由此可以看出,隐式欧拉法的常数因子是一个小于1的正数,即使在较大的步长 Δt\Delta tΔt 下,系统也会稳定衰减,不容易产生震荡。

PS:可以通过 f(x)f(\mathbf{x})f(x) 保证稳定性吗?

f(x)f(\mathbf{x})f(x) 确实可以人为规定(比如通过神经网络的激活函数来定义),并且可以选择不同的形式。比如:

  • 线性函数 : f(x)=xf(\mathbf{x}) = \mathbf{x}f(x)=x
  • sigmoid 函数 : f(x)=11+e−xf(\mathbf{x}) = \frac{1}{1 + e^{-\mathbf{x}}}f(x)=1+e−x1
  • tanh 函数 : f(x)=tanh⁡(x)f(\mathbf{x}) = \tanh(\mathbf{x})f(x)=tanh(x)

这些函数的选择可以影响系统的行为,规定一个合适的 f(x)f(\mathbf{x})f(x),比如选择 sigmoidtanh,就可以一定程度上避免震荡行为,甚至可以保证模型的稳定。

但是在 刚性问题 (例如大时间常数的系统)时,显式方法会在大步长 的情况下变得不稳定,即使 f(x)f(\mathbf{x})f(x) 是平滑且没有震荡的。这种现象会出现在那些衰减或增长非常快的系统 中,因此修改 f(x)f(\mathbf{x})f(x) 确实能在某些情况下避免震荡,但如果面对刚性系统,隐式方法才是最稳妥的解决方案。

三. 总结

1. 深度学习中的动力学系统

  • 在深度学习中,动力学系统 是通过微分方程来描述状态随时间变化的系统 ,即模型的状态 按一定规则随时间连续变化。
  • 例如,在液态神经网络(LTC) 中,动力学系统描述了网络的隐藏状态随着时间的演化,由一个微分方程决定。

2. 线性衰减模型与稳定性分析

  • 线性衰减模型 (如 dxdt=−αx(t)\frac{d\mathbf{x}}{dt} = -\alpha \mathbf{x}(t)dtdx=−αx(t))是描述许多自然衰减现象的经典例子,例如温度衰减、药物代谢等。
  • 对于这个方程的求解,我们可以得到指数衰减解 ,其形式是 x(t)=x(0)e−αt\mathbf{x}(t) = \mathbf{x}(0) e^{-\alpha t}x(t)=x(0)e−αt,并且通过求导得到了衰减速率为 −αx(t)-\alpha \mathbf{x}(t)−αx(t)。

3. 显式与隐式欧拉法的数值求解

  • 显式欧拉法 :通过当前时刻的状态来计算下一时刻的状态更新。其公式为:
    x(t+Δt)=x(t)+Δt⋅f(x(t)) \mathbf{x}(t + \Delta t) = \mathbf{x}(t) + \Delta t \cdot f(\mathbf{x}(t)) x(t+Δt)=x(t)+Δt⋅f(x(t))对于衰减模型,更新公式为 x(t+Δt)=(1−αΔt)x(t)\mathbf{x}(t + \Delta t) = (1 - \alpha \Delta t) \mathbf{x}(t)x(t+Δt)=(1−αΔt)x(t),每步更新因子为 1−αΔt1 - \alpha \Delta t1−αΔt,当步长较大时,可能导致解不稳定 ,甚至出现震荡
  • 隐式欧拉法 :通过新状态 x(t+Δt)\mathbf{x}(t + \Delta t)x(t+Δt) 来计算状态更新。其公式为:
    x(t+Δt)=x(t)1+αΔt \mathbf{x}(t + \Delta t) = \frac{\mathbf{x}(t)}{1 + \alpha \Delta t} x(t+Δt)=1+αΔtx(t)隐式欧拉法能够在 较大步长 下保持稳定,即使系统的时间常数较大,或者衰减速度非常快,依然能 避免震荡数值发散

4. 稳定性问题的解决方法

  • 修改 f(x)f(\mathbf{x})f(x) :通过选择平滑的激活函数(如 sigmoidtanh ),可以避免一些突变和震荡,从而使系统行为更加平稳。然而,对于刚性系统 (如快速衰减的部分),显式方法仍然容易导致不稳定,即使 f(x)f(\mathbf{x})f(x) 被设计得非常平滑。

  • 隐式方法 (如隐式欧拉法):能够有效解决震荡和不稳定问题 ,特别适用于刚性系统 。隐式方法通过隐式更新新状态,确保系统在较大的步长下依然能够保持稳定,不会因数值误差而发散。

5. 小结与建议

  • 显式欧拉法 适用于变化较慢线性 的系统,但在刚性系统中需要较小的步长来保持稳定,否则会引起震荡或解发散。
  • 隐式欧拉法 是处理刚性系统 的更好选择,它通过隐式更新保持稳定性,即使在大步长下也能有效避免震荡和不稳定。
  • 修改 f(x)f(\mathbf{x})f(x) 确实可以缓解一些不稳定性,但它不能完全解决数值方法带来的问题,特别是在衰减或增长非常快的系统中,隐式方法依然是更稳妥的选择。
相关推荐
Jurio.2 小时前
Python Ray 分布式计算应用
linux·开发语言·python·深度学习·机器学习
_codemonster3 小时前
深度学习实战(基于pytroch)系列(四十八)AdaGrad优化算法
人工智能·深度学习·算法
AI即插即用3 小时前
即插即用系列 | Attention GhostUNet++:基于多维注意力和 Ghost 模块的高效 CT 图像脂肪与肝脏分割网络
网络·图像处理·人工智能·深度学习·神经网络·计算机视觉·视觉检测
哥布林学者4 小时前
吴恩达深度学习课程四:计算机视觉 第一周:卷积基础知识(二)卷积参数
深度学习·ai
学历真的很重要4 小时前
PyTorch 机器学习工作流程基础 - 完整教程
人工智能·pytorch·后端·python·深度学习·机器学习·面试
李昊哲小课5 小时前
深度学习高级教程:基于生成对抗网络的五子棋对战AI
人工智能·深度学习·生成对抗网络
CoovallyAIHub6 小时前
何必先OCR再LLM?视觉语言模型直接读图,让百页长文档信息不丢失
深度学习·算法·计算机视觉
CoovallyAIHub6 小时前
NAN-DETR:集中式噪声机制如何让检测更“团结”?
深度学习·算法·计算机视觉