全链路:

  • 输入句子: “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)

  1. Scaling:

我们的 ,所以 。 为了方便计算,我们粗略取值为 1.7。

  1. Softmax (按行):

将这些分数转换成概率。

  • 第一行 (“Time”):

    输入 , 。总和 。 权重 (解读:Time 主要关注自己,稍微关注一点点“Machine”)

  • 第二行 (“Machine”):

    输入 。 数值一样,权重平分。 权重 (解读:Machine 50% 关注 Time,50% 关注自己)

注意力权重矩阵 (Attention Weights):


第五阶段:提取信息 —— 加权求和 ()

最后,用算出来的权重去“混合” V 矩阵里的信息。

回顾 V 矩阵:

  1. 计算 “Time” 的新向量 (Output 1):

它是

  • 第一维:
  • 第二维:
  • 第三维:

“Time” 的新向量 =

(原始 V 是 。你看,它吸收了“Machine”的一些特征,第三维从 0 变成了 1.2)

  1. 计算 “Machine” 的新向量 (Output 2):

它是

  • 直接取平均:

“Machine” 的新向量 =


总结:数据是怎么流动的?

  1. Embedding: [1, 0, 1, 0] (我是单词 “Time”)
  2. Projection: 乘以 变成了三个小向量
  3. Attention: 拿我的 去和大家的 比较,发现我和自己最相关,和“Machine”不太熟。
  4. Output: 既然不太熟,我就只拿一点点“Machine”的 ,主要保留我自己的 。最终输出了一个混合向量。

这个混合向量,就是下一层网络的输入(或者下一层 Transformer Block 的输入)。这个过程重复 6 次(或更多),模型就深刻理解了整句话的含义。