交叉熵、信息与散度:我们每天都在猜,只是有人猜得更贵
我们每天都在猜。
猜明天会不会下雨,猜一个人会不会答应,猜股票会上涨还是下跌,猜消费者喜欢什么,甚至猜下一个字会是什么。
很多时候,我们并没有确定答案。
我们只有一个判断:
“我觉得它发生的概率是多少。”
而信息论研究的一个核心问题,就是:
当我们面对一个不确定的世界时,应该怎样衡量“猜”的成本?
这就引出了信息量、熵、交叉熵和 KL 散度。
它们看起来是四个数学概念,其实可以用一句非常简单的话串起来:
世界有不确定性,我们有自己的判断;如果判断错了,就会产生额外的代价。
信息量:越意外的事情,信息越多
假设一枚硬币正面朝上的概率是 50%。
如果有人告诉你:
“硬币是正面。”
你不会特别惊讶。
因为这件事情并不罕见。
但如果有人告诉你:
“连续抛 100 次,100 次全部是正面。”
你就会非常惊讶。
为什么?
因为发生概率越低,事情越“意外”。
信息论把这种“意外程度”定义为:
$$ I(x)=-\log p(x) $$
这里的 (p(x)) 是事件发生的概率。
概率越小:
$$ -\log p(x) $$
就越大。
所以:
- 必然发生的事情 → 信息量接近 0
- 50% 概率的事情 → 信息量较小
- 10% 概率的事情 → 信息量更大
- 0.001% 概率的事情 → 信息量非常大
这里的“信息”不是“有多少知识”,而是:
当一件事情发生时,它给我们带来了多少意外性。
熵:一个世界到底有多难猜?
如果只讨论一个事件,可以计算它的信息量。
但现实世界不是只发生一个事件。
例如天气可能是:
| 天气 | 概率 |
|---|---|
| 晴 | 70% |
| 雨 | 20% |
| 雪 | 10% |
我们当然可以分别计算晴、雨、雪的信息量。
但我们更关心一个问题:
如果每天都要面对这个天气系统,平均来说,每天要面对多少不确定性?
这就是熵。
$$ H(P)=-\sum_i p_i\log p_i $$
熵可以理解成:
一个概率分布本身平均有多难猜。
例如:
公平硬币:
正面 50%,反面 50%。
两种结果一样常见,因此很难提前猜。
熵比较高。
如果硬币变成:
正面 99%,反面 1%。
那就非常容易猜。
熵就低很多。
所以:
熵高,不代表世界更糟;只是代表这个世界更加不可预测。
这点非常重要。
现实世界和我们的判断,是两回事
现在进入真正有意思的地方。
假设真实天气分布是:
| 天气 | 真实概率 P |
|---|---|
| 晴 | 70% |
| 雨 | 20% |
| 雪 | 10% |
这是现实。
但是你不知道真实分布。
你心里认为:
| 天气 | 你的判断 Q |
|---|---|
| 晴 | 50% |
| 雨 | 30% |
| 雪 | 20% |
这就是你的认知模型。
注意:
P 是世界本身,Q 是你认为世界是什么样。
现实和认知,从来不是同一个东西。
交叉熵:拿着自己的判断面对现实
如果你按照自己的判断 Q 来进行预测、编码或者决策,但是现实却按照 P 发生,那么你最终付出的平均代价是多少?
这就是交叉熵:
$$ H(P,Q)=-\sum_i p_i\log q_i $$
为什么前面是 (p_i),里面却是 (q_i)?
因为:
事情到底发生多少次,由现实决定。
而:
你为这些事情准备了多少“预测成本”,由你的判断决定。
还是拿天气来说。
你觉得晴天只有 50%。
但实际上晴天发生了 70%。
于是你对最常发生的事件准备得不够充分。
反过来,你认为下雪有 20%,实际上只有 10%。
你又为一个不常发生的事件准备了过多资源。
最终:
你不是因为世界本身的不确定性多花钱,而是因为自己的判断不够准确,又多花了一部分钱。
KL 散度:因为判断错误,多付出的代价
这里出现了一个非常漂亮的公式:
$$ H(P,Q)=H(P)+D_{KL}(P\parallel Q) $$
也就是说:
交叉熵 = 现实本身的最低不确定性成本 + 认知错误造成的额外成本。
其中:
$$ D_{KL}(P\parallel Q) = \sum_i p_i\log\frac{p_i}{q_i} $$
就是 KL 散度。
它可以直观理解成:
你的认知模型 Q 和现实 P 不一致,因此产生的额外信息代价。
对于刚才的例子:
$$ H(P)\approx1.157 $$
而:
$$ H(P,Q)\approx1.495 $$
所以:
$$ D_{KL}(P\parallel Q)\approx0.338 $$
也就是说:
现实本身的“不确定性”不是你的错,但你对现实的错误判断,又额外产生了一部分成本。
一个非常重要的区别:不确定性不是认知错误
这是理解整个理论最重要的一步。
假设天气明天有:
晴 50%,雨 50%。
即使你拥有全世界最强大的计算能力,你仍然不能在今天确定明天到底下不下雨。
这是现实本身的不确定性。
它对应的是熵。
但如果真实情况是:
晴 90%,雨 10%。
你却坚信:
晴 10%,雨 90%。
那么问题就不再只是现实的不确定性。
而是:
你的认知模型错了。
这就是 KL 散度所描述的部分。
因此可以把它简单地理解成:
熵:世界有多难猜。
KL 散度:我因为猜错而多付出了多少代价。
这两个问题不能混在一起。
为什么 KL 散度永远不会小于零?
有一个非常漂亮的性质:
$$ D_{KL}(P\parallel Q)\geq0 $$
为什么?
因为如果你知道真实分布 P,那么按照 P 来描述现实,就是最有效的。
你换成另一个错误的分布 Q,不可能凭空获得额外的信息效率。
所以:
认知模型正确,是基准。
认知模型错误,只会增加额外成本。
当:
$$ P=Q $$
时:
$$ D_{KL}=0 $$
也就是:
你的判断和现实完全一致,没有额外的认知误差成本。
但 KL 散度不是普通的“距离”
这里还需要特别注意。
我们平时说“距离”,往往意味着:
A 到 B 的距离 = B 到 A 的距离。
但是 KL 散度不是这样:
$$ D_{KL}(P\parallel Q) \neq D_{KL}(Q\parallel P) $$
所以它更适合被理解为:
“用 Q 去描述 P 时产生的额外代价。”
而不是简单的“P 和 Q 相差多少”。
这也是为什么它叫“散度”,而不是普通的几何距离。
机器学习为什么喜欢交叉熵?
现在再看人工智能,就容易理解很多了。
假设模型预测下一个词:
“今天天气很……”
模型可能认为:
- 好:40%
- 热:30%
- 冷:10%
- 糟糕:5%
- ……
但训练数据告诉模型:
实际答案是“好”。
模型就会受到一个反馈:
你给“好”的概率是多少?
如果模型认为“好”的概率非常高,损失就小。
如果模型认为“好”的概率只有 0.001%,损失就非常大。
对于一个确定标签的情况,交叉熵实际上会变成:
$$ -\log q(y) $$
也就是说:
模型越相信正确答案,损失越小;越不相信正确答案,损失越大。
于是训练模型的过程,可以粗略理解成:
不断拿现实发生的结果,纠正模型自己的概率判断。
这其实就是一种“认知纠错”
现在可以换一个角度看机器学习。
模型一开始并不知道世界是什么样。
它有一个内部模型:
$$ Q $$
然后不断接触现实数据:
$$ P $$
如果预测错了,就产生损失。
训练的过程,就是不断修改 Q:
$$ Q_1\rightarrow Q_2\rightarrow Q_3\rightarrow\cdots $$
让它越来越接近现实。
因此:
机器学习的一个核心过程,就是用现实不断纠正自己的概率模型。
这也是交叉熵如此重要的原因。
人类其实也一直在做同样的事情
你第一次下雨前看到乌云。
你可能认为:
乌云出现以后,80% 会下雨。
结果后来发现:
实际只有50%。
你的模型就应该调整。
如果你愿意不断根据现实修正自己的判断,那么你的预测会越来越准确。
但是如果你发现:
“怎么今天没下雨?”
然后不是修改自己的判断,而是说:
“一定是今天特殊。”
下一次又失败,再说:
“这次也是特殊情况。”
那么你实际上是在保护自己的 Q,而不是纠正 Q。
这就是认知系统最危险的一种状态:
现实不断提供错误反馈,但认知模型拒绝修改。
所以,真正聪明的系统,不是没有错误
现实世界太复杂。
没有任何人能够永远预测正确。
真正重要的是:
错误出现以后,系统能不能发现错误,并且修改自己的模型。
从这个角度看:
熵告诉我们:
世界本身有多少不可预测性。
交叉熵告诉我们:
我拿自己的模型面对现实,要付出多少代价。
KL 散度告诉我们:
其中有多少是因为我的模型错了而产生的额外代价。
于是可以用一句话总结:
世界的不确定性不是错误;把错误的判断当成确定的真相,才会产生额外的代价。
这也解释了为什么信息论不仅是通信技术的基础,也成为机器学习、人工智能的重要数学基础。
而它还可以继续往前走一步:
如果一个人的错误判断只影响自己,代价可能只是自己承担;如果一个机构的错误判断影响几百万人,那么“如何发现和纠正认知错误”,就不再只是数学问题,而变成了制度问题。
这正是下一篇文章要讨论的问题。