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

4.2 多头注意力 ​

核心问题: 为什么需要多头注意力?它为什么不是简单重复多个注意力层?

在线 Notebook

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


技术背景 ​

核心问题 ​

单个自注意力已经可以计算全局依赖,为什么 Transformer 还要把它拆成多个头并行计算?

答案是:一个注意力矩阵通常不足以同时表达序列中的多种关系。 语言、视觉和多模态数据里往往同时存在局部依赖、长距离依赖、语法关系、语义对齐和结构线索。多头注意力的目的,就是让模型在不同表示子空间里并行学习这些不同模式。

关键概念 ​

  • Head:一个独立的注意力子模块
  • Projection Subspace:每个头各自的 Q / K / V 线性投影空间
  • Concatenation:把多个头的结果拼接起来
  • Output Projection:把多头结果重新映射回模型维度

应用场景 ​

  • 文本中的语法关系与语义关系同时建模
  • 长上下文中的局部模式与全局主题同时建模
  • 图像 patch 之间的不同空间依赖
  • 多模态对齐中的文本-视觉交互

单头注意力的问题 ​

单个注意力头并不是“没用”,而是它通常只能在一个主要关系模式上形成较强偏好。

例子:

text
"The cat sat on the mat"

一个注意力头可能更擅长:
- 关注主语-谓语关系
- 或关注修饰词-名词关系
- 或关注局部相邻词关系

问题在于,这些关系并不总能被同一个注意力分布同时高质量表达。

如果一个头主要在看局部搭配,它就未必能同时很好地看长距离依赖;如果它专门对齐语义主体,可能又不擅长建模位置邻近关系。

所以,单头的限制不在于它不能看全局,而在于它难以同时用一种模式解释所有关系。

这意味着,真正的问题不是“有没有注意力”,而是“能不能同时表示多种注意力模式”。


多头注意力的核心思想 ​

多头注意力的做法是:

  • 先把输入通过不同的线性变换投影到多个子空间
  • 每个头在自己的子空间里独立计算注意力
  • 再把多个头的结果拼接起来,交给输出层融合

数学表达 ​

MHA(Q,K,V)=Concat(head1,…,headh)WO

其中:

headi=Attention(QWiQ,KWiK,VWiV)

常见设置下,每个头的 dk=dv=d/h,拼接后恢复到模型维度 d;具体模型也可以采用不同的键值头配置。统一记号见附录 A.7。

这里最重要的一点不是“有多个头”,而是:每个头都有自己独立的投影矩阵。

这意味着不同头看到的并不是完全相同的表示,而是输入在不同子空间下的投影结果。

多头注意力的投影、并行聚合与融合过程

图4.2-1:同一个输入通过各头独立的 Q/K/V 投影进入不同表示子空间,每个头分别聚合关系,再经拼接和输出投影恢复到模型维度。应重点观察“独立投影”而不是“头的数量”:如果投影和注意力模式完全相同,多头就只是在重复计算。


为什么多头不是简单重复? ​

如果多个头只是复制同一个注意力层,那确实没有意义。真正让多头有效的关键,是不同头使用不同的 Q / K / V 投影参数,因此可以学习不同类型的相关性。

1. 不同头关注不同关系 ​

某些头更偏向局部邻近关系,某些头更偏向远距离依赖,某些头可能更偏向特定语法角色或结构边界。

2. 不同头工作在不同子空间 ​

输入表示是高维的。把它投影到多个不同子空间后,每个头都可以在自己的坐标系里决定“什么叫相关”。

这就像:

  • 一个头从“语法关系”视角看序列
  • 一个头从“语义相似”视角看序列
  • 一个头从“位置邻近”视角看序列

虽然这些视角不一定能直接命名,但模型会在训练中自动学习出类似的分工。

3. 拼接后形成更丰富的表示 ​

单头输出是一种关系聚合结果;多头输出是多种关系聚合结果的组合。拼接后再线性变换,可以把这些不同模式融合成更强的表示。

所以,多头的本质不是“投票”,而是并行提取多种依赖结构,再统一融合。

从工程角度看,这相当于让模型在同一层里同时保留不同类型的上下文摘要,而不是把所有信息都挤进一个注意力图里。


直观结构 ​

text
输入表示
   ↓
分成 h 个投影子空间
   ↓
每个头独立做自注意力
   ↓
得到 h 组关系聚合结果
   ↓
拼接(Concat)
   ↓
线性映射(W^O)
   ↓
输出表示

各头在不同投影子空间中计算注意力,结果拼接后再经过输出投影。注意力头共同训练,不等同于独立专家或模型集成。


多头注意力提供了什么 ​

1. 同时学习多种关系 ​

多个投影子空间让同一层可以并行计算不同的匹配模式。具体是否形成局部、句法或其他关系,应从训练结果观察。

2. 分摊表示维度 ​

在固定模型维度下,每个头处理较低维的 Query、Key 和 Value,最后再合并为一层输出。头数增加也会改变单头维度与计算布局,并非越多越好。

3. 适用于不同 token 类型 ​

相同计算形式可以用于文本 token、图像 patch 或多模态序列,但效果取决于表示方式、训练数据和注意力掩码。

4. 更利于后续层迭代 ​

一层的输出会成为下一层输入,使模型能够重复执行信息聚合与逐位置变换。不能预先规定某个头或某一层负责固定语义。


多头注意力的代价与权衡 ​

多头并不是没有代价。

1. 计算布局与实现成本 ​

在模型维度 d 固定且各头维度满足 hdk=d 时,标准多头注意力的 Q/K/V 与输出投影参数量仍约为 4d2,不会仅因头数增加而按比例增长;主要矩阵乘法的理论计算量也处于同一量级。头数会改变单头维度、中间张量形状、并行粒度和算子效率,因此实际速度与显存仍需测量。

2. 头数不是越多越好 ​

如果头太多,每个头分到的维度会太小,单个头能表达的信息反而受限。

3. 部分头可能退化 ​

在实际训练中,并不是每个头都会学到清晰分工。有些头可能功能重复,有些头的重要性较弱。

因此,多头注意力的关键不在于“尽量多”,而在于在表达能力和计算成本之间找到合适平衡。

换句话说,多头不是免费增益:它改变了表示如何分解到多个子空间,也改变了计算布局,但收益和代价不能只从头数推断。


与卷积和集成思想的类比 ​

从某种角度看,多头注意力和前面章节里的几个思想是相通的:

  • 类似 CNN 中多个卷积核学习不同局部模式
  • 类似集成学习中多个弱模型从不同视角建模数据
  • 类似信号处理中多个滤波器提取不同频带特征

区别在于,多头注意力提取的不是固定模式,而是基于当前输入动态变化的关系模式。


本节小结 ​

  • 每个头在独立投影后的子空间中计算注意力,输出拼接后再投影。
  • 多头共同训练,不等同于多个独立模型或专家投票。
  • 头数会影响单头维度、参数布局和计算效率,需要结合模型规模验证。

下一节: 4.3 位置编码

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