全链路:
-
输入句子: “Time Machine” (为了简单,假设句子只有这两个词)。
-
维度设定:
- Embedding 维度 () = 4
- Q, K, V 的维度 () = 3 (注意:故意把维度变小,模拟“降维投影”的过程,这在multi-head attention里常用)。
第一阶段:Embedding (词嵌入)
这是 Transformer 的大门。计算机不认识单词,只认识数字。 在模型训练之前,我们已经有一个巨大的 Embedding 表(这就好比一本字典,每个词对应一行数字)。 假设查表后得到的向量如下:
- “Time” ():
[1, 0, 1, 0] - “Machine” ():
[0, 2, 0, 1]
我们将这两个向量拼成一个矩阵 (输入矩阵):
第二阶段:生成 Q, K, V
这是你最关心的部分:向量是怎么变成 Q、K、V 的?
Transformer 每一层都有三个可训练的权重矩阵:。
这些矩阵的形状是 [Embedding维度, QKV维度],也就是 4 x 3。
假设(经过一轮随机初始化后) 矩阵长这样:
现在的任务:计算 Query (Q) 矩阵。
公式:
我们来手算一下 “Time” 这个词的 Query 向量:
解读:通过乘以 ,我们将 4 维的原始向量压缩成了 3 维的查询向量。
同理,计算出所有 Q, K, V(这里我直接给出假设的计算结果,方便后续步骤):
Q (查询 - 我在找什么):
K (键 - 我有什么特征): ( 的结果)
V (值 - 我的实际内容): ( 的结果)
第三阶段:计算相关性 ()
现在我们要看看 “Time” 和 “Machine” 之间的关系。
公式:
1. 计算 “Time” (Row 1) 的得分:
-
Time vs Time:
-
Time vs Machine:
(这说明在这个简单的例子里,Time 的 Query 和 Machine 的 Key 完全不匹配)
2. 计算 “Machine” (Row 2) 的得分:
- Machine vs Time:
- Machine vs Machine:
得分矩阵 (Scores):
第四阶段:缩放与归一化 (Scale & Softmax)
- Scaling:
我们的 ,所以 。 为了方便计算,我们粗略取值为 1.7。
- Softmax (按行):
将这些分数转换成概率。
-
第一行 (“Time”):
输入 。 , 。总和 。 权重 (解读:Time 主要关注自己,稍微关注一点点“Machine”)
-
第二行 (“Machine”):
输入 。 数值一样,权重平分。 权重 (解读:Machine 50% 关注 Time,50% 关注自己)
注意力权重矩阵 (Attention Weights):
第五阶段:提取信息 —— 加权求和 ()
最后,用算出来的权重去“混合” V 矩阵里的信息。
回顾 V 矩阵:
- 计算 “Time” 的新向量 (Output 1):
它是 。
- 第一维:
- 第二维:
- 第三维:
“Time” 的新向量 =
(原始 V 是 。你看,它吸收了“Machine”的一些特征,第三维从 0 变成了 1.2)
- 计算 “Machine” 的新向量 (Output 2):
它是 。
- 直接取平均:
“Machine” 的新向量 =
总结:数据是怎么流动的?
- Embedding:
[1, 0, 1, 0](我是单词 “Time”) - Projection: 乘以 变成了三个小向量 。
- Attention: 拿我的 去和大家的 比较,发现我和自己最相关,和“Machine”不太熟。
- Output: 既然不太熟,我就只拿一点点“Machine”的 ,主要保留我自己的 。最终输出了一个混合向量。
这个混合向量,就是下一层网络的输入(或者下一层 Transformer Block 的输入)。这个过程重复 6 次(或更多),模型就深刻理解了整句话的含义。