3-7 的序列模型把走过的一切都压进一个隐藏状态,一格一格地往前走。注意力换了一种思路:每当需要时,就重新查看前面所有的格,并给相关的格更多注意。我们将亲手跟踪查询(Q)·键(K)·值(V)的数字,并看看由这些部件堆叠而成的 Transformer 为何成为当今语言模型的骨架,以及它的成本。
把韩语句子“果蝇·苹果·吃了”(按韩语语序逐词对应,意为“果蝇吃了苹果”)译成 “The fly ate the apple”。每生成一个英语词,就把注意力分配给各个韩语词。线越粗,注意力越大。
韩语的顺序是“果蝇 · 苹果 · 吃了”,英语是 “The fly · ate · the apple”。动词的位置不同。所以生成 “ate” 时,要重点看句末的“吃了”。这张图里的注意力值是为了说明而设定的数字。真实的翻译模型会通过学习自己找到这种对应关系,Bahdanau 等人报告说,学到的注意力与人的直觉很吻合 [R1]。注意力都在 0~1 之间,总和为 1(softmax)。
注意力(Q, K, V) = softmax(Q·Kᵀ / √dk) · VVaswani 等,2017
| 符号 | 在图书馆里 | 在神经网络中 |
|---|---|---|
| Q 查询 | 写着我要找什么的纸条 | 表示当前格“需要什么”的向量。输入 × WQ |
| K 键 | 每本书上贴的索引卡 | 表示每一格“我是这样的信息”的向量。输入 × WK |
| V 值 | 书的实际内容 | 每一格实际要交出的信息。输入 × WV |
| Q·K | 纸条和卡片有多匹配 | 两个向量的内积。方向越相似,值越大 |
| ÷ √dk | — | 防止向量变长时内积变大、导致 softmax 只集中在一格上 [R2] |
| softmax | 把阅读时间分给每本书 | 把分数变成总和为 1 的注意力 |
| × V | 按阅读时间把内容混合整理 | 以注意力为权重把各个值相加。这就是输出 |
第 3 节中,问题和书是分开的。在自注意力中,句子里的每个词既是查询,也是键,也是值。每个词都把注意力分配给其他所有词。
词向量用 [动物, 食物, 动作, 指示词] 四格手工设定。查询变换 WQ 设定为“指示词找食物,动作找动物”。键·值变换保持不变。真实的 Transformer 中,词向量和 WQ·WK·WV 全都通过学习确定,宽度也有数百格。计算公式与这个例子完全相同。代码 1 会得出同样的数字。
一个句子里有多层关系。“谁吃了”和“吃了什么”是不同的问题。每个头使用不同的 WQ·WK·WV 来看不同的关系,再把结果拼接起来。
注意力一次性比较所有格。所以即使打乱词序,每个词的结果也完全相同。要告诉它顺序,就在词向量上加上每个位置都不同的“位置编码”。
原论文在位置 pos 的偶数格放入 sin(pos / 100002i/d),奇数格放入 cos(…) [R2]。前面的格波动得快,后面的格波动得慢,于是每个位置都形成不同的花纹。这就像同时看时钟的秒针、分针和时针,时刻就唯一确定了。通过学习来确定位置编码的方法也被广泛使用。代码 2 的小 Transformer 使用了可学习的位置嵌入。
Transformer 的一个块由多头注意力和前馈神经网络(3-2 的 MLP)组成。两者各自加上直接把输入加回来的捷径(残差连接)和归一化,再把这样的块堆叠多层。
同样的块,只要改变“哪一格能看到哪一格”(掩码),用途就会不同。
Transformer 被广泛使用的原因可归纳为三点。相应地也有成本。最大的成本是随长度平方增长的注意力计算。
与 3-7 代码 2 相同的任务(所有格都是 ±1,答案是第一格)和相同的训练设置(Adam 0.005,30 轮次,训练 2,000 个·测试 1,000 个,种子 2 个)。Transformer 使用一个自注意力块(宽度 16,2 个头)和可学习的位置嵌入。“对第一格的注意力”是所有格给第一格的注意力的平均值。
本篇讲到 Transformer 的结构为止。用这种结构生成文字·图像的生成模型(大规模语言模型的预训练、指令遵循训练、扩散模型等)不在本系列范围内。接下来的几篇(3-4 语音、3-6 时间序列·股价、3-5 文本)专注于把数据变成数字的过程。
两段代码都只使用 Colab 默认安装的库。点击“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
用同样的数字计算图书馆示例、五个词的自注意力、两个头、打乱顺序与位置编码。想换成自己的数据,就修改 BOOK_K·BOOK_V·QUERIES 或词向量 X。
用只有一个自注意力块的 Transformer 重新解决 3-7 中 LSTM 在长序列上失败的任务。还会测量训练后的 Transformer 给答案所在的第一格多少注意力。第 9 节下方的表格直接由这段输出生成。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”时,所选代码会一并附在提示词后面。把〔 〕里的内容换成自己的情况即可。
AI 的回答只是起点。它提出的论文·数值·库函数务必对照原文和官方文档核实。如果在竞赛·论文中借助了 AI,请按照主办方和期刊的规定说明使用的事实和范围。
与正文中黄色虚线下划线相同的词典。整个系列使用统一的写法。点击章节名可跳到首次出现的位置。
类比是理解的第一步,但也可能成为误解的种子。果蝇·大脑类比标注了强度。直接 有证据表明实际在做同样的事 · 部分 只有部分性质相似 · 无 尚未发现对应的东西
| 概念 | 日常类比 | 果蝇·大脑类比 | 类比失灵之处 |
|---|---|---|---|
| 注意力 | 备考时在重要的页上涂荧光笔 | 部分 人的选择性注意(在嘈杂处专注于一个声音) | 大脑的注意是感觉·意图·疲劳等交织在一起的现象。模型的注意力只是由内积和 softmax 决定的加权平均 |
| Q·K·V | 图书馆的问题纸条·索引卡·书的内容 | 无 | 图书馆会挑出一本书拿来,而注意力把所有的书按比例混合 |
| softmax 注意力 | 把阅读时间分给每本书 | 无 | 时间怎么分都会全部用完,但注意力只有 0.01 的格也一格不落地要计算(所以需要 n²) |
| 多头 | 几位编辑从不同角度阅读同一份文稿 | 无 | 头的“视角”不是人定的。训练后去解读,很多头看不出明确的角色 |
| 位置编码 | 同时看时钟的秒针·分针·时针,时刻就确定了 | 无 | 时钟过了一天会回到原处,而位置编码只在训练过的长度内才熟悉 |
| 残差连接 | 修改稿旁边总是附上原稿 | 无 | 关键在于原稿是“直接相加”的。修改幅度小时,原稿几乎原样传到下一层 |
| 掩码(GPT 型) | 遮住答案纸,只看前面的题来解下一题 | 无 | 训练时所有格一次性计算。遮住的只是“能看到的范围” |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片参考资料
这是面向讲师、实务 OJT 负责人和辅导老师的教学指南。时间为预估值,请根据实际课堂调整。
| 对象 | 学完 3-7 的大学生·职场人士。想了解语言模型“由哪些部件构成”的从业者 |
|---|---|
| 先修知识 | 向量的内积(相同位置相乘再相加)、3-2 的 softmax 与 MLP、3-7 的编码器–解码器 |
| 学习目标 | ① 用数字计算注意力公式 softmax(QKᵀ/√d_k)V ② 分别说明自注意力·多头·位置编码为什么必要 ③ 同时说明 Transformer 成为基础的原因与 n² 成本 |
| 预计时间 | 阅读 45~55 分钟 · 动画演示 25 分钟 · Colab 实操 30 分钟(代码 1 10 分钟,代码 2 运行 8 分钟 + 解读 12 分钟) |
导入 5 分钟(第 1 节 瓶颈)→ 第 2·3 节 图书馆 15 分钟 → 第 4·5 节 10 分钟 → 第 6 节 打乱顺序 10 分钟 → 第 9 节 n² 与代码 2 结果 5 分钟 → 检测题 5 分钟。
第 1·3 节 15 分钟 → 第 8 节 把三种结构与业务案例(分类·摘要·翻译)联系起来 20 分钟 → 第 9 节 成本计算(用我们自己的文档长度)15 分钟 → 代码 2 运行·解读 25 分钟 → 提示词卡片 15 分钟。
入门者只学第 1·2·3·9 节。中级者先手算第 3 节的结果向量再与代码 1 对照,并亲自推导第 7 节的 4d² + 4d。
| 章节 | 停下来提问的问题 | 操作提示 |
|---|---|---|
| 1 遗留问题 | “把 40 个词的句子装进 8 格向量,每个词能分到几格?” | 从 5 改成 40 个词,观察数字的变化 |
| 2 注意力 | “生成 ate 时,为什么要看最后一个词?” | 停在 “ate” 按钮上 |
| 3 Q·K·V | “只拿注意力最大的那本书不行吗?” | 在“两者都想了解”中,观察结果混合成 [5.5, 5.5] |
| 4 自注意力 | “‘它’指的是什么?模型是怎么知道的?” | 按 它 → 很甜 的顺序点击,也看看手工设定规则的局限 |
| 5 多头 | “把头增加到 8 个,参数会变成 8 倍吗?” | 在模型宽度 512 下确认参数数字 |
| 6 位置信息 | “打乱顺序结果却一样,问题在哪里?” | 按 无位置编码 → 打乱的顺序 → 加上 的顺序点击 |
| 7 块 | “块的参数大部分是注意力,还是前馈?” | 在基本型中读出“前馈所占比例” |
| 8 编码器·解码器 | “GPT 型为什么要遮住未来的格?” | 点击“仅解码器”,指出掩码中的 × 格 |
| 9 基础与局限 | “文档长度变成 2 倍,注意力计算会变成几倍?” | 从 4,096 改成 32,768 比较内存,然后转到下方的实验表 |
| 误解 | 正确解释 | 要展示的场景 |
|---|---|---|
| 注意力会挑出最重要的一个词 | 它把所有词按比例混合。注意力小的词也会进入结果 | 第 3 节“两者都想了解” |
| Transformer 天生就知道顺序 | 没有位置编码时,打乱顺序结果也一样 | 第 6 节 |
| 每个头的角色由人来指定 | 角色是通过学习形成的。本页的两个头是为了说明而手工设定的 | 第 5 节及其下方的说明 |
| Transformer 在所有方面都比 RNN 好 | 它擅长长距离连接和并行计算,但要付出长度平方的成本,在小数据上可能处于劣势 | 第 9 节 |
| 注意力图就是模型做出判断的理由 | 它只是显示看了哪里来计算,并不保证判断正确的理由 | 第 4 节的“很甜” |
q·k = 2×2 + 0.4×0 = 4。4 / √2 ≈ 2.828。与第 3 节中书 A 的分数相同。
注意力 ≈ [0.238, 0.238, 0.525]。结果 = 0.238×[10,0] + 0.238×[0,10] + 0.525×[6,6] ≈ [5.53, 5.53]。代码 1 的输出是 [5.525, 5.525]。
完全相同。每个词的输出只由“与其他所有词的比较”决定,而比较对象的集合与顺序无关,始终相同。在代码 1 中,差异为 1e-16(计算误差的水平)。
W_Q·W_K·W_V·W_O 四个矩阵各为 512 × 512,偏置各 512 个:4 × 262,144 + 4 × 512 = 1,050,624 个。改变头数只是头宽变小,矩阵大小不变,所以参数数量不变。
4 倍。(2n)² = 4n²。从 4,096² = 16,777,216 个变为 8,192² = 67,108,864 个。
在代码 1 中计算:如果不除以 √d_k,图书馆示例的注意力会怎样变化。用两句话说明:把向量放大 10 倍时,除法的作用如何变大。
在代码 2 中去掉 Transformer 的位置嵌入(AddPosition)后重新训练。用 3 个以上的种子报告结果和“对第一格的注意力”如何变化,并联系第 6 节写出原因。
| 入门者 | 跳过第 5·7 节也不会打断思路。只需把第 3 节的图书馆示例亲手算一遍 |
|---|---|
| 进阶 | 让学生调查并发表减少第 9 节 n² 成本的方法(分段查看、低维近似等)。调查到的论文要查阅原文确认 |
| 延伸学习 | Sangsun Ahn,《面向商业的数据科学》讲义(数据科学总览) · STEP [K-数字] 人工智能自然语言处理(与 3-5·3-8 相关) · STEP [K-数字] 金融科技数据分析基础(与 3-6 相关) |
| 讲师用资料 | 检测题的评分标准和作业参考答案可在教师用答案页面(3-8)中查看 |
你读完了「3-8 注意力与 Transformer」篇。实验室的成员们各说一句来帮你总结。