多头注意力为什么要先分头再拼接:8 个头不是 8 倍参数
围绕多头注意力的描述,解释 Query、Key、Value 如何分到多个子空间计算,再拼接并投影回模型维度。
相关工具
多头注意力要解决的不是重复计算
如果只用一个注意力头,模型会把所有关系压进同一组 Query、Key 和 Value 投影里。它当然可以学习相关性,但不同类型的关系会争用同一个表示空间:有的位置关系需要关注近邻词,有的关系需要追踪指代,还有的关系需要保留更远的上下文。
Transformer 相关概念 对多头注意力的描述很明确:先用多组不同的线性变换把 Query、Key、Value 映射到不同子表示空间,再分别计算注意力,最后把各个头的结果拼接起来并做一次线性变换。多头的重点不在于简单重复,而在于让模型从多个角度观察同一序列。

同一输入经过多组投影后分成多个注意力头,各头独立计算,最后拼接并投影回模型空间。
分头之前,输入还是同一组表示
编码器或解码器子层接收到的输入通常是一个长度为 L 的向量序列,每个位置的宽度是 d_model。以 文中常见的设置为例,词嵌入和编码器输出可以使用 512 维表示。多头注意力并不是先把句子切成几段,而是让每个位置的完整表示同时进入多组投影。
假设有 h 个头,模型希望每个头使用 d_k 维的 Query 和 Key,使用 d_v 维的 Value。输入 X 仍然只有一份,变化发生在投影矩阵:不同的 W_Q、W_K、W_V 把同一个位置映射成不同的查询、匹配特征和信息载体。每个头看到的原始序列位置相同,看到的表示角度不同。
为什么一个头可以关注一种关系
注意力分数来自 Query 和 Key 的相似程度。某个头的投影矩阵如果逐渐学会保留语法关系,那么它的 Query 和 Key 可能更容易在主谓、修饰或指代位置之间产生较高分数;另一个头则可能更适合保留局部邻近关系。模型并没有在结构里写死“第一个头负责语法、第二个头负责指代”,这些分工是在训练中形成的。
资料 用 it 和 The animal 的例子说明,自注意力可以把当前位置和句子中其他位置联系起来。多头机制进一步提供了多个表示子空间:一个头对某种关系敏感时,其他头仍可以保存不同关系。这样,当前位置的最终表示不是一次选择的结果,而是多组关联信息的合并。

同一位置可以在不同子空间中关注不同的上下文关系,多个头共同形成当前位置的表示。
每个头内部仍然是完整的缩放点积注意力
分头并没有改变注意力的基本计算。对第 i 个头,输入经过独立投影后得到 Q_i、K_i 和 V_i,然后先计算 Q_iK_i 的转置,再除以根号 d_k,接着经过 Softmax 得到权重,最后用权重对 V_i 做加权求和。每个头都会产生一组自己的上下文表示。
把多个头放在一起时,真正变化的是投影参数和表示空间,而不是注意力的基本规则。每个头都要回答同一个问题:当前位置应该从哪些位置读取信息?只是不同头使用了不同的坐标系,因此得到的答案可以互补。
拼接为什么不是简单取平均
如果把所有头的结果直接平均,来自不同子空间的细节会被压到同一组数值中,模型很难保留各个头之间的区别。Transformer 采用拼接,把每个头的输出沿最后一个维度连接起来。若有 h 个头、每个头输出 d_v 维,那么拼接结果的宽度就是 h×d_v。
拼接保留了不同头的来源信息,但它也可能让维度暂时变宽。随后的一次输出投影 W_O 会把拼接结果重新映射到 d_model 维。这个投影不是可有可无的格式转换,它负责学习如何组合不同头捕获到的关系,并让结果重新回到残差连接能够接收的模型空间。

各头输出先沿特征维拼接,再经过输出投影回到 d_model,便于继续进入残差连接和后续子层。
8 个头是不是 8 倍参数
不能只看头的数量下结论。经典设置通常让每个头的维度随着头数增加而减小:d_model 被拆成多个较小的子空间。以 d_model=512、8 个头为例,可以让每个头使用 64 维的 Query、Key 和 Value。这样,所有头的总投影宽度仍然和模型宽度处在同一个量级。
如果把 8 个头都保持为 512 维,参数量和计算量当然会大幅增加,但那不是经典多头注意力的常规含义。理解参数规模时,要同时看输入宽度、头数、每头维度以及输出投影,而不能把“有 8 个头”直接理解成“完整复制 8 个注意力层”。
多头结果为什么还要经过残差和归一化
多头注意力的输出只是一次跨位置的信息融合。它需要和子层输入相加,保留原始表示中的有用内容,再交给后续 FFN 或下一层继续加工。残差连接要求两侧维度一致,这正是输出投影要回到 d_model 的重要原因。
随后进行 LayerNorm,可以帮助不同子层输出保持更稳定的数值尺度。资料 对编码器的描述中,Self-Attention 和 FFN 都配有残差连接和层归一化;多头注意力并不是一个脱离 Transformer 主干的独立模块,而是被放在这条深层信息传递路径里。
训练时多个头可以一起计算
虽然概念上我们会把注意力头逐个写出来,但实际计算通常把各个头整理成批量矩阵。输入先通过线性层得到组合后的 Q、K、V,再调整形状,把头数作为一个独立维度。这样可以同时计算多个头的分数矩阵和加权结果,充分利用矩阵乘法的并行能力。
这也是 Transformer 与传统顺序模型的重要区别之一:多头注意力不是让模型按头一个接一个地处理句子,而是把多个头和多个序列位置一起组织成张量。概念上的分工帮助理解,矩阵化实现负责效率。
把多头注意力记成四个动作
第一步,所有位置的输入表示分别经过多组 W_Q、W_K、W_V 投影;第二步,每组投影在自己的子空间里完成缩放点积注意力;第三步,把各头输出拼接起来;第四步,用 W_O 投影回 d_model,并接入残差与归一化。
四个动作里,分头解决的是表示角度问题,独立计算解决的是关系提取问题,拼接解决的是信息保留问题,输出投影解决的是统一维度和综合信息问题。这样看,多头注意力既不是八个完全独立的模型,也不是把所有结果简单平均,而是一种有组织的并行表示组合。
常见问题
多头注意力的每个头都会读取完整句子吗?
通常会。每个头面对的是同一组序列位置,差别在于输入经过了不同的线性投影,因此不同头可能在不同子空间中形成不同的关注分布。
头数越多,模型效果一定越好吗?
不一定。头数、每头维度、模型宽度和训练数据需要共同匹配。头数过多可能让每个头的表示过窄,也可能增加实现和调参成本。
拼接之后为什么还需要输出投影?
拼接结果的宽度可能是 h×d_v,输出投影负责把它重新映射到 d_model,并学习如何综合不同头的信息,使其能够接入残差连接和后续子层。