本文是作者本人学习深度学习的理解,如有错误,劳烦指出,让我改正
文章目录
- 前言
- 一、注意力机制的动机:三个直观例子
- 1. 一词多义:三个 "mole"
- 2.精细化修饰:从 "Tower" 到 "Miniature Eiffel Tower"
- 每一步,周围的词都在拉扯这个向量的含义。
- 3.长距离信息传递
- Transformer 的最终预测完全基于序列最后一个向量。它必须通过层层注意力,把整个上下文窗口中所有相关信息都编码进来。
- 二、单头注意力:一步步拆解
- 1.Query(查询)—— 提出"问题"
- 2. Key(键)—— "回应"查询
- 3.点积 + Softmax → 注意力模式
- 4.Masking(掩码)—— 不能偷看未来
- 这就是因果掩码(Causal Masking)——信息只能从前往后流动。
- 5.Value(值)—— 实际传递的信息
- 6.加权求和 → 更新嵌入
- 三、多头注意力:多个视角并行
- 1.为什么需要多个头?
- 上下文影响含义的方式远不止一种:
- 2.多头配置(以GPT3.0为例)
- 总结
前言
为什么同一个词 “mole”,在 “鼹鼠”、“摩尔”、“痣” 三种语境下,模型能自动区分?答案就藏在注意力机制里。
一、注意力机制的动机:三个直观例子
1. 一词多义:三个 “mole”
“American shrew mole” → 一种鼹鼠
“One mole of carbon dioxide” → 摩尔(化学计量单位)
“Take a biopsy of the mole” → 痣(医学用语)
2.精细化修饰:从 “Tower” 到 “Miniature Eiffel Tower”
初始 “Tower” → 指向"高大建筑物"方向
前面出现 “Eiffel” → 注意力将向量推向"巴黎、钢铁、法国"方向
再前面出现 “miniature” → 进一步推离"高大",靠向"微缩模型"
每一步,周围的词都在拉扯这个向量的含义。
3.长距离信息传递
想象你给模型输入整本侦探小说,最后一句话是 “Therefore the murderer was ____”。那个空白位置的向量,必须跨越几十页的上下文,从前面所有人名中"回忆起"谁是凶手。
Transformer 的最终预测完全基于序列最后一个向量。它必须通过层层注意力,把整个上下文窗口中所有相关信息都编码进来。
二、单头注意力:一步步拆解
以 “A fluffy blue creature roamed the verdant forest.” 为例。假设我们追踪形容词如何更新名词 “creature” 的含义。
注意力机制的核心流程分五步:
每个 token 的嵌入
↓
① 生成 Query(查询向量)—— “我在找什么?”
② 生成 Key (键向量) —— “我能提供什么?”
③ Q·K 点积 + Softmax → 注意力模式
④ 生成 Value(值向量) —— “如果被选中,传递什么信息?”
⑤ Value 加权求和 → ΔE → 加到原嵌入
1.Query(查询)—— 提出"问题"
每个 token 的嵌入向量 E 与一个可训练的查询矩阵 Wᴏ 相乘,得到查询向量 Q:
名词 “creature” 的 Q 向量像是在问 —— "我前面有形容词吗?
2. Key(键)—— "回应"查询
同样,每个 token 通过键矩阵 Wᴋ 产生键向量 K:
键向量和查询向量处于同一个低维空间。直觉上,形容词 “fluffy” 的 K 向量像是在回应 —— “是的!我是形容词,我在前面!”
3.点积 + Softmax → 注意力模式
计算所有查询向量与所有键向量的点积(dot product),得到一个 n × n 的网格。
点积衡量两个向量的对齐程度——值越大,表示"这个词与那个词越相关"。
然后对网格逐列做 Softmax,Softmax 将每列变成合法的概率分布(0~1,列和为 1)。
除以查询空间维度的平方根,是为了数值稳定性——防止点积值太大导致 Softmax 输出过于极端(梯度消失)。
这个归一化后的网格就是注意力模式(Attention Pattern)——它告诉我们每个词应该从其他词那里"听多少"。
4.Masking(掩码)—— 不能偷看未来
训练时有一个巧妙的设计:对每个位置,模型同时预测下一个 token。比如输入 “A fluffy blue creature roamed…”:
位置 1 预测位置 2
位置 1~2 预测位置 3
位置 1~3 预测位置 4
…
一把前向传播,同时训练所有位置——效率极高。
但有个问题:后面的 token 不能影响前面的 token,否则等于"看了答案再答题"。
做法很简单——在 Softmax 之前,把注意力网格的上三角区域全部设为 负无穷,这列依然归一化。
这就是因果掩码(Causal Masking)——信息只能从前往后流动。
5.Value(值)—— 实际传递的信息
有了"谁关注谁"的权重网格后,还需要真正的内容来更新嵌入。
通过值矩阵 Wᴠ 产生值向量 V:
值向量与嵌入向量同维,因为它要直接加到嵌入上。
直觉理解:值向量回答了 —— “如果我被选中去更新其他词,我应该往它的嵌入里加什么?”
6.加权求和 → 更新嵌入
用注意力权重对值向量加权求和,得到变化量 ΔE,最后加到原始嵌入上,“creature” 的新嵌入向量就从泛化含义,变成了包含 “fluffy” 和 “blue” 形容词信息的精炼含义。
三、多头注意力:多个视角并行
1.为什么需要多个头?
上下文影响含义的方式远不止一种:
| 模式 | 例子 |
|---|---|
| 形容词 → 名词 | “fluffy creature” |
| 语法结构暗示 | “they crashed the car” |
| 跨句关联 | “Harry” + 前面提到 “wizard” → Harry Potter |
| 复杂语义推理 | “Queen, Sussex, William” + “Harry” → Prince Harry |
一个注意力头只能学一种模式。所以要多头并行。
2.多头配置(以GPT3.0为例)
GPT-3 每个注意力块有 96 个头,每个头有独立的:
Wᴏ(查询矩阵)
Wᴋ(键矩阵)
V↓ + V↑(值矩阵对)
所有 96 个头各自独立计算,产生 96 份 ΔE 提案,最后全部加总。
总结
本文主要是讲解Transformer的核心机制,注意力机制,这只是粗略的讲解,具体的实现以及公式在文章内未提及,可以去翻阅资料查询对应的公式和实现代码等。