为什么同样的问题,模型的回答会不同?
从贪心与采样理解回答的随机性,认识 Temperature、Top-p 和 Top-k 的作用。
上一讲,我们了解了词元化。这一课,我们再来细看模型实际是如何选择下一个词元的。
一、贪心与采样:如何选择下一个 Token
上一讲我举了一个问天气的例子,这个例子是为了更好地让大家理解 token 和 token id 这个概念。所以简化了模型输出的部分。
实际上模型的输出并不是直接产生一个 token ID,而是分成两步:
- 第一步:先产生一个含多个 token ID 的概率分布
- 第二步:再从这个概率分布里选择一个 token ID
我们拿一个相对开放的问题来举例。假设现在模型要继续生成「今天下雨,出门记得带」。模型会进行第一步,计算下一个 Token 的概率分布(为了方便解释就不用 Token ID 而是用 Token 了),可能的结果有:
- 伞:50%
- 雨衣:30%
- 外套:15%
- 帽子:5%
然后,模型又会从这一组概率分布里,选择其中一个作为输出。目前主流的选择规则有两种:贪心(Greedy)和采样(Sampling)。
- 贪心:每次选概率最高的。
- 采样:按概率选择,每个候选结果都有机会。
如果大语言模型使用贪心策略,它会选择概率最高的「伞」,生成结果就是「今天下雨,出门记得带伞」。如果模型使用采样策略,它会按概率选择一个,可能会选择「伞」,也可能选择「雨衣」或「外套」。所以每次生成的结果可能不一样。
现在的主流模型公开的推荐和评测配置中,采样相对会比较常见一些。并且一般会提供三个参数去调整采样的结果。
二、Temperature(温度):调整候选的概率
温度越低,越偏向原本概率高的候选;温度越高,候选之间的机会差距越小。
| 设置 | 简单理解 |
|---|---|
低温,例如 0.2 | 热门候选优势更大,选择更集中 |
1.0 | 不通过温度改变原来的概率分布,仍然可以随机抽取 |
高温,例如 1.5 | 冷门候选获得更多机会,选择更分散 |
拿前面的下雨例子来解释。假设模型原本给出的概率是:
- 伞:50%
- 雨衣:30%
- 外套:15%
- 帽子:5%
Temperature 做的事情,就是在抽签之前,重新调整每种签的数量。
| 候选 | 低温:0.5 | 原样:1.0 | 高温:2.0 |
|---|---|---|---|
| 伞 | 约 68% | 50% | 约 38% |
| 雨衣 | 约 25% | 30% | 约 29% |
| 外套 | 约 6% | 15% | 约 21% |
| 帽子 | 约 1% | 5% | 约 12% |
可以看到当温度为 0.5 时,「伞」的机会从 50% 提高到约 68%,而原本冷门的「帽子」更难被选中了。而当温度为 2.0 时,「伞」的机会从 50% 降低到约 38%,而原本冷门的「帽子」机会提高到约 12%。「伞」的优势缩小了,「帽子」也有更多机会。但「伞」仍然排第一,并没有变成所有候选机会相等。 对于大于 0 的温度,单独调整温度不会改变候选的概率排名,只会改变概率分布。
三、Top-p:按累计概率筛选候选
Top-p 是指只从概率累积达到 p 的候选中选择。它的作用是限制候选的范围,减少冷门候选被选择的机会。
还是拿前面的下雨例子来解释:
| 设置 | 保留哪些候选? | 为什么? |
|---|---|---|
top_p = 0.8 | 伞、雨衣 | 伞和雨衣的概率之和为 50%+30%=80% |
top_p = 0.9 | 伞、雨衣、外套 | 前两个不够,加入第三个达到 95% |
top_p = 1.0 | 全部保留 |
四、Top-k:按数量筛选候选
Top-k 是指只从概率最高的 k 个候选中选择。它跟 Top-p 的区别是,Top-k 保留概率最高的前 k 个,Top-p 保留累计概率达到 p 的最小候选集合。同样起到了限制候选范围的作用。
| 设置 | 保留哪些候选? | 为什么? |
|---|---|---|
top_k = 1 | 伞 | 只保留概率最高的 1 个候选 |
top_k = 2 | 伞、雨衣 | 只保留概率最高的 2 个候选 |
top_k = 3 | 伞、雨衣、外套 | 只保留概率最高的 3 个候选 |
top_k = 4 | 全部保留 | 这个示例一共只有 4 个候选 |
五、用抽签理解三个参数
最后总结一下,用抽签作为类比:
| 参数 | 控制什么? | 抽签比喻 |
|---|---|---|
temperature | 候选概率有多集中或分散 | 调整每个候选有多少张签 |
top_k | 保留概率最高的前 k 个候选 | 只准前 k 名入场 |
top_p | 保留累计概率达到 p 的最小一组候选 | 从第一名往下收,凑够概率就停止 |
六、搞懂这些概念有什么用?
目前越来越多的闭源模型不再支持设置这几个参数了。而开源模型往往也会提供推荐的参数配置,一般情况下,其实已经不需要修改这些参数了。了解这几个参数并不能直接帮助你获得更好的结果。
但是通过这个概率的理解,你就能明白其实模型每次的输出,不一定会给出相同的结果。
也就是说,模型的输出是有一定随机性的。这跟你使用传统软件会有很大不同。多数传统程序按固定规则执行,LLM 默认按概率采样,所以相同输入更容易产生不同结果。
另外,这种生成方式,还会带来另一个问题 —— 幻觉(Hallucination)。当大语言模型不知道某件事情时,它并不会总是说「我不知道」,而是会根据概率去选择一个最可能的答案。这就意味着,模型可能会生成错误的答案,甚至是完全虚构的内容。
比如拿第一章天气的例子来说,如果你问模型「今天广州的天气如何?」,在没有额外工具调用的情况下,模型可能会回答「今天广州天气晴朗,温度在 28 ℃」,但实际上今天广州可能是下雨的。模型并没有意识到自己回答的是错误的,它只是根据概率选择了一个最可能的答案。