模型是如何算出 Token 概率的?
用简单公式、候选分数与 Softmax 类比模型如何得到 Token 的概率分布。
上一讲,我们细讲了下,模型是如何从一组概率分布里,选择一个 token 的。这一讲,我想讲一下模型是如何产生概率分布的。
一、用一个公式理解输入与参数
先从一个最简单的公式讲起。
x 是输入,y 是输出,a、b 就是参数。参数取什么值,决定这个公式怎样处理输入。
二、把输入代入公式,算出候选分数
拿第三章「今天雨天,出门记得带...」这个例子解释一下。不过我想换个角度来给大家解释。同时也先抛弃什么复杂的概率学。我们就用最朴实的乘法和加法来看看。
我们假设输出的是「伞」,但输入略有不同。分别输入「今天晴天,出门记得带...」以及 「今天雨天,出门记得带...」。
两次输入不同的地方是「晴天」和「雨天」,那我们就可以将其稍微简化一下,假设下雨为 1,晴天为 0。换句话说 x(下雨)= 1,x(晴天)= 0。同时经过模型训练我们知道参数 a = 2,b = 1。
套入前面的公式,得出伞的分数就是:
| 情况 | 输入 | 计算 | “伞”的分数 |
|---|---|---|---|
| 下雨 | x = 1 | 2 × 1 + 1 | 3 分 |
| 晴天 | x = 0 | 2 × 0 + 1 | 1 分 |
你可以将分数简单类比为概率。换句话来说,当输入是「下雨」时,「伞」作为「出门记得带」后接龙的可能性更高。
那既然有「伞」的分数公式 y(伞) = a(伞)x + b(伞),自然也会有其他 token 的计算公式,比如雨衣或帽子的计算公式,只是 a 和 b 会不一样。
| 候选 | a | b | 代入公式 | 算出的分数 |
|---|---|---|---|---|
| 伞 | 2 | 1 | 2 × 1 + 1 | 3 |
| 雨衣 | 1 | 1 | 1 × 1 + 1 | 2 |
| 帽子 | -2 | 3 | -2 × 1 + 3 | 1 |
三、把分数转换成概率
这样我们就得到了一个输入,多次运算,得出三个数字,最后通过 Softmax 的数学换算(不用细究,知道就好),把它们转换成加起来等于 100% 的概率。它会让分数较高的候选获得较高的概率。
| 候选 | 公式算出的分数 | 换算后的概率 |
|---|---|---|
| 伞 | 3 | 约 66.5% |
| 雨衣 | 2 | 约 24.5% |
| 帽子 | 1 | 约 9.0% |
四、从简单类比到真实模型
当然实际的运算复杂得多,我只是想通过最简单的数学运算来解释模型是如何得出一组 token 的概率的。
那实际 LLM 预测下一个 token 的过程,可以理解为:
- 输入内容今天下雨,出门记得带…
- 大量相互连接的计算
- 得到很多分数
- 分数 1伞
- 分数 2雨衣
- 分数 3帽子
- ……
- 按采样策略选择一个 Token ID伞
五、搞懂这个概念有什么用?
第一,输入会影响模型算出的概率。
前面的例子里,同样一组参数,输入从「晴天」变成「雨天」,「伞」的分数就变了。实际使用时,你补充的背景、要求和示例,也会参与模型的计算,影响后续 Token 的概率。
正如我在 大语言模型如何生成回答的?中所说,你想要获得好的结果,就要给模型提供足够的信息,以及正确的信息。即使模型发展到现在,把目标、背景和要求写清楚仍会对结果有明显影响。
第二,Token 的概率不等于答案的正确率。
前面「伞」的概率是 66.5%,表示在这个简化例子里,它被选为下一个 Token 的概率。它不表示「带伞这个建议有 66.5% 的概率是正确的」,也不表示模型对整段回答有这么高的把握。
所以,一段话即使读起来流畅、语气很肯定,也可能包含错误。需要确认事实时,仍要核对来源;只让模型把话说得更肯定,并不能提高事实的可靠性。