⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

第4章扩展:注意力机制的变种 ​

版本: v2.0
最后更新: 2026-05-26

在线 Notebook

对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明。

本文档包含第4章的深度扩展内容,介绍注意力机制的各种变种和优化。


E4.1 注意力机制的数学基础 ​

注意力的本质 ​

注意力就是加权求和:

Attention(Q,K,V)=∑iwivi

其中权重 wi 由查询和键的相似度决定。

不同的相似度函数 ​

点积注意力(Dot-Product Attention):

wi=softmax(q⋅kidk)

加法注意力(Additive Attention):

wi=softmax(vTtanh⁡(Wqq+Wkki))

乘法注意力(Multiplicative Attention):

wi=softmax(qTWki)

优点对比:

  • 点积:计算快,内存高效
  • 加法:表达能力强,但计算慢
  • 乘法:平衡两者

E4.2 高效Transformer ​

问题:二次复杂度 ​

标准Transformer的注意力复杂度是 O(n2),其中 n 是序列长度。

对于长序列很贵:

  • 序列长度1000:100万次操作
  • 序列长度10000:1亿次操作

解决方案1:稀疏注意力 ​

思想: 不是每个位置都关注所有位置,只关注相关位置。

方法:

  • 局部注意力:只关注附近的位置
  • 步长注意力:每隔k个位置关注一次
  • 块对角注意力:分块处理

复杂度: O(nlog⁡n) 或 O(n)

解决方案2:低秩近似 ​

思想: 注意力矩阵可以用低秩矩阵近似。

方法:

  • Linformer:用线性投影降维
  • Performer:用随机特征近似softmax

复杂度: O(n)

解决方案3:分层注意力 ​

思想: 先在局部做注意力,再在全局做注意力。

例子:

  • Longformer:局部 + 全局注意力
  • BigBird:块对角 + 全局注意力

E4.3 多查询注意力(Multi-Query Attention) ​

问题 ​

标准多头注意力中,每个头都有独立的键和值投影,导致参数多、内存占用大。

解决方案 ​

多查询注意力: 所有头共享同一个键和值。

MQA(Q,K,V)=Concat(head1,...,headh)WO

其中所有 headi 使用同一个 K 和 V。

优势 ​

  • 参数减少 h 倍
  • 内存占用减少
  • 推理速度快
  • 性能基本不变

应用 ​

  • PaLM:Google的大模型
  • Falcon:开源大模型

E4.4 因果注意力(Causal Attention) ​

问题 ​

在生成任务中,模型不应该看到未来的token。

解决方案 ​

因果掩码: 在计算注意力权重前,把未来位置的分数设为 −∞。

Attention(Q,K,V)=softmax(QKTdk+M)V

其中 Mij=−∞ 如果 i<j(未来位置)。

实现 ​

python
# 创建因果掩码
mask = torch.tril(torch.ones(seq_len, seq_len))
scores = scores.masked_fill(mask == 0, float('-inf'))

E4.5 相对位置编码 ​

问题 ​

绝对位置编码有局限:

  • 对于超长序列,位置编码可能超出范围
  • 模型难以泛化到训练时没见过的长度

解决方案 ​

相对位置编码: 编码位置之间的相对距离,而不是绝对位置。

Attention(Q,K,V)=softmax(QKT+Rdk)V

其中 R 是相对位置偏置。

优势 ​

  • 可以泛化到更长的序列
  • 更符合人类的相对位置理解

应用 ​

  • T5:Google的预训练模型
  • DeBERTa:微软的预训练模型

E4.6 旋转位置编码(RoPE) ​

思想 ​

用复数旋转编码位置。

PE(pos,2i)=cos⁡(pos⋅θi)PE(pos,2i+1)=sin⁡(pos⋅θi)

其中 θi=10000−2i/d。

优势 ​

  • 自然的相对位置编码
  • 可以外推到更长的序列
  • 计算高效

应用 ​

  • LLaMA:Meta的大模型
  • Falcon:开源大模型

E4.7 分组查询注意力(Grouped Query Attention) ​

思想 ​

介于多头注意力和多查询注意力之间。

多头注意力: 每个查询头有独立的K、V
分组查询注意力: 多个查询头共享一个K、V
多查询注意力: 所有查询头共享一个K、V

优势 ​

  • 比多头注意力参数少
  • 比多查询注意力表达能力强
  • 性能和效率的平衡

应用 ​

  • Llama 2:Meta的改进版大模型

E4.8 闪电注意力(Flash Attention) ​

问题 ​

标准注意力实现在GPU上不高效:

  • 需要多次访问内存
  • 内存带宽是瓶颈

解决方案 ​

Flash Attention: 重新组织计算,减少内存访问。

关键思想:

  1. 分块计算注意力
  2. 在GPU高速缓存中完成计算
  3. 减少全局内存访问

性能提升 ​

  • 速度快2-4倍
  • 内存占用减少
  • 精度不变

应用 ​

  • PyTorch 2.0:官方支持
  • Hugging Face Transformers:集成支持

E4.9 推荐论文 ​

注意力机制的经典论文 ​

  1. Vaswani et al. (2017) - "Attention Is All You Need"

    • Transformer的原始论文
    • 引入多头自注意力
  2. Bahdanau et al. (2014) - "Neural Machine Translation by Jointly Learning to Align and Translate"

    • 注意力机制的开创性工作

高效Transformer的论文 ​

  1. Kitaev et al. (2020) - "Reformer: The Efficient Transformer"

    • 局部敏感哈希注意力
  2. Choromanski et al. (2020) - "Rethinking Attention with Performers"

    • 用随机特征近似softmax
  3. Dao et al. (2022) - "FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness"

    • Flash Attention的论文

位置编码的论文 ​

  1. Su et al. (2021) - "RoFormer: Enhanced Transformer with Rotary Position Embedding"

    • 旋转位置编码
  2. Shaw et al. (2018) - "Self-Attention with Relative Position Representations"

    • 相对位置编码

E4.10 进一步学习 ​

书籍 ​

  • "Attention Is All You Need" 论文详解

    • 很多博客和教程详细讲解
    • 推荐 Jay Alammar 的可视化讲解
  • "The Illustrated Transformer"

    • 在线免费资源
    • 非常直观的讲解

在线资源 ​

  • Stanford CS224N - NLP with Deep Learning
  • CMU 11-747 - Neural Language Models
  • Hugging Face Course - NLP with Transformers

实践项目 ​

  1. 实现自注意力

    • 从零开始实现
    • 理解每一步的计算
  2. 实现多头注意力

    • 理解多头的作用
    • 对比单头和多头的性能
  3. 实现完整Transformer

    • 编码器-解码器结构
    • 在简单任务上训练
  4. 优化注意力

    • 实现Flash Attention
    • 测试性能提升

返回: 第4章:Transformer详解

本教程采用 CC BY-NC-SA 4.0 许可协议