Module 1 · Transformer
Lesson 08
注意力最后一块
Multi-head Attention
单个注意力只能"用一种方式关注"。多头 = 并行开好几套注意力,各看一种关系,最后拼起来。正好解答你之前的 512→64→512 疑问。
① Why — 单个头只能"关注一种关系"
一次注意力,每个词最终得到一组 softmax 权重、一个加权平均结果。这意味着它只能表达一种"该关注谁"的模式。但语言里,一个词同时和别人有多种关系:
- 指代:
it → animal(它指谁)
- 句法:动词 → 它的主语 / 宾语
- 邻接:和前后相邻的词(局部搭配)
如果只有一个头,这些不同关系被挤进同一组权重里平均,互相干扰、变得模糊。解决办法很直接:开多个头,每个头独立地关注一种关系。
② How — 拆成 h 个小注意力,并行跑
设 d_model = 512,头数 h = 8。做法:
- 不再用一套 512→512 的大 Q/K/V,而是给每个头一套更小的矩阵:
W_Q/W_K/W_V 形状 512×64(64 = 512/8)。
- 每个头把 512 维的词向量投影成自己的 64 维 q/k/v,独立跑一遍完整的
softmax(qkᵀ/√d)v,得到一个 64 维输出。
- 8 个头 → 8 个 64 维输出,拼接(concat)成
8×64 = 512 维。
- 再过一个输出矩阵 W_O(512×512)整合各头信息 → 最终 512 维输出。
headi = softmax(qikiᵀ/√d)vi · 每个 64 维
输出 = Concat(head1,…,head8) · W_O · 512 维
512 拆成 8 个 64(各头独立做注意力)→ 拼回 512 → 过 W_O 整合。进 512、出 512,可以继续叠下一层。
✅ 回答你之前的疑问: 你早就发现"512→W(512×64)→64,那 64 怎么接下一层"。答案就在这:那个 64 维只在单个头内部用;8 个头各出 64 维,拼接又回到 512,再过 W_O。所以整层进 512、出 512,维度对得上,能一层层叠下去。
③ 关键直觉
多头 = 多个并行的"注意力视角",各看一种关系,再汇总
- 每个头有自己独立的 W_Q/W_K/W_V → 可以学到不同的"该关注谁"的模式
- 总计算量和单个 512 维大注意力差不多(8 个头各 64 维 ≈ 一个 512 维的活,拆开并行)
- W_O 负责把各头的结论融合成一个统一的输出
⚠️ 别误解"分工":没有人给每个头指定"你管指代、你管句法"。它们是在训练中自发分化的——因为独立的权重 + 预测压力,不同头自然学到不同模式。(诚实边界:也有些头学得冗余、甚至可被剪掉,这是后话。)
④ 🅿️ 注意力到此完成,接下来(预告)
不展开,只留名:一个 Transformer Block 里,多头注意力之后还有 残差连接、LayerNorm、FFN(前馈网络);然后把整个 Block 叠 N 层(你多次问到的"多层")。这些是接下来几课,最后拼出完整 Transformer。
✅ 快速检查(用自己的话答)
- 为什么一个头不够用?多个头解决了什么问题?
- d_model=512、h=8 时,每个头的 q/k/v 是多少维?8 个头的输出怎么变回 512 维?
- 各个头的"分工"(比如一个管指代、一个管邻接)是人为设定的,还是怎么来的?
答完这 3 题,注意力机制就整个通关了 🎉 下一课进入 Block 的其余零件:残差 / LayerNorm / FFN。