Multi-Head Attention 在 Transformers 中的工作原理
单个注意力头只能捕捉一种关系模式。Multi-Head Attention 通过并行运行多组独立的注意力计算,让模型同时从不同角度理解输入。
从单头到多头:为什么需要多个注意力头?
回顾 Self Attention,每个词会生成一组 Q、K、V 向量。但语言是复杂的——同一个词在不同语境下需要关注不同的信息。
句子:"苹果发布了新 iPhone,股价大涨"
单头 Attention 可能只捕捉到:
"苹果" → "发布"(语法关系)
但忽略了:
"苹果" → "iPhone"(产品关系)
"苹果" → "股价"(商业关系)
"发布" → "新 iPhone"(修饰关系)
Multi-Head Attention 的解决方案:让多个注意力头各自独立计算,每个头学习关注不同方面的信息。
多头注意力的计算过程
Step 1: 线性投影生成多组 Q、K、V
# 假设 h=8 个头,d_model=512,d_k=64
# 每个头的维度 = 512 / 8 = 64
# 对每个头 i(i=1 到 8):
Q_i = x @ W_Q_i # [batch, seq_len, 64]
K_i = x @ W_K_i # [batch, seq_len, 64]
V_i = x @ W_V_i # [batch, seq_len, 64]
Step 2: 并行计算 8 组 Attention
# 每个头独立计算注意力
for i in range(8):
attn_i = softmax(Q_i @ K_i.T / sqrt(64)) @ V_i
# 每个头输出 [batch, seq_len, 64]
Step 3: 拼接 + 线性变换
# 拼接所有头的输出
concat = [attn_1, attn_2, ..., attn_8] # [batch, seq_len, 512]
# 最终线性变换
output = concat @ W_O # [batch, seq_len, 512]
直觉理解:多头的分工
可以把多头注意力想象成一个团队协作:
头 1(语法专家):关注词与词之间的语法关系
"猫" → "吃"(主谓关系)
头 2(语义专家):关注词之间的语义关联
"苹果" → "iPhone"(产品关联)
头 3(位置专家):关注相邻词的关系
"新" → "iPhone"(修饰关系)
头 4(远距离专家):关注长距离依赖
"苹果" → "股价"(跨句关联)
... 每个头都从不同角度理解同一句话
为什么除以 √d_k?
这是 Scale Dot-Product Attention 中的关键细节。当 d_k 较大时,点积结果的方差也会很大,导致 Softmax 输出趋向 one-hot 分布(梯度消失)。
# 不缩放的情况
Q · K^T = [8.2, 7.5, 9.1, 6.8] # 方差大
softmax → [0.05, 0.02, 0.88, 0.05] # 几乎 one-hot
# 缩放后(d_k=64, √64=8)
Q · K^T / 8 = [1.03, 0.94, 1.14, 0.85] # 方差缩小
softmax → [0.25, 0.24, 0.28, 0.23] # 分布更平滑
Transformer 中的位置编码
Self Attention 有一个天然缺陷:它不知道词的顺序。"猫吃鱼" 和 "鱼吃猫" 对 Attention 来说是一样的。因此需要加入位置编码(Positional Encoding):
# 正弦位置编码
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
# 最终输入 = 词嵌入 + 位置编码
input = token_embedding + positional_encoding
多头注意力的实际效果
研究者通过可视化注意力权重发现:
- 底层(1-3 层):头主要关注局部模式(相邻词、标点)
- 中层(4-8 层):头开始学习语法关系(主谓、动宾)
- 高层(9-12 层):头捕捉语义和上下文关系
这种层次化的特征学习,使得 Transformer 能够从浅到深逐步理解语言。
总结
Multi-Head Attention 的核心思想:通过多个独立的注意力头并行计算,让模型从不同维度同时理解输入信息,最终融合形成更全面的表示。这是 Transformer 成功的关键设计之一。