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

多头注意力为什么通常要求 d_model 能被头数整除

围绕多头注意力分头、拼接和模型维度的描述,解释 d_model 与头数的整除关系来自张量形状切分,而不是注意力本身的数学限制。

相关工具

先理解多头到底在切什么

多头注意力接收的是宽度为 d_model 的位置表示。它不会把句子按词切成几段,而是把每个位置的特征维度拆到多个注意力头中。每个头在自己的较小子空间里计算 Query、Key 和 Value,再把结果拼回去。

资料 对多头机制的描述是:通过 h 个不同的线性变换把 Query、Key、Value 映射到不同子表示空间,分别完成 Attention,最后拼接并进行一次线性变换。所谓“分头”,首先是特征维度的组织方式。

Transformer d_model 模型维度拆分到多个注意力头的示意图
模型维度如何分到多个头

每个位置的 d_model 维表示沿特征维拆成多个头,各头独立计算后再合并。

每头维度通常由 d_model 除以头数得到

在常见实现中,假设模型宽度是 d_model,注意力头数是 h,那么每个头的宽度通常设为 d_head=d_model/h。比如 d_model=512、h=8 时,每个头可以使用 64 维。八个 64 维子空间拼接后,正好恢复 512 维。

这就是为什么配置多头注意力时常要求 d_model 能被 h 整除。整除让每个头获得相同宽度,张量可以规整地 reshape 成“批次、头数、序列长度、每头维度”的形状。它首先是工程上的形状约定,随后才影响计算效率和参数组织。

不整除时,问题出在形状而不是注意力公式

如果 d_model=500、头数为 8,500 不能平均分成 8 组相同宽度。此时并不是 Query-Key 点积不能计算,而是标准的等宽分头方式无法直接完成。要么让部分头宽度不同,要么先用额外投影把输入变成适合切分的宽度。

不同头使用不同宽度会增加实现复杂度:矩阵形状不再统一,批量计算和拼接规则需要额外处理。大多数工程实现因此选择让模型宽度和头数配套,而不是让每个头承担不同大小的子空间。

Q、K、V 的最后一维必须分别对齐

对单个注意力头来说,Query 和 Key 的最后一维需要一致,才能做点积;Value 的宽度可以单独定义,但多头输出通常会按照统一规则拼接。假设有 h 个头,每头 Query、Key 为 d_k 维,Value 为 d_v 维,那么各头输出拼接后的宽度通常是 h×d_v。

如果采用 d_k=d_v=d_model/h,形状最直观:输入投影后可以按头拆分,注意力输出按头拼接,再通过 W_O 投影回 d_model。每个阶段的形状都容易检查,残差连接也能直接接收最终结果。

Transformer 多头注意力中 d_model 分到各头后形成 Q K V 形状的示意图
Q、K、V 的头内形状

模型宽度经过投影和分头后形成多个相同宽度的 Q、K、V 子空间,点积在每个头内部完成。

拼接后为什么还要投影回 d_model

各头结果沿特征维拼接后,宽度通常是 h×d_v。即使这个宽度刚好等于 d_model,Transformer 仍会使用输出投影,让模型学习如何综合不同头的结果。投影后的输出回到主干宽度,才能和输入做残差相加。

因此,d_model 与头数的关系不只影响分头,也影响后面的拼接和残差接口。一个好的配置会让整个链路的形状前后一致,而不是只让单个注意力头的点积能够运行。

Transformer 多头注意力分头计算、拼接并恢复 d_model 的流程图
分头、拼接与恢复模型宽度

各头独立计算后拼接,输出投影把组合结果送回统一的 d_model 空间。

头数增加并不等于表示宽度增加

在保持 d_model 不变时,增加头数通常意味着每个头变窄。头数从 8 增加到 16,模型可以从更多子空间观察关系,但每个头可使用的特征维度也会减少。头数和每头维度需要一起看,不能只用“头更多”判断容量更大。

如果同时增加头数和每头宽度,整体投影规模、注意力计算和参数量都会增长。那已经不是单纯把同一模型拆得更细,而是改变了模型宽度和资源需求。阅读模型配置时,应同时记录 d_model、head 数和 head_dim。

整除关系也影响批量矩阵计算

多头注意力在实际实现中通常把多个头放入同一个张量维度,一次完成矩阵乘法。等宽的头可以共享同一套批量计算逻辑,形状也更适合硬件并行。整除关系让 reshape 和 transpose 后的维度清晰,减少了为不同头单独处理的分支。

这并不是说数学上不能写出不等宽的多头注意力,而是标准 Transformer 结构追求规则的子空间和统一的计算接口。论文中的多头描述与常见实现都更适合用这种等宽切分来理解。

不同模型不一定完全遵守同一种切分

经典多头注意力通常采用等宽头,因此配置里常见 d_model 能被 head 数整除。但具体模型可能使用不同的 Q/K/V 宽度、分组查询、共享 Key/Value 或其他注意力变体。此时,不能只套用 d_model/h 的公式。

学习基础结构时,先掌握等宽分头的主线:模型表示进入多组投影,按头形成统一形状,各头计算后拼接,再投影回主干。遇到特殊实现时,再分别查看它的 head_dim、KV 头数和投影矩阵形状。

用四个形状问题检查多头配置

第一,输入的模型宽度是多少;第二,头数是多少,每头 Query 和 Key 的宽度是多少;第三,各头输出拼接后宽度是多少;第四,输出投影后是否回到 d_model,能否接入残差连接。

如果采用常见的等宽设计,d_model/h 应该是整数,Q、K、V 的头内形状也应能在批量矩阵中统一。记住,整除不是注意力思想的边界,而是让标准分头、拼接和并行计算顺利衔接的形状约定。

常见问题

d_model 不能被头数整除时,注意力一定无法计算吗?

不一定。可以使用不等宽头或额外投影,但实现会更复杂。经典等宽多头注意力通常要求整除,是为了让张量切分和批量计算保持规整。

头数越多是不是一定越好?

不一定。头数增加时每头维度可能变小,表达能力、计算成本和训练效果需要综合平衡。

为什么输出投影还要回到 d_model?

为了统一后续子层接口,并让多头输出能够与输入通过残差连接相加。