为什么 Transformer 采用多头注意力机制?
为什么 Transformer 采用多头注意力机制?
这道题考的是对注意力机制设计思想的深层理解,不只是让你背公式,而是看你能不能讲清楚"为什么要把一个注意力拆成多个"。本质是考察你对"分而治之"这个算法思想在深度学习中的应用理解。
我从四个方面来讲:先说单头注意力为什么不够用,再讲多头是怎么解决这个问题的,然后用具体例子说明分头之后各管各事的效果,最后总结这样设计到底好在哪。
单头注意力的"力不从心"
先说个问题:单头注意力只有一个 Q、一套 K、一套 V。
这意味着什么?意味着它只能学出一种注意力分布——说白了就是只能关注一种类型的信息。
但你看一句话,里面同时混着:
- 词性信息(谁是动词、谁是名词)
- 句法结构(谁修饰谁)
- 长距离依赖("因为...所以..."这种隔着老远的关系)
- 语义关系(指代、消解这些)
一个注意力头,要同时搞定这些?就像让一个人同时当销售、客服、技术支持,结果每件事都做得马马虎虎。
单头注意力就是这样,任务太杂,压力太大,学到的东西互相干扰。
多头注意力的核心思想——"分而治之"
Transformer 的解决方案很简单:不让你一个人扛,我找多个人来分担。
具体做法是:把特征空间拆成 h 个子空间,每个子空间各自有一套 Q、K、V。8 个头就拆成 8 份,16 个头就拆成 16 份。
每个头独立计算注意力,独立关注输入的不同方面。
然后把所有头的输出拼接起来,再做一个线性变换得到最终结果。
公式长这样:
MHA(Q,K,V) = Concat(head₁, head₂, ..., headₕ) × Wᴼ
简单理解就是:8 个人各自看完一句话,各自给出自己的理解,最后汇总成一个更全面、更丰富的理解。
实战举例——"用毒药去毒那条毒蛇"
拿个经典例子来说明多头的效果。
"用毒药去毒那条毒蛇"
这句话里"毒"出现了三次,含义各不相同:
- 第一个"毒"是名词,指毒药
- 第二个"毒"是动词,表示用毒药去处理
- "毒蛇"的"毒"是形容词,描述蛇的特征
单头注意力要一次搞清这三个关系?太为难它了。
多头注意力怎么分工:
Head1 当"词性专家",专门识别每个词的词性角色——名词、动词、形容词分清楚。
Head2 当"语法专家",专门分析词与词之间的依存关系,谁是主语、谁是宾语。
Head3 当"逻辑专家",专门捕捉长距离的逻辑关系,把"用...去..."这个结构理解清楚。
三个头各管一摊,最后拼接起来输出。模型就能准确理解:哦,这是"用毒药作为工具,去处理那条毒蛇"。
这就是多头分工的效果——专业的人做专业的事。
这样设计为什么更好
总结一下多头注意力相比单头的优势:
1. 学习压力分散
每个头只管自己那一摊子事,不用同时学多种模式。压力小了,学得更准。
2. 表征更丰富
单头输出的只是一个向量,多头拼接后输出的是 h 个向量的拼接。信息量翻倍,表达能力更强。
3. 捕捉多维信息
不同的头天然倾向于关注不同类型的信息,有的看局部语法,有的看全局语义,有的看位置关系。复杂句子上,多头的优势尤其明显。
4. 增强模型鲁棒性
一个头学歪了,其他头还能补上。整体抗干扰能力更强。
面试怎么答
基础版(100字左右):
单头注意力只能学出一种注意力分布,面对需要多种信息(词性、语法、语义、长距离依赖)的任务时顾此失彼。多头注意力把特征空间拆成多个子空间,每个头独立学习不同方面,最后拼接输出。这样做本质是"分而治之",降低了单头的学习压力,丰富了输出表征,让模型能同时捕捉多维信息。
加分版(200字左右):
Transformer 采用多头注意力,本质是把一个复杂的注意力学习任务拆成多个子任务并行处理。每个头有独立的 Q、K、V 参数,在不同的子空间中独立计算注意力,关注输入的不同层面——比如有的头捕捉语法结构,有的头关注语义关系,有的头处理长距离依赖。
最后把所有头的输出拼接起来,通过一个线性变换得到最终结果。这种设计的优势很明显:专业分工降低学习压力,丰富输出表征,增强模型表达能力。像"用毒药去毒那条毒蛇"这种多义词句,多头就能让不同头分别识别"毒"的名词、动词、形容词角色,拼接后准确理解语义。
一句话总结
多头注意力的核心就是"分而治之"——把一个复杂的注意力任务拆成多个子空间并行处理,每个头专注学一种信息模式,最后拼接输出一个更全面、更丰富的表征。
