采样

采样
可爱可倾采样(Sampling)
LLM 在推理时,需要对模型输出的概率分布进行采样,以得到最终的输出。即在生成文本时,需要根据概率分布选择下一个词。
例如:在某一步的输出结果如下:
token1: 0.4
token2: 0.3
token3: 0.2
token4: 0.1
这时应该根据什么规则选择下一个词呢?常用的采样方法有:
- 贪心采样(Greedy Sampling):选择概率最大的词作为下一个词。
- 简单高效
- 可能会导致生成的文本过于单调和重复
- 随机采样(Random Sampling):根据概率分布随机选择下一个词。
- 增加生成的多样性
- 生成的文本可能不够连贯和无意义
- 束搜索(Beam Search):维护一个大小为 k
的候选序列集合,每一步从每个候选序列的概率分布中选择概率最高的 k
个单词,然后保留总概率最高的 k 个候选序列。k=1时即为贪心采样。
- 增加搜索空间,平衡生成的质量和多样性
- 可能会导致生成的文本之间的相似度很高,多样性不足,导致过于保守和不自然。
top-k 采样和 top-p 采样是介于贪心解码和随机采样之间的方法,也是目前大模型解码策略中常用的方法。
1 Top-k采样
在每一步,只从概率最高的 k 个单词中进行随机采样,而不考虑其他低概率的单词。 k=1 时即为贪心采样。
Top-k 采样是对前面“贪心策略”的优化,它从排名前 k 的 token 中进行抽样,允许其他分数或概率较高的token 也有机会被选中。 在很多情况下,这种抽样带来的随机性有助于提高生成质量。
- top-k 优点:
- 可以根据不同的输入文本动态调整候选单词的数量,而不是固定为 k 个。不同的输入文本可能会导致不同的概率分布,有些分布可能比较平坦,有些分布可能比较尖锐。如果分布比较平坦,那么前 k 个单词可能都有相近的概率,那么我们就可以从中进行随机采样;如果分布比较尖锐,那么前 k 个单词可能会占据绝大部分概率,那么我们就可以近似地进行贪心解码。
- 可以通过调整 k 的大小来控制生成的多样性和质量。一般来说,k 越大,生成的多样性越高,但是生成的质量越低;k 越小,生成的质量越高,但是生成的多样性越低。
- 可以与其他解码策略结合使用,例如温度调节(Temperature Scaling)、重复惩罚(Repetition Penalty)、长度惩罚(Length Penalty)等,来进一步优化生成的效果。
- top-k 缺点:
- 可能会导致生成的文本不符合常识或逻辑。这是因为 top-k 采样只考虑了单词的概率,而没有考虑单词之间的语义和语法关系。例如,如果输入文本是“我喜欢吃”,那么即使饺子的概率最高,也不一定是最合适的选择,因为可能用户更喜欢吃其他食物。
- 可能会导致生成的文本过于简单或无聊。这是因为 top-k 采样只考虑了概率最高的 k 个单词,而没有考虑其他低概率但有意义或有创意的单词。例如,如果输入文本是“我喜欢吃”,那么即使苹果、饺子和火锅都是合理的选择,也不一定是最有趣或最惊喜的选择,因为可能用户更喜欢吃一些特别或新奇的食物。
因此,我们通常会考虑 top-k 和其它策略结合,比如 top-p。
2 Top-p采样
top-k 有一个缺陷,那就是“k 值取多少是最优的?”非常难确定。于是出现了动态设置 token 候选列表大小策略——即核采样(Nucleus Sampling)。
在每一步,只从累积概率超过某个阈值 p 的最小单词集合中进行随机采样,而不考虑其他低概率的单词。即只考虑前 p 的概率的单词。 这种方法也被称为核采样(nucleus sampling),因为它只关注概率分布的核心部分,而忽略了尾部部分。
3 温度调节
温度调节(Temperature Scaling)是一种简单有效的解码策略,它可以通过调整温度参数来控制生成的多样性和质量。
实现主要是将 logits 除以温度来实现温度采样,然后将其输入 Softmax 并获得采样概率。
temperature这个参数可以告诉机器如何在质量和多样性之间进行权衡。 较低的 temperature 意味着更高的质量,而较高的 temperature 意味着更高的多样性。 当 temperature 设置为零时,模型总是会选择具有最高可能性分数的token,从而导致模型生成的回复缺乏多样性,但却能确保总是选择模型评估出的最高质量的token来生成回复。 当 temperature 设置为较大时,概率分布趋向于均匀分布,从而导致模型生成的回复具有更高的多样性,但却可能导致生成的回复质量较低。
4 联合采样
通常将 top-k、 top-p 和 temperature 结合起来使用,以获得更好的生成效果。
使用的顺序一般是 top-k -> top-p -> temperature
例如对于上面的例子:
- 先根据 top-k = 3 采样,得到候选词集合
{token1: 0.4, token2: 0.3, token3: 0.2} - 再根据 top-p = 0.8 采样,得到候选词集合
{token1: 0.4, token2: 0.3} - 最后根据 temperature = 0.7 归一化,得到候选词集合
{token1: 0.54, token2: 0.46} - 根据概率分布随机选择下一个词,得到最终的输出。
5 惩罚机制
频率惩罚(frequency penalty):一种抑制重复生成的机制。它通过对已经生成的词语在下一次生成时进行惩罚来减少某些词的重复出现。 存在惩罚(presence penalty):存在惩罚与频率惩罚类似,但它只关心词语是否已经出现过,而不关心出现的次数。存在惩罚通过减少已经出现过的词语的概率,鼓励生成新的词语,而不会明显抑制常用词的重复。
temperature 参数通过在token选择过程中添加随机性来实现输出内容的多样性,而频率惩罚和存在惩罚则通过对已在文本中出现的token施加惩罚以增加输出内容的多样性。这使得对旧的和过度使用的token进行选择变得不太可能,从而让模型选择更新颖的token。
就像 temperature 一样,频率惩罚和存在惩罚会引导我们远离“最佳的”可能回复,朝着更有创意的方向前进。然而,它们不像 temperature 那样通过引入随机性,而是通过精心计算的针对性惩罚,为模型生成内容增添多样性。在一些罕见的、需要非零 temperature 的任务中(需要对同一个提示语给出多个答案时),可能还需要考虑将小的频率惩罚或存在惩罚加入其中,以提高创造性。但是,对于只有一个正确答案且你希望一次性找到合理回复的提示语,当你将所有这些参数设为零时,成功的几率就会最高。
6 参数调整
1. 只存在一个正确答案
temperature: 0.0
frequency_penalty: 0.0
presence_penalty: 0.0
2. 需要创造性或者多样性
temperature: 增加
frequency_penalty: 增加
presence_penalty: 增加
当模型输出无意义内容或者胡言乱语时,需要降低
temperature top-k top-p
如果模型输出的内容看起来零散并且话题变化太快,应当降低presence_penalty
如果有太多新奇和不寻常的词语,或者存在惩罚设置为零但仍然存在很多话题变化,应当降低frequency_penalty






