简介
在使用类似ChatGpt的大语言模型时,需要了解解码时的几个重要参数,以便于对整体生成效果的调解。本文主要介绍解码的三个超参数(top_k、top_p、temperature)涉及的原理。
自回归 语言生成是基于如下假设: 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积。
上式中,是初始上下文单词序列。文本序列的长度 通常时变的,并且对应于时间步 。
选择输出token的方法(解码方法)仍然是一个开放的问题。
本文介绍目前最常用的解码方法,主要有
- 贪心搜索 (Greedy search)
- 波束搜索 (Beam search)
- Top-K 采样 (Top-K sampling)
- Top-p 采样 (Top-p sampling)
这些方法是主流的LLM使用的解码方法,可以通过调整解码方法,对输出token达到一定程度的可控性。
贪心搜索
每个时间步都简单地选择概率最高的词作为当前输出词: ,如下图所示:
从单词 开始,算法在第一步贪心地选择条件概率最高的词 作为输出,依此往后。最终生成的单词序列为 ,其联合概率为 。
贪心搜索的主要缺点是它错过了隐藏在低概率词后面的高概率词,如上图所示:
条件概率为 的单词 隐藏在单词 后面,而 因为在 t=1 时条件概率值只排第二所以未被选择,因此贪心搜索会错过序列 其联合概率为 。
波束搜索_(Beam search)_
我们可以用波束搜索_(Beam search)_来缓解这个问题!
波束搜索通过在每个时间步保留最可能的 num_beams 个词,并从中最终选择出概率最高的序列来降低丢失潜在的高概率序列的风险。以 num_beams=2 为例:
在时间步 1,除了最有可能的假设 ,波束搜索还跟踪第二可能的假设 。在时间步 2,波束搜索发现序列 概率为,比 的 更高。
波束搜索一般都会找到比贪心搜索概率更高的输出序列,但仍不保证找到全局最优解。
beam search在做像是翻译和摘要这类可以大致预测生成长度的场景中表现还可以Murray et al. (2018)、Yang et al. (2018)。但是在像是对话和故事生成这类开放生成领域效果就差得多了。
Beam Search与真人说话之间的区别,Beam Search生成的句子虽然可以令其的概率最大,但用词总是比较普通,可人的语言往往不是令语言模型概率最大化的那个词,每个词出现的概率更有节奏。
直觉的经验观察是,即使使用可能性作为训练目标会导致高质量的模型用于广泛的语言理解任务,但基于最大化的解码方法,如波束搜索,会导致退化–输出的文本平淡无奇、不连贯,或陷入重复的循环中。
采样
在其最基本的形式中,采样意味着根据当前条件概率分布随机选择输出词
继续使用上文中的例子,下图可视化了使用采样生成文本的过程。
很明显,使用采样方法时文本生成本身不再是 确定性的。单词 从条件概率分布 中采样而得,而 则采样自 。
top-k采样
Top-k采样是对前面“贪心策略”的优化,它从排名前k的token种进行抽样,允许其他分数或概率较高的token也有机会被选中,以达到有一定机率不选最大概率的词,其核心思想在于:在解码的每个时间步从前k个概率最大的词中按它们的概率进行采样。
Fan 等人 (2018) 的论文介绍了一种简单但非常强大的采样方案,称为 Top-K 采样。在 Top-K 采样中,概率最大的 K 个词会被选出,然后这 K 个词的概率会被重新归一化,最后就在这重新被归一化概率后的 K 个词中采样。
我们将上文例子中的候选单词数从 3 个单词扩展到 10 个单词,以更好地说明 Top-K 采样。
设 ,即我们将在两个采样步的采样池大小限制为 6 个单词。我们定义 6 个最有可能的词的集合为 。在第一步中, 仅占总概率的大约三分之二,但在第二步,它几乎占了全部的概率。同时,我们可以看到在第二步该方法成功地消除了那些奇怪的候选词 。
Top-K 采样不会动态调整从需要概率分布 中选出的单词数。这可能会有问题,因为某些分布可能是非常尖锐 (上图中右侧的分布),而另一些可能更平坦 (上图中左侧的分布),所以对不同的分布使用同一个绝对数 K 可能并不普适。
在 时,Top-K 将 排除出了采样池,而这些词似乎是合理的候选词。另一方面,在 时,该方法却又把不太合适的 纳入了采样池。因此,将采样池限制为固定大小 K 可能会在分布比较尖锐的时候产生胡言乱语,而在分布比较平坦的时候限制模型的创造力。这一发现促使 Ari Holtzman 等人 (2019) 发明了 Top-p采样(核-采样)
top-p采样
在 Top-p 中,采样不只是在最有可能的 K 个单词中进行,而是在累积概率超过概率 p 的最小单词集中进行,然后在这组词中重新分配概率质量。
这样,词集的大小 可以根据下一个词的概率分布动态增加和减少。
假设 ,Top-p 采样对单词概率进行降序排列并累加,然后选择概率和首次超过 的单词集作为采样池,定义为 。
在 时 有 9 个词,而在 时它只需要选择前 3 个词就超过了 92%。
可以看出,在单词比较不可预测时,它保留了更多的候选词,如,而当单词似乎更容易预测时,只保留了几个候选词,如。
虽然从理论上讲, Top-p 似乎比 Top-K 更优雅,但这两种方法在实践中都很有效。 Top-p 也可以与 Top-K 结合使用,这样可以避免排名非常低的词,同时允许进行一些动态选择。
temperature
上面所说的topk, top_p都是在动态选择不同词的范围,但并没有更改实际词出现的概率,那么,是否可以在出现上概率上也进行调节呢?例如,将高频和低频之间的概率拉大或者减少,也能够对多样性提供一些思路。
通过降低所谓的 softmax 的“温度”使分布 更陡峭。而降低“温度”,本质上是增加高概率单词的似然并降低低概率单词的似然。
将温度应用到于我们的例子中后,结果如下图所示。
时刻单词的条件分布变得更加陡峭,几乎没有机会选择单词 了。
在概率模型中,logits扮演着能量的角色,可以通过将logits除以温度来实现温度采样,然后将其输入Softmax并获得采样概率。
越低的温度(<1)使模型会对高频的选择更为偏向,而高于1的温度,则会缩小高频词和低频词之间的差距。t的取值不同,解码词的概率分布也就更平缓或更两极分化。一定程度上也能通过设置不同的t达到与top-k sampling一样的效果。
用于控制模型输出的结果的随机性,这个值越大随机性越大。一般我们多次输入相同的prompt之后,模型的每次输出都不一样。
- 设置为 0,对每个prompt都生成固定的输出
- 较低的值,输出更集中,更有确定性
- 较高的值,输出更随机(更有创意😃)
较低的温度意味着较少的随机性;温度为 0 将始终产生相同的输出。执行具有“正确”答案的任务(如问题回答或总结)时,较低的温度(小于 1)更合适。如果模型开始自我重复,则表明温度过低。
高温意味着更多的随机性,这可以帮助模型给出更有创意的输出。如果模型开始偏离主题或给出无意义的输出,则表明温度过高。
一般来说,prompt 越长,描述得越清楚,模型生成的输出质量就越好,置信度越高,这时可以适当调高 temperature 的值;反过来,如果 prompt 很短,很含糊,这时再设置一个比较高的 temperature 值,模型的输出就很不稳定了。
参考
如何生成文本
controlling-generation-with-top-k-top-p
如何让大模型生成解码阶段的结果更好:从Beam Search到top_k、top_p等参数的实现原理与脚本实现
Top-k & Top-p, Temperature