下一个词,从来不是确定的
模型在写出来之前并不知道自己要写什么。每到一个词,它都为每个可能的候选算出一个概率,然后从里面抽一个。本页把这次抽取在你眼前跑一遍,一个参数一个参数地看:温度、top-k 和 top-p。
一切都在你的浏览器里计算。语料随页面一起加载,模型在这台设备上学出来,你调的任何一项都不会离开你的机器。打开浏览器的“网络”标签页,再动手玩这个演示:不会有任何请求发出去。
先算出一个分布,再从里面抽
语言模型在写出来之前并不知道自己要写什么。每到一个词,它都为每个可能的候选算出一个概率:得到的是一整张清单,从来不是一个定死的答案。这张概率清单就是一个分布。看起来像“做选择”的那一步在后面:从这个分布里抽一个,就像从一副加了权的牌里抽一张。
正因如此,同一个问题问两遍,答案不一定相同。只要分布里还留着好几个可能的候选,抽取就会挑出一个,而且不总是同一个。在这里,抽取用的是一个看得见、也改得动的随机种子,让结果保持可复现:同一个种子永远给出同一个词。一般的服务会把种子藏起来,于是那种随机看上去就像无来由的。
本页的模型学的是儒勒·凡尔纳的《八十天环游地球》,1873 年出版,属于公有领域。它统计的是:在这段文本里出现过的每一段一到三个词的序列,后面接过哪个词、各接过多少次。在这份语料上,它此刻认得 … 个词元,词表里有 … 个不同的词,分布在 … 个单词上下文、… 个双词上下文和 … 个三词上下文里。为这个演示,转录做过处理:撇号统一为印刷体,转录里的破折号和引号去掉,斜体标记去掉,章节标题和目录剔除,不足四十个字符的段落剔除。
这个演示把文本按整个词来切,为的是保持可读。真实的模型切出的单位比一个词更小,是靠另一套计算得到的词元:见被切碎的词那一章。至于分布和抽取这套机理,两种情况下是一样的。
这个演示展示了什么
走一步:同一个公式,结果在你眼前变
拖动温度滑块,表格的各列会立刻动起来:对数值没变,它被温度一除就变了,“softmax 之后”那一列也跟着变。打开 top-k 或 top-p,原先还留着的一些候选会变成“已剔除”,写得明明白白,而不只是把横条画淡一点。这些都不改变语料,也不改变统计次数:变的只是读同一个分布的方式。
走好几步:一段文本,要么重复,要么散掉
温度接近零时,抽取几乎总是留下概率最高的候选:生成的文本很快陷进循环,同样那几个词按同样的顺序反复出现。温度接近二时,罕见的候选变得几乎和高频候选一样可能:文本碎成一块块,一句一句看还算说得通,整体却没有一条线。用同一个开头、同一个种子,把两种设置都试一次,就能看到这两种效果先后出现。
方法
下面是“生成文本”这个按钮所做的事,一步一步来。“走一步”那一节的表格,正是把这些同样的步骤用在当前开头的真实候选上:只要一列一列地读下来,就能用五个候选和一台计算器用手重做一遍。
- 统计。对当前的上下文,在整份语料里找出接过它的每个词,以及各接过多少次。一个候选的起始概率,就是它的次数除以这个上下文里所有候选次数之和:
p = 次数 ÷ 总数。 - 取对数。每个概率变成
logit = log(p),其中log是自然对数,也就是科学计算器上的“ln”键。logit 永远是负数或零,因为 p 在零和一之间。 - 如果有偏置,就加上。一个可选的偏置在其他步骤之前加到 logit 上:
带偏置的 logit = logit + 偏置。本页不加任何偏置;水印那一章会在正是这一步上加一个。 - 除以温度。每个带偏置的 logit 都除以温度 T:
z = 带偏置的 logit ÷ T。温度小,就拉大最佳候选和其他候选之间的差距;温度大,就把这个差距抹平。 - 过 softmax。各个 z 变成一组加起来等于一的概率:
概率 = exp(z) ÷ 所有候选的 exp(z) 之和。温度为零时,这一步和下一步都跳过:直接留下 logit 最高的那个候选,不做抽取。 - 按 top-k 截断。候选按概率从高到低排好。如果 top-k 取值 k 生效,只有前 k 个留在场上;其余剔除。
- 按 top-p 截断。如果 top-p 的阈值生效,模型保留同一张清单上累计概率达到这个阈值的最短前缀;其余剔除,包括前一道 top-k 截断已经放过的那些。
- 重新归一化。剩下候选的概率各自除以它们自己的和,重新回到总和为一:这就是每个候选的最终概率。
- 抽取。取一个落在零(含)到一(不含)之间的数,把这些最终概率首尾相接排成一条线,这个数落在谁的区间里,谁就是留下的那个词元。上下文随之长出一个词,然后回到第一步,去算下一个词。
真实的模型多了什么,又没少什么
这个演示要诚实,有一个条件:说清楚这个类比在哪里到头。
在大模型里同样成立的部分
- 它给出的是下一个单位的概率分布,从来不是一个确定答案。
- 它从这个分布里抽:结果取决于一次随机,在这里被随机种子变得看得见、也可复现。
- 温度、top-k 和 top-p 用同样的公式、在同样的步骤上作用于它的分布。
- 它总会回答:从不沉默,也从不自己主动说一句“我不知道”。
这个玩具模型不做的事
- 没有梯度下降式的训练:这个模型只是统计,它不调整任何权重。
- 没有词向量:每个词都是一个光秃秃的标签,不是语义空间里的一个点。
- 没有注意力机制:纳入考虑的上下文最多三个词,而且总是最近的那几个。
- 没有语义,也不做泛化:在所要求的阶数上从没见过的上下文,只会让模型退回一级,绝不猜。
研究测出了什么
三项已发表的结果,正好给这个演示让人感觉到的东西定了位。
一律挑概率最高的词,产出的文本平淡而重复;核采样把分布中不可靠的那部分截掉(也就是本页的 top-p),产出的文本更自然。softmax 公式里的温度参数会让模型算出的概率分布变软或变硬:温度越高,选择越难预料,也越均匀地分散在几个可能的词之间。top-k 采样把每一步的抽取限制在概率最高的 k 个词里,是一种用来生成比恒定挑选更多样文本的方法。
为什么“说得通”的文本不等于真的文本
本页的模型只读过一部 1873 年的小说。让它续写一句像这部小说的话,它会用一个真实存在、阶数也对的上下文来回答。让它续写一句在这段文本里毫无对应的话,它就退回到更短的上下文,直到给出整份语料里最高频的那个词:它照样回答,表面上一样笃定,从不提示自己是在猜。
一个“说得通”的回答,是形式上像语料里有的东西的回答。计算过程里没有任何一步去核对它是否对应一个事实。一个在几十亿词而不是一部小说上学出来的大模型,退回的次数更少,退回时也更不显眼:这就是为什么它会编造那一章的主题。
想再往下走
把文本切成比词更小的单位,讲在被切碎的词那一章。模型不回答而是编造的情况,讲在为什么它会编造那一章。本站所有演示都汇集在演示页面,课程目录在理解页面。
来源
- The Curious Case of Neural Text Degeneration Ari Holtzman, Jan Buys, Li Du, Maxwell Forbes, Yejin Choi,2020 年。该文确立:一律挑概率最高的词会产出平淡而重复的文本,而把分布中不可靠部分截掉的核采样(top-p)产出的文本更自然。
- Distilling the Knowledge in a Neural Network Geoffrey Hinton, Oriol Vinyals, Jeff Dean,2015 年。该文确立:softmax 公式里的温度参数会让模型算出的概率分布变软或变硬,温度越高,选择越难预料,也越均匀地分散在几个可能的词之间。
- Hierarchical Neural Story Generation Angela Fan, Mike Lewis, Yann Dauphin,2018 年。该文确立:把每一步的抽取限制在概率最高的 k 个词里的 top-k 采样,是一种用来生成比恒定挑选更多样文本的方法。
- Le Tour du monde en quatre-vingts jours 儒勒·凡尔纳,J. Hetzel et Compagnie,1873 年,公有领域。转录:Wikisource。为这个演示做过处理:撇号统一为印刷体,转录里的破折号和引号去掉,斜体标记去掉,章节标题和目录剔除,不足四十个字符的段落剔除。