跳到主要内容

一次只添加一个词 — 生成到底是怎么发生的

这一章讲三件事: 你看到字一个个冒出来时,它在重复什么动作; 那些「可能性」是从哪儿来的;以及为什么这件事只能靠「算」,不能靠「查」。 读完你会拿到全书的第一条推理链——这条链后面六章都在往下接。 不需要任何基础,遇到的生词都在当场解释。

1. 先看现象:字是一个一个蹦出来的

你用它的时候,回答不是「唰」地整段出现,而是一个字一个字往外冒。

那不是动画效果,那就是它真实的工作节奏。

它在反复回答同一个问题:

「照目前这段文字,下一个词该是什么?」 问一次,写一个词,把加长后的文字再喂回去,重新问一遍。

没有「先构思、再打草稿、最后润色」这样的阶段。每一步它都现算一张清单: 哪些词可能接在后面,各自的可能性有多大。然后挑一个接上去,再算下一张1

你输入:「今天天气」

├─ 算一张清单 → 很好 40% / 不错 25% / 怎么样 15% / 预报 5% / …
│ 挑中「很好」,接上去

现在是:「今天天气很好」

├─ 再算一张清单 →(从头再来一遍)

……一直到它算出「该停了」为止

图说:每一步都是独立的一次计算,前一步的清单算完就丢掉了。
**这四个百分比是为演示编的,不是真实数值。**

这张清单是本章的主走查。 下面每一节都会回到它: 第 2 节看它上面那些「词」到底是什么单位,第 3 节看怎么从它里面挑, 第 5 节看它是从哪儿来的。

一句要记住的话:它追求的是「像」,不是「对」

书里对「该接什么」给的定义,值得原样记住:看过海量人类写的文字之后, 人们大概率会接着这么写2

注意这句话里没有「正确」两个字。

它拿来当好坏标准的从来就不是「说对」,而是「像人会写的」。 后面所有「它为什么会一本正经地胡说」的现象,根子都在这一句上—— 胡说不是它坏了,是它在忠实地执行「写得像」。

2. 它吐出来的不是「词」,是「标记」

这一节只解释一个词,但这个词后面每一章都会用到。

前面为了好懂,我一直说「词」。严格说,它每次添加的是一个「标记」。

标记就是它切分文字的最小单位。 它可能是一个完整的词,也可能只是词的一小截—— 英文里像 pre、ing、ized 这样的词头词尾,都各自算一个标记3

这解释了两个你可能遇到过的现象:

  • 它偶尔会造出不存在的词。 因为它是在拼片段,不是从字典里挑整词;
  • 生僻词、外语、中文它都能处理。 因为不需要有谁事先把这个词整个存进去,拆成片段就行。

往后本文一律说「标记」,只在讲直觉的地方才用「词」——那时说的是同一件事。

回到那张清单:走查第 ① 步

第 1 节那张清单的输入写的是「今天天气」。在它眼里,这不是两个词,而是四个标记:

你打进去的 今天天气
它切成 「今」「天」「天」「气」 四个标记
它要回答的 这四个标记后面,第五个标记是什么

图说:**这个切法是为演示编的**;真实切法取决于每个模型自己那份表,
中文常常一个字一个标记,英文则常常几个字母一个标记。

所以那张清单严格说不是「『今天天气』后面接哪个词」, 而是「这四个标记后面接哪个标记」——「很好」在清单上其实是「很」和「好」两步。

3. 一个反直觉的设计:它故意不挑最高分

这一节回答:为什么同一个问题问两遍,答案不一样。

先看现象

你大概遇到过:同一句话问它两遍,两次回答不一样;或者让它重写,它真的能给出另一版。

这不是它记性不好,是设计里故意加进去的随机。

为什么要故意随机

有了那张可能性清单,最自然的做法是每次都挑分最高的那个。但那样写出来的东西会很平淡, 一点「创造力」都没有,严重时甚至会一字不差地重复前面写过的话4

所以真实做法是:有时候故意挑排名靠后的词。

挑得多大胆,由一个可以调的设定控制,这个设定叫温度:

温度它怎么挑你会看到什么
0(书里叫「零温度」)每次都挑最高分稳定但平淡,写长了会开始混乱和重复5
0.8(书里说写文章用这个最好)大多挑高分,偶尔挑冷门有变化又不跑偏
更高冷门词大量出头更「有想法」,也更容易胡说

回到那张清单:走查第 ② 步

拿第 1 节那张清单看一眼温度到底在动什么(这些数是为演示编的):

清单 很好 40% 不错 25% 怎么样 15% 预报 5% …

温度 0 永远挑「很好」。问一百遍,一百遍都是「今天天气很好」
温度 0.8 大多数还是「很好」,但大约每四次里有一次会挑到「不错」
更高 连「预报」这种排在第四位的也常常被挑中,句子开始跑偏

图说:清单一张都没变,变的只是「照这张清单怎么挑」。

关键在最后一句:温度不改那张清单,只改挑法。 它算出来的可能性是同一套,你调的是「要不要按可能性老实挑」。

这里有一个态度问题,比数字重要

0.8 这个数是试出来的,不是推出来的。

作者说得很直白:这里没有用任何理论。「温度」这个名字借自统计物理, 但和物理学之间并没有任何实际联系6

判断(我们的,不是书里的): 这是整本书第一个值得带走的态度—— 这个行业里相当一部分默认值属于「试出来发现有效」,不是「推导出来的」。 以后遇到一个说不出所以然的默认设定,先假设它属于这一类,而不是假设背后有深意。 如果错,会错在: 如果某个默认值其实有推导过程而我们没查, 就会把本来可以调好的东西当成玄学放过。

一个实用的副作用:温度调起来不是均匀的

清单上的可能性掉得非常快:头几个词占掉了绝大部分,后面拖着一条很长很长的尾巴—— 成百上千个词,每个都只有极小的机会7

所以温度调起来手感不均匀: 往上调一点,冷门词才刚开始有机会; 调过某个位置之后,输出会突然从「有变化」滑向「胡说」。

4. 那张清单是怎么算出来的:先看行不通的办法

这一节说明一件事:最容易想到的办法,在物理上就是走不通的,所以必须换路。

最容易想到的办法:数数

拿一大堆文字来数:每个词后面各接过什么、各接过多少次。数完就有了可能性清单。

书里先用最简单的版本演示——不数词,数字母:拿维基百科上「猫」和「狗」两个条目, 数每个字母出现多少次8。样本够大时,各字母的频率会稳定下来。

然后一步步加码:

数什么生成出来像什么
单个字母的频率纯乱码
加上「词一般多长」像词的形状,但没有一个是真词
两个字母一组去数开始蹦出几个真词(比如 q 后面几乎一定跟 u,一数就知道)
三个、四个一组越来越像英文
整个词,几个一组去数理论上「基本上会得到一个 ChatGPT」

最后一行是关键:这条路在道理上是通的,在现实中走不通。

为什么走不通:组合爆炸

先解释这个词。组合爆炸的意思是:每多考虑一个位置,可能的组合数就翻很多倍, 很快就多到没法一一列举。

用书里的数字看最清楚——英语常用词大约 4 万个9:

一次考虑几个词可能的组合数数得过来吗
两个词一组16 亿勉强
三个词一组60 万亿不够数
二十个词一组比宇宙中的粒子还多永远不可能列出来

那我们手上有多少文字可数?网上爬下来的大概几千亿个词,电子书再几百亿10 (这一大堆拿来喂给机器读的文字,行话叫语料)。

差了太多个数量级。 不是「再多收集一点就够了」,是原理上永远不够

这一步的结论要记住: 不是「数数这个思路不好」, 而是这条路被物理性地堵死了。剩下唯一的出路是——不查表,改成算。

5. 「模型」这个词到底什么意思

这一节解释全书最重要的一个词。 你以后看到的「大模型」「它有多少亿个数」, 说的都是这一节的东西。

书里的例子

想知道从比萨斜塔各层扔下炮弹,分别要多久落地。

  • 办法一: 每层都上去扔一次、测一次,记成一张表;
  • 办法二: 找出一条规律,让没测过的楼层也能算出来11

办法二就是模型。

模型 = 用一条规律,替代一张列不完的表。

关于模型,书里点了两件容易被忽略的事

第一,模型里一定掺着你的猜测。

同一批测出来的数据,你可以拿一条直线去凑,也可以拿更弯的曲线去凑。 为什么先试直线?作者的回答很老实:「在某种程度上说,我们并不知道」—— 只是因为直线在数学上简单,而且我们习惯了很多测量能被简单的式子对上。 换个更复杂的式子,可能更准,也可能出大问题12

第二,从来没有「不带模型的模型」。

任何模型都是两部分:一个固定的结构,加上一堆可以拧的旋钮。 数据不对就拧旋钮,拧到对上为止。

书里把这些旋钮叫「旋钮」只是为了好懂,它们的正式名字是「参数」

ChatGPT 有 1750 亿个参数——上一代那个模型只有 15 亿个,两年之间翻了一百多倍; 而它每吐出一个字,这 1750 亿个数都要全部参与一遍计算13

「旋钮」这个说法到此为止,后文一律叫参数。 顺便记住一组等价的叫法:

权重就是参数,同一样东西的两个名字;书里那个「旋钮」也是它,三个词说的是同一件事。 你以后看到「70B 模型」,说的就是「这个模型有 700 亿个参数」—— 只有 ChatGPT 那 1750 亿的五分之二。

回到那张清单:走查第 ③ 步

现在可以把第 1 节那句话说准了。「很好 40% / 不错 25% / 怎么样 15%」这张清单, 不是从哪张表里查出来的,是当场算出来的——用的正是这 1750 亿个参数。

「今」「天」「天」「气」这四个标记
│ 1750 亿个参数全部参与一遍

一张清单:很好 40% / 不错 25% / 怎么样 15% / 预报 5% / …
│ 按温度挑一个

「很」——接到文末,再来一遍,1750 亿个参数再全部参与一遍

图说:每挑一个标记,这 1750 亿个数就全部走一遍。**这些百分比是为演示编的。**

到这里,全书的第一条链条完整了:

想要一张「下一个词」的可能性清单
└─ 数数? ── 组合爆炸,语料永远不够 ── 此路不通
└─ 那就学一条规律(模型)── 没见过的组合也能算
└─ 可是语言有现成的公式可用吗?── 见下一节

图说:每一层都是被上一层逼出来的,不是设计者自己想这么做。

6. 为什么语言不能照搬物理的做法

这一节回答:既然模型这么好用,为什么讲语言要多绕一大圈。

炮弹落地能用简单式子算,是因为几百年来我们已经知道该用什么式子。 语言是人脑产生的东西,我们(至少目前)没有现成的简单式子可用。

作者不直接讲语言,而是先讲一个更容易看清的例子:认手写的数字。

笨办法和人的差距

笨办法是一个像素一个像素地跟已有样本比对。但人明显比这强得多—— 手写的数字歪歪扭扭、有涂抹,我们照样认得出14

那能不能造一个算式,把图上所有像素的深浅当输入,输出「这是几」?能。 一个典型的例子大概要算 50 万次——这是 1998 年那批认手写数字的网络的量级; 而 ChatGPT 每吐一个字要算 1750 亿次,是它的三十多万倍15。 先把它当黑箱:输进像素,输出数字。

一个关键的追问:凭什么说这个算式「对」?

书里做了一个很妙的推演。把一个「2」逐渐涂糊,算式一开始还认得出,后来开始给出「错」的答案。

但凭什么说它错?

我们知道这些图是从「2」糊过来的。可如果我们的目标是给「人的识别能力」建个模型, 那真正该问的是:面对一张糊掉的图、并且不知道它原来是什么,一个人会认成几?

如果算式给出的答案总是和人的判断一致,我们就有了一个「好模型」16

这句话定义了整个领域的成功标准,值得停一下对照着看:

给物理现象建模给「人做的事」建模
谁说了算客观世界——测一下就知道人的判断
能不能证明它对能,有物理定律不能——那需要一套关于人的数学理论
边界在哪定律的适用范围说不清,而且换个物种答案就不一样17

书里把语言、认图这类「本来只有人能做的事」统称为类人任务

这张表解释了一件事:为什么这个领域到处是「试出来有效」,而不是「证明了有效」。 不是研究者不够严谨,而是判据本身长在人这一侧,压根没有可以拿来证明的东西。

判断(我们的,不是书里的): 这一节其实提前回答了「模型评测为什么这么难」。 凡是「正确答案由人说了算」的任务,评测就必然带上人的口味; 今天所有那些「把它调得更像人想要的」的做法——让人打分、拿人的偏好当训练材料—— 做的都是同一件事:把「人会怎么判断」变成机器能照着调的信号。 如果错,会错在: 如果某类任务其实有客观判据(代码能不能跑通、数学题对不对), 那它就不该按类人任务来评,应该直接用客观判据。这也正是第七章那条出路的起点。

7. 可带走的

全章那条走查,一行写完:「今天天气」→ 切成「今」「天」「天」「气」四个标记 → 1750 亿个参数算出一张清单(很好 40% / 不错 25% / …)→ 按温度挑一个 → 接到文末,从头再来一遍。清单上的百分比是为演示编的,不是真实数值。

  1. 生成 = 反复回答「下一个词是什么」,没有构思、没有全局规划;
  2. 它追求的是「像人会写的」,不是「说对」——这是后面所有胡说现象的总根源;
  3. 它吐的是「标记」不是词,可能只是半个词,所以它会造词、也能处理生僻词;
  4. 随机是故意加的,不是缺陷;温度决定它多敢挑冷门,而且调起来手感不均匀;
  5. 温度 0.8 这类默认值是试出来的,别默认背后有理论;
  6. 数数这条路被组合爆炸堵死了(20 个词的组合比宇宙粒子还多),所以必须改成算;
  7. 模型 = 用一条规律替代一张列不完的表;它由「结构 + 参数」构成;
  8. 参数 = 权重 = 旋钮,同一样东西的三个名字;
  9. 「人做的事」的对错由人的判断定义,所以这个领域只能试,没法证明。

8. 原文地图

主题原书章原文位置
一次一个词、写得「像」它只是一次添加一个词text/03-fm.txt:19(搜「合理的延续」) · text/03-fm.txt:31(搜「一遍又一遍地询问」)
标记而不是词它只是一次添加一个词text/03-fm.txt:31(搜「标记」)
不挑最高分、温度、0.8它只是一次添加一个词text/03-fm.txt:36(搜「平淡」) · text/03-fm.txt:40(搜「温度」) · text/03-fm.txt:40(搜「指数分布」)
零温度会写崩它只是一次添加一个词text/03-fm.txt:73(搜「混乱和重复」)
可能性掉得极快它只是一次添加一个词text/03-fm.txt:92(搜「次幂律衰减」)
数字母、几个一组地数概率从何而来text/04-fm.txt:16(搜「逐字母」) · text/04-fm.txt:76(搜「n元」)
组合爆炸的具体数字概率从何而来text/04-fm.txt:97(搜「16亿」) · text/04-fm.txt:97(搜「60万亿」) · text/04-fm.txt:97(搜「宇宙中的粒子数量」)
常用词量与语料量概率从何而来text/04-fm.txt:82(搜「个常用词」) · text/04-fm.txt:82(搜「几百亿个词」)
模型的定义、参数什么是模型text/05-fm.txt:16(搜「比萨斜塔」) · text/05-fm.txt:25(搜「直线」) · text/05-fm.txt:48(搜「旋钮」) · text/05-fm.txt:48(搜「无模型的模型」)
类人任务、认手写数字类人任务(human-like task)的模型text/06-fm-human-like-task.txt:31(搜「逐像素」) · text/06-fm-human-like-task.txt:39(搜「50万次数学运算」)
「好模型」的判据类人任务(human-like task)的模型text/06-fm-human-like-task.txt:57(搜「好模型」) · text/06-fm-human-like-task.txt:60(搜「蜜蜂或章鱼」)

Footnotes

  1. 出处:「它只是一次添加一个词」第 31 段(text/03-fm.txt:31,搜「一遍又一遍地询问」)。原文:写文章时它「实质上只是在一遍又一遍地询问『根据目前的文本,下一个词应该是什么』,并且每次都添加一个词」。

  2. 出处:「它只是一次添加一个词」第 19 段(text/03-fm.txt:19,搜「合理的延续」)。原文给「合理」下的定义是:「人们在看到诸如数十亿个网页上的内容后,可能期待别人会这样写」。它比对的不是字面文本,而是「意义匹配」的东西——这一点要到第三章讲嵌入时才说得清。

  3. 出处:「它只是一次添加一个词」第 31 段(text/03-fm.txt:31,搜「标记」);更完整的说明见 「嵌入的概念」第 104 段(text/11-fm.txt:104,搜「标记」)。约 5 万个标记里只有约 3000 个是完整的词。

  4. 出处:「它只是一次添加一个词」第 36 段(text/03-fm.txt:36,搜「平淡」)。原文用了「玄学」一词形容这件事没有解释——「出于某种原因,也许有一天能用科学解释」。

  5. 出处:「它只是一次添加一个词」第 73 段(text/03-fm.txt:73,搜「混乱和重复」)。这是零温度下继续生成的实际观察。

  6. 出处:「它只是一次添加一个词」第 40 段(text/03-fm.txt:40,搜「温度」)与第 40 段(text/03-fm.txt:40,搜「指数分布」)。中文版编者注补充说,这里指的应当是玻尔兹曼分布;但作者本人强调「与物理学之间并没有任何实际联系,至少就我们目前所知是这样的」。

  7. 出处:「它只是一次添加一个词」第 92 段(text/03-fm.txt:92,搜「次幂律衰减」)。原文的说法是「点的连线对应于次幂律衰减,这是语言的一般统计特征」。次幂律是描述这种「头部极高、尾巴极长」形状的数学名字,记不住不影响理解。

  8. 出处:「概率从何而来」第 16 段(text/04-fm.txt:16,搜「逐字母」)。书里还指出 dogs 条目里字母 o 更常见——因为 dog 这个词本身含 o。

  9. 出处:「概率从何而来」第 82 段(text/04-fm.txt:82,搜「个常用词」)。原文:「英语中有大约 50 000 个常用词」;后面算组合数时用的是 4 万这个口径。

  10. 出处:「概率从何而来」第 82 段(text/04-fm.txt:82,搜「几百亿个词」);语料总量的更大口径见 「ChatGPT的训练」第 19 段(text/13-fm-chatgpt.txt:19,搜「万亿级别」)。

  11. 出处:「什么是模型」第 16 段(text/05-fm.txt:16,搜「比萨斜塔」)。这个例子可以追到伽利略——16 世纪末那个「从塔上扔东西」的问题,正好是「测量」和「建模」这条分界线最早出现的地方。

  12. 出处:「什么是模型」第 25 段(text/05-fm.txt:25,搜「直线」)。

  13. 出处:「什么是模型」第 48 段(text/05-fm.txt:48,搜「旋钮」)与第 48 段(text/05-fm.txt:48,搜「无模型的模型」)。补充(不在书里,来自通用知识):作为对照的「上一代那个模型」是 GPT-2,参数量 15 亿。中文版导读序特别点名了这一节,说作者「非常贴心地用直观的例子(函数和旋钮)」解释了「模型」和「参数」这两个最难讲清的概念(出处:「导读序」第 332 段(text/01-fm.txt:332,搜「刘江」))。

  14. 出处:「类人任务(human-like task)的模型」第 31 段(text/06-fm-human-like-task.txt:31,搜「逐像素」)。

  15. 出处:「类人任务(human-like task)的模型」第 39 段(text/06-fm-human-like-task.txt:39,搜「50万次数学运算」)。

  16. 出处:「类人任务(human-like task)的模型」第 57 段(text/06-fm-human-like-task.txt:57,搜「好模型」)。

  17. 出处:「类人任务(human-like task)的模型」第 60 段(text/06-fm-human-like-task.txt:60,搜「蜜蜂或章鱼」)。原文的推演是:改变「2」的图像里的一些像素,我们仍会认为它是 2;但改到什么程度就不认了?这是关于人类视觉感知的问题,「对于蜜蜂或章鱼的图像,答案无疑会有所不同」。