在进行多头注意力的时候需要对每个 head 进行降维吗?
- 标签:Transformer、多头注意力机制
🏛 业务架构师
需要。多头注意力把 d_model 维(如 4096)切给 h 个头(如 32 个),每个头在 d_model/h(128 维)的子空间里独立做注意力——这就是"降维":不是先算完整维度再切,而是每个头天生就工作在低维子空间。
为什么要这样设计(而不是每头都用全维度):
- 计算经济性:全维度多头注意力的计算量是单头(切分后)的 h 倍——按头切分后,多头的总计算量约等于一个大头,但换来了多样性;
- 子空间多样性:每个低维头专注一种关系模式——有的头学句法依赖、有的学指代、有的学位置邻近——多个视角拼起来比单一全维视图表达力更强。研究可视化(Bertviz 类)证实了这种分工;
- ** concat 后投影回原维**:各头输出拼接(仍是 d_model 维)再过一个输出投影矩阵 Wo 融合——降维是"分工手段",融合保证最终表征完整。
业务视角的理解:这像咨询公司的项目组——不派一个"全才"做所有分析,而是派多个"专家"各查一个维度(财务、法务、市场),汇总后形成完整判断。总人力(计算量)差不多,但结论质量更高。
引申:这就是为什么 GQA/MQA(分组共享 K/V 头)能在几乎不掉点的情况下压缩 KV Cache——头与头之间本来就有冗余,说明"多头"的收益主要来自 Q 视角多样性,这个认知对推理成本优化很有价值。
🏗 系统架构师
需要降维,而且是设计上的必然。标准多头注意力的机制:总维度 d_model(如 4096)切给 h 个头,每头维度 d_head = d_model / h(如 32 头 × 128 维)。
为什么要降维(三个理由):
- 保持计算量恒定:注意力复杂度是 O(n²·d)。如果不降维,h 个头各用全维度 d,计算与参数都是单头的 h 倍(32 头 = 32 倍开销);切分后多头总计算量与单头全维基本持平——这是多头机制"免费多样性"的来源;
- 表达需求决定的:注意力 softmax 内积
QK^T/√d的稳定性依赖维度——高维内积方差大,softmax 趋向尖峰(one-hot)或均匀,梯度消失;低维(64~128)内积分布更平滑,注意力分布可学习性更好(除以 √d 也是同目的的缩放); - 子空间假设:语言的关系模式(句法、指代、位置、语义)天然分布在不同低维子空间——每头一个子空间独立学一种关系,比一个大空间学所有关系更有效(类似集成学习的视角)。
代价与权衡:每头维度小(128),单头表达力有限——靠拼接融合补回;头数 vs 头维度有权衡(头太多每头太弱,GQA/MQA 就是在推理成本压力下对 K/V 头做共享的变体)。
一句话:多头降维不是妥协而是设计——用"多个低维视角"替代"一个高维视角",参数预算不变,关系建模能力倍增。
💻 全栈开发专家
是的,每个 head 都要做降维,而且是多头机制的核心设计:把 d_model 均分给 h 个头,每头维度 d_head = d_model / h。
例如 d_model=768、h=12:每头 Q/K/V 投影到 64 维,注意力在 64 维空间算,输出拼接后过 W_O(768×768)融合回原维度。
为什么这样设计(工程账):
- 总计算量与单头全维几乎相同:12 个头 × 64 维 = 768 维总量,FLOPs 不变——「多视角」近乎免费;
- 每个头专注一个子空间:64 维的低维空间里,注意力分布更「尖锐」,不同头各自学到不同模式(实证发现:有的头盯句法依赖、有的盯位置邻近、有的做共指消解);全维单头的注意力容易被「平均化」,什么都看等于什么都不精;
- 拼接+输出投影是融合机制:W_O 学到如何组合各头的视角。
head 数的约束:d_head 必须是整数且不能太小——
- 经验下限 d_head ≥ 32(再小表达能力塌缩);
- 所以 h ≤ d_model/32:768 维最多 24 头(实用 12),4096 维可到 32~128 头(Llama-70B 用 64 头 GQA);
- head 数不能无限加(这是常见追问):d_head 缩到 16 以下收益变负——参数少了、每头太「瞎」,而且 h 个头的投影矩阵和 W_O 参数是固定的,头数越多每头越弱,总容量并未增加。
现代变体:GQA(分组共享 KV 头)在保持多头 Q 的同时压缩 KV cache——又是「Q 独立性神圣不可侵犯」的佐证。