
NLP 的发展过程中,一直在解决这个核心问题:如何构建一个能够理解语言序列性与上下文依赖性的计算模型。在很长一段时间里,循环神经网络(RNN)及其变体长短期记忆网络(LSTM)和门控循环单元(GRU)被认为是解决这一问题的标准答案。
这些模型的设计思路受人类线性阅读习惯的影响非常大,它们按时间逐词处理输入,将前一个时刻的隐藏状态传递给当前时刻,试图在递归的过程中积累上下文信息。不过,这种听起来挺顺理成章的处理方式,其实恰恰成了限制大语言模型进一步发展的最大瓶颈。
序列递归处理带来了两个无法回避的问题:
GPU 这种大规模并行处理的能力在面对 RNN 时显得无用武之地。在处理长序列时,这种串行依赖导致训练时间随着序列长度线性增长,极大地限制了模型规模的扩张和数据的吞吐量。LSTM 引入了门控机制来缓解梯度消失问题,但在处理长达数千甚至上万个 Token 的文本时,早期的信息在经过无数次非线性变换和矩阵乘法后,几乎不可避免地被稀释、扭曲甚至遗忘。当模型读到文章末尾时,往往已经无法准确回忆起开头的主语或关键实体,导致生成的文本在长程逻辑上出现断裂。Transformer 架构的出现,标志着 NLP 领域从“序列递归”向“全局并行”的范式转移。其核心创新在于抛弃了递归结构,转而依赖 “注意力机制” 来捕捉序列中词与词之间的关系。在 Transformer 中,句子中的每一个词都可以同时 “看见” 句子中的所有其他词,无论它们在序列中的距离有多远。这种全局视野使得模型能够直接建立长距离依赖,将词与词之间的交互路径缩短为常数级 ,而不再受限于序列长度的 。
从序列到并行的转变,不仅仅是计算效率的提升,更是语义理解方式的质变。模型不再是被动地“记忆”过去,而是主动地在全局上下文中“搜索”相关信息。这一转变正是本篇中要深入拆解的 “注意力机制”。它不仅定义了现代 LLM 的基本工作方式,更引发了后续关于计算效率与模型性能之间长达数年的博弈与演进,从最初的 Multi-Head Attention (MHA) 到为了效率妥协的 MQA、GQA,再到 DeepSeek 提出的兼顾性能与效率的 Multi-Head Latent Attention (MLA) 。
在探讨 Transformer 的技术细节之前,我们需要回答一个问题:为什么需要“注意力”?
人类的视觉系统是注意力机制的最佳体现。当我们观察一幅图像或阅读一段复杂文本时,我们的视线并非均匀地扫描每一个像素或每一个字母。

相反,我们会迅速将焦点集中在具有高信息量的区域,比如图像中的人脸、物体边缘,或者句子中的关键词汇,而将背景或其他无关信息模糊化处理。这种机制使人类能够从海量的感知输入中,以极低的认知成本筛选出最关键的信息,实现资源的优化配置。
在深度学习的早期 Encoder-Decoder 架构(如 Seq2Seq 模型)中,我们面临着严重的“信息瓶颈”问题。Encoder 负责将输入序列(如一句中文)压缩成一个固定长度的 Context Vector,Decoder 则基于这个向量生成输出序列(如对应的英文翻译)。这就好比要求一个人读完一整本小说后,只能用一个固定大小的便签纸记下所有内容,然后凭借这张便签纸复述出整本小说的细节。显然,对于长序列,固定长度的向量无法承载足够丰富的信息,导致生成质量随着序列长度增加而急剧下降。这种 Encoder-Decoder 的过程造成了巨大的信息损耗。
注意力机制的引入,打破了这个瓶颈。它允许 Decoder 在生成的每一个步骤,都能够 “回头看” Encoder 的所有输出状态,并根据当前生成的需要,动态地分配关注点。
具体来说,注意力的必要性体现在以下三个维度:
允许模型在不同时间聚焦于输入序列的不同部分,注意力机制将“死记硬背”转变为“按需检索”。Decoder 不再依赖单一的上下文向量,而是拥有了访问整个输入历史,这样模型能够处理任意长度的序列而不必担心信息被压缩丢失。
在机器翻译中,“Apple” 对应 “苹果”,这种对应关系往往跨越了语序的差异,注意力机制通过计算词与词之间的相关性分数,显式地对齐了源语言和目标语言的语义单元。这种对齐能力是处理复杂句法结构(如倒装句、从句)的关键,它让模型知道在翻译当前词时应该看原文的哪个位置。
词义是流动的,“Bank” 一词在 “River bank” 和 “Bank account” 中具有完全不同的含义。若没有注意力机制,模型只能学习到 “Bank” 的平均含义。而有了 Self-Attention,模型可以通过观察 “Bank” 周围是 “River” 还是 “Account”,来动态调整其对 “Bank” 的向量表示。这种上下文感知是现代 LLM 能够进行复杂推理和生成连贯文本的基础。
因此,注意力是机器实现深度语言理解的一大创新,它将信息的处理方式从线性的流式处理,升级为网状的关系建模,为后续的大模型智能奠定了基础。
《Attention Is All You Need》 中最令人费解也最精妙的设计,莫过于将输入投影为三个向量:Query (查询)、Key (键) 和 Value (值)。这三个概念可以借用于计算机中的 数据库检索系统 来理解;为了理解注意力机制,我们必须先剥离它数学表示,深入到它的语义内核层面,详细阐述 Q、K、V 到底是什么,以及它们如何在向量空间中完成信息的交互与融合的。

Self-Attention 层中,输入向量序列 (例如词嵌入加上位置编码)并不直接参与计算,而是首先通过三个独立的线性变换矩阵 、、 映射到三个不同的子空间。
对于序列中的每一个 Token,我们计算:
这三个向量分别扮演了完全不同的角色,构成了注意力机制的完整逻辑闭环:
代表了当前 Token 的查询意图,它是一个主动的探针,携带着当前 Token 希望从上下文中获取什么信息的信号。
"The cat sat on the mat" 中,当模型处理 "sat"这个词时,它的 Query 向量可能会在向量空间中发出一种信号:“我在找动作的主体(谁坐?)和地点(坐在哪?)”。如果这是一个语法分析任务,Query 可能会寻找名词短语;如果这是一个指代消解任务,Query 可能会寻找之前出现的实体。Key 进行匹配。 代表了当前 Token 的特征索引。它是一个被动的标签,用于向外界展示该 Token 所蕴含的关键特征,以便与 Query 进行匹配。Key 并不直接提供内容,而是提供一种 可被检索的属性。
"cat" 这个词,其 Key 向量可能会编码 “我是名词”、“我是有生命物体”、“我是主语候选者” 等信息。当 "sat" 的 Query 扫描过来寻找动作主体时,"cat" 的 Key 能够与该 Query 产生高响应。注意,Key 的设计是为了响应 Query,而不是为了表达完整的词义。Query 进行点积运算,决定了被注意的权重。 代表了当前 Token 的实际内容。当 Query 与 Key 匹配成功后,Value 是真正被提取并传输的信息。Value 往往包含了 Token 的语义表示,甚至可能经过转换以适应后续层的处理。
"cat" 被 "sat" 成功关注,那么 "cat" 的 Value 向量(包含了“猫”的语义概念)就会沿着注意力权重传输给 "sat",从而更新 "sat" 的表示,使其变为“猫坐”,Value 可以看作是存储在记忆单元中的具体数据。Value 向量的加权线性组合。
这三个组件的协作过程可以被看作是一个 软寻址 过程,它不同于哈希表的精确匹配(Key 必须完全相等),注意力机制执行的是基于相似度的模糊匹配,整个过程是完全可微的,因此可以通过反向传播进行训练。
整个过程可以细化为三个步骤:
模型计算当前 Token 的 Query 与序列中所有 Token 的 Key 之间的相似度,最常用的度量方式是缩放点积(Scaled Dot-Product) 。
Softmax 函数后,会推向梯度极小的饱和区(接近 0 或 1),导致反向传播时出现 梯度消失 。 将点积分布方差归一化,确保了训练的稳定性。通过 Softmax 函数将原始分数转化为概率分布。
表示 Token 对 Token 的关注程度,所有 的权重之和为 1,这一步是一个去噪和聚焦的过程,过滤掉不相关的 Key,高亮匹配度高的 Key。
最后,利用计算出的权重对所有 Token 的 Value 进行加权求和,得到 Token 的最终输出。
这一步实现了信息的流动与融合。Token 不再是孤立的词,而是吸收了整个句子中相关部分信息的聚合体,这种聚合操作是排列不变的,因此 Transformer 需要额外的位置编码来保留序列信息。
一个常见的疑问是:为什么不能直接用输入向量 既当 Q 又当 K 还当 V?即 ?
如果 ,这意味着一个词只能关注与它自身最相似的词(因为向量与自身的点积通常最大)。这会限制模型的表达能力。通过引入独立的投影矩阵 和 ,模型可以将输入映射到不同的子空间:
这种 不对称性 极其重要,它允许 “动词” 去关注 “名词”,允许 “代词” 去关注 “实体”,即使它们在原始语义空间中并不相似(例如 "it" 和 "robot" 并不相似,但在 "The robot fell because it..." 中,it 必须关注 robot)。Q 和 K 的分离打破了“相似性”的限制,建立了 “功能性” 的连接。
同理,V 的分离允许模型在提取信息时,可以提取与匹配特征不同的内容信息,提供了另一层特征转换的自由度。例如,Query 匹配的是 “语法属性”,但 Value 传输的是“语义内容”,这种设计赋予了 Transformer 强大的灵活性和泛化能力。
既然单个注意力机制能够捕捉词与词之间的关联,为什么我们还需要 “多头” 呢?
这就好比人类在思考问题时,需要从多个不同的角度切入,当我们理解一句话时,我们的大脑同时在处理多种关系:
如果只有一个 Single-Head,模型只能提取出一种类型的相关性,所有这些复杂的关系被迫压缩到同一组权重中,必然导致信息的互相干扰和平均化。Multi-Head Attention 通过并行运行多组独立的注意力机制解决了这个问题。具体而言,我们将输入的维度 切分为 个头,每个头拥有自己独立的 投影矩阵,维度为 。
多头机制带来了两个优势:
在单头情况下,注意力往往由当前位置最强的某种关系主导(例如,只关注到了紧邻的词)。多头机制允许模型在同一时间步,一部分头关注局部邻居,另一部分头关注长距离的特定词。
每个头可以独立学习一种特定的语义或句法关系。
it 指代谁的问题)。多头注意力将高维向量空间切分成了多个正交的子空间,使得模型能够在不同的子空间中并行地寻找特征,极大地增强了模型的表达能力和鲁棒性。
Transformer 的架构设计初衷是为了解决序列处理的并行化问题,但这种高度冗余、多通道的机制在海量数据训练后,涌现出了令人惊讶的复杂行为。我们不再仅仅关注它 “能否工作”,而是深入到了机械可解释性(Mechanistic Interpretability)的层面。
什么是归纳头?简而言之,它是一种能够执行 “前缀匹配与复制” 算法的注意力头。它的工作逻辑可以描述为:“我在当前的上下文中寻找,以前我在哪里见过当前的这个 Token?如果我找到了,我就看看它后面当时跟着的是什么 Token,然后我把那个 Token 复制过来作为现在的预测。”
这听起来像是一个简单的 Ctrl+C, Ctrl+V 操作(比如你看到一段文本里反复出现 “苹果 → 红色”,那么下次再看到 “苹果”,模型就可能直接猜 “红色”),但在神经网络内部,它是通过 双头电路 来实现的:
历史上下文: ... → A₁ → B₁ → ...
↑
│ (回顾头:B₁ 携带 A₁ 信息)
↓
新上下文: ... → A₂ → [?]
↑ ↑
│ └── 归纳头用 A₂ 作 Query
│ 找到携带 A₁ 特征的 B₁
└── A₂ ≈ A₁ → 触发匹配N 层)。B 时,回顾头会把前一个词 A 的信息(通过 Key/Value)注入到 B 的向量中。B 的内部表示不仅代表自己,还“携带”了 “我前面是 A” 这个上下文线索。A 后面是什么” --> 归纳头(Induction Head)N+1 层)。A,并要预测下一个词时,归纳头就开始工作:A 作为 Query,去搜索整个上下文中有没有“和 A 配对过”的位置A 后面的那个词(比如 B)已经 “背上了 A 的照片”(即包含了 A 的特征),所以归纳头能通过特殊的注意力匹配(称为 Q-Composition 和 K-Composition)精准定位到那个 BB 的内容(Value)提取出来,大幅提高 B 在预测结果中的概率这种机制解释了两个现象:
“A B A ?” 这样的序列,并正确填出 “B”。换句话说,模型的 “聪明” 并非来自推理,而是来自对上下文中共现模式的高效记忆与复用。而归纳头,正是实现这一能力的核心技术。
虽然 Transformer 抛弃了 RNN 的序列结构,但它并没有忽视位置信息,这块我在 LLM 系列(十五):Positional Encoding篇中有过介绍,感兴趣的读者可以详细阅读。
Token 的前一个或后一个位置,这说明在处理低级语言特征(如词组搭配、分词)时,局部性依然是最有效的归纳偏置。Softmax 函数虽然理论上给所有 Token 分配非零概率,但实际上,许多深层头会将 99% 的权重集中在 1 到 2 个特定的 Token 上,而对其他 Token 视而不见。这说明多头注意力实际上演化成了一种 路由网络,也就是说每个头都是一个特定功能的专家,只有在遇到特定的触发条件(如特定句式、特定实体)时才会被激活并传输信息。综上所述,多头注意力机制并不是一个均质的 “浆糊”,而是一个高度分工、层级分明的机器;它底层处理局部关系,中层搬运历史信息构建归纳回路,高层则进行复杂的语义路由和指代推理。这些复杂的行为,都是为了最小化预测误差而自组织形成的。
Transformer 的核心是注意力机制,但随着模型规模从 BERT 的 1.1 亿参数迈向 GPT-4 级别的万亿参数,以及上下文长度从 512 扩展到 128k 甚至 1M,标准的 多头注意力(Multi-Head Attention, MHA) 就暴露出了问题:推理时的显存占用与带宽瓶颈。
在 LLM 的自回归生成(推理)阶段,为了避免重复计算,会将之前所有 Token 的 Key 和 Value 向量缓存起来,这就是我们熟知的 KV Cache。
对于一个 层、隐藏维度 、头数 (每头维度 )的模型,当上下文长度达到 时,KV Cache 的显存占用(以 FP16 为例)为:
随着 Batch Size 和序列长度 的增加,KV Cache 会迅速吃掉数十 GB 甚至上百 GB 的显存,从而导致显存带宽饱和。GPU 不是在算得慢,而是在等数据搬运。
MHA 是 Transformer 的原始形式,也是我们理解后续变体的基准。
KV Cache 极大,每个头都需要存储自己独立的 K 和 V。例如,对于一个 70B 参数的模型,如果使用 MHA,仅 KV Cache 就可能占据超过 100GB 的显存(取决于 Context Window),这极大地限制了最大 Batch Size,从而限制了推理吞吐量。为了解决 MHA 的显存问题,Noam Shazeer 等人在 2019 年提出了 MQA。
Query 是负责“提问”的,需要多样性来捕捉不同的关系;而 Key 和 Value 是被检索的“资料”,是不是可以共享?MQA 让所有的注意力头 共享同一组Key 和 Value 矩阵(即 只有一组),但保留多组 。Key 头和 1 个 Value 头。KV Cache 的大小瞬间缩小了 倍(通常是 8 倍或 16 倍),极大地降低了显存占用,使得在相同硬件下可以支持更大的 Batch Size,推理速度提升显著。K 和 V,相当于强迫模型在所有语义子空间中使用完全相同的“资料库”。例如,一个头想查语法关系,另一个头想查语义关系,但它们只能查同一本 “字典”,这严重削弱了模型捕捉复杂细节的能力,且训练往往不稳定。鉴于 MQA 的性能损失太大,Llama 2 和 Llama 3 等主流开源模型采用了 GQA 作为折中方案。
GQA 是 MHA 和 MQA 的插值。它不让所有头共享一组 KV,而是将 Query 头分成 个组,每组内的 Query 共享一对 K 和 V。Query 头,对应 个 Key/Value 头()。例如,64 个 Query 头,分成 8 组,每组 8 个 Query 共享 1 个 KV,总共有 8 对 KV。KV Cache 压缩率为 ,GQA 成功地在 MHA 的高质量和 MQA 的高速度之间找到了平衡点;它保留了足够的 KV 多样性以维持性能,同时显著减少了显存占用。尽管 GQA 表现出色,但它仍然是一种 “丢弃信息” 的有损压缩(减少了 KV 的头数)。DeepSeek-V2 和 V3 引入的 MLA (Multi-Head Latent Attention) 则代表了另一种维度的创新:通过低秩投影(Low-Rank Projection)在保持多头能力的同时,实现比 MQA 更极致的压缩。
MLA 的核心创新点在于它不再通过减少“头数”来压缩,而是通过压缩“向量维度”并利用低秩恢复技术,实现了 性能优于 GQA,显存占用甚至少于 MQA 的奇迹。MLA 由两大核心技术构成:
在标准 MHA 中,KV Cache 存储的是高维的 和 向量。MLA 认为,这些高维向量中存在大量冗余。因此,MLA 不直接存储 和 ,而是将它们压缩进一个低维的 潜在向量(Latent Vector) 中。

具体过程如下:
a、压缩(Down-Projection)
将输入隐藏状态 投影到一个低维的潜在空间 :
其中 的维度 远小于标准的 。在推理时,我们只缓存这个极小的 向量。
b、解压(Up-Projection)与矩阵吸收
理论上,计算注意力分数时,模型需要将 投影回高维空间,生成每一个头所需的 Key 和 Value
MLA 的精妙之处在于矩阵吸收(Matrix Absorption),由于矩阵乘法具有结合律,我们在推理时不需要显式地恢复巨大的 矩阵。我们可以将解压矩阵 整合到 Query 的投影矩阵中,将 整合到输出矩阵 中,这意味着,虽然我们在数学上拥有 个独立的头,但在物理存储上,我们只需要存储极小的 。
这种方法的精髓在于:用计算换显存;通过存储高度压缩的 ,而不是解压后的 ,MLA 实现了极致的显存效率。
可以参考这篇知乎文章来理解 https://zhuanlan.zhihu.com/p/716976304,同时也推荐各位直接阅读原论文 https://arxiv.org/pdf/2405.04434
RoPE 的核心机制依赖于高维、完整且结构化的向量空间来维持相对位置信息,但是低秩压缩会破坏这种精细的几何结构,导致位置编码失效或严重退化,DeepSeek 的解决方案是 Decoupled RoPE(解耦 RoPE):将 Key 向量一分为二。
RoPE,参与低秩压缩,这部分进行完全的极致压缩,对应上述的 。RoPE 的小向量 ,这个向量很小(例如 64 维),且所有头共享。最终的 Attention 计算中,Query 也被对应地拆分为 “内容 Query” 和 “位置 Query”。
Query 与 压缩恢复后的 Key 进行交互(主要贡献语义分数)。Query 与 共享的 RoPE Key 进行交互(主要贡献位置分数)。两者相加得到最终的 Attention Score。
下表总结了四种注意力机制的关键指标对比:
机制 | 显存占用 (KV Cache) | 性能 (Performance) | 代表模型 | 核心特征 |
|---|---|---|---|---|
MHA | 极大 () | 最优 | GPT-3, BERT | 独立 Q, K, V,显存杀手 |
MQA | 极小 () | 较差 (细节丢失) | Falcon, ChatGLM2 | 共享 K, V,激进压缩 |
GQA | 中等 () | 良好 (平衡) | Llama 2/3 | 分组共享,当前主流 |
MLA | 极小 () | 最优 (无损多头) | DeepSeek-V2/V3 | 低秩压缩 + 解耦 RoPE |
MLA 的出现标志着注意力机制的设计进入了一个新的阶段:从单纯的结构剪枝(如 MQA/GQA 简单粗暴地减少头数)转向了更深层的数学变换与压缩(低秩分解 + 解耦编码)。
在大模型的世界里,“注意力” 常被提起,但种类繁多,容易混淆。其实,它们大致可分为两类:注意力机制本身,以及 提升其效率的工程技术。
最基础的是 标准自注意力(Scaled Dot-Product Attention),它通过计算词与词之间的相关性,动态决定每个位置该关注哪些上下文。然而,它的计算和显存开销随序列长度平方增长(O(n2)),难以处理长文本。
为此,业界提出了多种优化方案,例如 稀疏注意力(如 Longformer)只计算局部或关键位置的关联;线性注意力(如 Performer)则用数学近似将复杂度降至 O(n),适合超长序列,但会牺牲一定精度。
而真正改变游戏规则的,是两类 不改变模型结构、只优化计算过程 的高效实现:
GPU 片上内存调度,在不损失精度的前提下,大幅加速计算并减少显存占用,它已成为现代大模型训练和推理的标配。vLLM 团队提出,灵感来自操作系统的 “虚拟内存分页”。它将 Key-Value 缓存划分为固定大小的“页”,按需加载,避免内存碎片。这使得 GPU 能更高效地服务多个并发请求,并显著提升吞吐量。需要注意的是,FlashAttention 和 PagedAttention 并非新的注意力机制,而是让 已有注意力跑得更快、更稳、更省资源 的关键技术。前者优化单次计算,后者优化内存管理与批处理。
总之,当我们谈论 “注意力” 时,既要分清是 算法创新(如稀疏、线性),也要识别 工程突破(如 FlashAttention、PagedAttention)。正是这些技术的协同,才让大模型既能理解万字长文,又能实时响应用户请求。
本文系统梳理了注意力机制在大语言模型中的核心作用及其技术演进路径。从序列建模的历史背景出发,引出 Transformer 通过注意力机制实现了对全局上下文的并行建模,突破了传统 RNN 在长程依赖与计算效率上的结构性限制。注意力机制本质上是一种基于 Q、K、V 的可检索过程,使模型能够在上下文中动态选择并融合关键信息。
多头注意力通过并行的表示子空间,它提升了模型对不同语义关系的刻画能力,并在训练过程中自然形成具备不同功能分工的注意力头结构。这一机制为上下文理解、信息路由与泛化能力提供了重要支撑。随着模型规模和上下文长度不断扩大,注意力机制的瓶颈逐渐转向显存与计算开销,多头结构也随之演化出 MQA、GQA、MLA 等更高效的变体,以在性能与资源消耗之间取得平衡。
同时,FlashAttention 等工程级优化手段从实现层面释放了注意力机制的计算潜力,使其在大规模训练与推理场景下具备可行性。整体来看,注意力机制既是大模型能力提升的理论基础,也是推动其工程落地的关键支点。