1. 引言:为什么 Self-Attention 需要持续改进
Self-Attention 是 Transformer 的核心,它让序列中每个 token 都能与所有 token 交互,从而建模长距离依赖。但标准实现存在两个硬伤:
- 计算与显存复杂度为 O(N²):序列长度翻倍,注意力矩阵规模变为 4 倍,长序列训练极易显存爆炸;
- 推理时 KV Cache 开销大:自回归生成需要缓存全部历史 K、V,显存占用随上下文线性增长,成为长上下文推理的瓶颈。
围绕这两个痛点,业界从硬件机制、模型架构、位置编码三个方向提出了大量改进算法。下面按这三条主线梳理。
2. 硬件机制优化:FlashAttention
FlashAttention 针对 GPU 的存储层级(HBM 显存与 SRAM 片上缓存)做优化,核心思想是分块计算(Tiling)+ 前向重计算(Recomputation):
- 将 Q、K、V 切分成小块,逐块加载到 SRAM 中完成注意力计算,避免把完整的 N×N 注意力矩阵写回 HBM;
- 反向传播时不保存中间注意力矩阵,而是重新计算,用少量额外算力换取大量显存。
效果上,它把注意力部分的内存读写复杂度从 O(N²) 降到 O(N),解决了长序列训练时的显存爆炸问题,同时因为减少了 HBM 访问,实际速度也显著提升。FlashAttention 属于"精确注意力",不改变数学结果,是当前训练与推理的默认基础设施。
3. 架构优化
3.1 MQA(Multi-Query Attention)
标准 MHA 中每个注意力头都有独立的 Q、K、V。MQA 让所有注意力头共享同一组 K 和 V,只保留多头 Q。
- 推理时 KV Cache 缩小为原来的 1/h(h 为头数),显存占用和访存带宽大幅下降;
- 生成速度明显加快,适合高并发推理场景;
- 代价是模型表达能力略有损失,效果通常略逊于 MHA。
3.2 GQA(Grouped-Query Attention)
GQA 是 MQA 与 MHA 的折中:把 Query 头划分为若干组,每组内的 Query 共享一组 K、V。
- 组数等于头数时退化为 MHA,组数为 1 时退化为 MQA;
- 在维持接近 MQA 的推理速度的同时,保留了接近 MHA 的模型性能;
- 目前被 LLaMA 2/3 等主流大模型广泛采用,是工程上性价比最高的方案之一。
3.3 Linear Attention
标准注意力的 softmax 使其无法利用矩阵乘法的结合律。Linear Attention 引入特征映射 φ(·) 替换或近似 softmax 的非线性操作,把注意力写成:
Attention(Q,K,V)=ϕ(Q)(ϕ(K)⊤V)ϕ(Q)(ϕ(K)⊤1) \text{Attention}(Q,K,V) = \frac{\phi(Q)\left(\phi(K)^\top V\right)}{\phi(Q)\left(\phi(K)^\top \mathbf{1}\right)} Attention(Q,K,V)=ϕ(Q)(ϕ(K)⊤1)ϕ(Q)(ϕ(K)⊤V)
利用结合律先算 φ(K)ᵀV,可将序列长度复杂度从 O(N²) 降为 O(N),推理时可维护一个固定大小的状态,天然适合超长序列与流式场景。代价是近似带来的精度损失,在长程精确检索类任务上仍有差距。
3.4 MLA(Multi-head Latent Attention)
MLA 由 DeepSeek 提出,核心是低秩投影压缩 KV:将输入的隐藏状态先投影压缩成一个极低维的共享隐向量(latent vector),推理阶段只需缓存这个压缩向量,计算注意力时再上投影恢复出完整的 K、V。
- KV Cache 体积大幅压缩,长上下文推理显存显著降低;
- 相比 MQA/GQA 的"共享"思路,MLA 通过低秩分解保留了更强的表达能力,性能接近甚至优于 MHA。
3.5 DSA(DeepSeek Sparse Attention)
DSA 在 MLA 基础上进一步做稀疏化,采用"先粗筛、后细筛"的两阶段策略:
- 粗筛:在计算完整注意力之前,用一个轻量快速的索引器(Indexer)计算当前 Query token 与所有历史 token 的关联度分数;
- 细筛:只挑选分数最高的 Top-k 个 token,在这些 token 之间执行完整的注意力计算。
这样有效过滤了无关区域引入的噪声,把注意力计算量从 O(N²) 降到接近 O(N·k),在保持长上下文建模能力的同时大幅降低计算开销。
4. 位置编码优化:RoPE
RoPE(Rotary Position Embedding)通过复数空间的旋转矩阵将绝对位置信息注入到 Q 和 K 的点积运算中:
- 对 Q、K 按位置角频率进行旋转,使得注意力分数只依赖相对位置差,天然具备相对位置编码的性质;
- 不引入额外参数,实现简单,且对序列长度有更好的泛化能力;
- 配合位置插值(PI)、NTK-aware 缩放、YaRN 等技术,可进一步把训练时的短上下文外推到更长上下文。
RoPE 已成为 LLaMA、Qwen、DeepSeek 等主流开源模型的标配位置编码方案。
5. 三类改进对比总结
| 方向 | 代表算法 | 核心思路 | 主要收益 |
|---|---|---|---|
| 硬件机制 | FlashAttention | 分块计算 + 重计算 | 显存读写 O(N²)→O(N),长序列可训练 |
| 架构(KV 共享) | MQA / GQA | 多头共享 K、V | KV Cache 缩小,推理加速 |
| 架构(低秩压缩) | MLA | 低秩投影压缩 KV | 长上下文显存大幅降低,性能接近 MHA |
| 架构(稀疏化) | DSA | 粗筛 + 细筛 Top-k | 计算量降至近 O(N·k),过滤噪声 |
| 架构(线性化) | Linear Attention | 特征映射 + 结合律 | 复杂度降为 O(N),适合超长序列 |
| 位置编码 | RoPE | 旋转矩阵注入位置 | 相对位置感知,长度泛化更好 |
6. 面试答题要点
回答这类题时,建议按"问题 → 思路 → 收益 → 代价"的结构展开,并注意以下几点:
- 先点明 Self-Attention 的两个核心痛点(O(N²) 复杂度、KV Cache 开销),让回答有主线;
- 区分训练侧优化 (FlashAttention)与推理侧优化(MQA/GQA/MLA/DSA),体现工程视角;
- 说明各方案的取舍:MQA 快但损性能,GQA 折中,MLA 压缩但需上投影,Linear Attention 快但精度有损;
- 能补充实际落地情况(如 GQA 用于 LLaMA、MLA/DSA 用于 DeepSeek)会明显加分。