Multi-Head Attention 为什么有效?

Multi-Head Attention 为什么有效?
上次我们聊了为什么要对注意力分数除以 √dk,这个操作就像给点积结果"降温",防止 softmax 把所有注意力都推到某个值上。但这只是注意力机制的一个小细节。
更大的问题来了: Attention 机制本身,一个头难道不够用吗?
你看论文里动不动就 8 个头、16 个头,甚至更多。这不是把简单问题复杂化吗?
还真不是。
QKV 三剑客——注意力机制的核心
先来看单个注意力是怎么工作的。Attention 的本质是从一堆信息里挑出和你相关的。怎么判断"相关"?靠的就是 Q、K、V 这三个向量。
Query 是"我想找什么"。打个比方,你走进图书馆,心里想的是"编程书"——这就是你的 Query。
Key 是"我有什么"。书架上的分类标签,写着"编程"、"历史"、"文学"——这些就是 Key。
Value 是"实际内容"。书架上每本书的具体内容,这才是你真正想拿走的。
计算过程:Query 和所有 Key 做点积得到相似度分数,Softmax 把这些分数变成概率分布,用这些概率给 Value 加权求和得到输出。
多头注意力不是简单堆砌
Multi-Head Attention 就是把一个 Attention 复制多份,每份独立训练。但它不是简单的 1+1=2。
关键在于:每个头工作在不同的低维子空间里。
原始嵌入维度是 d_model,比如 512。如果你有 8 个头,那每个头处理的维度就是 512÷8=64。每个头有自己独立的 Wq、Wk、Wv 权重矩阵,在 64 维的空间里计算注意力,互相不影响。最后把所有头的输出拼接起来,通过一个 Wo 投影层还原到原始维度。
这样每个头学到的东西就不一样了——我之前分析 BERT 的注意力权重时发现,有的头专注语法关系,有的头关注语义相似度,有的头捕捉指代关系。就像一个团队,有人看大局,有人抓细节,有人找关联。
高维空间的困境
你可能会问:为什么要分这么细?一个头直接处理 512 维不好吗?
还真不太好。
问题出在高维空间的向量分布上。想象你站在一个巨大的体育场里,里面有一万个人。你要找你的朋友张三,但大家站得稀稀拉拉,你根本看不出谁和谁是朋友关系。这就是高维空间稀疏的问题。向量分布太分散,点积结果的区分度就不够——要么全都很小,要么随机一片,没有规律。
但如果把一万人分成 100 个小组,每组 100 人。你在小组内部找朋友,就容易多了。小组内的向量分布更紧凑,相似的东西真的挤在一起。
多头注意力解决的就是这个问题。每个头只处理 64 维,子空间里的向量更紧凑,注意力计算更有区分度。GPT-3 用 12288 维的嵌入,如果只有一个头,那真是大海捞针。但分成 96 个头,每个头 128 维,问题就简单多了。
多头注意力解决了单头的哪些痛点
分维度只是其中一个好处。多头的设计还顺手解决了单头的好几个问题。
第一,自身位置过度关注。
自注意力机制有个毛病:容易过度关注自己。毕竟每个 token 要和自己的 Q 去匹配自己的 K,天然就倾向于给自己高分。但多个头一融合,这种偏差就被平均掉了——其他头关注的是别的东西,整体输出更均衡。
第二,短距离和长距离依赖的捕捉。
我之前可视化过 BERT 不同层的注意力模式,发现底层头更多关注相邻 token,高层头则跳来跳去找远距离依赖。有的 token 只需要看隔壁邻居,有的 token 需要跨越整个句子找指代。多头设计让模型能同时处理这两种情况。
第三,多模式学习。
部分头学语法结构,部分头学语义关联,部分头学指代关系。你读一篇文章时,眼睛也在做类似的事——有时看语法,有时抓意思,有时找上下文。多头注意力让模型拥有了多双"眼睛"。
可视化告诉你——头真的在学不同的东西
说了这么多,有没有证据?
还真有。研究人员把不同头的注意力权重可视化出来,发现了一些有意思的现象。
同一层里,大多数头确实在学相似的东西。
但总有那么几个"异类"——它们的行为模式和别的不一样。
比如某些头特别关注相邻的 token,某些头却跳来跳去找远距离的依赖。
还有些头专注于特定的语法关系,比如动词和主语、形容词和名词。
更有意思的是:有些头可以被剪掉,但模型性能下降得并不多。
这说明多头注意力存在冗余——不是每个头都同等重要。但也说明确实有"核心头"存在——它们学到了关键的东西,剪掉会出大问题。
Transformer 的底层更关注语法,顶层更关注语义。这个规律在多头注意力的可视化里也得到了验证。
实战视角——多头注意力的工程权衡
理论讲完了,聊聊工程上的事。
头的数量不是越多越好。
太多头会增加计算量和参数量,但收益会递减。
通常的经验法则是:让每个头的维度保持在 64 左右。
BERT-base 用 12 个头,每头 64 维。BERT-large 用 16 个头,每头 64 维。这个配置在表达能力和计算开销之间取得了不错的平衡。
头剪枝是模型压缩的有效手段。
你可以训练完再分析哪些头是冗余的,直接删掉。但要小心:别把核心头剪掉了。
初始化对头的影响可能比你想的大。
我踩过这个坑:有一次调参时发现某个头一直没什么响应,检查了半天发现是初始化太大导致梯度爆炸。后来换了 Xavier 初始化就好多了。
最后
Multi-Head Attention 的设计,看起来不过是把注意力复制多份。
但背后是对高维空间学习困境的深刻洞察,是对不同语义模式并行捕获的工程智慧。
分而治之,才是它的精髓。
但还有一个问题没解决:Attention 机制本身是不考虑位置的。
"我爱你"和"爱你找我",在 Attention 眼里可能是一样的。
这显然不行。
下一篇文章,我们就来聊聊 Transformer 是怎么解决这个问题的——位置编码。
