2606 字
13 分钟
彻底理解注意力机制:注意力机制的演进之路,及其核心优化逻辑
2026-01-05

之前学习Transformer时,学过好几次都觉得当时学懂了,但是后面就又忘掉了:注意力机制(Attention)这个概念看似直观,但总感觉隔着一层纱,学完不久又变得模糊。最近学习大模型,我再次认真梳理了这部分内容,有了一些更踏实的体会。

所谓注意力机制,其核心在于“聚焦”——面对大量信息时,系统能够根据当前需要,自动筛选出最相关的部分,而非均等地处理全部输入。在计算机视觉中,我们识别一张图片并不需要看清每个像素,只需关注关键区域即可理解内容;在自然语言处理中,理解一个句子也往往不需要逐字推敲,而是抓住几个重要词汇就能把握整体含义。这种模仿人类认知的“选择性关注”,就是注意力机制的基本思想。

具体实现上,注意力机制通常涉及三个核心概念:查询(Query)、键(Key)和值(Value)。可以借用一个比喻来理解:假设我们去图书馆借一本关于“人工智能”的书。这里的“人工智能”就是查询(Query);图书馆里所有书籍的索引或主题标签相当于键(Key);而每本书的具体内容便是值(Value)。我们根据查询(人工智能)去匹配图书馆中相关的键(书籍主题),最终获取那些匹配度高的书籍所对应的值(内容)。注意力机制的作用,就是自动化这个过程——计算查询与各个键的关联程度,并依据这个程度对值进行加权汇总。

注意力计算的核心公式如下:

Attention(Q,K,V)=softmax(QKTd)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V

它的关键步骤是查询与键的点乘。你可能会问:为什么点乘能够表示相似度?这背后其实依赖一个重要的前提:在向量空间中,语义或特征越相似的项,其向量表示的方向越接近,点乘的结果也就越大。因此,点积本质上衡量了查询与键之间的相关性。 随后除以 d\sqrt{d} 是为了避免维度较高时点积结果过大,从而稳定梯度;softmax 操作则将相关性转换为权重(总和为1);最后将权重施加在值上,得到加权求和的结果——这就是注意力输出的本质:根据相似度对信息进行筛选与融合。

在实际应用中,我们往往一次性处理多个查询,因此公式中的 qq 扩展为矩阵 QQ,实现并行计算。这种设计也让我联想到数据结构中的哈希表:通过键来索引对应的值。在注意力中,查询的目的正是为了匹配最相关的键,进而提取并融合对应的值,只是这里的“匹配”并非精确查找,而是基于相似度的软性加权。

综上所述,注意力机制的本质可总结为:计算查询与一系列键的相似度,并依据该相似度对相应的值进行加权求和,从而实现有选择的信息聚合

那么,什么是 自注意力(Self-Attention) 呢?顾名思义,它发生在序列内部。在自注意力中,查询、键、值都来自同一个输入序列(例如一句话中的各个词),通过不同的线性变换得到。它让序列中的每个元素都能够直接关注到序列中所有其他元素,从而捕捉序列内部的依赖关系,这是 Transformer 理解上下文的核心机制。

交叉注意力(Cross-Attention) 则涉及两个不同的序列。其中一个序列提供查询,另一个序列提供键和值。这种机制常见于编码器-解码器结构,例如在机器翻译中,解码器的当前状态作为查询,去关注编码器输出的全部信息,从而获取源语言序列中对当前翻译最有用的部分。

为了提高模型的表现力与稳定性,研究者进一步提出了 多头注意力(Multi-Head Attention, MHA) 。其思想是将查询、键、值投影到多个不同的子空间(即多个“头”),在每个头上独立进行注意力计算。这样可以让模型同时关注来自不同表示子空间的信息,最后将各头的输出拼接并做一次线性变换。类比一下,就像我们观察一个物体时,可以同时从形状、颜色、纹理等多个角度去分析,最后综合得到更全面的认识。

随着模型规模不断增大,尤其是进入大模型时代,如何在保持强大表达能力的同时优化计算与内存效率,成为了至关重要的工程问题。传统的多头注意力(MHA)虽然性能优异,但在自回归生成任务(如文本生成)中,其推理过程存在一个显著的瓶颈:KV Cache(键值缓存) 的显存占用。

在自回归生成中,模型每生成一个新词(token),都需要基于之前所有已生成的词来计算注意力。为了避免重复计算,标准做法是将之前所有时间步的键(K)和值(V)矩阵缓存下来,这就是 KV Cache。在MHA中,每个注意力头都有自己独立的K和V矩阵。对于一个拥有 n_heads 个头、d_k 维键向量的模型,生成一个长度为 L 的序列时,KV Cache的总大小将达到 2 * n_heads * d_k * L。随着模型参数(头数、维度)和生成长度的增加,这个缓存会消耗巨量的显存,成为限制长文本生成或部署在资源受限环境中的主要障碍。

为了优化这一问题,人们设计了更高效的注意力变体,核心思路就是减少需要独立缓存和计算的K、V矩阵数量

多查询注意力(MQA) 正是在此背景下被提出的优化方案。它采用了一种极简的策略:让所有注意力头共享同一套键(K)和值(V)。换句话说,无论模型有多少个头,在整个注意力层中只维护一组K和V矩阵。这带来了直接的好处:KV Cache的大小被削减为 2 * d_k * L,仅为MHA的 1 / n_heads。这极大地降低了显存占用和每次生成时读取KV Cache的带宽开销,从而显著提升了推理速度。实验表明,在许多任务中,MQA带来的性能损失非常小,使其成为实践中极具吸引力的高效替代方案。

分组查询注意力(GQA) 则是MHA与MQA之间一个优雅的折中。它并非让所有头共享一套KV,也不是让每个头独占一套KV,而是将多头分组。每组内的多个头共享同一套K和V矩阵,不同组之间则使用不同的KV。例如,一个12个头的模型可以分为3组,每组4个头共享KV,那么总共只需要维护3套独立的K和V矩阵。这样,KV Cache的大小为 2 * groups * d_k * L。GQA允许在组数(groups)这个维度上进行灵活调节:当 groups = n_heads 时,GQA退化为MHA,表达能力最强;当 groups = 1 时,GQA就变成了MQA,效率最高。通过选择合适的组数,可以在模型质量和推理效率之间取得理想的平衡。目前,许多前沿大模型(如Llama 2/3系列)都采用了GQA架构。

如果说 GQA 是在性能与显存之间做“减法”的权衡(通过减少 KV 头的数量),那么 DeepSeek 提出的 MLA(Multi-head Latent Attention)多头潜在注意力 则试图通过“压缩”技术打破这种零和博弈。MLA 的核心洞察在于:MHA 中的键值矩阵(KV)虽然维度很高,但实际上包含了很多冗余信息。我们不一定非要粗暴地减少头的数量(像 MQA/GQA 那样),而是可以通过低秩压缩(Low-Rank Compression) 的方式,将巨大的 KV 矩阵投影到一个低维的潜在向量(Latent Vector)中。然后在计算注意力时,再通过投影矩阵将这个低维向量“恢复”成原本 MHA 所需的高维形态。此外,为了解决压缩过程与位置编码(RoPE)可能产生的冲突,MLA 设计了一种巧妙的解耦技巧。它将携带位置信息的向量单独处理,不参与压缩,从而在大幅降低显存占用的同时,保留了精确的位置感知能力。MLA 的最终效果非常惊人:它的 KV Cache 显存占用极低(甚至少于 MQA),但在理论上和实测中却能保持与标准 MHA 几乎一致的模型性能。 这意味着我们不再需要在“聪明程度”(性能)和“记忆容量”(显存)之间做艰难的选择,MLA 让我们得以兼得鱼与熊掌。

从标准的多头注意力(MHA)到极简的多查询注意力(MQA),再到折中的分组查询注意力(GQA),最后到基于低秩压缩的潜在注意力(MLA),这一条演进脉络清晰地揭示了现代大模型发展的一个核心方向:在逼近人类智能的宏大目标下,每一步前进都必须兼顾算法效能与工程实现的极致优化。理解这些变体背后的动机——特别是对 KV Cache 的“压榨”——不仅有助于我们把握模型架构设计的精髓,更能让我们在实际应用中(比如选择部署方案或进行微调时)做出更合理的技术选型。注意力机制不再只是一个数学公式,它是算法与算力相互妥协又相互成就的产物。

彻底理解注意力机制:注意力机制的演进之路,及其核心优化逻辑
https://jiqingjiang.github.io/posts/tech/ai-llm/attention/
作者
erode
发布于
2026-01-05
许可协议
CC BY-NC-SA 4.0