4.2 多头注意力
核心问题: 为什么需要多头注意力?它为什么不是简单重复多个注意力层?
在线 Notebook
对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明。
技术背景
核心问题
单个自注意力已经可以计算全局依赖,为什么 Transformer 还要把它拆成多个头并行计算?
答案是:一个注意力矩阵通常不足以同时表达序列中的多种关系。 语言、视觉和多模态数据里往往同时存在局部依赖、长距离依赖、语法关系、语义对齐和结构线索。多头注意力的目的,就是让模型在不同表示子空间里并行学习这些不同模式。
关键概念
- Head:一个独立的注意力子模块
- Projection Subspace:每个头各自的 Q / K / V 线性投影空间
- Concatenation:把多个头的结果拼接起来
- Output Projection:把多头结果重新映射回模型维度
应用场景
- 文本中的语法关系与语义关系同时建模
- 长上下文中的局部模式与全局主题同时建模
- 图像 patch 之间的不同空间依赖
- 多模态对齐中的文本-视觉交互
单头注意力的问题
单个注意力头并不是“没用”,而是它通常只能在一个主要关系模式上形成较强偏好。
例子:
"The cat sat on the mat"
一个注意力头可能更擅长:
- 关注主语-谓语关系
- 或关注修饰词-名词关系
- 或关注局部相邻词关系问题在于,这些关系并不总能被同一个注意力分布同时高质量表达。
如果一个头主要在看局部搭配,它就未必能同时很好地看长距离依赖;如果它专门对齐语义主体,可能又不擅长建模位置邻近关系。
所以,单头的限制不在于它不能看全局,而在于它难以同时用一种模式解释所有关系。
这意味着,真正的问题不是“有没有注意力”,而是“能不能同时表示多种注意力模式”。
多头注意力的核心思想
多头注意力的做法是:
- 先把输入通过不同的线性变换投影到多个子空间
- 每个头在自己的子空间里独立计算注意力
- 再把多个头的结果拼接起来,交给输出层融合
数学表达
其中:
常见设置下,每个头的
这里最重要的一点不是“有多个头”,而是:每个头都有自己独立的投影矩阵。
这意味着不同头看到的并不是完全相同的表示,而是输入在不同子空间下的投影结果。
图4.2-1:同一个输入通过各头独立的 Q/K/V 投影进入不同表示子空间,每个头分别聚合关系,再经拼接和输出投影恢复到模型维度。应重点观察“独立投影”而不是“头的数量”:如果投影和注意力模式完全相同,多头就只是在重复计算。
为什么多头不是简单重复?
如果多个头只是复制同一个注意力层,那确实没有意义。真正让多头有效的关键,是不同头使用不同的 Q / K / V 投影参数,因此可以学习不同类型的相关性。
1. 不同头关注不同关系
某些头更偏向局部邻近关系,某些头更偏向远距离依赖,某些头可能更偏向特定语法角色或结构边界。
2. 不同头工作在不同子空间
输入表示是高维的。把它投影到多个不同子空间后,每个头都可以在自己的坐标系里决定“什么叫相关”。
这就像:
- 一个头从“语法关系”视角看序列
- 一个头从“语义相似”视角看序列
- 一个头从“位置邻近”视角看序列
虽然这些视角不一定能直接命名,但模型会在训练中自动学习出类似的分工。
3. 拼接后形成更丰富的表示
单头输出是一种关系聚合结果;多头输出是多种关系聚合结果的组合。拼接后再线性变换,可以把这些不同模式融合成更强的表示。
所以,多头的本质不是“投票”,而是并行提取多种依赖结构,再统一融合。
从工程角度看,这相当于让模型在同一层里同时保留不同类型的上下文摘要,而不是把所有信息都挤进一个注意力图里。
直观结构
输入表示
↓
分成 h 个投影子空间
↓
每个头独立做自注意力
↓
得到 h 组关系聚合结果
↓
拼接(Concat)
↓
线性映射(W^O)
↓
输出表示各头在不同投影子空间中计算注意力,结果拼接后再经过输出投影。注意力头共同训练,不等同于独立专家或模型集成。
多头注意力提供了什么
1. 同时学习多种关系
多个投影子空间让同一层可以并行计算不同的匹配模式。具体是否形成局部、句法或其他关系,应从训练结果观察。
2. 分摊表示维度
在固定模型维度下,每个头处理较低维的 Query、Key 和 Value,最后再合并为一层输出。头数增加也会改变单头维度与计算布局,并非越多越好。
3. 适用于不同 token 类型
相同计算形式可以用于文本 token、图像 patch 或多模态序列,但效果取决于表示方式、训练数据和注意力掩码。
4. 更利于后续层迭代
一层的输出会成为下一层输入,使模型能够重复执行信息聚合与逐位置变换。不能预先规定某个头或某一层负责固定语义。
多头注意力的代价与权衡
多头并不是没有代价。
1. 计算布局与实现成本
在模型维度
2. 头数不是越多越好
如果头太多,每个头分到的维度会太小,单个头能表达的信息反而受限。
3. 部分头可能退化
在实际训练中,并不是每个头都会学到清晰分工。有些头可能功能重复,有些头的重要性较弱。
因此,多头注意力的关键不在于“尽量多”,而在于在表达能力和计算成本之间找到合适平衡。
换句话说,多头不是免费增益:它改变了表示如何分解到多个子空间,也改变了计算布局,但收益和代价不能只从头数推断。
与卷积和集成思想的类比
从某种角度看,多头注意力和前面章节里的几个思想是相通的:
- 类似 CNN 中多个卷积核学习不同局部模式
- 类似集成学习中多个弱模型从不同视角建模数据
- 类似信号处理中多个滤波器提取不同频带特征
区别在于,多头注意力提取的不是固定模式,而是基于当前输入动态变化的关系模式。
本节小结
- 每个头在独立投影后的子空间中计算注意力,输出拼接后再投影。
- 多头共同训练,不等同于多个独立模型或专家投票。
- 头数会影响单头维度、参数布局和计算效率,需要结合模型规模验证。
下一节: 4.3 位置编码
