简介
LLM生成是根据提示词以及之前生成的token生成下一个token的概率分布,之后通过不同解码策略来生成下一个token(词元)。
从数学角度来看,输出概率分布可以表示为:
具体的LLM推理及解码过程如下图所示。
本文将探究诸如贪心搜索、束搜索、Top-k采样、Top-p采样(核采样)、基于温度的采样、Min-P 采样等知名的解码策略,通过了解这些技术,使我们可以更高效的优化LLM的生成结果。
文章较长,建议先点赞收藏,再慢慢观看。另外,我撰写的大模型相关的博客及配套代码均整理放置在Github:llm-action,有需要的朋友自取。
贪心搜索(Greedy Search)
贪心搜索是最为简单直接的解码算法。在每一时间步中,它都会选择概率最高的Token。
如下图所示,从单词 开始,算法在第一步选择条件概率最高的词 作为输出,依此往后。最终生成的单词序列为 ,其联合概率为 。
优点:
- 贪心搜索计算效率高且易于实现。
局限:
- 它确保总是选择最有可能的单词,导致它错过了隐藏在低概率词后面的高概率词,这可能会带来局部最优的决策。因为它总是选择最有可能的单词,这常常会致使文本缺乏多样性,文本重复且单调。它不会探索那些可能会产生全局最优序列的替代路径。
穷举搜索(exhaustive search)
穷举搜索指穷举地列举所有可能的输出序列及其条件概率, 然后计算输出条件概率最高的一个。使用穷举搜索来获得最优序列, 但其计算量极大,通常,现有的计算机几乎不可能计算它。
束搜索(Beam search)
束搜索(beam search)是贪心搜索的一个改进版本,介于穷举搜索与贪心搜索。束搜索通过在每个时间步保留最可能的 num_beams 个词(即束宽),并从中最终选择出概率最高的序列来降低丢失潜在的高概率序列的风险。
下图以 num_beams=2 为例,在第一步,除了最有可能的假设 ,束搜索还跟踪第二可能的假设 。在第二步,束搜索发现序列 概率为,比 的 更高。
虽然结果比贪心搜索更流畅,但输出中仍然包含重复。一个简单的补救措施是引入 n-grams (即连续 n 个词的词序列) 惩罚。最常见的 n-grams 惩罚是确保每个 n-gram 都只出现一次,方法是如果看到当前候选词与其上文所组成的 n-gram 已经出现过了,就将该候选词的概率设置为 0。但是,n-gram 惩罚使用时必须谨慎,如一篇关于 纽约 这个城市的文章就不应使用 2-gram 惩罚,否则,城市名称在整个文本中将只出现一次!
在机器翻译或摘要等任务中,因为所需生成的长度或多或少都是可预测的,所以波束搜索效果比较好。但开放域文本生成情况有所不同,其输出文本长度可能会有很大差异,如对话和故事生成的输出文本长度就有很大不同。同时,在故事生成这样的场景中,很难用 n-gram 或其他惩罚来控制,因为在“不重复”和最大可重复 n-grams 之间找到一个好的折衷需要大量的微调。
优点:
- 束搜索在探索和利用之间取得了平衡,与贪婪解码相比,通常能产生更连贯、更多样的文本。它考虑了多条路径,这可能(仍不保证)会导向全局最优的序列。
局限:
- 它仍然可能存在重复问题,并且可能无法捕捉到所有可能输出的多样性。束搜索的计算成本可能很高,尤其是束宽较大时。
随机采样
束搜索算法生成的输出较为统一,变化较少。高质量的人类语言并不遵循最大概率法则。人类生成的文本具有独特的分布,存在明显的峰值,这反映了文本的可变性和创造性。下图中展示了人类生成文本带来的惊喜度比波束搜索好不少。为了解决这一局限性,我们可以在生成过程中引入一些随机性。
随机采样是基于采样的解码中最基本的形式,它从概率分布中随机选择下一个单词,而不是选择最有可能的单词,随机采样可能会选中一个罕见词。
然而,纯粹的随机采样方法在概率分布的长尾部分存在显著缺陷,这也是LLM质量变差的区域。长尾指的是概率分布中模型为大量可能单词分配低概率的区域。虽然随机采样可以带来更多样的输出,但它也增加了从长尾中选择单词的可能性,这可能会导致文本毫无意义、语法错误或不连贯。
Top-K 采样
为了缓解随机采样的问题,可以使用Top-k采样。在 Top-K 采样中,概率最大的 K 个词会被选出,然后这 K 个词的概率会被重新归一化,最后就在这重新被归一化概率后的 K 个词中采样。 GPT2 采用了这种采样方案,这也是它在故事生成这样的任务上取得成功的原因之一。
如下图所示,以 为例,即将在两个采样步的采样池大小限制为 6 个单词。我们定义 6 个最有可能的词的集合为 。在第一步中, 仅占总概率的大约三分之二,但在第二步,它几乎占了全部的概率。同时,可以看到在第二步中该方法成功地消除了那些奇怪的候选词 。
优点:
- Top-k采样为生成的文本引入了随机性和多样性,使其更像人类生成的文本。它让模型能够探索替代路径,这可能会带来更具创造性和多样性的输出。通过调整 (k) 的值,模型可以在创造性和连贯性之间取得平衡。例如,k = 1 等同于贪婪搜索,而 k = V(其中, V 是词汇表大小)等同于纯粹的随机采样。
局限:
- 与束搜索相比,Top-k采样有时可能会生成连贯性较差的文本。将采样池限制为固定大小 K 可能会在分布比较尖锐的时候产生胡言乱语,而在分布比较平坦的时候限制模型的创造力。k的选择至关重要;k 值过小可能无法引入足够的多样性,而 k 值过大可能会引入过多的随机性。
Top-P 采样(核采样)
由于 Top-K 采样不会动态调整从概率分布 中选出的单词数。这可能会有问题,因为某些分布可能是非常尖锐 ,而另一些可能更平坦,所以对不同的分布使用同一个绝对数 K 可能并不普适。
在 Top-P 采样中,采样不只是在最有可能的 K 个单词中进行,而是在累积概率超过概率 p 的最小单词集中进行。然后在这组词中重新分配概率质量。这样,词集的大小可以根据下一个词的概率分布动态增加和减少。
优点:
- 平衡多样性和连贯性:通过关注最有可能的单词,同时允许一定的可变性,核采样确保生成的文本既多样又连贯。动态调整:所考虑的单词数量是动态调整的,从而产生更自然、更像人类生成的文本。控制创造性和连贯性:通过调整 p 的值,模型可以控制创造性和连贯性之间的权衡。例如:
- p = 0.1:模型考虑的单词集合相对较小,生成的文本连贯性更强,但创造性较弱。p = 0.5:模型考虑的单词集合较大,生成的文本更多样,但可能连贯性较弱。p = 1:模型考虑所有可能的单词,等同于纯粹的随机采样,生成的文本极具创造性,但可能不连贯。
局限:
- p的选择至关重要;p 值过小可能无法引入足够的多样性,而 p 值过大可能会引入过多的随机性。此外,核采样的计算量可能比Top-k采样更大。
基于温度的采样
通过温度(temperature)来调整概率分布。它控制着生成文本的随机性,进而控制文本的多样性。经过温度调整后的概率分布可以表示为:
当 t = 1 时,模型根据其原始概率分布生成文本,在多样性和连贯性之间保持平衡。
当 t > 1 时,模型变得更具创造性和多样性。温度越高,不太可能出现的单词被选中的可能性就越大,从而产生更多样、可能更令人惊讶的输出。在探索不同的生成结果或鼓励模型突破常规思考时,这一点特别有用。
当 0 < t < 1 时,分布向高概率事件倾斜,从而隐式地降低尾部分布的概率质量。模型变得更具确定性和保守性。温度越低,最有可能出现的单词被选中的可能性就更大,从而产生更一致、可预测的输出。当目标是保持特定的风格或语气,或者当模型对其预测的信心至关重要时,这是有益的。
温度通常在 Top K、Top P 或 Min P 等采样方法之后应用。这可确保筛选首先删除不需要的token,然后,通过 temperature 调整剩余的合理token的相对可能性。此顺序保留了过滤步骤的完整性,并允许更安全地使用更高的温度(如 1.0),以增加预过滤选项的多样性。
尽管降低温度可以提高生成质量,但会以牺牲多样性为代价。
Min-P 采样
Min-P 采样是一种随机截断采样方法,在保持一定程度的token多样性的同时,仍然专注于高概率token。该方法使用相对概率阈值 来缩放最大token概率 以确定绝对概率阈值 。然后对概率大于或等于 的标记进行采样。具体工作原理如下:
- 首先从概率分布中找出最大概率,即排名最高的token的概率。将这个最大概率乘以一个参数,得到一个最小阈值。采样所有概率大于或等于的token。最后,对截断后的概率进行重新归一化,得到新的概率分布。
Min-P 采样会根据模型的置信度动态调整过滤阈值,当模型置信度高时,会专注于高概率的token;当置信度低时,会包括多样但合理的token选项。这比top-p和top-k采样更有效地平衡了连贯性和多样性。
通过在多个大语言模型基准测试(包括推理 [GPQA]、小学数学 [GSM8K] 和创意写作 [AlpacaEval])上的实验,相比流行的 top-p 采样方法,min-p 在保持连贯性的同时,能够在温度(temperature)超过 1 的情况下生成更多样化的输出。而在标准温度设置()下,min-p 实现了与 top-p 相当的基准测试性能。
Mirostat 采样
当前的解码算法如top-k和top-p采样,虽然能够生成高质量的文本,但在控制文本特性方面存在不足。而先前的报告显示,人类更倾向于困惑度适中的文本,此外,交叉熵(困惑度的对数)与重复性之间存在近似线性关系。对于较小的 k 和 p 值,困惑度会随着生成文本长度的增加而显著下降,生成的文本容易陷入“乏味陷阱”(boredom trap),即出现大量重复内容。对于较大的 k 和 p 值,困惑度会随着生成文本长度的增加而上升,又容易陷入“混乱陷阱”(confusion trap),生成不连贯的内容。而 mirostat 能够避免这两种陷阱。
Mirostat 采样是一种基于反馈的自适应top-k采样方法,它能够在无需任何调整的情况下生成具有预定目标困惑度的文本(无论长度如何)。实验表明,将目标困惑度值设定在某个阈值以上时,可以显著减少句子级别的重复。
Mirostat 在生成每个词时分为两个阶段进行。首先,它基于词遵循齐夫(Zipf)定律(词频分布曲线)的假设使用最小均方误差(MMSE)来估计 s 的值;其中,s 是表征分布的指数。然后,使用 top-k 采样;其中,k 是估计的 s 和输出文本的目标困惑值的函数。
以下详细介绍了 mirostat 算法,用于生成具有预定平均困惑值的文本。输入是一个目标困惑值 τ,初始化一个变量 µ = 2τ。每个词的生成过程如下:首先根据公式30计算,然后根据公式(2)近似计算 k,接着使用 top-k 采样来采样下一个词 X,计算误差项 e 为采样词 X 的观察到的困惑值 S(X) 与 τ 之间的差值,最后利用 e 更新 µ。
虽然可以通过迭代最可能的词来设置对应于具有合适困惑量的词的 k 值,以此来调整算法中的 k 值,从而控制困惑值。但 mirostat 通过反馈机制来自动调整 k 值,从而实现对文本生成过程的动态控制,确保生成的文本在整个过程中保持预定的困惑度水平。具体来说,算法通过不断地估计 s、计算 k、采样词、计算误差并更新 µ,使得生成的词序列的困惑值能够稳定在目标值 τ 附近。这种基于反馈的机制允许 mirostat 自适应地调整采样策略,避免了传统方法中因参数固定而导致的困惑度波动问题,从而能够生成更符合预期的高质量文本。
创新点:
- 直接控制困惑度:Mirostat提供了一种新的方法来直接控制生成文本的困惑度,避免了现有方法中繁琐的参数调优过程。避免低质量生成陷阱:通过反馈机制和自适应调整,Mirostat能够有效避免“乏味陷阱”和“混乱陷阱”,生成更加自然和连贯的文本。人类偏好一致性:实验验证表明,Mirostat生成的文本质量更符合人类的阅读偏好,特别是在流畅性和一致性方面。
局限:
- 算法效率:虽然Mirostat能够生成高质量的长文本,但在实时应用场景下,其计算效率仍有改进空间。
重复控制
一些场景下,需要通过惩罚进行重复控制。常见的重复控制手段有:
重复惩罚 (repeat_penalty):防止模型在生成文本过程中过度重复之前已经生成的内容。Repetition Penalty 通常通过一个惩罚因子(penalty factor)来控制惩罚的程度。惩罚因子大于 1 时,表示增加对重复内容的惩罚。具体来说,对于已经生成的 token,其概率被除以惩罚因子。这样,这个已经被生成过的词在下一个位置被选中的概率就降低了。
频率惩罚(frequency_penalty):通过对已生成词汇的概率分布进行调整,来影响模型后续词汇的选择。Frequency Penalty 会根据词汇在生成文本中出现的频率来调整其概率。具体来说,它会对高频词汇施加惩罚,降低这些词汇在未来生成中出现的概率,从而鼓励模型探索一些不那么常见的词汇,使生成的文本更加多样化。
Frequency Penalty 的取值范围通常在 0 到 2 之间。当 Frequency Penalty 为 0 时,不对词汇的频率进行惩罚,允许高频词频繁出现;当 Frequency Penalty 值大于 0 时,会随着值的增大,更倾向于降低高频词汇的概率,使模型减少对常见词汇的依赖,生成更多新颖、不常见的词汇和表达方式。
Frequency Penalty 作为一个缩放因子,直接作用在模型预测的对数概率上,其数学表达形式为:(1 - frequency_penalty) * log_probability
存在惩罚(presence_penalty):关注词汇是否已经在生成的文本中出现过,只要词汇出现过,无论出现的频率如何,都会对其施加一定的惩罚,即降低该词汇再次被选中的概率,从而促使模型引入更多新的词汇,让生成的文本在主题和内容上更加丰富多样。
Presence Penalty 的取值通常也在 0 到 2 之间。当 Presence Penalty 为 0 时,不对已出现的词汇施加任何惩罚,允许重复使用相同的词汇;当 Presence Penalty 值大于 0 时,会随着值的增大,增加对已出现词汇的惩罚力度,使模型更倾向于选择尚未出现过的词汇进行生成,避免内容的重复,增加文本的多样性。
与 Frequency Penalty 惩罚词汇出现频率不同,Presence Penalty 对所有已出现的词汇施加的惩罚是相同的,出现2次的词汇和出现 10 次的词汇会受到相同的惩罚。
不同采样方法执行顺序最佳实践
通常情况下,可以结合多种采样方法一起使用。而采样方法的应用顺序会显著影响输出质量。在 llama.cpp 等框架中实现的标准和推荐顺序通常为:
- 惩罚:对初始化的 logit 应用惩罚,如:repeat_penalty、frequency_penalty、presence_penalty。过滤/截断: 按顺序应用筛选方法,以删除不太可能或不需要的token。llama.cpp 中的典型顺序是如下所示。注意:确切的顺序可能因版本或分支而略有不同,如果精度至关重要,需查阅特定文档。每个过滤器都对前一个过滤器传递的候选集进行操作。
- Top K (top_k)无尾采样 (tfs_z)Typical Sampling(typical_p)Top P (top_p)Min P (min_p)
- 温度缩放: 将剩余候选token的 logit 除以 temperature 值。Softmax & Sampling: 应用 softmax 函数将最终缩放的 logit 转换为概率,然后根据此分布对下一个token进行采样。
为什么这个顺序很重要?
- 首先根据模型的原始预测删除低概率或其他不需要的token。然后,温度(Temperature)仅用在筛选后幸存下来的合理候选者中,重新调整概率,在不重新引入不良候选者的情况下,微调最终选择似然。在筛选之前应用温度缩放可能会扭曲初始概率,可能导致不需要的token通过筛选阶段或错误地筛选出好的token。
遵循此标准顺序可确保每个步骤都按预期运行。但在使用 Mirostat 时,它取代了步骤 2 和 3,动态控制整个过程本身。
什么时候调整不同的参数设置?
以下情况增加温度:
- 响应过于笼统或可预测想要更具创意或多样化的输出模型似乎处于 “安全模式” 中,默认使用常见的回复
以下情况降低温度:
- 回答过于随机或不连贯需要事实的准确性模型产生幻觉或编造
在以下情况下使用 min-p 而不是 top-p
- 注意到模型包含不太可能或无意义的选项希望在确保连贯性的同时保持多样性类似提示之间的响应质量差异很大
在以下情况下增加重复惩罚
- 模型陷入循环文本包含过多重复的短语或概念模型不断重用相同的示例或模式
在以下情况下避免高重复惩罚
- 在编码场景(通常需要重复)模型避免了必要的重复(如在列表中)注意到尴尬的措辞以避免重复
不同场景下采样推荐值
采样设置会极大地影响模型的性能。对于大多数使用场景而言,建议如下:
- 尝试 Min P (0.05-0.1) 与温度 (0.7-0.9) 以保持良好平衡在不同采样的最后应用温度(temperature)。谨慎使用重复惩罚 (1.0-1.2)根据特定需求尝试设置
注:不同的模型对这些设置的响应可能不同,因此,需要通过一些实验帮助找到特定模型和场景的最佳参数。以下是一些场景的推荐设置。
设置 | 常规 | 编码 | 事实 | 写作 | 聊天 |
---|---|---|---|---|---|
min_p | 0.05 | 0.05 | 0.1 | 0.05 | 0.05 |
temperature | 0.7 | 0.2 | 0.3 | 1 | 0.85 |
top_p | 0.9 | 0.9 | 0.8 | 0.95 | 0.95 |
mirostat | 0 | 0 | 0 | 0 | 0 |
repeat_penalty | 1.1 | 1.05 | 1.05 | 1 | 1.15 |
top_k | 40 | 40 | 0* | 0 | 0 |
此外,一些指南建议 Top K = 40,但 Min P 通常提供更好的自适应筛选。对于大多数事实场景,考虑单独使用 Min P ,并设置一个更高的值(0.1)。
LLM生成的回答中疑难场景的解决思路
当模型的输出不令人满意时,调整采样参数会有所帮助。但是,参数调整并不总是导致问题的原因。许多问题源于更基本的因素:
- 提示质量: 提示是否清晰、具体且明确?它是否提供了足够的背景信息?上下文窗口: 是否已达到模型的上下文限制,导致它无法跟踪早期信息?模型适用性: 所选模型在知识、推理能力和大小方面是否适合任务?
通常考虑首先解决这些基本方面。如果问题仍然存在,继续进行参数调整。注意:调整通常是一个迭代过程 ,并且更改可能会产生相互影响 。一次修改一个参数并评估整体输出质量。
模型不断重复
第一步:
- 检查提示和上下文: 确保提示不会无意中鼓励重复。验证上下文窗口未满。评测选择的模型: 有些模型本质上更容易重复。
参数调整(按优先级排序):
- 增加重复惩罚: 逐渐增加 repeat_penalty(例如,1.05、1.1、最大 1.15-1.2),监控不自然的措辞。尝试频率/存在惩罚: 如果简单的重复惩罚不足或导致问题,则尝试使用 frequency_penalty(例如:0.1-0.5)来阻止过度使用常用词,或使用 presence_penalty(例如:0.1-0.5)来鼓励新颖性。调整筛选条件: 尝试略微增加 min_p(例如:增加到 0.1)或略微减少 top_p(例如:降低到 0.85),以过滤掉可能导致循环的低概率延续。调整温度: 如果使用高温值,请尝试将其稍微降低(例如:0.7 或 0.8)。
输出太随机/不连贯
参数调整(按优先级排序):
- 使用 Min P 而不是值为 0.1 的 Top P逐渐降低温度(尝试 0.7,然后 0.5)如果仍然存在问题,请考虑启用 Top K = 40 作为最后的手段
输出过于通用/可预测
参数调整(按优先级排序):
- 逐渐升高温度(0.9,然后 1.0)将 Min P 值降低到 0.05 或 0.03确保禁用 Top K(设置为 0)
模型生成不正确的事实
参数调整(按优先级排序):
- 温度显著降低(0.3 甚至 0.1)将 Min P 增加到 0.1 或 0.15考虑调整提示策略以鼓励事实的准确性
总结
本文讲述了贪心搜索、束搜索、top-k、top-p、min-p 等解码策略。
当使用LLM进行文本生成时,贪心搜索、束搜索 和 top-k 截断方法会导致大量的重复(用蓝色显示),而带温度和不带温度的采样往往会导致不连贯(用红色显示)。top-p采样(核采样)在很大程度上避免了这两个问题。
相比流行的 top-p 采样方法,在温度(temperature)超过 1 的情况下,min-p 在保持连贯性的同时,能够生成更多样化的输出。
而 Mirostat 采样是一种基于反馈的自适应top-k采样方法,它能够在无需任何调整的情况下生成具有预定目标困惑度的文本(无论长度如何)。实验表明,将目标困惑度值设定在某个阈值以上时,可以显著减少句子级别的重复。
另外,还探讨了不同采样方法执行顺序最佳实践,不同场景下采样的推荐值以及LLM生成的回答中疑难场景的解决思路。
此外,还有无尾采样(tail free sampling)、采样、采样、Top- 采样等解码算法,本文就不一一介绍了。
参考文档:
- 如何生成文本: 通过 Transformers 用不同的解码方法生成文本*Comprehensive Guide to LLM Sampling Parameters*The Curious Case of Neural Text DegenerationMin P Sampling: Balancing Creativity and Coherence at High Temperature动手学深度学习:束搜索Mirostat: A Neural Text Decoding Algorithm that Directly Controls Perplexitytop-nsigma, 更好的大模型采样Truncation Sampling as Language Model DesmoothingLLM 中的生成采样:实现和解释*一文读懂 LLM 解码策略:从贪婪解码到核采样