本篇是mamba系列blog的第三篇文章,系列文章见:

剩余预计还有两篇文章正在生产中~

序言

在mamba之前,HiPPO、S4、DSS、S4D都是Albert Gu的工作,可以说是一己之力推动了SSM模型的发展。在S4到mamba之间,其实还经历了很多简化。

本篇选取中间的一篇工作S4D,来一窥目前的mamba仓库代码的雏形。(主要是比mamba清楚太多了,mamba文章和代码仓库完全看不懂,只能说被ICLR24拒稿是有原因的)

P.S. DSS和S4D都是同一年的NIPS,爽发啊

Motivation

S4的突出贡献就在于给出了HiPPO矩阵及相关卷积核高阶幂的求解办法 DPLR,但是从推导就可以看出,仍然是过于复杂了。

前置工作 DSS 发现,存在使用对角线状态矩阵简化原来的HiPPO矩阵的可能性,不过还是引入了一些有难度的操作(需要复值softmax,并且没有解释为什么对角线矩阵可以work)

本篇文章就进一步梳理了SSM使用对角线状态方程的最佳表达形式。如果A只有对角线的话那A的高阶幂就太好算了。

零阶保持离散化(ZOH)

我们首先来介绍一下零阶保持离散化方法

状态方程

求解

使用积分因子法,首先将方程整理为标准形式:

接下来计算积分因子 $\mu(t)$:

将积分因子乘以方程两边:

左边变为:

对两边积分:

积分后得到:

解出 $h(t)$:

离散化

我们考虑 $ t = t_0 + \Delta$,则 $x(\tau)$ 在这段时间内保持恒定,不妨设为 $x_k$, 则

其中,$\int_0^{\Delta}e^{A\tau}d\tau$ 的结果可以如下计算得到:

两边积分得:

左乘 $A^{-1}$ 得:

对于定积分 $[0,\Delta]$,结果是:

综上,代入积分结果,原来的离散化方程为:

所以

而 SSM 中的 $C$ 和 $D$ 是不需要离散化的,因为它本来就是在离散空间上更新的。其实也不一定需要是 $x’ = Ch + Dx$ 吧,也可以是 $y = Ch + Dx$,SSM最重要的只是维护一个状态罢了——这个状态是对记忆空间正交基的投影。

之前S4中用双线性离散化,就是因为不是对角线形式的 $\bar{A} = e^{A\Delta}$ 不好算。

矩阵指数

矩阵指数的定义参考标量指数函数的泰勒展开:

系统的稳定性主要由矩阵指数 $e^{At}$ 决定,分析 $e^{At}$ 的敛散性比较复杂且经典,这里直接给出结论 —— 由矩阵 $A$ 的特征值的实部的正负决定

  • 当矩阵 $A$ 的所有特征值的实部都小于0时,矩阵指数函数 $e^{At}$ 在 $t \rightarrow \infty$ 时收敛到零矩阵。

证明

意会一下,以后补上完整证明

任何矩阵 $A$ 都可以分解为 Jordan 标准型 $A = PJP^{-1}$,其中 $J$ 是 Jordan 矩阵。因此,$e^{At}=Pe^{Jt}P^{-1}$

每个 Jordan 块对应一个特征值 $\lambda$,其矩阵指数包含形如 $t^ke^{\lambda t}$的项(其中 $k$ 是多项式项的阶数)。当 $\lambda$ 的实部小于0时,指数衰减 $e^{\lambda t}$ 会压制多项式增长 $t^k$,使得每一项在 $t \rightarrow \infty$ 时趋于0

因此整个Jordan 矩阵的指数 $e^{Jt}$ 趋向于零矩阵,进而 $e^{At} = Pe^{Jt}P^{-1}$ 也趋向于零矩阵。

Left-half plane condition

因此,为了限制 $A$ 的实部大小,一个常见的方法是用指数函数来创建 $A$ 的实部:$A = -e^{A_{Re}} + i \cdot A_{Im}$

这样实部就总是负的,天才。

Albert Gu 在这篇文章中指出,不一定要用指数函数,用一般的激活函数比如说 ReLU, softplus也是可以的。现在transformers库对mamba的实现中就是用的exp的形式。

1
2
# transformers/models/mamba2/modeling_mamba2.py
A = -torch.exp(self.A_log.float())