1. 从连续到离散:为什么你的神经网络需要SSM离散化?
如果你最近关注AI圈,尤其是大语言模型和视觉模型,肯定对Mamba、VMamba这些名字不陌生。它们号称在长序列建模上能跟Transformer掰手腕,但计算复杂度却从平方级降到了线性级,推理速度也快了不少。听起来很美好,对吧?但当你兴冲冲地打开一篇Mamba的论文,准备大干一场时,很可能在“状态空间模型(SSM)离散化”这块硬骨头上就卡住了。满篇的积分、矩阵指数、零阶保持法……让人头大。
别慌,这正是我们今天要啃下来的硬骨头。我会用最直白的方式,带你走过从连续时间SSM到离散时间SSM的完整旅程。你不需要有很强的控制理论背景,只要对深度学习有基本了解,就能跟上。简单来说,状态空间模型(SSM) 原本是用来描述物理世界连续变化系统的数学工具(比如电路、机械运动),它的核心是一组微分方程。而离散化,就是把这套描述连续时间的“语言”,翻译成计算机和深度学习框架能听懂的“离散时间语言”。
为什么非得翻译这一步?原因很实在:我们的电脑是数字的,处理的是一个个时间步的数据(比如一句话里的每个词,一段视频里的每帧图像)。原始的连续SSM就像一卷无限长的电影胶片,而离散化就是把它转换成一张张我们可以逐张处理的数码照片。只有这样,我们才能用PyTorch、TensorFlow这些工具来训练它,用GPU来加速它,最终把它塞进像Mamba这样的现代神经网络架构里。不经过离散化,再强大的SSM理论也只是纸上谈兵,没法在实际任务中落地。
2. 拆解SSM:连续时间系统的“语言”到底是什么?
在深入离散化这个“翻译过程”之前,我们得先搞懂原文——连续时间状态空间模型到底在说什么。别被“状态空间”这个词吓到,你可以把它想象成一个黑盒子系统的“内部日记”。
这个系统(比如一个简单的弹簧振子,或者一个抽象的序列处理单元)在任何时刻 t,都有一个内部的状态,记作 x(t)。这个状态是系统全部记忆的浓缩,它决定了系统未来会如何演变。同时,系统会从外界接收输入 u(t)(比如施加的外力,或者输入的一句话),然后产生一个我们能观测到的输出 y(t)(比如振子的位置,或者生成的文本)。
SSM用两个方程来描述这一切:
- 状态方程(State Equation):
dx(t)/dt = A * x(t) + B * u(t)- 这个方程是系统的“行为准则”。它告诉我们,系统内部状态
x(t)随时间的变化率(导数dx/dt),取决于它当前的状态x(t)和当前的输入u(t)。矩阵A决定了系统自身状态如何相互影响和演化(比如阻尼、振荡),矩阵B决定了外部输入如何驱动系统。
- 这个方程是系统的“行为准则”。它告诉我们,系统内部状态
- 观测方程(Observation Equation):
y(t) = C * x(t) + D * u(t)- 这个方程是系统的“对外窗口”。我们无法直接看到内部状态
x(t),只能通过输出y(t)来窥探。矩阵C负责从内部状态中提取出我们能观测到的信息,矩阵D则允许输入信号直接“抄近道”影响输出(在很多简化模型里,D常被设为零)。
- 这个方程是系统的“对外窗口”。我们无法直接看到内部状态
在Mamba出现之前的经典SSM(如S4模型)中,A, B, C, D 这几个矩阵通常是固定不变的,我们称之为线性时不变(LTI)系统。这大大简化了分析和计算。Mamba的创新之一,就是让这些矩阵能够根据输入 u(t) 动态变化,变成了线性时变系统,从而获得了更强的数据选择性。但为了理解离散化的核心思想,我们从简单的LTI系统入手是最佳路径。
那么,这个连续系统直接拿来用行不行?很遗憾,不行。因为计算机无法处理“连续的时间流”。我们需要找到一种方法,只在一些特定的、离散的时间点 t0, t1, t2, ...(通常间隔为 Δ 或 T)上来“询问”这个系统:输入一个离散信号 u[k],然后得到对应的输出 y[k]。这就是离散化的使命。
3. 离散化核心推导:如何把微分方程“拍扁”成递归公式?
现在进入最关键的环节:如何把那个描述连续变化的微分方程,变成一个可以在计算机上一步步迭代的离散公式?原始文章里给出了详细的数学推导,我这里帮你把核心逻辑和容易卡壳的点用更通俗的方式捋一遍。
3.1 第一步:为什么不能直接硬来?
最朴素的想法可能是:状态方程 dx/dt = A*x + B*u,我直接两边对时间积分不就行了吗?从 t_k 积到 t_{k+1},左边积分得到状态的变化量 x(t_{k+1}) - x(t_k),右边积分……问题就出在这里。右边积分号里是 A*x(t) + B*u(t),其中 x(t) 本身在积分区间内是连续变化的,我们根本不知道它确切的表达式!这就成了一个“先有鸡还是先有蛋”的循环:我想求 x,但求 x 的公式里又需要知道 x 本身。此路不通。
3.2 第二步:巧妙的“积分因子”法
数学家们想出了一个很巧妙的技巧,叫做“积分因子”。核心思想是:给原来的方程乘上一个精心设计的函数 α(t),使得乘完之后的新方程,其左边恰好是某个东西的导数,从而可以直接积分。
具体操作如下:
- 我们构造一个新函数:
α(t) * x(t)。 - 对它求导(乘积法则):
d[α(t)x(t)]/dt = α(t) * dx/dt + x(t) * dα/dt。 - 把原来的状态方程
dx/dt = A*x + B*u代入上式:d[α(t)x(t)]/dt = α(t)*(A*

:状态空间模型SSM在深度学习中的离散化实践&spm=1001.2101.3001.5002&articleId=153557396&d=1&t=3&u=723267398afd43c6afc6502718f7ef45)
6112

被折叠的 条评论
为什么被折叠?



