原文:
towardsdatascience.com/here-comes-mamba-the-selective-state-space-model-435e5d17a451
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/603853a334e124f61fa10eadcb54415c.png
图片由Sascha Kirch提供。
这是我的新多部分系列的第三部分🐍 向 Mamba 状态空间模型迈进:图像、视频和时序。
被称为要取代强大 Transformer 的 Mamba 模型,已经从最初在深度学习中使用状态空间模型(SSM)的初始想法走了很长的路。
Mamba 为状态空间模型添加了选择性,从而在保持 SSM 的次二次工作复杂性的同时,实现了类似 Transformer 的性能。其高效的选择性扫描比标准实现快 40 倍,并且作为 Transformer 可以提供 5 倍的吞吐量。
加入我,深入了解 Mamba,我们将发现选择性如何解决先前 SSM 的限制,Mamba 如何克服随之而来的新障碍,以及我们如何将 Mamba 纳入现代深度学习架构。
图像、视频和时序的 Mamba 状态空间模型
概述
第二部分结束时的内容
将选择性引入 SSM 2.1 整体情况 2.2 什么是选择性? 2.3 选择性如何影响张量维度 2.4 所有这些矩阵背后的直觉是什么?
再次谈谈矩阵 A! 3.1 对角状态空间模型 3.2 Mamba 的矩阵 A
无卷积表示的快速训练 4.1 并行关联扫描 4.2 核融合 4.3 梯度的重新计算 4.4 它有多快?
Mamba 作为一个通用模型 5.1 Mamba 块 5.2 可学习参数在哪里? 5.3 我们如何初始化模型?
总结 Mamba 6.1 摘要 6.2 继续阅读第四部分
进一步阅读和资源
1. 第二部分结束时的内容
结构化状态空间模型可视化解释
我们在第二部分介绍了 S4 模型。通过将状态矩阵A约束为具有某种结构,卷积核可以非常高效地计算,与之前的 SSM 相比,S4 使用 400 倍更少的内存就能快 30 倍,因此成为 Transformer 的可行替代品。
我们说,由于 LTI 系统的循环和卷积表示的对偶性,我们的结构化状态空间模型可以高效地训练和推理。❗然而问题在于:LTI 系统平等地对待所有输入,因此无法做出数据依赖的决策。
2. 引入选择性到 SSM
Mamba 通过引入数据依赖的选择机制来解决此问题,但正如我们将看到的,这需要付出代价。稍后我们会更多地讨论这一点。让我们先从一些直观的想法开始。
2.1 整体图景
序列建模的一个基本问题是要决定到何种程度上下文(即之前的输入)被压缩到模型的态中。
记住,RNN由于其高度压缩的态,能够实现快速推理,但这对于建模长距离依赖是无效的。另一方面,Transformer明确地完全不压缩上下文。每个标记可以在任何时间关注到其他标记,从而允许非常有效地建模长距离依赖,但代价是二次工作复杂度O(L²)。
结构化 SSM使用 HiPPO 矩阵来近似上下文,从而实现一些压缩,由于其卷积表示,它比 RNN 更有效地进行训练。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e84afe186c8149f1b8ca3391f2758430.png
图 1:RNN、SSM、Transformer 和 Mamba 模型的效率与性能对比。图片由Sascha Kirch提供。
我们想要的介于两者之间,或者更好地说,是两者的最佳结合。一个性能和效率都高的模型。剧透一下:Mamba 可能是一个有希望的候选者。
2.2 什么是选择性?
我们不想像 Transformer 那样关注整个历史,也不想像 RNN 和 SSM 那样将整个历史压缩成一个单一的态,我们希望有选择性地压缩相关数据,最终得到一个高度性能和高效的模型。这里的“高效”不仅指推理速度,还与其他资源有关,如内存和训练模型所需的数据。
让我们看看这个简单的例子,预测我的名字:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c08d0095e41269ed7f028a1b605be550.png
图 2:选择性地关注输入的一个子集。图片由Sascha Kirch提供。
到目前为止,所有矩阵A、B和C都与输入数据无关。它们对于信号的各个时间步长没有变化,因此我们说我们有一个线性时不变(LTI)系统,其中循环和卷积表示相等。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a53c754245ab58a78dedc42136154b99.png
图 3:状态空间模型的不同表示。图片由 Sascha Kirch 提供。
Mamba 通过使矩阵B和C以及离散化参数 ∆ 成为时间依赖的来改变这一点。这意味着对于每个输入标记,我们最终都会得到一组不同的参数!回想一下,矩阵A是从 HiPPO 矩阵派生出的结构化矩阵,并近似地根据先前状态的历史来描述状态随时间的变化。Mamba 保持这种方式。
2.3 选择性如何影响张量维度
使 SSM 具有选择性为矩阵引入了新的维度。具体来说,我们现在需要考虑长度为L的序列中的每个标记,并将其并行化到批大小B。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9c2e8b57af58c229a3d255e694b867d3.png
图 4:选择性状态空间模型中所有矩阵的张量形状。图片由 Sascha Kirch 提供。
这里有几个需要注意的点:
矩阵A的形状为DxN,对于单个标记不发生变化。因此,它仍然是时间不变的。我们将在第三章(第三章)中更多地讨论矩阵A。
矩阵A通过离散化步骤 Δ 执行选择,现在它依赖于输入。因此,离散化矩阵的形状为BxLxDxN。
在 SSM 内部,矩阵B和C仍然是应用于输入标记或产生输出标记的向量,只是现在它们被堆叠起来构建一个张量。
离散化的矩阵比非离散化的矩阵大得多。更多内容将在第四章(第四章)中讨论。
这些是 SSM 方程中使用的矩阵的形状,而不是学习的参数!那些参数隐藏在其他地方。我们将在第五章(第五章)中寻找它们。
❓ 但是,这一切究竟意味着什么?所有这些矩阵背后的直觉是什么?为什么只有一些是选择性的?
2.4 所有这些矩阵背后的直觉是什么?
矩阵 A:状态到状态矩阵决定从上一个状态传播到下一个状态的内容。
矩阵 B:输入到状态矩阵将任何传入的标记进行转换。它必须具有选择性,以过滤掉无关数据或专注于重要数据,从而只允许相关数据进入新状态。它类似于某种门控机制。
矩阵 C:状态到输出矩阵将状态转换为输出标记。它必须具有选择性,以决定哪些状态信息是必要的,以便实现输出。因此,与矩阵B类似,矩阵C也与门控机制有一些联系。
矩阵 Δ:离散化参数通常被称为将连续输入信号转换为离散序列的步长。虽然在经典 SSM 中这可能很直观,但在深度学习设置中并不如此,尤其是在处理已经离散化的数据或其他模态,如文本标记时。
因此,让我们看看极端情况:如果Δ→∞,系统会更关注(或更长时间关注)输入,因此在状态方程中,状态更新主要由输入的贡献主导,而较少由先前状态主导。如果Δ→0,则发生相反的情况。
这意味着 Δ 可以被视为新样本与先前状态重要性之间的一种权重。
每当 Sascha Kirch 发布内容时都收到电子邮件 🚀_ 每当 Sascha Kirch 发布内容时都收到电子邮件 🚀 想了解更多关于深度学习或只是保持最新信息…medium.com
3. 再次谈谈矩阵 A!
再次,我们必须谈谈状态矩阵A。你在观察矩阵A的维度时有没有注意到什么?
我们总是说矩阵A是一个NxN的平方矩阵,但在 Mamba 中它的形状是DxN。发生了什么?
3.1 对角状态空间模型
好吧,在 S4 论文和 Mamba 发布之间发生了很多事情。特别是,对角状态空间(DSS) 模型通过移除低秩项,进一步简化了 S4 的 DPLR(对角加低秩)公式,使其成为一个简单的对角矩阵。当我们谈到本系列的第二部分中的 S4 时,我们说,对于卷积核K的计算,拥有一个对角矩阵A实际上会是理想的情况,因为它可以大幅减少计算量!
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e82341ad7bd9c5a7430e9a7593ceec0d.png
图 5:DSS 论文提出的真正对角状态矩阵 A。图片由 Sascha Kirch 提供。
在 S4 作者的后续论文中,他们提供了一种详尽的分析,解释了为什么这种方法有效,并进一步建议了多种新的初始化方案,以实现导致 S4D 模型的真正对角情况。
简而言之,Mamba 使用了 S4D-Real 初始化,这在 S4 论文的边注中提到,因为它与原始 S4-LegS HiPPO 矩阵具有相同的谱。我们将在第五章中进一步讨论初始化。
3.2 Mamba 的矩阵 A
但现在让我们回到 Mamba 的矩阵A。记得从本系列的第二部分中提到,如果我们有一个NxN的对角矩阵,我们只需要存储N个值,这意味着我们可以将其存储为一个向量。Mamba 的DxN矩阵实际上只是表示对角矩阵的这样一个向量的D倍!
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fb98bb99d8db60d76feaa74729ddd3a5.png
图 6:从矩阵 A 创建 SSM 的对角矩阵。图片由Sascha Kirch提供。
这使我们能够观察到关于 Mamba 和先前状态空间模型的一个有趣的事实:D中的每个通道都是独立处理的,这可以解释为每个通道都得到了自己的 SSM!这个事实在第六部分和第七部分中变得很重要,当我们分别查看 MambaMixer 和 Mamba-2 时。
4. 快速训练而不使用卷积表示
对于不同的时间步长有不同的参数意味着我们的模型现在是时变的。因此,卷积表示不再有效,我们失去了快速训练的好处。Mamba 论文的大部分内容都是关于如何克服这个问题。他们引入了三种策略,导致了他们的选择性扫描算法:(1)并行关联扫描,(2)核融合和(3)梯度的重新计算。
注意:这些想法并不完全新颖。S5 层(用于序列建模的简化状态空间层)应用了并行扫描,H3(贪婪的贪婪河马)已经使用核融合来加速训练。
4.1 并行关联扫描
回想一下,结构化状态空间模型是一个时不变系统(LTI),因为涉及更新状态的矩阵(A和B)对于每个新的输入都是相同的。这允许使用循环表示或卷积表示。在 Mamba 中,由于离散化的矩阵A和B现在依赖于输入,所以这种情况发生了变化。
这意味着我们不能使用卷积表示来加速训练,我们只剩下循环表示,这次为每个新的输入和状态更新使用不同的矩阵:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7ba9096449a10bf733657e931c8986ad.png
图 7:选择性状态空间模型的循环表示。图片由Sascha Kirch提供。
循环执行的工作复杂度为O(L),这意味着输入序列长度L加倍需要两倍的工作量来计算最终输出。循环的一个大问题是,在训练过程中我们不希望按顺序计算所有状态,因为我们事先可以访问所有输入的标签。在推理过程中,特别是对于自回归采样任务(例如,下一个单词预测)这将是完全可行的。
❓问题是,我们如何加快状态序列的顺序更新速度,其中每个状态都强烈依赖于前一个状态?我们不可能并行运行它,对吧?
这种特殊的递归类型,其中每个新状态是前一个状态和输入的总和,被称为扫描。它在科学和工程中是一个非常普遍的问题,甚至在我们在 1986 年和 1990 年拥有并行计算机之前,就已经发表了并行化扫描的技术。直到 2005 年,这些算法才在真实的 GPU 上进行测试。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/08f555c44bbd22aa5a5eb7e77fdb8e26.png
图 8:并行扫描算法。图片由 Sascha Kirch 提供。
并行扫描的工作复杂度为O(log L),这比O(L)要小。输入序列L越长,与循环执行相比的速度提升就越高。
记住,一个普通的转换器的工作复杂度为O(L²)。
4.2 内核融合
如你所知,任何计算机都有不同类型的内存。一般来说,离处理单元越远,内存就越大,读取数据所需的时间就越长(主要由于 PCB 和其他不允许更高频率的电子组件的性质)。
在 GPU 中通常发生的情况是,变量从较远但更大的 HBM(高带宽内存)读取到较快的 SRAM 中进行计算,然后将结果写回 HBM。如果一个计算需要多个步骤,这个过程(读取、处理和写入)会重复,直到整个计算完成。如果一个计算的实际计算时间比读取和写入的时间短,那么它被称为内存受限,也称为 I/O 受限。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d402c9ffd8beb6ba7422829eb3e4f331.png
图 9:GPU 利用率与内存 I/O。图片由 Sascha Kirch 提供。
I/O 密集型操作对计算硬件的使用效率相当低,因为它们大部分时间都在等待数据处于空闲状态。基本上,你想要避免频繁地读取大量数据。
❓ 但我们能做什么?或者更确切地说:Mamba 的作者们做了什么?
而不是存储离散化的矩阵A和B,只存储连续时间的矩阵。矩阵A、B、C和Δ从 HBM 读取到 SRAM 中,然后在 SRAM 中执行离散化。
在这里,我们举一个例子来说明在读取连续时间矩阵或离散化矩阵时需要读取多少值,考虑到前面描述的矩阵形状:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7b768467d042a8d3c7e8e9adc1810151.png
图 10:离散矩阵与连续矩阵读取所需值的数量。图片由Sascha Kirch提供。
此外,内核融合被应用于减少从 HBM 读取和写入的次数。特别是,他们将离散化、选择性扫描和与矩阵C的乘法融合成一个单独的内核。因此,他们读取所有通过所有状态进行整个正向传递所需的数据,处理这些数据,并将最终输出y(形状为BxLxD)写回。为了避免内存需求和读取大量数据,形状为BxLxDxN的大状态没有被实现。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/50416f376007c564d592637308e1e26a.png
图 11:内核融合对 GPU 利用率的影响。图片由Sascha Kirch提供。
听说过内核融合和涉及的不同内存后,我们终于可以看看 Mamba 论文中的标志性插图,展示了不同矩阵之间的交互以计算新的状态和输出:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d06feba2e29b899180342e14690be74e.png
图 12:具有硬件感知状态扩展的选择状态空间模型。图片由A. Gu 等人提供,Sascha Kirch注释。
绿色表示这些值存储在 HBM 中,而橙色表示它们保存在 SRAM 中。在第五章中,我们将调整这张图片以展示实际发生的情况,并找到训练参数。
Sascha Kirch 的论文解读
4.3 梯度的重新计算
在之前,我们看到了通过减少 I/O 操作以及隐藏状态没有保存在 HBM 中,我们可以通过内核融合加快模型的推理。然而,为了计算梯度并反向传播损失以更新权重,需要那些中间状态。
由于内核融合非常有效,在反向传播过程中按需重新计算中间状态,比从 HBM 中写入和读取形状为BxLxDxN的大中间状态要高效得多。
4.4 它有多快?
在花费了大量努力使 SSMs 更快之后,一个问题仍然存在:与我们所知的最高效的注意力实现FlashAttention-2相比,它有多快?
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/34355ed01f120ad1557ad3f017744039.png
图 13:Mamba 的效率基准。图片由A. Gu 等人提供,Sascha Kirch注释。
5. Mamba 作为一个通用模型
我们现在拥有了选择性 SSM,这是一个高效、快速、与输入序列长度L线性扩展的状态空间模型,并且由于每个输入都使用自己的参数集进行处理,因此也是选择性的。我们唯一剩下的事情是将它包装成一个模块,并将多个模块堆叠在一起来构建深度学习模型;就像我们在 Transformer-Decoder 中堆叠多头 Transformer 模块一样。
5.1 Mamba 模块
让我们看看使用 Mamba 进行自回归下一个词预测的模型可能是什么样子:
注意,维度名称和模块名称与 Mamba 模块的官方代码实现 相同,以便更好地理解如何配置以及正在发生什么。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1e3718aa1ec4b312991492013dec19f8.png
图 14:Mamba-Block 的详细模块图。在这个例子中:L=4,d_model=3,expand=2,d_inner=6。图片由 Sascha Kirch 提供。
输入投影简单地将每个L个标记投影到d_model维度的空间中。头部使用堆叠的Mamba 模块中的一个或多个输出标记进行预测。
在Mamba 模块内部,我们首先将前一层的residuals添加到hidden_states中,然后将它们的和作为下一个residuals输出。我们使用 RMS 层归一化,然后从d_model维度线性投影到2*d_inner维度,其中d_inner定义为expand*d_model。expand在代码中默认为 2。in_proj的这个输出然后被分成两条不同的路径,两条路径现在都是[1, d_inner]维度,并且都包含一个 SiLU 非线性。
选择性 SSM 模块是我们使用矩阵A、B、C和Δ参数化的状态空间模型。注意,图 4 中的向量维度 D对应于d_inner。在选择性 SSM 模块之后,两条路径被合并,从d_inner投影回d_model以形成最终的输出。
注意,这两个线性投影都广播到L个标记上,这意味着它们为每个标记使用相同的参数!
5.2 学习参数在哪里?
当在 Mamba 模块内部时,学习参数的位置相当清楚(即输入投影in_proj、输出投影out_proj和 1D 卷积conv1d),但在选择性 SSM 模块内部隐藏的学习参数仍然是个谜。
我认为如果我们调整图 12,以展示选择性 SSM(单个标记和没有批量轴)内部真正发生的事情,我们就能最好地观察正在发生的事情:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4f5bfd6f3e83390eb0e899edc8f4504a.png
图 15:具有硬件感知状态扩展的选择性状态空间模型,包括离散化矩阵和可学习的线性投影。图片由 Sascha Kirch 提供。
在这个图中,有很多事情在进行中,所以让我们先提出两个观察点:
矩阵A没有下标t,表示它不具有时间依赖性选择,但离散化的矩阵A则具有。
矩阵A和B存储在 GPU 的 HBM 中,而离散化矩阵则如第 4.2 节所述,仅在实际需要时在 GPU SRAM 中实现。
现在,让我们看看正在发生的事情。请注意,时间依赖性矩阵B和C是输入x在时间t的线性投影x_proj的结果。同样,这里也使用了一个单一的线性层,这可能是出于性能考虑。x_proj的输出进一步从dt_rank投影到d_inner,以形成最终的离散化矩阵Δ。我们直接优化的只有矩阵A(实际上,为了训练过程中的数值稳定性,我们跟踪log(A))。
总结来说,在选择性状态空间模型(Selective SSM)中,我们不对状态方程中使用的矩阵进行训练,而是训练导致这些矩阵的线性投影的权重。我们直接优化的只有矩阵A。
有了这些,就只剩下一个问题需要回答了…
5.3 我们如何初始化模型?
这是一个不容易回答的问题,因为不仅由于主题的复杂性,阅读论文本身就相当复杂,而且代码也相当复杂。
首先要注意的是:有一个独立的 Mamba 块的初始化,然后根据最终深度学习模型堆叠多个块的结构进行重新初始化,即使用[_init_weights()](https://github.com/state-spaces/mamba/blob/62db608da60f6fc790b8ed9f4b3225e95ca15fde/mamba_ssm/models/mixer_seq_simple.py#L85-L115)函数。
让我们先看看 Mamba 块本身。
所有模块都使用 pytorch 对应模块类型的默认初始化器进行初始化(例如,Conv1D 和 Linear 使用均匀分布),有两个例外:矩阵A和用于构建Δ的线性投影dt_proj。
矩阵A使用前面提到的 S4D-Real 初始化方法相对简单:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/34923c021188ba17b1304aef32f92923.png
图 16:状态矩阵 A 的 S4D-Real 初始化。图片由 Sascha Kirch 提供。
另一方面,时间尺度要复杂一些。我建议您查阅 “如何训练你的 Hippo” 论文 以获取更多详细信息。简而言之:
dt_proj的偏差应该通过在(Δmin=0.001, Δmax= 0.1)范围内进行对数均匀抽样来初始化。在那篇论文中的一个非常重要的注意事项,很容易被忽视:如果你将1/Δmin设置为大约在序列长度的范围内,可以提高性能。所以 0.001 大约是 10³个样本。
例如,看看这篇关于基准数据集(序列长度为L=16,384)的论文中的这个图:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d8561590fbbf984b1042c29e7f202b67.png
图 17:在 Path-X 基准上选择时间尺度对验证准确率的影响。图片由A. Gu 等人提供,Sascha Kirch 标注。
最后,不深入细节地讲,这里有一个带有一些注释的[_init_weights()](https://github.com/state-spaces/mamba/blob/62db608da60f6fc790b8ed9f4b3225e95ca15fde/mamba_ssm/models/mixer_seq_simple.py#L85-L115)函数,用于在MixerModel和MambaLMHeadModel中使用时覆盖已经初始化的权重:
这个函数实际上在那些类中都被调用,意味着它们覆盖了初始初始化时覆盖的权重😵但开个玩笑,如果在时间压力下寻找最有效的解决方案,并不总是有足够的时间来编写干净的代码。这又是另一个权衡……
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/acc714ed58573c11827f9aefcbf69c4a.png
图 18:标注 Mamba 仓库中用于初始化后覆盖模型权重的 _init_weights()函数。代码来自此处,Sascha Kirch 标注。
6. 总结 Mamba
6.1 摘要
使用 Mamba,我们现在得到了一个与 Transformer 一样强大且与 RNN 一样高效的序列模型。
我们看到,通过添加选择性,我们失去了循环和卷积表示的对偶性,但我们通过实现选择性扫描算法再次加快了模型的运行速度。
Transformer 是一种通用架构,适用于你所能想到的所有数据模态。到目前为止,当我们谈论 Mamba 时,我们只谈论类似于文本标记或模拟信号的序列数据。❓但我们能否将 Mamba 应用于非序列数据?比如说图像?
感谢!
🤝我想要感谢我的故事读者,感谢你们的持续支持,为我点赞的故事,以及跟随我,永远不会错过我的最新文章。正是你们激励我继续写作,深入研究复杂主题,并通过写作成为更好的工程师/研究人员。你们太棒了!
6.2 继续阅读第四部分
Vision Mamba:像视觉 Transformer 但更好
在第四部分中,我们将看到如何将类似 Mamba 的模型应用于非序列数据类型,例如图像。我们将重新审视视觉 Transformer 的一些设计选择(例如,补丁大小、图像分辨率和位置编码),并查看在使用 Mamba 而不是注意力机制时它们是否仍然有效。
Vision Mamba 最终比DeiT快 2.8 倍,并节省了 86.8%的 GPU 内存,我们将看到这是如何实现的。所以请保持关注!
7. 进一步阅读与资源
Mamba 状态空间模型用于图像、视频和时序数据
Sascha Kirch 的论文讲解
博客文章
[第一部分]: 迈向用于图像、视频和时序数据的 Mamba 状态空间模型
Mamba 和状态空间模型的视觉指南
论文:
Mamba:使用选择性状态空间的线性时间序列建模 by A. Gu et.al., 1 Dec. 2023
H3: 饥饿的河马:迈向使用状态空间模型的语言建模 by D. Fu et.al., 28 Dec. 2022
如何训练你的 HiPPO:具有广义正交基投影的状态空间模型 by A. Gu et.al., 24 Jun. 2022
S4: 使用结构化状态空间高效建模长序列 by A. Gu et.al., 31 Oct. 2021
S5: 简化状态空间层用于序列建模 by J. Smith et. al., 9 Aug. 2022
HiPPO:具有最优多项式投影的循环记忆 by A. Gu et.al., 17 Aug. 2020
DSS: 对角状态空间与结构状态空间一样有效 由 A. Gupta 等人撰写,2022 年 3 月 27 日
S4D: 对角状态空间模型的参数化和初始化 由 A. Gu 等人撰写,2022 年 6 月 23 日
S4ND: 使用状态空间将图像和视频建模为多维信号 由 E. Nguyen 等人撰写,2020 年 10 月 12 日
Code
- Mamba GitHub 仓库