信息量、熵与交叉熵
有了概率地图,怎样量出意外、不确定性,以及模型猜错的代价?
有了概率地图,怎样量出预测的代价?
上一课已经认识随机变量、条件概率、期望与方差。现在模型面对「今天天气很 ___」,给每个候选词分配概率 q。这张地图说明模型准备怎样下注,却还没有告诉我们它有多难猜、猜错的代价是多少。
本课沿三步走:一个结果有多意外 → 整个分布平均有多难猜 → 用模型的地图预测真实样本有多贵。前一课讲概率从哪里来,这一课讲怎样用概率衡量信息。
信息量:越意外的消息越「值钱」
有了「概率」,下一个问题是:一条消息到底带来多少「信息」? 先靠直觉感受一下。 朋友跑来告诉你两件事:
- 「明天太阳会从东边升起」——你眉头都不抬,等于没说。
- 「楼下小卖部老板昨晚中了五百万」——你瞬间瞪大眼,信息量爆炸。
区别在哪?第一件事几乎必然发生(概率≈1),第二件事极其罕见(概率极小)。一件事越「出乎意料」,它一旦成真带来的信息就越多。这就是信息论的核心直觉。 把它写成公式,就是事件 x 的信息量(用它的概率 p 来算):
为什么偏偏是 −log,而不是别的?除了「概率越小、数值越大」这个起码要求, 它还满足一条非常关键的性质:两条互不相干的消息,信息量应该能直接相加。 而 log 恰好能把「概率相乘」变成「信息相加」,天造地设。先用三个极端值检验一下它靠不靠谱:
- p = 1(太阳东升):I = −log 1 = 0。毫不意外,零信息。
- p = 0.5(抛一次硬币):I = −log 0.5 = 1 比特。一个「是/否」的信息。
- p = 0.001(中大奖):I ≈ 10 比特。极度惊讶,信息量巨大。
顺带说一句单位:用以 2 为底的对数,单位是比特(bit),正好对应「需要几个 0/1 才能表达这条消息」; 深度学习里更常用自然对数(底数 e),单位叫奈特(nat)。两者只差一个固定常数,性质完全一样。
熵:整个分布平均有多难猜
信息量说的是「某一个具体结果」有多意外。可如果想衡量「整件事整体上有多难预测」, 就得把所有可能结果的意外程度加权平均——用每个结果自己的概率当权重。 这个平均意外程度,就叫熵(entropy):
直觉很好抓:拿两枚硬币对比就懂了。
- 均匀分布(每种结果概率相等):熵最大。完全没有头绪,平均最意外。
- 确定性分布(某个结果概率为 1):H = −1 × log 1 = 0。结果板上钉钉,毫无悬念。
这恰好解释了「为什么 AI 猜词是一件有意义的事」。如果中文的每个字都等概率出现,那语言就是纯噪声, 熵高到没法预测,模型再聪明也无能为力。但真实语言远没那么随机—— 「今天天气很」后面接「好」的可能远大于接「桌子」。语言的熵不高不低: 有规律可循(所以可预测、可压缩),又留有选择(所以不无聊)。正因如此,「预测下一个词」才既不是送分题、也不是无解题。
交叉熵:拿一张「可能画错的地图」去赌真实世界
前面的熵,衡量的是真实世界本身有多难猜。但在 AI 里,我们手上往往只有一张模型自己画的「地图」——模型对各种结果的概率估计 q,它未必和真实情况 p 一致。 于是出现一个新问题:如果我拿着模型这张(可能画错的)地图,去面对真实世界,平均会有多「意外」?
答案就是交叉熵(cross-entropy):用模型分布 q 给出的「意外程度 −log q」, 按真实分布 p 来加权平均——
在一条「猜下一个词」的训练样本里,观测到的目标词是确定的:正确的词就是「猫」。 把这个事实写成概率分布 p,它是一个独热分布——p(猫)=1,其它词全是 0。 而模型的预测 q 则是一组没那么笃定的数,比如 q(猫)=0.7、q(狗)=0.2、q(鸟)=0.1:
因为 p 是独热的,求和里只有「猫」这一项的权重不为 0,整个交叉熵干脆利落地塌缩成一项:
现在体会一下它的脾气:模型越自信地答对(q(猫) 越接近 1),−log q(猫) 越接近 0,交叉熵越小; 模型越把正确答案的概率压低(q(猫) 越接近 0),−log q(猫) 越往上飙,交叉熵越大。 这不正是一个理想的「错得多离谱」打分器该有的样子吗?
所以这件事一点都不巧:「模型预测下一个词」的损失,天生就该用交叉熵来衡量。 第 15 课《损失函数》会把它正式当成训练的目标——到时你会看到,那个公式不是谁拍脑袋规定的, 而是信息论在这里自然长出来的。
① 交叉熵永远 ≥ 熵。 多出来的那部分,衡量的是「模型地图 q 和真实世界 p 差了多远」, 它有个名字叫 KL 散度。地图画得越准,q 越贴近 p,这段差距越小,交叉熵就越逼近真实世界本身的熵——再也省不掉了。
当正确类别的预测概率 q 接近 0 时,−ln(q) 变大,对 q 的导数是 −1/q。但经过 Softmax 与链式法则,对 logits 的梯度为 q−y,而不是无限增大。与「Sigmoid/Softmax 后的平方误差可能在饱和区间信号较弱」比较时,要说明求导对象。
三种量,回答三个不同的问题
H(p,q)=−Σ p(x) ln q(x)
DKL(p‖q)=Σ p(x) ln[p(x)/q(x)]=H(p,q)−H(p)
熵问真实分布自身有多难猜;交叉熵问用 q 去预测 p,平均承担多少负对数代价;KL 散度是这张预测地图带来的额外代价。KL 通常不对称,不是几何距离。
单条训练样本的标签可以用独热分布表示,但这不意味着同一前文在真实语言中只能有一种后续。我们是用许多样本近似学习分布。
p(x)=0 的项按极限约定贡献 0;若 p(x)>0 而 q(x)=0,交叉熵与 KL 为无穷大。实际实现使用稳定的 log-softmax 等方法,避免直接对舍入后的零概率取对数。
最后别把两个概念混为一谈:概率归一化只是输出形式正确,不保证模型校准良好,更不保证它说的事实是真的。下一课用神经元把前面这些数学工具拼成一个可训练的系统。
总结
概率分布是对「所有可能结果各占多少」的完整描述(非负、加和为 1)—— 这就是模型输出被叫做「概率」的原因。信息量 −log p 刻画一个结果有多意外;熵是整个分布的平均意外程度;交叉熵衡量「拿模型的分布 q 去面对真实分布 p」平均有多意外。 当单条样本的标签写成独热分布时,交叉熵塌缩成 −log(模型给正确答案的概率)—— 它是一种常用的「错得多离谱」打分器,也正是后面分类任务损失函数的来历。
💡 用大白话梳理:这一课的核心直觉
- 概率分布:非负、加和为 1,为可能结果分配概率,频率可用来估计它。
- 信息量 I = −log p:越意外信息越大;p=1 时为 0。log 来自「信息可加」。
- 熵 H(p) = −Σ p·log p:分布的平均意外程度,均匀时最大、确定时为 0。
- 交叉熵 H(p,q) = −Σ p·log q:p 为独热时塌缩成 −log q(正确答案)。
- KL 散度:交叉熵超出熵的部分,衡量模型分布与真实分布的差距。
学习小测验
动动脑筋:核心直觉小测验(选出你的答案后点击「提交」,即可查看生动通俗的详细解析)
11 神经元结构
一个加权投票器,加上偏置与激活,就成为神经网络的基本单元。