本站是 ODERSA 的官方网站。 如何确认这一点

官方域名

本站的网址以 odersa.org 结尾。协会的每一项服务都放在 odersa.org 的子域名下,别处一概没有。如果浏览器地址栏里的网址不是以 odersa.org 结尾,这个站点就不是我们的。

免费,也不用账号

所有内容一开始就全部开放:不用注册,不用账号,不用密码,不用订阅,也没有广告。没有什么是留给付费的人的,因为这里什么都不收费。

不收集任何数据

本站不跟踪您:没有跟踪代码,没有跟踪 cookie,这些页面里没有内嵌任何统计工具,也不在您的设备上测量任何东西。我们的主机会以汇总方式统计请求,就像任何会应答的服务器一样:只是一个总数,绝不是一份个人档案。您不必相信我们的话:打开浏览器的开发者工具,切到“网络”标签页,然后刷新页面。您会看到本站请求的完整清单。所有内容都来自 odersa.org,没有任何东西发往别处。

内容自由使用

内容以 CC BY 4.0 许可协议发布。您可以复制、翻译、打印并再分发,用于课堂或身边的人都可以,唯一的条件是署名 ODERSA。

下一个词,从来不是确定的

模型在写出来之前并不知道自己要写什么。每到一个词,它都为每个可能的候选算出一个概率,然后从里面抽一个。本页把这次抽取在你眼前跑一遍,一个参数一个参数地看:温度、top-k 和 top-p。

说明

一切都在你的浏览器里计算。语料随页面一起加载,模型在这台设备上学出来,你调的任何一项都不会离开你的机器。打开浏览器的“网络”标签页,再动手玩这个演示:不会有任何请求发出去。

先算出一个分布,再从里面抽

语言模型在写出来之前并不知道自己要写什么。每到一个词,它都为每个可能的候选算出一个概率:得到的是一整张清单,从来不是一个定死的答案。这张概率清单就是一个分布。看起来像“做选择”的那一步在后面:从这个分布里抽一个,就像从一副加了权的牌里抽一张。

正因如此,同一个问题问两遍,答案不一定相同。只要分布里还留着好几个可能的候选,抽取就会挑出一个,而且不总是同一个。在这里,抽取用的是一个看得见、也改得动的随机种子,让结果保持可复现:同一个种子永远给出同一个词。一般的服务会把种子藏起来,于是那种随机看上去就像无来由的。

本页的模型学的是儒勒·凡尔纳的《八十天环游地球》,1873 年出版,属于公有领域。它统计的是:在这段文本里出现过的每一段一到三个词的序列,后面接过哪个词、各接过多少次。在这份语料上,它此刻认得 … 个词元,词表里有 … 个不同的词,分布在 … 个单词上下文、… 个双词上下文和 … 个三词上下文里。为这个演示,转录做过处理:撇号统一为印刷体,转录里的破折号和引号去掉,斜体标记去掉,章节标题和目录剔除,不足四十个字符的段落剔除。

这个演示把文本按整个词来切,为的是保持可读。真实的模型切出的单位比一个词更小,是靠另一套计算得到的词元:见被切碎的词那一章。至于分布和抽取这套机理,两种情况下是一样的。

选一个示例,就会填进下面的开头栏。这些示例是页面加载时从语料里取出来的。
一个或几个词,要在这部小说的词表里。语料里没有的词会让模型退回到更短的上下文。
抽取
3
向前看几个词。这个模型只学一到三个词的上下文。
0.80
拉到零,抽取永远留下概率最高的候选,没有随机成分。超过一,罕见的候选会变得几乎和高频候选一样可能。
已关闭
零就关掉这道截断。设成 k,抽取前只有概率最高的 k 个候选留在场上。
已关闭
一就关掉这道截断。低于一时,只有累计概率刚好达到这个阈值的那一组最短候选留在场上。
长度与可复现
40 个词
只对下面“走好几步”那一节起作用。
一个词或一个数字。同一个种子永远给出同一个结果,这让本页在课堂上可以被引用。

走一步:下一个词的分布

下一个词的分布、它的横条和计算表格会显示在这里。

走好几步:生成一段文本,连同它的轨迹

生成的文本会显示在这里,附一段简短说明和它一步一步的轨迹。

这个演示展示了什么

走一步:同一个公式,结果在你眼前变

拖动温度滑块,表格的各列会立刻动起来:对数值没变,它被温度一除就变了,“softmax 之后”那一列也跟着变。打开 top-k 或 top-p,原先还留着的一些候选会变成“已剔除”,写得明明白白,而不只是把横条画淡一点。这些都不改变语料,也不改变统计次数:变的只是读同一个分布的方式。

走好几步:一段文本,要么重复,要么散掉

温度接近零时,抽取几乎总是留下概率最高的候选:生成的文本很快陷进循环,同样那几个词按同样的顺序反复出现。温度接近二时,罕见的候选变得几乎和高频候选一样可能:文本碎成一块块,一句一句看还算说得通,整体却没有一条线。用同一个开头、同一个种子,把两种设置都试一次,就能看到这两种效果先后出现。

方法

下面是“生成文本”这个按钮所做的事,一步一步来。“走一步”那一节的表格,正是把这些同样的步骤用在当前开头的真实候选上:只要一列一列地读下来,就能用五个候选和一台计算器用手重做一遍。

  1. 统计。对当前的上下文,在整份语料里找出接过它的每个词,以及各接过多少次。一个候选的起始概率,就是它的次数除以这个上下文里所有候选次数之和:p = 次数 ÷ 总数。
  2. 取对数。每个概率变成 logit = log(p),其中 log 是自然对数,也就是科学计算器上的“ln”键。logit 永远是负数或零,因为 p 在零和一之间。
  3. 如果有偏置,就加上。一个可选的偏置在其他步骤之前加到 logit 上:带偏置的 logit = logit + 偏置。本页不加任何偏置;水印那一章会在正是这一步上加一个。
  4. 除以温度。每个带偏置的 logit 都除以温度 T:z = 带偏置的 logit ÷ T。温度小,就拉大最佳候选和其他候选之间的差距;温度大,就把这个差距抹平。
  5. 过 softmax。各个 z 变成一组加起来等于一的概率:概率 = exp(z) ÷ 所有候选的 exp(z) 之和。温度为零时,这一步和下一步都跳过:直接留下 logit 最高的那个候选,不做抽取。
  6. 按 top-k 截断。候选按概率从高到低排好。如果 top-k 取值 k 生效,只有前 k 个留在场上;其余剔除。
  7. 按 top-p 截断。如果 top-p 的阈值生效,模型保留同一张清单上累计概率达到这个阈值的最短前缀;其余剔除,包括前一道 top-k 截断已经放过的那些。
  8. 重新归一化。剩下候选的概率各自除以它们自己的和,重新回到总和为一:这就是每个候选的最终概率。
  9. 抽取。取一个落在零(含)到一(不含)之间的数,把这些最终概率首尾相接排成一条线,这个数落在谁的区间里,谁就是留下的那个词元。上下文随之长出一个词,然后回到第一步,去算下一个词。

真实的模型多了什么,又没少什么

这个演示要诚实,有一个条件:说清楚这个类比在哪里到头。

在大模型里同样成立的部分

  • 它给出的是下一个单位的概率分布,从来不是一个确定答案。
  • 它从这个分布里抽:结果取决于一次随机,在这里被随机种子变得看得见、也可复现。
  • 温度、top-k 和 top-p 用同样的公式、在同样的步骤上作用于它的分布。
  • 它总会回答:从不沉默,也从不自己主动说一句“我不知道”。

这个玩具模型不做的事

  • 没有梯度下降式的训练:这个模型只是统计,它不调整任何权重。
  • 没有词向量:每个词都是一个光秃秃的标签,不是语义空间里的一个点。
  • 没有注意力机制:纳入考虑的上下文最多三个词,而且总是最近的那几个。
  • 没有语义,也不做泛化:在所要求的阶数上从没见过的上下文,只会让模型退回一级,绝不猜。

研究测出了什么

三项已发表的结果,正好给这个演示让人感觉到的东西定了位。

一律挑概率最高的词,产出的文本平淡而重复;核采样把分布中不可靠的那部分截掉(也就是本页的 top-p),产出的文本更自然。softmax 公式里的温度参数会让模型算出的概率分布变软或变硬:温度越高,选择越难预料,也越均匀地分散在几个可能的词之间。top-k 采样把每一步的抽取限制在概率最高的 k 个词里,是一种用来生成比恒定挑选更多样文本的方法。

为什么“说得通”的文本不等于真的文本

本页的模型只读过一部 1873 年的小说。让它续写一句像这部小说的话,它会用一个真实存在、阶数也对的上下文来回答。让它续写一句在这段文本里毫无对应的话,它就退回到更短的上下文,直到给出整份语料里最高频的那个词:它照样回答,表面上一样笃定,从不提示自己是在猜。

一个“说得通”的回答,是形式上像语料里有的东西的回答。计算过程里没有任何一步去核对它是否对应一个事实。一个在几十亿词而不是一部小说上学出来的大模型,退回的次数更少,退回时也更不显眼:这就是为什么它会编造那一章的主题。

想再往下走

把文本切成比词更小的单位,讲在被切碎的词那一章。模型不回答而是编造的情况,讲在为什么它会编造那一章。本站所有演示都汇集在演示页面,课程目录在理解页面。

来源