大家在体验大语言模型或者多模态大模型的开源应用时,经常会看到类似下面这个页面,用来控制大模型输出的一些参数设置:
或者在代码中也经常需要设置以下几个参数:
{
"num_beams": 1,
"max_tokens": 2048,
"do_sample": true,
"repetition_penalty": 1.05,
"temperature": 0.7,
"top_p": 0.8,
"top_k": 20,
}
这些参数设置会直接影响大模型的输出多样性和质量,因此很多面试官都喜欢通过提问这些参数的含义或者使用技巧,来考察首选人对大模型的掌握程度。本文主要介绍 top_k, top_p, temperature
以及num_beams, repetition_penalty, max_new_tokens
这几个核心参数的含义及使用技巧。
大模型生成策略
我们首先要知道大模型是如何生成结果的。大语言模型根据输入token序列来输出下一个token。每次模型想要生成另一个token时,会重新阅读整个token序列(输入token序列+已经生成的token序列)并预测接下来应该出现的token,也就是自回归生成(Auto-Regressive Generation),如下图所示:
GIF来源:https://pic2.zhimg.com/v2-a8e2ff8e26fa1a78b02bf000ad1397db_b.webp
大模型在自回归生成过程中,达到终止条件(如一个标点符号或一个最大长度)时就会停止输出。在每一步,模型会对于词表中的所有token,给出一个概率分布,表示它对下一个单词的预测,然后通过解码策略选出一个token作为最终的输出。
例如,如果输入的文本是“我喜欢”,那么模型可能会给出下面的概率分布,假设选择概率最大token作为输出结果,也就是“吃”,那么第二次预测,大模型的输入就变成了“我喜欢吃”,然后再选择下一个token,直到达到终止条件:
常用解码方法如下:
- 贪心解码(Greedy Decoding):直接选择词表中概率最高的token。这种方法简单高效,但是可能会导致生成的文本过于单调和重复。
- 随机采样(Random Sampling):按照概率分布随机选择一个token。这种方法可以增加生成的多样性,但是可能会导致生成的文本不连贯和无意义。
- 束搜索(Beam Search):维护一个大小为
num_beams
的候选序列集合,每一步从所有词表的概率分布中选择概率最高的num_beams
个token,然后保留总概率最高的num_beams
个候选序列。从所有完成的候选序列中,选择概率最高的序列作为最终生成的结果。这种方法可以平衡生成的质量和多样性,但是可能会导致生成的文本过于保守和不自然。搜索过程如下图所示(此时num_beams=2
)。beam search在每一步需要考察的候选人数量是贪心搜索的num_beams
倍,因此是一种牺牲时间换性能的方法。
可以看到,贪心解码和束搜索对于同一个输入,大模型的输出都是固定的,缺乏多样性,而随机采样又存在生成内容质量不高的问题。我们想要大模型的输出的内容质量又高,同时又兼顾多样性(创造性)。因此,有了下面的几个获取候选token的方法(采样参数)。
Top_k
Top-k 采样是对前面“贪心解码”的优化,它从词表logits 排名前 k 的 token 中进行抽样,允许其他分数或概率较高的token 也有机会被选中。在很多情况下,这种抽样带来的随机性有助于提高生成质量。如下图所示:
Top_p
top-k 有一个缺陷,那就是“k 值取多少是最优的?”非常难确定。于是出现了动态设置 token 候选列表大小策略——即核采样(Nucleus Sampling)。
top-p 采样思路:在每一步,只从累积概率超过某个阈值 p 的最小token集合中进行随机采样,而不考虑其他低概率的token。这种方法也被称为核采样(nucleus sampling),因为它只关注概率分布的核心部分,而忽略了尾部部分。
例如,如果 p=0.8,那么我们只从累积概率达到 0.8 的最小token集合中选择一个单词,而不考虑其他的token。这样可以避免采样到一些不合适或不相关的token,同时也可以保留一些有趣或有创意的token。如下图所示:
从top_p的选择过程可以看出:
- 如果词表的概率分布平缓,那么候选的token会多一些,会增加输出结果的多样性
- 如果词表的概率分布尖锐,那么候选的token会少一些,会增加输出结果的准确性
Temperature
Temperature 采样受统计热力学的启发,高温意味着更可能遇到低能态。在实际应用中,Temperature 采样是对Softmax函数的一个参数调节,如下图所示:
根据公式中的参数计算可以看到:
- 较低的 temperature,会使得原本概率较高的token获得更高的概率值,原本概率较低的token获得更低的概率值,这就导致输出结果更确定,质量更高
- 较高的 temperature,会使得原本token的概率分布更平缓,导致输出结果的多样性更高
联合使用的顺序
通常我们是将 Top-k、Top-p、Temperature 联合起来使用。使用的先后顺序是 Top_k->Top_p->Temperature
。
参考资料
- [1] https://blog.csdn.net/u012856866/article/details/140308083
- [2] https://www.bilibili.com/video/BV1nK421Y72d/?share_source=copy_web&vd_source=79b1ab42a5b1cccc2807bc14de489fa7
- [3] https://www.bilibili.com/video/BV1UM4m127A2/?share_source=copy_web&vd_source=79b1ab42a5b1cccc2807bc14de489fa7