Mamba模型学习笔记
笔记来源:bilibili
Transformer 的死穴
Transformer 结构的核心是自注意力机制层,无论是 encoder 还是 decoder,序列数据都先经过位置编码后喂给这个模块。
但是自注意力机制的计算范围仅限于窗口内,而无法直接处理窗口外的元素。因此,这种机制无法建模超出有限窗口的任何内容,看不到长序列的世界。
解决有办法:增加窗口的长度。但是,这样会导致计算复杂度随着窗口长度的增加而呈现平方增加 O ( n 2 ) O(n^2) O(n2),因为每个位置的计算都需要与窗口内的所有其他位置进行比较。
Transformer 的本质:通过位置编码,把序列数据空间化,然后通过计算空间相关度反向建模时序相关度。可以看到,这个过程忽视了内存结构的细腻关联关系,而是采取了一种一视同仁的暴力关联模式。比如,一个句子中存在一定的语法,同时,一个句子中也可能存在冗余的信息。所以,Transformer 存在不易训练的问题。
时序数据,却使用空间化的注意力机制,在当时是为了充分利用 GPU 的并行能力,但这不是万能的。让长序列数据建模回归传统,某种程序上说,这是整个 SSM 类模型思考问题的初衷和视角,而 Mamba 是其中的佼佼者。
时序状态空间模型 SSM
连续空间的时序建模

有很多实际的问题都可以用左图所示的连续空间模型来建模,比如控制理论或线性系统领域。一般将其称为 LTI(linear time-invariant,线性时不变)系统,用公式表示就是:
h ′ ( t ) = A h ( t ) + B x ( t ) h'(t) = Ah(t)+Bx(t) h′(t)=Ah(t)+Bx(t)
y ( t ) = C h ( t ) y(t)=Ch(t) y(t)=Ch(t)
输入为 x x x,隐藏层的变量为 h ( t ) h(t) h(t), y ( t ) y(t) y(t) 为输出。上面的叫状态方程,下面的叫观测方程。ABCD 为参数矩阵。
之所以叫时不变,是因为,ABCD 是固定的,这是一个强假设(transformer 没有这样的假设)。D 在上面的式子中没写主要是因为在许多实际系统中,它可以是零。通过牺牲通用性,换来特定场景下的更高的性能,是所有 SSM 模型的最底层逻辑。
时序离散化与 RNN
连续系统不方便计算机的处理,所以要对它进行离散化展开,就是沿时间拉长,模型和 RNN 长相上几乎一样(上图中,中图所示)。
公式也类似,只是导数改为不同时刻角标,形成递归过程。
h t = A ˉ h y − 1 + B ˉ x t h_t = \bar{A}h_{y-1}+\bar{B}x_t ht=Aˉhy−1+Bˉxt
y t = C h t y_t = Ch_t yt=Cht
原文给出了一种从连续系统转换为系统的 ABC 参数对应关系。它其实只是一种方法的举例,叫"零阶保持(Zero-Order Hold, ZOH)"。只用知道使用了一个 delta 函数,经过一组运算,可以提到新的 A 和 B。
A ˉ = e x p ( Δ A ) , B ˉ = ( Δ A ) − 1 ( e x p ( Δ A ) − I ) ⋅ Δ B \bar{A} = exp(\Delta A),\bar{B}=(\Delta A)^{-1}(exp(\Delta A)-I) \cdot \Delta B Aˉ=exp(ΔA),Bˉ=(ΔA)−1(exp(ΔA)−I)⋅ΔB

从效果上看,就是从上面的连续的输入,变成了下面离散的输入。输出也是。

以上是零阶保持的效果图,变成阶跃式的了。
并行化处理与 CNN
SSM 的最大特点是可以通过卷积实现了计算上的并行化(上图中,右图所示)。
其核心的思想是使用 CNN 对时序数据建模,借助不同尺度的卷积核,从不同时间尺度上捕获时序特征。其公式表示为:
K ˉ = ( C B ˉ , C A B ˉ , . . . , C A ˉ k B ˉ , . . . ) \bar{K}=(C\bar{B}, C\bar{AB},...,C\bar{A}^k\bar{B},...) Kˉ=(CBˉ,CABˉ,...,CAˉkBˉ,...)
y = x ∗ K ˉ y=x*\bar{K} y=x∗Kˉ
其图示为:

第二个式子与前面的图完全对应,就是一个 CNN 实现。时序递归状态方程改用卷积操作实现了,ABC 参数矩阵变成了 K ,就是图中的卷积核。体现在效果上,借助不同卷积核捕捉局部时间序列特征,可以同时对短期和长期依赖关系学习,并行计算提高了训练和推理的效率,使得 SSMs 在处理复杂的时序数据时表现出色。
在实际的问题中,往往会对 ABC 矩阵进一步简化,假设成更简单的对角阵来计算,这就是结构化 SSM,也叫 S4 模型。
在某种程序上,可以将 SSM 看成是 CNN 化的 RNN。
由于 SSM 有两个强假设:线性+时不变。所以极大的限制了其使用范围,因为大部分的系统是非线性,时变系统。而 Mamba 本质上是一个 SSM 模型的改进版,放开了这两个约束。
Mamba:选择性 SSM
Mamba 主要体现在设计了一种机制,让状态空间具备选择性,达到了 Transformer 的建模能力,同时在序列长度上实现了线性扩展(克服了 Transformer 的缺陷),可处理最长达百万长度的序列,而且效率很高,准确率很好。

在时间序列模型中设计了一个类似于 LSTM 的门结构,实现了选择性。BC 都带了 t,变成了时变参数,A 虽然没有直接含 t,但是通过 Δ t \Delta _t Δt 也变成了时变的, Δ t \Delta _t Δt 就是前面的离散函数。下面的蓝色部分就是所谓的选择机制。
最简单的理解就是:一个总开关( Δ t \Delta _t Δt)+若干个旋钮( B t , C t B_t,C_t Bt,Ct )=非线性时变系统。
要解决的问题
从某种角度看,序列建模的核心就是研究如何将长序列的上下文信息压缩到一个较小的状态中。比如,语言模型实际上就是在一个有限的词汇集合中不断进行转换。Transformer 的注意力机制虽然有效,但是效率低,因为它要存储整个上下文,导致推理和训练的时间较长。而 SSM 递归模型的状态是有限的(单纯是时不变导致的),其效率高但是有效性受限于状态的压缩能力。
而 Mamba 就是平衡了有效性与效率的点。本文关注了两种能力:
一是抓重点的能力(选择性复制任务):从大量的信息中选择和记住关键的信息,忽略不相关的部分。类似于在一个文章中找到关键词:

二是上下文联想,推理能力(诱导头任务)。在处理连续的信息时,能保持逻辑一致性和上下文的连贯性。

具体的改进的方法:由于 B 是时不变的(强假设的 LTI 系统),所以这导致了难以有效的选择上下文信息:无论输入的 x 是啥,B 一直不变(B (网络)与 x 无关)。所以,改进的方法就是让它时变:

全局卷积虽然可以用不同的卷积核进行时序特征捕捉,但是缺乏内容感知:不知道输入的重点与逻辑。但是 transformer 没有这些限制:既不是时不变系统,也不是线性系统。所以改进的方法就是:将其改成时变系统,并且改成非线性系统。
增加选择性的方法
增加选择性的本质是将 B 和 C 由固定的变成了可变的,根据输入 x t x_t xt 和它的压缩投影学习可变参数。A 为了简化,其自身还是不变的。蓝色部分(包括投影和连线)(上图所示)就是所谓的选择机制。目的是根据输入内容选择性地记忆和处理信息,从而提高对复杂序列数据的适应能力。
由于 Δ t \Delta _t Δt 使用了 τ \tau τ 激活函数,所以是非线性的,而 Δ t \Delta _t Δt 对 B t B_t Bt, A A A, C t C_t Ct 都有作用,所以整个系统都是非线性时变的。所以整个系统的两个条件都放开了。

右侧公式中,投影出来的三条划线其实就是 S B , S C , S Δ S_B,S_C,S_\Delta SB,SC,SΔ 三个选择函数,共享一个投影模块,主要是为了实现参数共享和计算效率。
而左侧就是原来的算法,可以看到:ABC 和 Δ \Delta Δ 都是固定的。
所以,Mamba 的本质上是拿 LSTM 的门控思想换票到了 SSM 模型上,放开了时不变的约束放成非线性系统。
参数:
- B:批次大小。表示一次输入的数据量的大小
- L:序列长度。表示每个序列中包含的时间步数
- N:特征维度。表示每个时间步的特征数量
- D:输入特征维度

其中,步长大小 delta 像是一个观察窗口,会影响信息处理的焦点。步长较小时,模型倾向于忽略具体的单词,而更多地依赖之前的上下文信息。

当 focus 较小时,只能看到几个词。所以,这个就可以理解为,delta 实现了注意力的选择。
上图代码中的几个选择函数:
- S B ( x ) = L i n e a r N ( x ) , S C ( x ) = L i n e a r N ( x ) S_B(x)=Linear_N(x),S_C(x)=Linear_N(x) SB(x)=LinearN(x),SC(x)=LinearN(x) 都是线性投影,这是很常见的神经网络操作,用于将输入数据转换到一个新的空间或维度。Linear 为线性层。
- S Δ ( x ) = B r o a d c a s t D ( L i n e a r 1 ( x ) ) S_\Delta(x)=Broadcast_D(Linear_1(x)) SΔ(x)=BroadcastD(Linear1(x)),广播是一个数据操作,它使得维度较小的数组可以与维度较大的数据进行算术操作。
- τ Δ = s o f t p l u s \tau_\Delta=softplus τΔ=softplus,这是一个平滑的非线性函数,通常用于网络中以添加非线性特征并帮助网络学习复杂的模式。

经过这样的设计,希望达到的效果:

左侧为 LTI 系统,输出只能对规则的输入特征进行原样的复制,而右边的选择性系统则可以自己找重点了。同时,右侧也有联想的能力了。对于非线性时变数据,具备了很强的特征捕捉能力。
核心原理:液体力学与李指数映射
Transformer 描述的是粒子运动,通过自注意力机制映射动态调整每个输入的权重,类似粒子间通过牛顿力学相互作用力来动态调整自己的轨迹。训练的过程,就是在用牛顿力学拟合粒子轨迹。每个输入(粒子)独立计算与其他输入的关系。
而 Mamba 描述的是液体运动,通过李指数映射来建模时空结构。流体运动描述的是连续介质中的分子集体行为,运动是整体的,内部各点之间有强烈的相互关系和依赖。液体的每个部分都受到整体液体运动的影响,通过内部压力,粘性等因素相互作用。这更符合记忆的本质,因为记忆系统具有连续性,动态变化性和整体关联性,这些特性与液体的性质非常相似。液体模型可以更好地描述记忆中的信息如何相互关联,如何随着时间和新信息的出现进行动态调整和整合。
李指数映射是一种数学工具,用于描述和分析一个向量场如何沿着另一个向量场发生变化,比如液体力学,电磁场,广义相对论的时空结构等,解决了动态系统中相互作用的描述。它是和微分任何中重要的概念,来源于李群和李代数的理论。
如果把记忆的流淌比作一个水流管道系统,可以看做一个李群,进行各种复杂变换(旋转,推移等)。固定矩阵 A 就是主管道(全局演变路径),类似于液体运动的全局关系,让系统状态更新有固定的全局路径和规则,因此可以表现出更高的灵活性和适应性。而 B t B_t Bt 和 C t C_t Ct 就是阀门或旋钮,delta 这个离散化因子,就像是液体力学中的时间步长,决定液体运动的离散时间点。选择机制就像是根据具体情况选择和调整旋钮,控制流体在管道中的流动路径。
训练 Mamba 的过程就是李指数映射假使流体力学动态系统,找到主管道 A,调整阀门和旋钮 B t , C t , Δ t B_t,C_t,\Delta t Bt,Ct,Δt 获得最优流体流动路径,让模型可以在高维特征空间中进行高效导航和决策。
Transformer 的自注意力机制粒子运动强调个体的独立性和动态调整,灵活性高,能动态调整权重,捕捉复杂的上下文依赖关系,但计算复杂度高,资源消耗大。Mamba 流体运动强调整体的连续性和全局关系,借用独特的矩阵 A 的固定性,提供了稳定性和确定性,通过李指数映射实现高效状态更新和决策。
相关文章:
Mamba模型学习笔记
笔记来源:bilibili Transformer 的死穴 Transformer 结构的核心是自注意力机制层,无论是 encoder 还是 decoder,序列数据都先经过位置编码后喂给这个模块。 但是自注意力机制的计算范围仅限于窗口内,而无法直接处理窗口外的元素…...
android kotlin 基础复习 继承 inherit
1、新建文件kt 2、代码: /**用户基类**/ open class Person1(name:String){/**次级构造函数**/constructor(name:String,age:Int):this(name){//初始化println("-------基类次级构造函数---------")println("name:${name},age:${age}")} }/**子…...
读软件设计的要素06概念完整性
1. 概念完整性 1.1. 当概念组合成一个软件时,它们可以同步以便协调行为 1.1.1. 同步可能会消除一个概念的某些行为,但决不会添加与该概念的规范不一致的新行为 1.1.2. 在使用概念设计软件时,即使你没有精确定义同步,至少要说服自…...
Java 每日一刊(第2期):搭建开发环境
文章目录 JVM、JRE、JDKJVM(Java Virtual Machine,Java 虚拟机)JRE(Java Runtime Environment,Java 运行时环境)JDK(Java Development Kit,Java 开发工具包)JVM、JRE、JD…...
探索EasyCVR与AI技术深度融合:视频汇聚平台的新增长点
随着5G、AI、边缘计算、物联网(IoT)、云计算等技术的快速发展,万物互联已经从概念逐渐转变为现实,AIoT(物联网人工智能)的新时代正在加速到来。在这一背景下,视频技术作为信息传输和交互的重要手…...
IBM中国研发部调整:全球化与本土化的新平衡
如何看待IBM中国研发部裁员? 近日,IBM中国宣布撤出在华两大研发中心,引发了IT行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅影响了众多IT从业者的职业发展,也让人思考全球化背景下中国IT产业的竞争力和未来发展方向。面对…...
C++入门基础篇
引言 说到编程语言常常听到的就是C语言C Java 。C语言是面向过程的,C是和Java是面向对象的,那么什么是面向对象呢?什么又是面向过程呢?C是什么?封装、继承、多态是什么?且听我絮絮叨叨。 C入门基础 1.命名…...
Qt QListWidget 代码范例,以及Qt 天坑:setStyleSheet失效问题
一、坑之所在 1.写了StyleSheet的QString并进行了设置 this->setStyleSheet(styleSheet_M);2.注释后,将StyleSheet换到UI form里去,然后又手动清理了UI form里的StyleSheet 重新使用代码设置,此时代码设置失效了 二、根本解决 1.手动从…...
Unity AnimationClip详解(1)
【动画片段】 前文我们介绍了骨骼动画,在Unity中骨骼动画的部分静态数据存储在SkinedMeshRender中,而另一部分动态的关键帧数据就是存储在AnimationClip中的。 关键帧数据来自与FBX、OBJ等动画模型文件,可以在动画导入后的Animation选项卡中…...
在这12种场景下会使Spring事务失效--注意防范
在某些业务场景下,如果一个请求中,需要同事写入多张表的数据,但为了保证操作的原子性(要么同事插入数据成功,要么同事插入失败),例如,当我们创建用户的时候,往往会给用户…...
SOPC:Nios II Processor -> Vectors
Reset Vector——复位向量 Exception Vector——执行向量 两个向量地址都存储着程序 1.Reset Vector 当FPGA进行复位时,FPGA就重新开始执行程序,这时就需要从EPCS中读取程序。由于FPGA的程序存放在EPC…...
golang学习笔记11——Go 语言的并发与同步实现详解
推荐学习文档 基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学习笔记04——如何真正写好Golang代码&…...
关于汽车加油是加200还是加满的思考
车子快开了1万公里了,每个月保险会送一个200-15的加油优惠券,所以之前一直是每次加200的习惯, 最近突然觉得经常去加油很麻烦,而且很浪费时间, 需要重新评估一下, 一次加200 or 一次加300 or 一次加满&am…...
C# 去掉字符串最后一个字符的5种方法
C# 去掉字符串最后一个字符的 5 种方法 (1)Substring string original "Hello!"; string result original.Substring(0, original.Length - 1); Console.WriteLine(result); // 输出: Hello (2)Remove string o…...
[Redis] Redis中的String类型
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
Transiting from CUDA to HIP(三)
一、Workarounds 1. memcpyToSymbol 在 HIP (Heterogeneous-compute Interface for Portability) 中,hipMemcpyToSymbol 函数用于将数据从主机内存复制到设备上的全局内存或常量内存中,这样可以在设备端的内核中访问这些数据。这个功能特别有用&#x…...
基于SpringBoot+Vue+MySQL的垃圾分类回收管理系统
系统展示 用户界面 管理员界面 系统背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟,信息的传播速度…...
游戏的3C,Al
在游戏开发中,“3C”通常指的是三个重要的组成部分:Character(角色)、Camera(摄像机)和Control(控制)。这三者对于创建沉浸式和流畅的游戏体验至关重要。而AI(人工智能&a…...
深度学习基础案例4--运用动态学习率构建CNN卷积神经网络实现的运动鞋识别(测试集的准确率84%)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 前几天一直很忙,一直在数学建模中,没有来得及更新,接下来将恢复正常这一次的案例很有意思:在学习动态调整…...
tekton pipeline workspaces
tekton pipeline workspace是一种为执行中的管道及其任务提供可用的共享卷的方法。 在pipeline中定义worksapce作为共享卷传递给相关的task。在tekton中定义workspace的用途有以下几点: 存储输入和/或输出在task之间共享数据secret认证的挂载点ConfigMap中保存的配置的挂载点…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
