跳到主要内容

02 · 生成:一个动作的无限重复

1. 这一章讲什么

原书第 2 章以 GPT-2 为切入点,回答三个连着的问题:这台机器凭什么能一段一段往外写?每一步「挑哪个词」的挑法有什么讲究?写出来之后,又用什么尺子量好坏?1

它在全书链条里的位置:第 1 章的五个零件在这里第一次拼成能干活的机器——零件没变,只是把注意力加装了「单向掩码」,再套上一个循环。读完这章你会明白,「会写作文」其实是「会挑下一个词」的副产品。

2. 顶层全景:生成就是转圈

提示词「今天天气」


┌────────────────────────────────────┐
│ 单向注意力:每个词只能看自己和左边 │
│ → 输出「下一个词」的概率表 │
│ 很可能 0.62 / 真 0.11 / 冷 0.08 … │
│ → 挑一个(怎么挑?见 §3.2) │
│ → 接到句子末尾 │
└────────────┬───────────────────────┘
│ 变长了一词
└──────────► 回到开头,重新算一遍
直到写够长度或撞到终止符

图说:没有草稿,没有通盘构思;每写一个词,整台机器从头跑一遍。

3. 核心原理

3.1 层堆叠与单向掩码:生成的前提

GPT-2 的身体就是把第 1 章的那层积木(注意力、前馈——两层带弯折的普通变换——、残差、归一化)堆 N 次:每层先做注意力、再做前馈,输出形状与输入一致,所以能无缝接力2。堆得越深,每层能捕捉的语言结构越复杂。

关键的改动是单向掩码:普通注意力里每个词能看全场,但生成任务不能这么干——写第 5 个词时如果看得到第 6 个词,等于考试看答案。单向注意力让每个位置只能关注自己和之前的词,原书明确说这是为了「避免生成时泄露未来信息」3。掩码实现上就是把「往右看」的那些相关分数压成极小,归一化后权重为零——数学上就是第 1 章那套注意力,只是打分表被遮了半边。

3.2 自回归循环与两种挑法

「自回归」指的是:每一步的输入里包含自己上一步的输出。流程原书写得很直白——从提示词(你给的开头几句)开始,算出每个候选词的概率(可能性多大),选概率最高的词加入上下文(到此为止已写出的全部文字),循环往复,直到够长或遇到终止符4

但「选概率最高的」只是挑法之一。原书比较了两种,比喻是两个人挑水果:

挑法怎么挑代价与收益
Greedy Search每步只拿「当下看起来最甜的」快;但一路只顾眼前,最后一篮水果口味单一——生成上表现为重复、局部最优(困在眼前的好,错过更好的)5
Beam Search每步保留多条候选路径(「束宽」个),最后选整体得分最高的一条更贵(候选都要往下算);但组合更优、更流畅6

主走查:同一个提示词,两种挑法分道扬镳。 原书 2.2.2 的演示里,两法从同一个起点出发,前三个词碰巧相同(编号 1, 345, 876),第四步开始分裂:Greedy 走了 238(当下概率最高),Beam 因为同时养着另一条候选路,发现走 1102 的整条路总分更高,于是改道——最终两条序列——两串编号——是 [1, 345, 876, 238, 1095, 358, 302][1, 345, 876, 1102, 923, 145, 798]7。这就是两种挑法的全部区别:Greedy 逐点最优,Beam 全局较优。这些编号数值来自原书演示输出,对应的文本内容原书以图片呈现,没进文本。

3.3 三把尺子:BLEU、ROUGE、困惑度

写出来了,好不好?第一把尺子 BLEU:量生成文本与参考文本抄得像不像——数 n-gram(连续 n 个词的片段)的重合比例8

第二把尺子 ROUGE 换方向:量参考文本被盖住多少,适合摘要类任务9。它报的第一组数是精确率(报出的有多少是对的)。

第二组数是召回率(该抓的有多少抓到了)。

第三组 F1(两者的折中分)把前两个数拧在一起。

第三把尺子困惑度(总纲里见过:机器自己在多少个候选里犹豫)。备一个词:熵——乱劲、不确定的程度。

3.4 困惑度:把犹豫变成数

困惑度的量法分两步。先算交叉熵——把「错得多离谱」加总的标准尺(熵在这里派上用场)。

再取指数(把差距放大成「在多少个候选里犹豫」)。数值越低,模型越「不意外」10

一个具体对照(原书 2.3.1 的演示值):生成文本与参考文本完全一致时,BLEU=1.0;换成大意相近、措辞不同的两段中文长文,BLEU 掉到 0.85,ROUGE 各项落在 0.87-0.95 之间——尺子立刻区分出了「抄写」和「意译」11

主走查(第二走查):困惑度怎么算出来、怎么降下去。 原书 2.3.2 拿一个简化 GPT 模型做微调:

① Epoch 1 结束:模型对验证文本每个位置给出概率分布,
算交叉熵损失(编的演示值)≈ 4.59
② 困惑度 = e^4.59 ≈ 98.23 ← 原书输出 98.2345
③ 用 Adam 优化器 + StepLR 调度器继续训
(StepLR:每 10 个 epoch 把学习率乘 0.1,越练步子越小)[^12]
④ Epoch 10:困惑度 32.46;Epoch 15:25.68 → 训练在起效[^13]

走查说明:困惑度每降一档,意味着模型对「下一个词是什么」的判断集中了一档——从「98 选 1 犹豫」走到「26 选 1」。注意单位:困惑度是「模型平均在多少个候选里犹豫」,不是百分比。

3.5 原书的四条调优叮嘱

原书 2.3.2 末尾给了四条,都值得带出来。

困惑度低不等于文本好——它量的是拟合,不是可读性和逻辑,必须与 BLEU/ROUGE 或人工评价合用12

学习率过高会梯度爆炸;过低则不收敛(迟迟到不了目标附近)。建议适中起步、按阶段调整13

微调要防过拟合(把训练题背得太死,见新题就崩):用低学习率、权重衰减、数据增强14

数据集质量直接写进困惑度:噪声(没用的杂讯)多的数据,先把困惑度抬高15

4. 作者的判断与证据

  • 有演示数据的: Greedy 与 Beam 的分道序列(2.2.2)、BLEU 1.0 与 0.85 的对照(2.3.1)、困惑度 98.23→25.68 的微调曲线(2.3.2)。
  • 是作者判断的: 「Beam Search 生成质量往往更高」——书里没有给两者的量化对比实验,只给了两条不同的输出序列,这句判断靠的是策略本身的性质(保留更多候选),不是测量。
  • 教学比喻: 挑水果的那一段是原书自己的比喻,原文写明把 Greedy Search 和 Beam Search 比作两个挑水果的人16

5. 边界与局限

  • 原书的 GPT-2 是演示级实现:词表是自建的玩具词表,生成的「文本」以编号串示人。它演示机制足够,不代表真实 GPT-2(15 亿参数级)的行为;第 11 章才会碰真实的预训练模型。

  • 生成策略缺了今天最常用的两员。第一员:温度(控制随机度的旋钮)抽样。

第二员:top-p(只保留累计可能性够高的候选)截断。

原书只讲了确定性(同输入必同输出)挑法,这也是它所有演示输出可复现的原因。

补充(不在书里,来自通用知识):这两个旋钮几乎出现在所有大模型 API(程序对接的插口)里,值得另行补课。

  • BLEU/ROUGE 对开放式生成(聊天、创作)基本失灵——没有唯一「参考答案」可比;原书给了尺子,没说清尺子的适用范围,这里补一句。

  • 2.3 节的「模拟的 GPT 模型」是原书自造的教学装置(词嵌入(把词变一串数)+全连接(最普通的接法:每个输入都连到每个输出)层),不是 GPT 架构本身;困惑度的量法(交叉熵取指数)是真的,载体是假的。

6. 可带走的

  1. 生成 = 单向注意力 + 自回归循环;每写一个词,整台机器重跑一遍——这就是为什么写长文慢、贵。
  2. 单向掩码不是新零件,是给第 1 章的注意力打分表遮掉「未来」那一半。
  3. Greedy 逐点最优、Beam 全局较优;要多样性和质量上 Beam(或随机抽样),要速度用 Greedy。
  4. 三把尺子各有分工:BLEU 管精确、ROUGE 管覆盖、困惑度管模型自身的犹豫程度;任何一把单独用都会被骗。
  5. 困惑度的直觉单位是「平均在多少个候选里犹豫」;微调+学习率调度能把它一路压下去。
  6. StepLR 这类调度器的作用:训练后期把步子变小,防止在最优点附近来回震荡。
  7. 评估生成文本时先问:这任务有没有唯一参考答案?没有就别指望 BLEU/ROUGE。

7. 原文地图

主题原书章原文位置
章导语:以 GPT-2 为切入点第2章text/12-ch02.txt:24(搜「以GPT-2为切入点」)
层堆叠结构2.1text/13-ch02-01-2-1.txt:33(搜「层堆叠」)
单向自回归注意力、防泄露2.1text/13-ch02-01-2-1.txt:118(搜「单向的自回归注意力」) · text/13-ch02-01-2-1.txt:136(搜「泄露未来信息」)
自回归生成流程2.2text/14-ch02-02-2-2.txt:33(搜「逐步生成下一个词」) · text/14-ch02-02-2-2.txt:36(搜「循环往复」)
Greedy vs Beam 与束宽2.2text/14-ch02-02-2-2.txt:96(搜「束宽」) · text/14-ch02-02-2-2.txt:99(搜「挑选水果」)
两种挑法的分道序列2.2text/14-ch02-02-2-2.txt:144(搜「Greedy Search生成的文本序列」)
BLEU/ROUGE/困惑度定义2.3text/15-ch02-03-2-3.txt:33(搜「Bilingual Evaluation Understudy」) · text/15-ch02-03-2-3.txt:36(搜「召回率」)
困惑度=交叉熵取指数2.3text/15-ch02-03-2-3.txt:57(搜「取指数」)
BLEU 1.0 与 0.85 对照2.3text/15-ch02-03-2-3.txt:165(搜「0.85」)
StepLR 与困惑度下降2.3text/15-ch02-03-2-3.txt:217(搜「StepLR」) · text/15-ch02-03-2-3.txt:226(搜「98.2345」)
四条调优叮嘱2.3text/15-ch02-03-2-3.txt:266(搜「实际可读性或逻辑性」) · text/15-ch02-03-2-3.txt:272(搜「梯度爆炸」) · text/15-ch02-03-2-3.txt:278(搜「过拟合到特定的数据集」) · text/15-ch02-03-2-3.txt:284(搜「噪声较多的低质量数据」)

Footnotes

  1. 出处:「第2章 GPT模型文本生成核心原理与实现」第 24 段(text/12-ch02.txt:24,搜「以GPT-2为切入点」)。

  2. 出处:「2.1 GPT-2核心模块」第 33 段(text/13-ch02-01-2-1.txt:33,搜「层堆叠」)。原书:「每一层包含自注意力机制和前馈神经网络……最后利用残差连接与层归一化稳定信息流动」。

  3. 出处:「2.1 GPT-2核心模块」第 118 与 136 段(text/13-ch02-01-2-1.txt:118,搜「单向的自回归注意力」;text/13-ch02-01-2-1.txt:136,搜「泄露未来信息」)。

  4. 出处:「2.2 GPT模型的文本生成过程」第 33 与 36 段(text/14-ch02-02-2-2.txt:33,搜「逐步生成下一个词」;text/14-ch02-02-2-2.txt:36,搜「循环往复」)。

  5. 出处:「2.2 GPT模型的文本生成过程」第 96 段(text/14-ch02-02-2-2.txt:96,搜「局部最优」)与第 105 段(搜「最甜的水果」)。

  6. 出处:「2.2 GPT模型的文本生成过程」第 96 段(text/14-ch02-02-2-2.txt:96,搜「束宽」)。

  7. 出处:「2.2 GPT模型的文本生成过程」第 144-147 段(text/14-ch02-02-2-2.txt:144,搜「Greedy Search生成的文本序列」)。

  8. 出处:「2.3 模型效果评估与调优」第 33 段(text/15-ch02-03-2-3.txt:33,搜「Bilingual Evaluation Understudy」)。

  9. 出处:「2.3 模型效果评估与调优」第 36 与 54 段(text/15-ch02-03-2-3.txt:36,搜「召回率」;text/15-ch02-03-2-3.txt:54,搜「rouge_scorer」)。

  10. 出处:「2.3 模型效果评估与调优」第 57 段(text/15-ch02-03-2-3.txt:57,搜「取指数」)。

  11. 出处:「2.3 模型效果评估与调优」第 66 与 165 段(text/15-ch02-03-2-3.txt:66,搜「1.0」;text/15-ch02-03-2-3.txt:165,搜「0.85」)。

  12. 出处:「2.3 模型效果评估与调优」第 266 段(text/15-ch02-03-2-3.txt:266,搜「实际可读性或逻辑性」)。

  13. 出处:「2.3 模型效果评估与调优」第 272 段(text/15-ch02-03-2-3.txt:272,搜「梯度爆炸」)。

  14. 出处:「2.3 模型效果评估与调优」第 278 段(text/15-ch02-03-2-3.txt:278,搜「过拟合到特定的数据集」)。

  15. 出处:「2.3 模型效果评估与调优」第 284 段(text/15-ch02-03-2-3.txt:284,搜「噪声较多的低质量数据」)。

  16. 出处:「2.2 GPT模型的文本生成过程」第 99 段(text/14-ch02-02-2-2.txt:99,搜「挑选水果」)。