7.6 解码
根据模型给出的概率选择要生成的词元,这项任务称为 解码(decoding)。如前所述,从左到右地对语言模型进行解码(对于阿拉伯语等从右向左阅读的语言,则从右到左),从而以先前的选择为条件反复选取下一词元,这一过程称为 因果生成(causal generation)或 自回归生成(autoregressive generation)。[4]
我们从形状为 的概率向量 y 中解码,该向量为词表中的每个词元分配一个概率。图 7.17 给出了一个示例:为便于说明,它只在一个包含 4 个词的简化词表上计算 softmax。下面用这个例子考察生成词语时的不同采样方法。

图 7.17 使用 softmax 从 logit 向量 u 生成概率向量 y。
7.6.1 贪心解码¶
生成词元最简单的方法,是始终生成在给定上下文下概率最高的词元,这称为 贪心解码(greedy decoding)。贪心算法每次都会做出局部最优的选择,不管事后看来这是否真的是最佳选择。因此,在贪心解码中,生成过程的每个时间步都会先把 logits 转换成词元上的概率分布,然后选择词表中概率最高的词元(即 argmax)作为输出 :
图 7.18 表明,在这个例子中,模型选择生成 all。

图 7.18 贪心解码:选择概率最高的词。
不过在实践中,我们并不会对大语言模型使用贪心解码。贪心解码的一个主要问题是:它所选择的词元按定义就是极易预测的,因此生成的文本往往千篇一律,而且经常重复。事实上,贪心解码的可预测性如此之强,以至于它是确定性的:只要上下文相同、概率模型相同,贪心解码每次都会生成完全相同的字符串。
第 13 章将介绍贪心解码的一种扩展——束搜索(beam search)。它非常适合机器翻译等约束很强的任务,因为在这类任务中,我们总是在给定另一种语言的特定文本后,生成一种语言的文本。
而在大多数其他任务中,人们更偏好由采样方法生成的文本,因为采样可以为生成结果带来更多变化。
7.6.2 随机采样¶
因此,大语言模型最常用的解码方法涉及采样。回顾第 3 章,从一个分布中 采样(sampling),是指依据各个点的可能性随机选择点。因此,从表示后续词元分布的语言模型中采样,就是根据模型为词元赋予的概率,选择接下来要生成的词元。于是,模型认为概率较高的词元更有可能被生成,而模型认为概率较低的词元则较少被生成。
换言之,我们按照模型定义的上下文概率随机选择一个词元,生成该词元,然后重复这个过程。正如第 3 章所述,可以把它想象成掷骰子,再根据落入的概率区间选择词元。当然,这样的模型与贪心算法一样,最有可能生成概率最高的词元;不过,它也有可能生成任何其他词元,只是概率更小。总体而言,模型认为在当前上下文中概率较高的词元更容易被生成,概率较低的词元则较少被生成。
Shannon (1948) 以及 Miller and Selfridge (1950) 很早就提出了从语言模型中采样。第 3 章第 79 页曾介绍如何用一元语言模型生成文本:不断依据概率随机采样词元,直到达到预先设定的长度,或选中句末词元为止。
要用大语言模型生成文本,只需稍微推广这个模型:在每一步中,我们都依据以前面所做选择为条件的概率来采样词元,并把大语言模型作为提供该概率的概率模型。
i ← 1
while
i ← i + 1
该算法称为 随机采样(random sampling),也称为 随机多项式采样(random multinomial sampling),因为我们是从词语上的多项分布中采样。随机采样可以形式化如下:不断生成词元序列 ,直到遇到序列结束词元;其中, 表示“从分布 p(x) 中采样以选择 x”。

图 7.19 随机多项式采样:按照各个词的概率随机选择一个词。
遗憾的是,随机采样的效果同样不理想。问题在于,尽管随机采样大多数时候会生成合理的高概率词元,但分布的尾部还存在许多古怪的低概率词元。虽然每个词元本身的概率都很低,这些罕见词元的概率总和却占据了分布中不可忽视的一部分。因此,它们仍会以足够高的频率被选中,导致生成奇怪的句子。
换句话说,贪心解码太无聊,而随机采样又太随机。我们需要一种方法:既不在每一步都贪心地选择排名第一的候选项,又不会深入到概率极低的事件中。
有三种标准采样方法通过修改随机采样来解决这些问题:温度采样、top-k 采样和 top-p 采样。
7.6.3 温度采样¶
下面介绍的三种方法可以在生成中的两个重要因素之间进行权衡:质量与多样性。偏重最高概率词语的方法,往往会生成被人们评价为更准确、更连贯且事实性更强的内容,但也更乏味、更容易重复。稍微提高中等概率词语权重的方法,往往更有创意、更加多样,但事实性较弱,也更可能不连贯或存在其他质量问题。
温度采样(temperature sampling)的思路是重塑概率分布:提高高概率词元的概率,降低低概率词元的概率。这样一来,生成概率极低词元的可能性会降低,而生成较高概率词元的可能性会提高。
实现这一思路非常简单:在把 logit 传入 softmax 之前,先将其除以温度参数 。在低温采样中,。
因此,我们不再像下式这样直接根据 logits 计算词表上的概率分布(重复式 7.48):
而是先将 logits 除以 ,按如下方式计算概率向量 :
也就是说,通常我们像图 7.20(a) 那样把 logits 转换为 softmax;而使用温度参数时,则会先像图 7.20(b) 那样缩放 logits。

图 7.20 (a) 不使用温度缩放的常规 softmax;(b) 先除以温度参数 ,为 softmax 加入温度缩放。
为什么除以 会提高词表向量中高概率元素的概率,并降低低概率元素的概率?当 等于 1 时,我们执行的是常规 softmax,所以当 接近 1 时,分布不会发生太大变化。但当 较小时,除以小于 1 的 会让传入 softmax 函数的分数变大。
回想一下,softmax 的一个有用性质是,它倾向于把高值推向 1、把低值推向 0。因此,把更大的数传入 softmax 后,所得分布会提高最高概率词元的概率,并降低低概率词元的概率,使分布更加贪心。当 趋近于 0 时,除以 会使最可能词语的概率趋近于 1,结果也就趋近于贪心解码。
温度采样的直觉来自热力学:处于高温的系统非常灵活,可以探索许多可能的状态;而温度较低的系统更可能只探索能量较低(更好)的状态子集。在低温采样中,我们平滑地提高最高概率词元的概率,并降低罕见词元的概率。
图 7.21 又给出了一个示意例子。为便于说明,词表仍然只包含 4 个词元(all、the、your、that);图中展示了不同温度值如何影响根据初始 logits 计算出的概率。 对应常规 softmax。可以看到,把 设为 0.5 后,排名第一的候选项概率从 .44 提高到 .59;把 设为 0.1 后,该候选项的概率进一步提高到 .95,已经接近贪心解码。
图 7.21 还展示了另一种选择:有时我们希望把词概率分布变得更平坦,而不是更贪心。温度采样也能处理这种情况;此时采用 高温采样(high-temperature sampling),即令 。

图 7.21 温度采样:不同的 值会改变由初始 logits 得到的概率(简化示例的词表中只有 4 个词元)。
7.6.4 Top-k 与 top-p 采样¶
Top-k 采样是贪心解码的一种简单推广。它不是只选择概率最高的一个词来生成,而是先把分布截断到最有可能的 k 个词,重新归一化以形成合法的概率分布,再根据重新归一化后的概率,从这 k 个词中随机采样。更正式地说:
预先选定词语数量 k。
对于词表 V 中的每个词,使用语言模型计算给定上下文时该词的概率 。
按概率对词语排序,丢弃所有不属于概率最高的 k 个词的候选词。
对这 k 个词的分数重新归一化,使其成为合法的概率分布。
根据概率,从剩余的 k 个最高概率词中随机采样一个词。
当 k = 1 时,top-k 采样与贪心解码完全相同。把 k 设为大于 1 的数值后,我们有时会选中并非概率最高、但概率仍然足够高的词,从而生成更多样且质量仍足够高的文本。
Top-k 采样的一个问题是 k 固定不变,但不同上下文中的词概率分布形状各不相同。如果设置 k = 10,那么有时概率最高的 10 个词本身可能性很高,涵盖了绝大部分概率质量;但有时概率分布更平坦,排名前 10 的词只包含一小部分概率质量。
另一种方法称为 top-p 采样(top-p sampling)或 核心采样(nucleus sampling)(Holtzman et al., 2020)。它保留的不是排名前 k 的词,而是合计占据前 p 比例概率质量的词。其目标相同:截断分布以去除可能性极低的词。不过,由于它衡量的是概率而非词数,因此有望在差异很大的上下文中更加稳健,并能动态增减候选词池。
给定分布 ,我们按概率从高到低排序,那么 top-p 词表 就是满足下式的最小词语集合:
或许令人意外的是,人们通常会把 top-k 和 top-p 采样结合起来:先用 top-k 作为一种硬过滤器去除毫无价值的候选项,再用 top-p 适应模型的置信程度。
严格来说,自回归模型根据时刻 、 等时刻的值的线性函数,预测时刻 的值。尽管语言模型并非线性的(因为它们具有许多层非线性结构),我们仍宽泛地将这种生成技术称为自回归生成,因为每个时间步生成的词元都以网络在上一步选中的词元为条件。第 9 章将介绍掩码语言模型等替代方案;由于它们可以同时根据过去和未来的词元进行预测,因此属于非因果模型。