编程与 AI15 分钟阅读更新于 2026-08-03

多头注意力到底“多”在哪里:从不同子空间到最终拼接

围绕多头注意力机制,解释不同线性投影、子表示空间、注意力头的分工,以及多头结果如何拼接回模型表示。

相关工具

多头不是把同一个注意力复制几遍

多头注意力的“多”,不是把同一个 Query、Key、Value 和同一组参数重复运行几次,而是为不同的头准备不同的线性投影。相同输入经过不同的投影后,会进入不同的子表示空间,在各自的空间里计算注意力。

资料 对这个过程的概括是:通过 h 个不同的线性变换映射 Query、Key 和 Value,分别计算 Attention,再把不同头的结果拼接起来,最后做一次线性变换。每个头看到的是同一个输入,但使用的参数和表示空间不同。

这样设计的意义在于,一个头可以更多关注指代关系,另一个头关注谓词或状态,还有的头关注邻近词、句法结构或其他模式。最终表示不是单一注意力判断,而是多个子空间判断的组合。

Transformer 多头注意力从不同线性投影到拼接输出的完整流程图
多头注意力完整流程

输入经过每个头独立的 Q/K/V 投影,在不同子空间计算注意力,随后拼接并通过输出投影。

一个头究竟拥有哪几组参数

对第 r 个头来说,输入 X 会分别乘以 W_Q^(r)、W_K^(r) 和 W_V^(r),得到 Q^(r)、K^(r) 和 V^(r)。这些投影矩阵属于这个头,和其他头的矩阵并不相同。

如果模型维度是 d_model,每个头的 Query 和 Key 维度是 d_k,Value 维度是 d_v,那么每个头都在较小的空间里完成一次缩放点积注意力。头数增加时,通常会相应减小每个头的维度,使所有头拼接后仍回到模型维度。

独立参数让不同头有机会学到不同的关注方式,但不保证每个头都会形成完全清晰、互不重复的功能。模型会根据训练目标自行使用这些空间,某些头可能相似,某些头可能更专门化。

为什么要映射到不同子空间

如果所有头使用同一组投影和同一组参数,那么它们看到的 Q、K、V 完全一样,计算出的注意力也会高度相似。简单复制不能带来真正的多视角,只会增加重复计算。

不同线性投影相当于从输入表示中提取不同方向的特征。一个子空间可能更适合比较名词之间的关系,另一个子空间可能更适合比较动作与状态,模型不需要把所有关系压进一次注意力分布。

这不是人为规定每个头必须对应一种语法功能,而是提供多个可以分工的表示空间。训练过程中,哪些关系值得保留、哪些位置应该互相关注,由参数和数据共同决定。

同一个 token 可以被不同的头看向不同位置

资料 用代词“it”的例子说明了这一点。在句子“The animal was tired. It lay down.”中,处理“it”时,一个头可能更多关注“animal”,帮助识别指代对象;另一个头可能更多关注“tired”,帮助利用前文的状态信息。

这两个头并不是给出两个互相冲突的答案,而是在同一个位置的表示中提供不同类型的上下文。一个表示包含指代关系,另一个表示包含状态或谓词关系,后续层再对它们进行组合。

注意力权重可视化只能作为理解工具,不能直接证明某个头永久对应某种语言学功能。更可靠的判断还需要结合不同输入、多个层和任务表现来看。

多头注意力处理 it 时分别关注 animal 和 tired 的示意图
不同头关注不同位置

同一个代词位置可以在不同头中分别关注指代对象和状态信息,最后融合成更完整的表示。

每个头的注意力计算仍然是完整的

多头并不是把注意力公式简化成只比较一部分位置。每个头都有自己的 Q、K、V,并完整执行 QK^T、缩放、Mask、Softmax 和与 V 的加权求和。区别只是每个头使用的投影参数和特征维度不同。

因此,第 r 个头会得到一个 Z^(r) 矩阵。假设序列长度为 n,那么 Z^(r) 的形状通常是 [n, d_v]。h 个头分别完成计算后,得到 h 个这样的输出,再沿最后一维进行拼接。

这种安排把“不同关系”放在不同空间里表达,却没有改变注意力的基本计算逻辑。先理解单头公式,再理解多头只是增加独立投影和并行分支,会比把 Multi-Head Attention 当成全新的算法更容易。

拼接之后为什么还要输出投影

假设 h 个头的输出各是 [n, d_v],拼接后得到 [n, h × d_v]。在常见设置中,h × d_v 约等于 d_model,但拼接只是把不同头的特征放在一起,还没有学习它们应该如何混合。

输出投影 W_O 会把拼接后的表示重新映射到 d_model 空间,得到最终的多头注意力输出。这个矩阵让模型可以学习头与头之间的组合方式,也让结果回到残差连接所需要的形状。

如果没有输出投影,各头输出只能按固定的拼接顺序交给后续层,头之间的交互会受到限制。输出投影不是装饰步骤,而是多头结果从“并列信息”变成“联合表示”的关键。

Transformer 多头注意力与单头参数规模及拼接输出关系图
多头拆分、拼接与参数关系

模型维度被分到多个子空间,各头独立投影并计算,拼接后再通过输出投影回到 d_model。

多头和单头的参数量如何比较

如果 d_model 固定,单头方案使用较大的 Q/K/V 投影,而多头方案把输出维度拆给 h 个头。常见设置会让所有头的总投影宽度大致回到 d_model,因此多头并不一定意味着参数量成 h 倍增长。

多头额外带来的主要变化是参数如何分布、表示如何分解,以及计算如何组织。每个头拥有独立的投影矩阵,但每个矩阵的输出维度更小;最后的输出投影负责把这些子空间结果重新组合。

具体参数量还会受到 bias、实现方式、是否共享权重等因素影响。阅读结构图时,先看 d_model、头数和每头维度之间的关系,不要只凭头的数量估算成本。

多头注意力和矩阵并行如何配合

不同头的 Q/K/V 投影和注意力计算可以放进额外的 head 维度中批量执行。于是,模型不需要先完成头 1 再完成头 2,而是可以把多个头交给矩阵运算同时处理。

这使多头结构同时拥有两种优势:表示上可以从多个子空间观察关系,计算上可以利用批量矩阵乘法。头数越多并不自动带来更好效果,实际还要看每头维度、序列长度、硬件和训练数据。

推理时也是如此。每一步生成内部,所有头仍然可以并行计算;但自回归生成的不同时间步之间仍有依赖,不能因为多头并行就一次生成完整目标句。

如何判断多头是否真的带来差异

可以先看不同头的注意力权重是否长期完全相同。如果所有输入和层中都高度一致,可能是投影参数没有正确分开、头维度变换有误,或者模型还没有学到明显分工。

但不能把“注意力图不同”直接等同于“模型一定更好”。有些头可能关注模式相似,却仍然在数值表示上提供有用差异;有些头看起来很分散,也不代表它没有贡献。最终还要结合验证结果和消融实验判断。

排查时重点确认三件事:每个头是否使用独立投影,拆分和拼接维度是否正确,输出投影是否存在且回到了 d_model。先保证结构正确,再讨论头的可解释性。

把多头注意力放回 Transformer 主线

多头注意力的本质,是把同一个输入表示映射到高维空间的不同子空间,在每个子空间中分别执行注意力,再把结果拼接并重新投影。它让模型可以同时保留多种位置关系,而不是把所有关系压进一张注意力分布。

文中“一个头关注 animal,另一个头关注 tired”的例子,正好说明了多头的直觉:同一个位置可以从不同角度读取上下文。最终表示不是选择其中一个头,而是把多个头提供的信息融合起来。

记住多头的四个动作就够了:独立投影、分别计算、拼接结果、输出投影。前两个动作创造不同子空间,后两个动作负责把分散的信息重新合成 Transformer 后续层能够使用的表示。

常见问题

多头注意力是不是把同一个注意力复制了很多次?

不是。每个头拥有独立的 Q/K/V 线性投影,会在不同子空间中计算注意力,因此可以学习不同的关注关系。

为什么多头结果还要经过输出投影?

拼接只是在最后一维并列放置各头输出,输出投影负责学习如何混合这些子空间信息,并把结果映射回 d_model 维度。

不同注意力头一定分别对应一种明确功能吗?

不一定。不同头可能形成一定分工,也可能部分重叠。注意力图适合帮助理解,但不能单独作为功能判断的充分证据。