Transformer 前置知识 05:概率与交叉熵

上一课,softmax 把分数变成了概率。这一课回答下一个问题:模型给出的概率,到底猜得准不准?

训练模型需要一个数字来打分:猜得越差,扣分越多。这个”扣分”就是交叉熵。


先复习一下概率

概率表示一件事发生的可能性,有两条规则:

  1. 每个概率都在 0 到 1 之间
  2. 所有可能的结果,概率加起来等于 1

比如掷骰子,每一面的概率都是 ,六个加起来正好是 1。

模型每次给出几万个概率

模型预测下一个词时,不是只给一两个候选,而是给词表里的每一个词都打一个概率。比如输入”今天天气真 ___”:

候选词 概率
好 0.62
不错 0.15
热 0.08
冷 0.05
差 0.02
…… ……
猫 0.0001
…(几万个词) …
总和 1

现在的大模型,词表通常有 5 万到 10 万多个 token,所以每猜一个词,模型都会输出几万个概率,加起来正好等于 1。这就是第 04 课 softmax 做的事。

正确答案是谁给的?

题目和答案都不用人出,它们就藏在文字里。

拿一句现成的话”小猫跳上桌子,它饿了”,从左往右切开,就自动得到一串”猜下一个词”的题:

题目(前面的文字) 正确答案(原文里的下一个词)
小猫 跳上
小猫跳上 桌子
小猫跳上桌子, 它
小猫跳上桌子,它 饿了

原文里真实出现的下一个词,就是正确答案。训练用的网页、书籍、代码加起来有几万亿个 token,就是几万亿道题。

这种”答案来自数据本身”的方法,叫自监督学习。像 ChatGPT 这样的聊天模型,后面还会用人写的示范回答和人的打分再做调整,但最主要的知识,都是这一步从海量文字里学来的。

只看正确答案的概率

假设正确答案是”好”。有两个不同的模型,各自给出了几万个概率,我们只看”好”这一格:

模型 给”好”的概率
模型 A 83%
模型 B 2%

显然 A 更好。规则很简单:

只看模型给正确答案的那个概率,越高越好。

其他几万个词不用管:概率加起来等于 1,正确答案那一格涨了,别的词自然就变小了。

交叉熵:把概率换成”扣分”

训练需要的是扣分:猜得越差,扣得越多。可概率是越大越好,方向反了。

怎么换算?两步:

  1. 先取对数:概率在 0 到 1 之间, 都是负数,概率越小越往下掉
  2. 再加一个负号:上下翻转,变成正数,这就是扣分
模型 A 模型 B
概率 0.83 0.02
−0.19 −3.91
(扣分) 0.19 3.91

这就是交叉熵:

其中 是模型给正确答案的概率。一句话记住:拿正确答案的概率,取 log,再加负号,就是这次要扣的分。

log p 都是负数,加负号上下翻转,就变成扣分 −log p

自信地猜错,扣分最多

沿着上图的蓝线从右往左看:

正确答案的概率 扣分
1 0(完美)
0.9 0.11
0.5 0.69
0.1 2.30
0.01 4.61
0.001 6.91

概率越接近 0,扣分涨得越来越快,而且没有上限。

打个比方:考试有一种”信心分”。小明说”我有一半把握选 A”,结果答案是 B,扣一点;小红说”我 99.9% 确定是 A”,结果答案是 B,狠狠地扣。交叉熵就是这样打分的,模型会被逼着学会:没把握别乱押宝,有把握要押对。

为什么不直接用 当扣分? 它太”温柔”了:概率从 0.1 掉到 0.001, 只从 0.9 变成 0.999,几乎没区别;而 会从 2.3 涨到 6.9,明显地喊”你错得更离谱了”。训练时,这种明显的差别能让模型更快纠正错误。

考考你

模型 C 给正确答案 10% 的概率,模型 D 只给 1%。D 的扣分大约是 C 的几倍?

答案是 2 倍左右:C 约 2.30,D 约 4.61。

概率小了 10 倍,扣分并没有大 10 倍,而是多出了一个固定的 2.30(也就是 )。这是对数的性质:乘法变成了加法。

1
2
3
import math
print(-math.log(0.1)) # 2.302...
print(-math.log(0.01)) # 4.605...

名字里为什么有”交叉”

完整的交叉熵公式,其实把几万个词都算了进去:

正确答案的标记模型给的概率

“正确答案的标记”是一张表:正确的那个词记 1,其他几万个词都记 0。乘以 0 的项全部消失,只剩正确答案那一项,结果就是 。它衡量的是”正确答案的分布”和”模型给的分布”之间的差距,所以叫”交叉”熵。

一整句话的误差

模型要预测的不止一个词,而是一整句话里每一个位置的下一个词。做法是:

  1. 每个位置算一个交叉熵
  2. 所有位置取平均,就是这句话的误差

训练的时候,用前几课的反向传播和梯度下降,把这个平均误差一点点降下来。误差降低,就意味着模型给正确的下一个词,分配了越来越高的概率。

小结

  1. 模型每次给几万个词各一个概率,加起来等于 1
  2. 正确答案就是原文里真实的下一个词,不用人出题
  3. 衡量模型猜得准不准,只看它给正确答案的概率
  4. 交叉熵 :先取 log(负数),再加负号(变成扣分);概率越高,扣分越少
  5. 自信地猜错,扣分最多
  6. 一句话的误差 = 每个位置交叉熵的平均值

到这里,数学基础就讲完了。下一课讲神经网络:线性层与激活函数。