跳到主要内容

让它造 — 看前 40 个字符猜第 41 个,外加一个叫 temperature 的旋钮

这一章讲三件事: 「造东西」这个任务怎么被改写成模型做得了的样子; 造得好不好凭什么判断;以及为什么不能每一步都挑最好的那个。 它在全书链条里的位置: 第 14 章的模型已经会吐出一整串字符了, 但那一串的答案是被输入唯一确定的——输入写着 2034,输出就必须是 2034。 这一章要的是没有唯一答案的东西,所以连「对不对」都得重新定义。

1. 先说清楚这一章和上一章差在哪

上一章那个日期转换模型确实在一个一个地吐字符,看起来已经在「造」了。

但书自己在这一章开篇就把这条界线划开了1:

上一章的日期格式转换示例明显不适用于本章的文本生成任务。 这是因为此处既没有明确的输入序列,也无法准确地定义输出是什么

上一章: 输入「JUL 18, 2034」 → 正确答案只有一个:「2034-07-18」
**答错了当场就知道**

这一章: 输入「一个莎士比亚风格的开头」 → 正确答案有无穷多个
**「答对了」根本没有定义**

图说:所以这一章要先解决的不是模型结构,**是怎么把这个任务变成一道有答案的题。**

顺便定两个名字

书在这里把全书的模型分成了两类2:

干什么例子
判别式模型把输入映射成一个数或一个类别,不关心这个输入是怎么来的前十四章全部——房价、钓鱼网站、鸢尾花、手写数字、语音口令
生成式模型在数学上模仿样例是怎么被生成出来的这一章开始的东西

书还给了一句有点大的判断:生成式模型一旦学会了怎么生成,它也能拿去做判别的活; 所以相比之下,它对数据的理解要更透彻2这句话书没有给证据,第 8 节会再说。

2. 承重节:把「造」改写成「猜下一个字符」

这一节是本章的地基,而且它的做法朴素到会让人怀疑。

只训一件事

给它前 40 个字符,让它猜第 41 个。

输入:「Love looks not with the eyes, b」
它该猜:「u」

就这一件事,反复训几万次。

图说:**没有语法、没有词典、没有任何关于英语的知识被写进去。**

那怎么生成一整段

把猜出来的那个字符接到末尾,再把最前面那个丢掉,窗口右移一格,再猜一次3:

第 1 步:窗口「Love looks not with the eyes, b」 → 猜出「u」
第 2 步:窗口「ove looks not with the eyes, bu」 → 猜出「t」
└ 最前面的 L 被丢掉,末尾接上了 u
第 3 步:窗口「ve looks not with the eyes, but」→ 猜出下一个
……一直到你想要的长度为止

开头那 40 个字符从哪儿来?**从原文里随便截一段**就行[^3]。

图说:这和第 14 章推断时那个「把自己吐的接回去」是同一个动作,
**区别是那里窗口一直在变长,这里窗口长度固定、整个往右滑。**

这一改,任务就变回了老朋友

书把这一步说得很清楚:序列生成任务就此变成了序列分类任务4

莎士比亚数据集里一共有 **71** 种不重复的字符
(大小写字母、标点、空格、换行符,以及其他特殊字符)

→ 每一步做的事是:**71 选 1**

这就是第 05 章那种多分类,只是类别从 3 个变成了 71 个。

图说:所以损失用的还是那把老尺子——分类交叉熵;
优化器用 RMSProp,因为书说这是循环网络的常见选择[^5]。

这是这一章最该记住的一句话:

「让机器写作」这件事,在实现层面上就是一道 71 选 1 的选择题,连做几千次。

3. 模型长什么样

结构简单到可以一眼看完5:

输入 [40, 71] ← 40 个字符,每个字符用 71 个格子表示(第 13 章那种写法)

LSTM 128 单元(**要求它把每一步的输出都留着**)

LSTM 128 单元(这一层只留最后一步)

密集层 71 单元 + 归一化指数函数

输出 [71] ← 下一个字符是这 71 种的概率各是多少

图说:两层 LSTM 摞在一起,书管这叫**堆叠**。
道理和第 04 章「多摞几个密集层能加容量」一样;
**要点只有一条:下面那层必须把每一步的输出都吐出来,上面那层才有序列可吃**[^7]。

4. 猜得准不准,凭什么判断

第 03 章那条纪律在这里也要用:一个损失数字自己不会说话。

这个任务的参照物很特别——它来自 1951 年一个用人做的实验6:

香农(信息论的奠基人)让人看一段英文,猜下一个字母是什么。
据此他估出:**英文里每个字母平均携带约 1.3 位信息。**

作为对照:26 个字母完全随机排列时,每个字母携带 lb(26) = **4.7 位**。

1.3 远小于 4.7 —— 这个差值量的正是「英文不是乱排的」这件事:
有些字母序列才是单词、有些词序才合语法、有些句子才说得通。

图说:**这个 1.3 就是这一章的地板。**
一个完美的英文续写模型,损失最低也就到这个量级。

这里有个数容易安错地方:那个 4.7 说的是 26 个英文字母, 不是这份莎士比亚文本的 71 个字符。71 个字符等概率瞎猜要 lb(71) ≈ 6.15 位 ——这个数是我们算的,书里没有;书拿来当对照的自始至终是 26 个字母那个 4.7。

书的模型跑出来的数7:

轮次验证损失
52.44
251.96
501.67
1001.61
1201.49

起点约 3.2,收敛在 1.4~1.5 之间——离香农那个 1.3 已经不远7

书立刻自己泼了盆冷水: 就这个训练流程和这点模型容量而言, 生成的文本离真正的莎士比亚水平其实还差得远7这句坦白很值钱——损失接近下限,不等于写得像。

5. 第二个承重节:为什么不能每步都挑最好的

这一节回答一个几乎所有人第一反应都会答错的问题。

先看现象

每一步都挑概率最高的那个字符,听起来天经地义。结果是这样的8:

训到 120 轮、损失已经降到 1.49 的模型,每步挑最高分,吐出来的是:

「ve the strike the strike the strike the strike ……」

训到 100 轮时是:「nd the sought the sought That the more the man the forth……」

图说:**它掉进了复读。** 而且注意,这不是模型没训好 ——
这是同一个模型,换个挑法就正常了。

为什么必然如此

书给的解释是:这么挑,整个生成过程就是确定性的9

同一个开头,跑一万次,**输出一模一样。**

前十四章的模型全都是确定性的 —— 给定输入,输出由结构和权重完全决定,
**你甚至可以给它写单元测试去断言输出值**(第 20 章会讲这件事)。

但书说:**这种确定性对写作是无益的,因为写作是创造性的过程。**

图说:更要命的是,一旦某个字符组合的概率略高,它就会被反复选中,
**然后这个组合又成了下一步的输入 —— 自己把自己锁死。**

解法:掷一次骰子

不选最高的,而是按概率随机抽一个10:

模型说: 「t」0.7 「s」0.2 「x」0.1

挑最高: 永远是「t」
随机抽: 七成的时候是「t」,两成是「s」,一成是「x」

图说:书的形容很准 —— 这就像掷一个**被动了手脚的骰子**,
每一面出现的概率不一样,由模型给的那串概率决定。

但这样又太野了。所以需要一个旋钮,能在「太死板」和「太胡来」之间拧。

6. 那个旋钮:它的名字你出门天天见

它怎么工作

三步,而且可以当场验算11:

① 把模型给的概率取对数
② 除以一个数(就是这个旋钮的值)
③ 再过一遍归一化指数函数,变回一组概率

拿书里那个例子:模型给的原始概率是 [0.1, 0.7, 0.2]

旋钮拧到 0.25(低):
log([0.1,0.7,0.2]) / 0.25 = [−9.2103, −1.4267, −6.4378]
变回概率 → **[0.0004, 0.9930, 0.0066]**
↑ 0.7 被抬到了 0.993,另外两个几乎归零 —— **几乎就是在挑最高的了**

旋钮拧到 0.75(高一些):
log([0.1,0.7,0.2]) / 0.75 = [−3.0701, −0.4756, −2.1459]
变回概率 → **[0.0591, 0.7919, 0.1490]**
↑ 差距明显小了,但仍比原分布集中

旋钮拧到 1: **原分布,一点不变**
旋钮拧到 1 以上: 更平均,更随机

图说:**排序自始至终没有变过** —— 0.7 那一项永远是最大的[^13]。
变的只是**它比另外两项大多少**。

它叫什么

上面那个旋钮——概率取对数、除以它、再归一化的那个数——中文版把它译作「混沌值」, 而它的原名是 temperature,字面意思就是「温度」12

书解释了这个名字的来历:它借自热力学,那里的温度越高,系统内部越混乱无序—— 这里也一样:这个数越大,吐出来的字越不可预测。

这个名字必须留住,因为你出门会天天撞见它。 补充(不在书里,来自通用知识): 今天任何一家大模型的调用接口里都有一个 temperature 参数,它就是这里这个数,做的事一模一样。 这是这本 2019 年的书里,活到今天一个字没改的东西。

拧到不同位置,吐出来的东西不一样

书印了一整张表,同一个模型、同一个开头,四个旋钮位置各吐一段13:

旋钮位置吐出来大概是什么样
0(纯挑最高)复读:同一小段反复出现
0.25还是很重复,但开始有变化
0.5词大多是真词,句子结构开始像样
0.75(书的默认值)乍一看像英文,但有些词根本不是英文——书自己举了两个模型造出来的假词

书给了一句很实在的经验:这个旋钮有一个「绝佳的平衡点」, 低于它文本重复又机械,高于它文本过于不可测和怪异12但书没有给这个平衡点是多少,也没有给找它的办法。

7. 主走查:一个 40 字符的窗口走完全程

这一章每个承重机制在这条走查上各占一步。数字全部来自书里,标注除外。

发生了什么具体的数 / 状态
1从莎士比亚文本里随便截 40 个字符当开头书用的那一段结尾是「…and lo」
2每个字符换成 71 个格子里点亮一个输入形状 [40, 71];71 是这份文本里不重复字符的个数
3过两层堆叠的 LSTM,各 128 单元下面那层必须把每一步的输出都留着,上面那层才有序列可吃
4密集层 + 归一化指数函数输出 [71]——下一个字符是这 71 种的概率各是多少
5诊断任务性质这是一道 71 选 1 的多分类题;损失用分类交叉熵
6训练:损失怎么走3.2 → 2.44(5 轮)→ 1.96(25 轮)→ 1.67(50 轮)→ 1.49(120 轮)
7拿参照物比一比香农测的人类下限约 1.3 位;26 个字母完全随机排列是 4.7 位
8判断收敛到 1.4~1.5,离下限不远;但书自己说离真莎士比亚还差得远
9挑字符,做法一:挑概率最高的输出「ve the strike the strike the strike……」——掉进复读
10诊断这么挑是确定性的:同一个开头跑一万次输出一样,而且会自己锁死自己
11做法二:按概率掷骰子拿到 [0.1, 0.7, 0.2],七成抽第二个,两成抽第三个,一成抽第一个
12加旋钮,拧到 0.25概率变成 [0.0004, 0.9930, 0.0066]——几乎退化成挑最高的
13拧到 0.75概率变成 [0.0591, 0.7919, 0.1490]——留了明显的余地
14拧到 1原样不变
15无论拧到哪,有一件事不变三项的大小排序一模一样;变的只是差距
16把抽中的字符接到窗口末尾,丢掉最前一个窗口还是 40 个字符,整个往右滑一格
17回到第 3 步,再来一次一直到要的长度
18收账拿到了「会造」;代价是从此没有一把尺子能判断输出好不好——损失只能量「猜得准」

8. 作者的判断与证据

书里给了证据的:

  • 损失从 3.2 降到 1.4~1.5。 书印了一张五行的表,每一轮的验证损失都有7
  • 旋钮的三个算例。 [0.1,0.7,0.2] 在 0.25、0.75、1 下各变成什么,数字全给了,可以验算11
  • 挑最高会复读。 书印了实际生成的文本,四个旋钮位置各一段13
  • 香农 1.3 位。 给了论文年份和标题6

属于作者判断、书里没给证据的:

  • 「生成式模型对数据的理解更透彻」。 这是一句立场性的判断, 书没有给任何实验或引文来支撑它2
  • 「旋钮有一个绝佳的平衡点」。 没有给这个点是多少,也没有给找它的办法12
  • 「RMSProp 是循环网络的常见选择」。 经验默认值14
  • 「同一套方法稍加调整就能自动谱曲」。 书给了一篇外部文章作为方向, 但这本书里没有做这件事15

书自己坦白的:

  • 生成的文本离真莎士比亚还差得远,即便损失已经接近香农的下限7

判断(我们的,不是书里的): 这一章最反直觉的一点,不是 temperature,是第 2 节那个改写。 「造一段像莎士比亚的文字」这个模糊到没法评分的任务,被换成了 「71 选 1,连做几千次」这个可以精确评分的任务——而换完之后, 原任务并没有真的被解决,只是被绕开了。 损失降到 1.49 说明它猜下一个字符猜得准;「写得像不像」始终没有一把尺子。 这个缺口会一直跟到第 17 章:那一章的模型连损失曲线都读不了。 如果错,会错在: 如果你要的只是「像那种风格的填充文本」而不是好文章, 那这个绕法就是解法本身,不存在缺口。

9. 边界与局限

  • 它是按字符猜的,不是按词。 所以它会造出「乍看像英文但不是英文」的假词—— 书自己举了两个13
  • 它没有任何长距离的记忆。 窗口只有 40 个字符,再往前的内容它看不见。 第 12 章那条硬伤在这里直接变成了「写不出有结构的段落」。
  • 「好不好」没有尺子。 损失只量「猜下一个字符准不准」, 和「这段文字好不好」不是一回事。书没有讨论怎么评估生成质量。
  • 那个「绝佳平衡点」书没给。 只说存在。
  • 模型很小。 两层各 128 单元;书明说以这点容量,结果离真莎士比亚差得远。
  • 没有讲怎么让它停。 生成到指定长度就停,没有「这段话说完了」这种判断。
  • 和第 14 章那个「集束搜索」没有连起来。 那一章说「同时留几条路更好」, 这一章说「故意别挑最好的」——两个方向相反的做法,书没有放在一起比较。

10. 可带走的

  1. 这一章和上一章的分界线:上一章的答案由输入唯一确定,这一章没有唯一答案, 所以连「对不对」都要重新定义;
  2. 全书的模型分两类: 前十四章全是判别式的(把输入映射成一个数或类别), 这一章开始是生成式的;
  3. 造文本的机制朴素到反常:只训一件事——看前 40 个字符猜第 41 个;
  4. 生成一整段的办法:把猜出来的接到末尾、丢掉最前一个,窗口右移一格,再猜;
  5. 这一改,「生成」就变回了一道 71 选 1 的多分类题,尺子还是分类交叉熵;
  6. 猜得准不准有参照物: 香农 1951 年测出英文每字母约 1.3 位, 而 26 个字母完全随机排列是 4.7 位;模型从 3.2 降到 1.4~1.5;
  7. 但损失接近下限 ≠ 写得像。 书自己说离真莎士比亚还差得远;
  8. 每步挑概率最高的会立刻复读,因为那样整个过程是确定性的,而且会自己锁死自己;
  9. 解法是按概率掷骰子,再加一个旋钮:概率取对数 → 除以旋钮值 → 归一化。 [0.1,0.7,0.2] 在 0.25 下变 [0.0004,0.9930,0.0066],在 0.75 下变 [0.0591,0.7919,0.1490];
  10. 无论旋钮拧到哪,排序永远不变——变的只是差距;拧到 1 就是原样;
  11. 这个旋钮中文版叫「混沌值」,原名是 temperature 它原封不动活到了今天每一家大模型的接口里,是这本书里最长寿的一样东西 (补充(不在书里,来自通用知识),依据见本章 §6)。

11. 原文地图

主题原书章原文位置
生成式模型的用途与实例第 10 章text/22-ch10.txt:15(搜「生成式模型」)
判别式与生成式的分野第 10 章text/22-ch10.txt:25(搜「判别式模型」)
这个任务和上一章的日期转换不同第 10 章text/22-ch10.txt:43(搜「无法准确地定义输出是什么」)
下个字符预测;窗口左移拼接第 10 章text/22-ch10.txt:45(搜「Love looks not with the eyes」)
序列生成变成序列分类第 10 章text/22-ch10.txt:49(搜「序列分类任务」)
香农 1951:每字母 1.3 位;随机排列 4.7 位第 10 章text/22-ch10.txt:51(搜「1.3位」) · text/22-ch10.txt:55(搜「4.7位」)
堆叠 LSTM;returnSequence 的作用第 10 章text/22-ch10.txt:78(搜「堆叠」) · text/22-ch10.txt:82(搜「returnSequence」)
输入形状 [40, 71];71 个字符第 10 章text/22-ch10.txt:84(搜「charSetSize的尺寸为71」)
输出层与损失、优化器第 10 章text/22-ch10.txt:109(搜「多分类任务」) · text/22-ch10.txt:113(搜「RMSProp」)
损失从 3.2 收敛到 1.4~1.5;离真莎士比亚差得远第 10 章text/22-ch10.txt:121(搜「1.4~1.5」)
四个 temperature 取值下的生成样例表 10-1第 10 章text/22-ch10.txt:123(搜「基于LSTM的下个字符预测模型生成的文本」) · text/22-ch10.txt:162(搜「strike」)
为什么不直接挑最高的:确定性第 10 章text/22-ch10.txt:175(搜「argMax」) · text/22-ch10.txt:177(搜「确定性」)
随机采样与「动了手脚的骰子」第 10 章text/22-ch10.txt:189(搜「动了手脚的多面骰子」)
temperature 的三步算法与两个算例第 10 章text/22-ch10.txt:201(搜「-9.2103」) · text/22-ch10.txt:205(搜「0.9930」) · text/22-ch10.txt:212(搜「0.7919」)
排序不变;拧到 1 无变化第 10 章text/22-ch10.txt:213(搜「大小排序是不变的」)
名字来自热力学;存在绝佳平衡点第 10 章text/22-ch10.txt:219(搜「来自热力学」)
同一套方法可以拿去谱曲第 10 章text/22-ch10.txt:31(搜「谱曲」) · text/22-ch10.txt:219(搜「自动谱曲」)

Footnotes

  1. 出处:「第 10 章 生成式深度学习」第 43 段(text/22-ch10.txt:43,搜「无法准确地定义输出是什么」)。原文原话是:「在上一章的日期格式转换示例中……然而,这明显不适用于本章的文本生成任务。」

  2. 出处:「第 10 章」第 25 段(text/22-ch10.txt:25,搜「判别式模型」)。原文把前面各章的模型(房价预测、钓鱼网站检测、鸢尾花分类、手写数字分类、语音口令识别)全部归入判别式一类,并说生成式模型「对数据的理解要更为透彻」——这一句没有配任何证据或引文。 2 3

  3. 出处:「第 10 章」第 45 段与图 10-1 说明(text/22-ch10.txt:45,搜「Love looks not with the eyes」)。原文说明起始文本可以「随机从文本数据集采集一小段」。

  4. 出处:「第 10 章」第 49 段(text/22-ch10.txt:49,搜「序列分类任务」)。原文把它和第 9 章 IMDb 情感分析对照,区别只在于类别数从 2 变成了字符集合的大小。

  5. 出处:「第 10 章」代码清单 10-1 与第 84 段(text/22-ch10.txt:84,搜「charSetSize的尺寸为71」)。原文说明网页版把窗口长度硬编码为 40,LSTM 单元数默认 128,填两个逗号分隔的数字就会堆叠两层。

  6. 出处:「第 10 章」第 51~55 段与第 53 段脚注(text/22-ch10.txt:51,搜「1.3位」;text/22-ch10.txt:55,搜「4.7位」)。脚注给的出处是克劳德·香农 1951 年的论文「Prediction and Entropy of Printed English」。 2

  7. 出处:「第 10 章」第 121 段与表 10-1(text/22-ch10.txt:121,搜「1.4~1.5」)。表里逐轮的验证损失见第 133、140、147、154、161 段。原文的坦白是:「就我们现在的训练流程和模型容量而言,生成的文本离真正的莎士比亚作品水平其实还差得远。」 2 3 4 5

  8. 出处:「第 10 章」表 10-1 第 162 段(text/22-ch10.txt:162,搜「strike」)。那一行是训练 120 轮、旋钮为 0 时生成的文本。

  9. 出处:「第 10 章」第 175~177 段(text/22-ch10.txt:175,搜「argMax」;text/22-ch10.txt:177,搜「确定性」)。原文:「这种决定性对文本生成任务而言是无益的。毕竟,写作是创造性的过程。」同段还提到可以给确定性模型写单元测试断言输出,并回指第 12 章(我们的第 20 章)。

  10. 出处:「第 10 章」代码清单 10-2 第 189 段(text/22-ch10.txt:189,搜「动了手脚的多面骰子」)。

  11. 出处:「第 10 章」第 196~213 段(text/22-ch10.txt:201,搜「-9.2103」;text/22-ch10.txt:205,搜「0.9930」;text/22-ch10.txt:212,搜「0.7919」;text/22-ch10.txt:213,搜「大小排序是不变的」)。原文的三步是:取对数、除以旋钮值、再用归一化指数函数变回概率。 2

  12. 出处:「第 10 章」第 219 段(text/22-ch10.txt:219,搜「来自热力学」)。中文版把 temperature 译作「混沌值」,并在第 171 段加了一条译者注说明这个译法(text/22-ch10.txt:171,搜「译者注」)。原文同段说这个旋钮有一个「绝佳的平衡点」,但没有给出这个点的数值。 2 3

  13. 出处:「第 10 章」表 10-1,第 123~167 段(text/22-ch10.txt:123,搜「基于LSTM的下个字符预测模型生成的文本」;text/22-ch10.txt:169,搜「stratter」)。原文指出旋钮 0.75 下生成的字符序列「乍一看像英文,但实际不是英文」,并举了模型造出来的两个假词。 2 3

  14. 出处:「第 10 章」第 113 段(text/22-ch10.txt:113,搜「RMSProp」)。原文说选 RMSProp「因为这是循环神经网络的一种常见选择」。

  15. 出处:「第 10 章」第 31 与 219 段(text/22-ch10.txt:31,搜「谱曲」;text/22-ch10.txt:219,搜「自动谱曲」)。原文说同一套方法「稍加调整就可应用到很多其他类型的序列上」,并给了绘画、生成汉字等方向的外部引文。