Transformer的核心——注意力机制

本文是作者本人学习深度学习的理解,如有错误,劳烦指出,让我改正

文章目录

  • 前言
  • 一、注意力机制的动机:三个直观例子
    • 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的核心机制,注意力机制,这只是粗略的讲解,具体的实现以及公式在文章内未提及,可以去翻阅资料查询对应的公式和实现代码等。