一、例子句子
我们用一句经典的歧义句:
小明 打了 小红 因为 他 生气了
问题:
“他” 指谁?
人类很容易理解:
他 = 小明
Transformer 就是通过 Attention 自动学会这个关系。
二、Step1:分词(Tokenization)
模型首先会分词:
[小明] [打了] [小红] [因为] [他] [生气了]
每个词叫一个 token。
三、Step2:查词表(Vocabulary)
模型有一个词表,例如:
| ID | 词 |
|---|---|
| 1 | 小明 |
| 2 | 打了 |
| 3 | 小红 |
| 4 | 因为 |
| 5 | 他 |
| 6 | 生气了 |
句子就变成:
[1,2,3,4,5,6]
四、Step3:查 Embedding
模型有一个 Embedding 表:
| 词 | 向量 |
|---|---|
| 小明 | [0.9 , 0.1] |
| 打了 | [0.5 , 0.4] |
| 小红 | [0.8 , 0.2] |
| 因为 | [0.3 , 0.7] |
| 他 | [0.7 , 0.3] |
| 生气了 | [0.4 , 0.9] |
句子变成向量:
小明 [0.9 ,0.1]
打了 [0.5 ,0.4]
小红 [0.8 ,0.2]
因为 [0.3 ,0.7]
他 [0.7 ,0.3]
生气了 [0.4 ,0.9]
五、Step4:生成 Q K V
Transformer 会生成:
Query
Key
Value
公式:
Q = XWq
K = XWk
V = XWv
为了简单,假设:
Q = embedding
K = embedding
V = embedding
六、Step5:计算 Attention(重点)
我们重点看:
他
模型要判断:
他 和 谁最相关?
公式:
score = Q · K
1️⃣ 他 → 小明
Q他 = [0.7 ,0.3]
K小明 = [0.9 ,0.1]
score =
0.7×0.9 + 0.3×0.1
= 0.63 + 0.03
= 0.66
2️⃣ 他 → 打了
[0.7,0.3] · [0.5,0.4]
= 0.35 + 0.12
= 0.47
3️⃣ 他 → 小红
[0.7,0.3] · [0.8,0.2]
= 0.56 + 0.06
= 0.62
4️⃣ 他 → 因为
[0.7,0.3] · [0.3,0.7]
= 0.21 + 0.21
= 0.42
5️⃣ 他 → 生气了
[0.7,0.3] · [0.4,0.9]
= 0.28 + 0.27
= 0.55
七、Step6:得到 Attention Score
| 词 | score |
|---|---|
| 小明 | 0.66 |
| 小红 | 0.62 |
| 生气了 | 0.55 |
| 打了 | 0.47 |
| 因为 | 0.42 |
八、Step7:Softmax 归一化
Softmax 后:
| 词 | 权重 |
|---|---|
| 小明 | 0.28 |
| 小红 | 0.24 |
| 生气了 | 0.20 |
| 打了 | 0.15 |
| 因为 | 0.13 |
注意力图:
他
/ / | \
小明 小红 生气了 ...
0.28 0.24 0.20
九、Step8:加权 Value
Transformer 会把这些信息融合:
Output = Σ attention × V
例如:
0.28 × V小明
0.24 × V小红
0.20 × V生气了
...
求和得到新的:
他'
新的向量包含:
小明 + 小红 + 生气
但:
小明权重最大
所以模型会学到:
他 ≈ 小明
十、为什么模型能学会这个?
因为训练数据中会不断出现:
小明 打了 小红 因为 他 生气了
正确标签:
他 = 小明
训练时模型会调整:
Wq
Wk
Wv
让:
score(他→小明) 最大
十一、Attention 的本质
Attention 本质就是:
谁和谁最相关?
用数学表达:
相似度 = 向量点积
十二、Transformer 最强的地方
每个词都会做一遍:
词 → 关注整个句子
例如:
小明 打了 小红 因为 他 生气了
注意力矩阵:
小明 打了 小红 因为 他 生气
小明 •
打了 •
小红 •
因为 •
他 → 小明
生气 → 他
十三、一句话彻底理解 Attention
Attention 就是:
每个词问:
我应该关注谁?
然后:
关注越多 → 信息贡献越大