跳到正文

为什么同样的问题,模型的回答会不同?

从贪心与采样理解回答的随机性,认识 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 ℃」,但实际上今天广州可能是下雨的。模型并没有意识到自己回答的是错误的,它只是根据概率选择了一个最可能的答案。

七、成就挑战