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

多头注意力是什么:为什么要同时学习多种关系

从单头注意力的局限出发,理解多头注意力如何把同一组输入投影到多个表示空间,分别捕捉语义、位置和指代等关系,再通过拼接与线性变换得到统一输出。

相关工具

多头注意力先解决一个直观问题

上一篇已经把 Self-Attention 的计算链路拆开:输入先生成 Q、K、V,再由 Q 和 K 算出关注权重,最后用权重对 V 做加权求和。这个机制能够让每个位置查看整段序列,但它仍有一个限制:如果整层只有一套 Q、K、V 投影,所有关系都要挤进同一个表示空间。

一段话里的关系往往不止一种。一个词可能需要关注前面的修饰词,也可能要找到句子里的同义表达,还可能要追踪代词对应的对象。把这些关系交给同一个注意力分布,模型当然可以尝试兼顾,但不同关系容易互相干扰。多头注意力的思路很朴素:让多组注意力并行工作,每一组负责从自己的角度看同一段输入。

这里的“头”不是把句子切成几段,也不是让不同头分别读取不同词。每个头通常都能看到完整序列,区别在于它使用了不同的线性投影,因此会在不同的表示空间里计算关系。

多头注意力从输入序列到并行注意力头再到输出的结构图
多头注意力的整体结构

同一组输入进入多个并行注意力头,各头独立计算后拼接,再经过输出线性变换得到最终表示。

一个头只能提供一种主要视角

可以把单头注意力想成一盏会移动的阅读灯。对每个 Query 位置,它会在所有 Key 位置上分配一组权重,亮的地方表示当前词更愿意读取那里。这样的阅读方式已经很有用,但整盏灯只有一套亮暗规则。它更容易形成一种主要视角,例如偏向语义相似,或者偏向距离较近的位置。

如果当前句子同时存在多种需要,单个注意力分布就要在它们之间作取舍。它可以给多个位置分配权重,却不容易把“为什么关注”这件事分成彼此独立的关系通道。多头结构并没有改变 Attention 的基本公式,而是把同样的公式重复到多个投影空间中。

所以,多头注意力的价值不在于简单地增加计算次数,而在于把一个复杂的关系判断拆成几次相对专注的判断。每个头的结果未必能被人直接命名,但它们共同提供了更丰富的上下文表示。

单头注意力和多头注意力的关系模式对比图
单头与多头的差别

单头主要形成一种关系模式,多头则让不同头并行捕捉不同关系,随后再合并信息。

多头并不是把输入序列切片

初学时最容易出现的误解,是把多头理解成“头一处理前半句,头二处理后半句”。实际情况通常不是这样。每个头接收的是同一个输入表示 X,序列长度也没有因为分头而缩短。变化发生在线性投影之后:同一个 X 会得到多组 Q、K、V。

假设输入 X 的形状是 L×d_model,L 表示序列长度,d_model 表示每个位置的表示维度。设置 H 个头后,通常会让每个头使用较小的维度 d_k 或 d_v,使 H 个头的总输出维度仍与模型宽度相匹配。分头是表示空间上的分工,不是输入内容上的分割。

这个区别很重要。若真的把序列切成几段,不同头之间就会失去对远处位置的直接访问;而多头注意力保留了全序列的可见范围,只是让每个头以不同参数来理解这段序列。

每个头都有自己的 Q、K、V 投影

对第 h 个头,可以分别使用三组参数矩阵把 X 投影成 Q⁽ʰ⁾、K⁽ʰ⁾ 和 V⁽ʰ⁾。写成公式就是:Q⁽ʰ⁾=XW_Q⁽ʰ⁾,K⁽ʰ⁾=XW_K⁽ʰ⁾,V⁽ʰ⁾=XW_V⁽ʰ⁾。不同头的参数不共享,因此即使输入相同,也会得到不同的表示。

接下来每个头独立执行缩放点积注意力:head_h=Attention(Q⁽ʰ⁾,K⁽ʰ⁾,V⁽ʰ⁾)。这里的 Attention 仍然是上一节讲过的 softmax(QKᵀ/√d_k)V。多头注意力没有发明另一套注意力公式,它做的是“多组投影、多次计算、最后合并”。

从这个角度看,头的数量 H 和单个头的维度 d_k 是一组需要共同考虑的参数。头太少,关系视角有限;头太多而每头维度过小,又可能让单个头难以保留足够的信息。模型通常让 H×d_k 与 d_model 保持相近,从而在表达能力和计算量之间取得平衡。

每个头可以关注不同类型的关系

教材里常用“语义关系、位置关系、句法关系”来帮助理解多头的分工。例如,一个头可能更重视相邻词之间的组合,另一个头更重视相隔较远但意义相关的词,还有一个头可能更容易追踪代词与它所指对象之间的联系。

这些名称主要是解释工具,并不意味着训练完成后每个头都会稳定地对应某一种人类语言学标签。真实模型中的头可能有明确的行为,也可能同时承担多种功能。更可靠的说法是:不同参数空间为模型提供了不同的关系表达通道。

当多个头把各自的上下文结果交给后续层时,模型就能同时保留多种线索。对于同一个位置,最终表示不再只回答“我应该关注谁”,还可以携带“从哪些角度关注过谁”的信息。

拼接把多个头的结果放回同一条表示里

每个头独立得到一个输出 head_h,形状通常是 L×d_v。多头计算完成后,沿着最后一个维度把它们拼接起来:Concat(head_1,...,head_H)。如果每个头的维度是 d_v,那么拼接结果的维度就是 H×d_v。

拼接不是求平均。求平均会把不同头的差异压到同一个数值里,而拼接会暂时保留各个头的结果,让下一层自己学习如何组合这些信息。也正因为如此,拼接后的表示维度会变大,需要再通过输出投影恢复到 d_model。

可以把这一步看成把几份不同角度的阅读笔记放在同一张桌面上。它们还没有被整理成最终结论,但每份笔记的内容仍然可见,后面的线性变换负责决定哪些信息应该互相混合。

输出线性变换负责重新混合信息

拼接后的结果会乘以输出矩阵 W_O,得到 MultiHead(Q,K,V)=Concat(head_1,...,head_H)W_O。这个矩阵把不同头的通道重新混合,同时把维度从 H×d_v 映射回 d_model。这样,多头模块的输入和输出就能保持相同的主维度,便于接入残差连接。

如果没有这一步,多个头的结果虽然被放在一起,却缺少一次统一的组合。输出投影让模型可以学习跨头关系:某个头发现的位置信息,可能需要和另一个头发现的语义信息共同决定最终表示。

因此,多头注意力的完整结构不能只写成“并行跑几个 Attention”。更完整的顺序是:独立投影、独立注意力、拼接、输出投影。少掉其中任意一步,都不能准确描述 Transformer 中的标准多头模块。

多头注意力从输入投影到各头计算再到输出投影的流程图
多头注意力的计算链路

输入先为每个头生成独立的 Q、K、V,各头计算缩放点积注意力,结果拼接后通过输出投影恢复模型维度。

为什么多头仍然可以并行计算

多头注意力看起来比单头复杂,但各头之间没有先后依赖。给定同一个输入 X 后,每个头都可以独立完成线性投影和注意力计算,最后再统一拼接。因此,训练阶段可以把多个头组织成批量矩阵运算,而不是一个头算完再等下一个头。

这延续了 Transformer 放弃循环结构的核心思路:序列位置之间的关系通过矩阵运算一次性计算。多头增加了表示空间的数量,却没有重新引入 RNN 那种必须按时间步推进的链式等待。

当然,并行并不代表计算没有成本。每个头都要进行矩阵乘法,序列越长,注意力矩阵占用的空间和计算量越大。多头的收益是表达更丰富的关系,代价则是需要更多投影和注意力计算。

多头注意力在编码器和解码器里有什么不同

在编码器层中,多头注意力通常是自注意力:Q、K、V 都来自同一段输入序列。每个位置可以查看序列中的其他位置,再把不同关系汇总进自己的表示。

解码器通常包含两类注意力。第一类是带掩码的自注意力,保证生成当前位置时不能偷看后面的目标词;第二类是编码器—解码器注意力,其中 Query 来自解码器当前状态,而 Key 和 Value 来自编码器输出。后者帮助解码器从源序列中找到与当前生成位置相关的信息。

无论是哪一类,基本的多头结构仍然相同:分头投影、分别计算、拼接、输出投影。变化主要发生在 Q、K、V 的来源以及是否需要遮挡未来位置。

用三个检查点理解多头模块

第一,看输入有没有被错误地切成几段。标准多头注意力的每个头都面对完整序列,分的是表示维度和参数空间。第二,看每个头是否拥有独立的 Q、K、V 投影。只有独立参数,多个头才可能形成不同的关系视角。

第三,看拼接后的维度是否经过输出投影恢复。若 H 个头的输出维度分别为 d_v,拼接后的最后一维应为 H×d_v;经过 W_O 后,才回到 d_model。沿着这三个检查点走一遍,通常就能判断一张结构图或一段公式是否描述完整。

学习时不必一开始就记住所有上标和矩阵形状。先记住一句话:多头注意力让多个独立的注意力视角同时读取同一段输入,再把这些视角合并成一个新的上下文表示。之后再把每个视角展开成 Q、K、V 和矩阵运算,理解会更稳。

多头注意力的四个检查点
步骤 1
同一输入

每个头都接收完整输入序列,分工发生在投影空间。

步骤 2
独立投影

不同头使用各自的 Q、K、V 投影参数。

步骤 3
分别计算

每个头独立完成缩放点积注意力和加权求和。

步骤 4
拼接投影

各头结果拼接后经过 W_O,恢复到模型主维度。

把多头注意力放回 Transformer

Transformer 的强大并不只来自多头注意力。注意力模块负责让位置之间交换信息,前馈网络负责对每个位置做进一步的非线性变换,残差连接和层归一化则帮助信息稳定地通过多层结构。多头注意力是其中的核心交通枢纽,但它需要和其他组件配合才能形成完整的编码器或解码器层。

从学习顺序上看,可以先把单头 Self-Attention 的计算弄清,再把它复制成 H 个并行分支,最后理解拼接和输出投影。这样不会把“注意力怎么算”和“为什么要多头”混在一起。前者是计算过程,后者是表示能力上的扩展。

下一步继续看位置编码会很自然:注意力本身只根据内容关系计算,并不知道序列中谁在前、谁在后。Transformer 需要额外把位置信息送入表示,模型才能同时理解词的内容和它在序列中的位置。

常见问题

多头注意力是不是把句子分给不同头处理?

不是。各个头通常都接收完整输入序列,区别在于它们使用不同的 Q、K、V 投影参数,在不同表示空间里计算关系。

为什么不直接把多个注意力结果平均?

平均会较早地抹平不同头之间的差异。拼接可以暂时保留各头的信息,再由输出线性变换学习更灵活的组合方式。

头的数量越多,模型效果一定越好吗?

不一定。头数增加会提供更多表示视角,也会带来更多计算和参数组织成本;如果每个头的维度过小,单个头能表达的信息反而可能不足。