小遥在奶茶店打工,店里有三种招牌饮品:珍珠奶茶、咖啡、果汁。店长手里有一本“秘密账本”——过去一年,50% 的客人点珍珠奶茶,30% 点咖啡,20% 点果汁。小遥第一天上班没看过账本,凭感觉猜:珍珠奶茶 20%、咖啡 50%、果汁 30%。她按自己的猜测准备原料,结果每天手忙脚乱:客人最常点的珍珠奶茶总是断货,咖啡却越囤越多。猜得越偏,浪费越大。信息论里,把“真实客人的选择”称为真实分布 p,把小遥的“瞎猜”称为预测分布 q,而“按错误猜测备料所要付出的平均代价”,就是交叉熵。本文就用这本“备料账本”作引子,把信息熵、KL 散度、二分类与多分类交叉熵、数值稳定和调参技巧全部串起来,让交叉熵不再是一个吓人的数学符号,而是一把能丈量所有分类模型好坏的“卡尺”。

岗位关联

对 AI 从业者来说,交叉熵是分类任务里出现频率最高的损失函数。搞懂它的来龙去脉,等于同时拥有了“看懂训练曲线、手写损失代码、应对面试推导”的底层能力。

目录
  1. 可视化演示
  2. 一、信息熵入门:确定性账本与“惊讶度”
  3. 二、交叉熵定义:用错误账本应付真实订单
  4. 三、KL散度关联:多交的冤枉钱有名字
  5. 四、二分类交叉熵:只问“要不要加珍珠”
  6. 五、多分类交叉熵:三种口味的正式账本
  7. 六、数值稳定性:别让 Log 零把账本算爆
  8. 七、实战调参技巧:把损失曲线当经营报表
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示交叉熵三大核心:信息熵衡量分布不确定性、KL散度与交叉熵关系(CE=H+KL)、二分类交叉熵损失曲线与Softmax梯度(p-y),动态演示分类损失本质。

本节配有交互动效(进入视口后自动加载,约 3KB)。

信息熵:衡量分布不确定性 靛蓝为均匀分布 浅蓝为峰值分布 H(p) = -sum p(x) log p(x) 均匀分布熵最大(最不确定),分布越集中熵越小(越确定)

一、信息熵入门:确定性账本与“惊讶度”

小遥上班第一天,店长把账本亮给她看:过去一年珍珠奶茶占 50%、咖啡占 30%、果汁占 20%。小遥问:“这有什么用?”店长说:“知道每种饮品的出现概率,才知道每样原料该备多少,才能算出'平均每单要忙活多久'。这个账本,在信息论里就是真实分布 p。”

账本还能告诉我们哪件事最有“信息量”。客人点珍珠奶茶是家常便饭,一点不意外;要是点了半个月才卖出一杯的果汁,小遥会瞪大眼睛——小概率事件带来的惊讶更大。信息论把“看到结果 x 时的惊讶度”称为自信息,它与概率的对数挂钩:

自信息只回答“某个结果带来多少惊讶”。小遥更关心“卖一单平均惊讶几次”——把每种饮品的自信息按真实概率加权平均,就是信息熵 H(p)。它给出了一个不可超越的下限:在只知道真实分布 p 时,最优备料方案的平均代价:

I(x)=−log⁡2p(x)\displaystyle I(x) = -\log_2 p(x)
  1. 按概率加权求和先对每个品类计算 p(x)·(−log₂ p(x)),再全部加起来,得到平均值。
    ∑xp(x)⋅[−log⁡2p(x)]\displaystyle \sum_{x} p(x) \cdot \left[-\log_2 p(x)\right]
  2. 带入奶茶店的数字0.5×1 + 0.3×1.737 + 0.2×2.322 ≈ 1.485 比特。
    0.5×1+0.3×1.737+0.2×2.322≈1.4850.5\times 1 + 0.3\times 1.737 + 0.2\times 2.322 \approx 1.485
  3. 取值下界H(p) ≥ 0,当某个品类概率为 1 时,分布完全确定,H(p)=0。
    H(p)=0  ⟺  分布退化为确定事件H(p)=0 \iff \text{分布退化为确定事件}

二、交叉熵定义:用错误账本应付真实订单

小遥第一天没看账本,凭直觉猜“珍珠奶茶 20%、咖啡 50%、果汁 30%”。她按这套比例备料,可客人依然按真实分布 p 点单:珍珠奶茶经常断货,咖啡囤了一堆。整天的手忙脚乱程度,就是交叉熵——真实世界按 p 一件件发生,小遥却用错误的 q 去估算“每件事有多意外”。

交叉熵的构造规则说穿了只有八个字:“真实加权,猜测取对数”。某个品类按真实概率 p(x) 决定它有多重要,但惊讶度按猜测概率 q(x) 计算:

把数字带进去算一笔账。真实 p=(0.5,0.3,0.2),猜测 q=(0.2,0.5,0.3):

还需要留意的是,交叉熵不讲究对称:H(p,q) 与 H(q,p) 一般不同。把“店长的账本”和“小遥的猜测”对调,成本完全不同——毕竟给事实贴错误标签,和用错误标签解释事实,是两笔账。猜得越偏,总账单越高;完全猜中时,账单回到信息熵。多出的那 0.32 比特冤枉钱,恰好是下一节的 KL 散度。

H(p,q)=−∑x∈Xp(x)log⁡2q(x)\displaystyle H(p,q) = -\sum_{x\in\mathcal{X}} p(x)\log_2 q(x)
  1. 珍珠奶茶项0.5 × (−log₂ 0.2) ≈ 0.5 × 2.322 ≈ 1.161。
    −0.5log⁡20.2≈1.161-0.5\log_2 0.2 \approx 1.161
  2. 咖啡与果汁项−0.3 log₂ 0.5 ≈ 0.300,−0.2 log₂ 0.3 ≈ 0.347。
    0.300+0.347=0.6470.300 + 0.347 = 0.647
  3. 求和对比交叉熵约 1.808 比特,比理想值 1.485 多出约 0.32 比特。
    1.808−1.485≈0.3231.808 - 1.485 \approx 0.323

三、KL散度关联:多交的冤枉钱有名字

店长帮小遥复盘:“你今天的平均手忙脚乱程度是 1.808 比特,理想情况是 1.485 比特。多花的 0.323 比特,就是因为你用错账本交的冤枉钱。”信息论给这笔冤枉钱起了名字:KL 散度,也叫相对熵。

KL 散度直接量化“用 q 描述世界”与“真实世界 p”之间的额外代价。注意方向性:D_KL(p‖q) 读作“从 p 到 q 的散度”,衡量把真实分布的信息按猜测分布 q 编码时多花的比特数:

KL 散度有一个至关重要的性质——非负性(吉布斯不等式):D_KL ≥ 0,当且仅当 p=q 时取等号。直观证明来自对数不等式 log t ≤ t−1(对数曲线总在切线下方),令 t=q/p 即可推出。对分类任务来说,真实标签决定的分布 p 是固定的,所以信息熵 H(p) 是常数,最小化交叉熵与最小化 KL 散度完全等价——模型训练就是在想办法把冤枉钱压到接近 0。

这样一来,训练分类模型的目标变得非常清晰:让小遥的猜测 q 越来越接近真实的 p。交叉熵是总账单,KL 散度是冤枉钱,信息熵是理想账单——三张报表互相咬合,是同一个故事的三面镜子。

DKL(p∥q)=∑x∈Xp(x)log⁡2p(x)q(x)=H(p,q)−H(p)\displaystyle D_{KL}(p \| q) = \sum_{x\in\mathcal{X}} p(x)\log_2 \frac{p(x)}{q(x)} = H(p,q) - H(p)
  1. 分式与对数p(x)/q(x) 是真实比例与猜测比例之比,比值越偏离 1,贡献的惊讶差越大。
    log⁡2p(x)q(x)=log⁡2p(x)−log⁡2q(x)\displaystyle \log_2\frac{p(x)}{q(x)} = \log_2 p(x) - \log_2 q(x)
  2. 真实概率加权外层 p(x) 保证稀有事件不会虚增总代价。
    p(x)⋅[log⁡2p(x)−log⁡2q(x)]\displaystyle p(x)\cdot\left[\log_2 p(x) - \log_2 q(x)\right]
  3. 拆成两个和−Σp log q(交叉熵)减去 −Σp log p(信息熵),正好是“总开销 − 理想开销”。
    H(p,q)−H(p)=∑xp(x)log⁡2p(x)q(x)\displaystyle H(p,q) - H(p) = \sum_{x} p(x)\log_2\frac{p(x)}{q(x)}

四、二分类交叉熵:只问“要不要加珍珠”

店长觉得三种口味太复杂,先让问题变简单:每位客人只回答一个问题——“要不要加珍珠?”真实答案 y 只有 1(加)或 0(不加)。小遥的模型输出一个概率 ŷ,表示“模型认为客人会要珍珠”。

这其实是一个只有两个取值的伯努利分布。真实分布是 p=(y, 1−y),模型预测分布是 q=(ŷ, 1−ŷ)。把两个取值代入交叉熵总式,就得到深度学习里最常见的二元交叉熵(BCE):

举个例子:真实标签 y=1,模型输出 ŷ=0.9,损失是 −ln 0.9 ≈ 0.105,很小;如果模型自信地说 ŷ=0.1,损失高达 −ln 0.1 ≈ 2.303。模型每一轮都在做同一件事——把正确答案的概率往 1 推。交叉熵就是“被打脸的惊讶程度”,推得越准,惊讶越少。

二分类交叉熵就是“要不要加珍珠”版本的手忙脚乱程度。它只需要核对一个数字:模型给真实答案打了多少分。这个分越离谱,损失越大,梯度就越清楚地告诉模型“该往哪个方向改”。

L=−[ylog⁡y^+(1−y)log⁡(1−y^)]\displaystyle L = -\left[ y \log \hat{y} + (1-y)\log(1-\hat{y}) \right]
  1. 开关结构真实标签 y 像开关,y=1 时第一项生效、第二项整体为 0;y=0 时恰好相反。
    y=1⇒L=−log⁡y^;y=0⇒L=−log⁡(1−y^)y=1 \Rightarrow L=-\log\hat{y}; \quad y=0 \Rightarrow L=-\log(1-\hat{y})
  2. 预测输出ŷ 必须落在 (0,1),工程上由 Sigmoid 函数产生,保证可以安全取对数。
    y^=σ(z)=11+e−z\hat{y} = \sigma(z) = \frac{1}{1+e^{-z}}
  3. 损失语义只看“正确类别被赋予了多大概率”;正确类概率越接近 1,损失越接近 0。
    y^→1⇒L→0;y^→0⇒L→+∞\hat{y}\to 1 \Rightarrow L\to 0; \quad \hat{y}\to 0 \Rightarrow L\to +\infty

五、多分类交叉熵:三种口味的正式账本

店长说:“还是把三种口味一起管起来吧。”真实标签不再是“要不要”,而是“这杯是哪一种”。假设这杯是咖啡,真实分布就是一个“铁指认”:p=[0,1,0],概率 1 全部压在咖啡上,其他口味为 0——这就是独热(one-hot)编码。

模型的输出也不是一个数,而是经过 Softmax 后的一组概率 ŷ=[0.2, 0.7, 0.1],三者之和为 1。把真实分布 p 和预测分布 q 代入交叉熵总式,由于 p 只在真实类别处为 1、其余全为 0,求和里只剩一项:

其中 k 是真实类别的下标。

多分类形式其实包含二分类:当 C=2 时,真实类别 k=1 对应 y=[1,0],L=−log ŷ₁,再用 1−ŷ₁ 替换 ŷ₂,就能还原出上一节的两项式。这也是为什么 PyTorch 里的 BCEWithLogitsLoss 与 CrossEntropyLoss 看似不同、本源却同出一个总式。

小遥盯着咖啡的预测分布 [0.2, 0.7, 0.1] 恍然大悟:模型只要让“咖啡”这一格的概率尽量大,损失就小;至于其他格子,独热账本根本不关心。真实世界的标准答案总是这么简单粗暴——一个样本,只属于一个类别。

L=−∑c=1Cyclog⁡y^c=−log⁡y^k\displaystyle L = -\sum_{c=1}^{C} y_c \log \hat{y}_c = -\log \hat{y}_{k}
  1. 独热标签的开关效果求和时 y_c 只对真实类别取 1,其他项全部乘 0 消失。
    yc={1c=k0c≠ky_c = \begin{cases} 1 & c = k \\ 0 & c \ne k \end{cases}
  2. 只剩正确类概率整个损失退化为“正确类概率的对数取负”。
    L=−log⁡y^kL = -\log \hat{y}_k
  3. 等价负对数似然最大化正确类概率,等价于最小化负对数似然(NLL)。
    arg⁡max⁡y^k  ⟺  arg⁡min⁡(−log⁡y^k)\arg\max \hat{y}_k \iff \arg\min \left(-\log \hat{y}_k\right)

六、数值稳定性:别让 Log 零把账本算爆

小遥突发奇想:“如果我的账本上写着果汁概率 0,会怎样?”话音刚落,计算器显示负无穷。0 的对数是负无穷,等于“从没想过客人点果汁,结果果汁卖得飞起”——账本直接爆炸。

训练初期的模型输出往往很离谱,Softmax 可能给出接近 0 或接近 1 的极端概率。如果先算 Softmax 再取 log,log(0) 会产生 −inf,反向传播立刻变成 NaN。解决方案是“不拆开算”:把 Softmax 与交叉熵合并成 LogSoftmax,并用 LogSumExp 技巧保证数值安全:

实际代码里几乎不会手写这两步:PyTorch 的 CrossEntropyLoss 内置了 LogSoftmax 加 NLLLoss 的融合实现,TensorFlow 的 softmax_cross_entropy_with_logits 同理。手写时也应该先算 log_softmax = z − a − log(Σ exp(z−a)),再取正确类的负值,而不是先 exp 后 log。

小遥学会了店长的规矩:账本不能出现“负库存”。先整体清点(减去最大值)、再逐项记账(LogSumExp)、最后合并结算(融合 Softmax 与交叉熵)——顺序对了,账本不爆,模型才能安心训练。

log⁡∑j=1Cezj=a+log⁡∑j=1Cezj−a,a=max⁡jzj\displaystyle \log \sum_{j=1}^{C} e^{z_j} = a + \log \sum_{j=1}^{C} e^{z_j - a}, \quad a = \max_j z_j
  1. 取出最大值 a让所有 z_j 减去 a,最大项变成 e⁰=1,其余项都不超过 1。
    a=max⁡jzj,zj−a≤0a=\max_j z_j, \quad z_j - a \le 0
  2. 加法不改变结果等式右边把公共因子 e^a 提了出来,数学上与左边严格相等,只是数值过程更安全。
    ezj=ea⋅ezj−ae^{z_j} = e^a \cdot e^{z_j - a}
  3. log 内安全指数和落在 [1, C] 区间,取对数绝不会越界,梯度也保持稳定。
    1≤∑j=1Cezj−a≤C1 \le \sum_{j=1}^{C} e^{z_j - a} \le C

七、实战调参技巧:把损失曲线当经营报表

学会了交叉熵,小遥每天打烊后都要看一组曲线:训练损失与验证损失。这不只是数字,而是奶茶店每天的“经营报表”——训练损失代表背题正确率,验证损失代表考试真实水平。

报表里最常见的坑是类别不均衡。假设店里 90% 客人点珍珠奶茶、只有 2% 点果汁,模型偷懒永远预测“珍珠奶茶”,训练损失照样很低——因为 90% 的样本被蒙对了,可果汁客人全被得罪光。这时要给稀有类别更高的权重 w_c,使用加权交叉熵:

另一个常见手段是标签平滑(label smoothing):把独热的 [0,1,0] 改成 [ε, 1−2ε, ε](如 ε=0.1),相当于告诉模型“正确答案并非 100% 确定”。这能防止模型过度自信导致的过拟合。最后别忘了监控验证损失与训练损失的 gap:gap 持续拉大说明过拟合;验证损失不降,则可能是学习率过大或模型欠拟合。

小遥的打工生活从此有了明确的经营指标:交叉熵是每日账单,KL 散度是冤枉钱,损失曲线是趋势图。看懂这三张表,无论奶茶店还是神经网络,都在“预测真实分布”这条路上越走越稳——这就是交叉熵作为分类损失函数的核心意义。

L=−∑c=1Cwc yclog⁡y^c\displaystyle L = -\sum_{c=1}^{C} w_c\, y_c \log \hat{y}_c
  1. 类别权重 w_c稀有类别权重大于 1,让“猜错稀有类”的惩罚变大。
    wc=NC⋅nc\displaystyle w_c = \frac{N}{C \cdot n_c}
  2. 保持开关结构y_c 依然只选真实类别,加权只是放大该项损失。
    L=−wklog⁡y^kL = -w_k \log \hat{y}_k
  3. 退化为标准形式所有 w_c=1 时,就是普通的多分类交叉熵。
    wc=1⇒L=−∑c=1Cyclog⁡y^cw_c=1 \Rightarrow L = -\sum_{c=1}^{C} y_c \log \hat{y}_c

AI 应用场景

场景 1:电商点击率预测——二分类交叉熵的日常

阶段:模型训练与损失函数设计

解决的问题:传统方式直接用 MSE 回归 0/1 点击标签,梯度在概率接近两端时几乎消失、收敛极慢;AI 用二元交叉熵以伯努利分布为假设,与 Sigmoid 输出天然匹配,提供稳定且语义清晰的梯度,训练曲线也更好解读。

具体案例:推荐系统对每个“用户-商品”对预估点击概率,标签只有“点击/未点击”。业界精排模型(如深度兴趣网络 DIM、各类 LR 与深度排序模型)几乎都用 BCE 作为损失,线上 AUC 与损失曲线一目了然。

场景 2:图像分类训练——多分类交叉熵与标签平滑

阶段:模型训练与泛化优化

解决的问题:独热硬标签诱导模型把正确类概率推到 1,容易过度自信、泛化变差;AI 采用“多分类交叉熵 + 标签平滑”,在损失里注入“答案不完全确定”的先验,让 logits 不过分激进。

具体案例:训练 ResNet、EfficientNet 等图像分类模型时,标准配方是“Softmax 交叉熵 + 标签平滑”。Google 在 Inception v3 中率先使用 label smoothing,之后 ImageNet 榜单上的多数模型沿用这招,验证集准确率有明显提升。

场景 3:大模型下一个词预测——交叉熵做预训练

阶段:预训练损失设计

解决的问题:语言模型每一步要在几十万词表上预测下一个词,本质是词表上的多分类。交叉熵把真实词当作独热标签,模型只需最大化真实词的 logits,训练目标简洁、信息论语义清晰。

具体案例:GPT 系列在自回归预训练时,对每个 token 位置计算交叉熵并取平均,训练语料从几百 GB 到数 TB;推理时还会用温度参数调整分布锐利程度,这同样是在校准“分布距离”。

Python 演示

python49 行
import math  def cross_entropy(p, q, eps=1e-12):    """计算交叉熵 H(p, q), 单位为比特"""    assert len(p) == len(q)    total = 0.0    for pi, qi in zip(p, q):        qi = max(qi, eps)          # 防止 log(0)        total += pi * math.log(qi, 2)    return -total  def log_softmax(z):    """数值稳定的 log_softmax: z - a - log(sum(exp(z - a)))"""    a = max(z)    shifted = [v - a for v in z]    log_sum = a + math.log(sum(math.exp(v) for v in shifted))    return [v - log_sum for v in z]  def softmax(z):    """普通 softmax, 仅用于对照展示"""    ez = [math.exp(v - max(z)) for v in z]    s = sum(ez)    return [v / s for v in ez]  def stable_ce(logits, labels):    """多分类交叉熵平均损失, 融入 log_softmax 保证数值稳定"""    total = 0.0    for z, y in zip(logits, labels):        ls = log_softmax(z)        total += -ls[y]            # 多分类交叉熵 = -log(正确类概率)    return total / len(labels)  if __name__ == "__main__":    p = [0.5, 0.3, 0.2]    good = [0.5, 0.3, 0.2]    bad = [0.2, 0.5, 0.3]    print("好店员交叉熵: %.4f 比特" % cross_entropy(p, good))    print("差店员交叉熵: %.4f 比特" % cross_entropy(p, bad))     logits = [[2.0, 1.0, 0.1], [0.5, 1.8, 2.2]]    labels = [0, 2]    print("稳定多分类平均损失: %.4f 比特" % stable_ce(logits, labels))    for z in logits:        print("softmax 概率:", [round(x, 4) for x in softmax(z)])
目的:用纯 Python 从零实现交叉熵与数值稳定的 log_softmax,并对比“好店员”与“差店员”的损失差异。
  1. qi = max(qi, eps)把预测概率钳到至少 1e-12,避免 log(0) 算出负无穷,这是最朴素的兜底手段。
  2. total += pi * math.log(qi, 2)用真实概率加权、对猜测概率取对数,正是 H(p,q) 的核心一行。
  3. a = max(z)取 logits 的最大值作为平移量,这是 LogSumExp 技巧的第一步。
  4. log_sum = a + math.log(sum(math.exp(v) for v in shifted))把指数项全部平移到安全区间后再取对数,数学结果不变。
  5. total += -ls[y]多分类交叉熵只取正确类别的负对数概率,其余类别被独热标签屏蔽。

常见误区

误区我把训练集交叉熵压到接近 0,模型肯定是最优的;只要损失还在降,就继续加大训练。

正解交叉熵衡量的是“预测分布与标签分布”的匹配程度,但标签本身可能含噪声,分布也可能不均衡。小遥的账本再精确,也经不起把“每周水果特价”当成规律硬背。训练损失低到 0 往往是过拟合信号——模型记住了训练集噪声而不是真实规律;判断模型好坏要同时看验证集损失和业务指标。

为何常见:损失函数在训练循环里天天可见,人们容易把损失当成“成绩单”本身,忽略了损失下降与泛化能力之间的鸿沟。

误区H(p,q) 和 H(q,p) 差不多吧?反正都是衡量两个分布差多远,交换一下应该不影响。

正解交叉熵和 KL 散度都不对称。用店长账本 p 编码小遥猜测 q,与用小遥猜测 q 编码真实账本 p,方向完全相反:前者是“给事实贴错误标签”,后者是“用错误标签解释事实”,超额代价不同。公式里 p 负责加权、q 负责取对数,角色互换,结果自然不同。

为何常见:日常口语里“距离”总是对称的,直觉上分布差异也该对称,于是忽略了下标方向。

误区MSE 也能衡量预测跟标签差多少,为什么不直接用它训练分类模型,反正都是看误差。

正解分类标签是“分布”而不是连续数值。MSE 假设高斯噪声,对概率误差的梯度在极端处几乎消失,配合 Sigmoid 时收敛很慢;交叉熵来自极大似然估计,与 Softmax 输出天然契合。工程上宁可给交叉熵做标签平滑,也不用 MSE 硬扛分类。

为何常见:初学者最先接触的损失就是 MSE,遇到新任务习惯性套用,没有意识到损失函数要匹配概率分布假设。

误区验证集上 Softmax 输出 0.99,说明模型对预测很自信,应该充分信任它。

正解高置信不等于高准确,这叫过度自信。独热硬标签会把正确类概率往 1 推,模型可能“盲目自信”——错分样本也给出 0.99。小遥那种“自信地猜错”比“谦虚地猜错”更危险。缓解手段包括标签平滑与温度缩放(temperature scaling),并用“置信度 vs 准确率”曲线做校准检查。

为何常见:概率高天然给人“靠谱”的感觉,但分类输出是似然而非精确概率,校准问题容易被忽略。

面试题

Q1. 某个事件发生的概率为 0.25,它的自信息量是多少比特?

单选题 · easy

  • A.一比特
  • B.二比特← 正确答案
  • C.三比特
  • D.四比特

答案:B。自信息定义为 I(x) = −log₂p(x)。把 0.25 代入:−log₂(0.25) = 2 比特。概率越小越“意外”,携带的信息越多;一比特对应 0.5,三比特对应 0.125,四比特对应 0.0625。这正是小遥店里“果汁卖光比珍珠奶茶卖光更让人惊讶”的量化版本。

Q2. 关于交叉熵 H(p,q) 的语义,下列哪项说法正确?

单选题 · mid

  • A.用 q 概率编码真实分布 p 的代价← 正确答案
  • B.用 p 概率编码猜测分布 q 的代价
  • C.真实分布与猜测分布的对称距离
  • D.真实分布自身包含的复杂度

答案:A。交叉熵的构造是“真实加权、猜测取对数”,即按照真实分布 p 加权、把数据当成分布 q 来编码,所以 A 正确。B 把方向颠倒了;C 错误,交叉熵并不对称;D 描述的是信息熵 H(p)。就像小遥用错误的备料账本应付真实订单,方向不同,代价就不同。

Q3. 当预测分布 q 与真实分布 p 完全一致时,交叉熵 H(p,q) 等于?

单选题 · easy

  • A.零,永远等于零
  • B.信息熵 H(p) 的值← 正确答案
  • C.KL 散度最大值
  • D.固定等于一比特

答案:B。H(p,q) = −Σp log q,当 q=p 时变成 −Σp log p,正是信息熵 H(p)。只有真实分布退化成确定事件时 H(p) 才为 0,所以 A 不准确;此时 KL 散度为 0 而非最大;D 显然不是定值。小遥完全照着真实账本备料时,总账单就等于理想账单。

Q4. 二分类交叉熵使用自然对数,真实标签 y=1,模型预测 ŷ=0.01,此时损失约为?

单选题 · mid

  • A.0.01
  • B.0.99
  • C.4.61← 正确答案
  • D.2.30

答案:C。y=1 时损失退化为 −ln(ŷ) = −ln(0.01) ≈ 4.605,选 4.61。0.01 只是预测概率本身;0.99 是 1−ŷ 的近似;2.30 对应 ŷ=0.1 的损失。模型只给必然发生的事分了 1% 的概率,惊讶值自然爆表,这正是交叉熵对“过度自信地猜错”的惩罚方式。

Q5. 多分类交叉熵在独热标签下,等价于对正确类别做什么操作?

单选题 · mid

  • A.最大化后验概率
  • B.最小化负对数似然← 正确答案
  • C.最大化先验估计
  • D.最小化信息熵值

答案:B。独热标签让求和只剩正确类一项,L = −log ŷ_k,即最小化正确类别的负对数似然,等价于最大化其对数似然。A 混淆了后验与似然;C 的“先验”与标签无关;D 是熵的性质而非损失目标。小遥只需盯住“咖啡这一格被打了多高的分”。

Q6. LogSumExp 数值稳定技巧的核心目的是?

单选题 · hard

  • A.加速矩阵乘法运算
  • B.避免指数上溢下溢← 正确答案
  • C.增加模型参数量
  • D.替代反向传播算法

答案:B。Softmax 先算 e^z,z 很大时上溢为 inf,z 很小时下溢为 0,log(0) 又产生 −inf。LogSumExp 让所有 z 减去最大值 a,指数项最大为 1,log 内输入落在安全区间,数学结果严格不变。它不改变计算量级、不增加参数、更不替代反向传播,只是让数值计算更稳。

Q7. 标签平滑(Label Smoothing)的主要作用是?

单选题 · easy

  • A.加快数据加载速度
  • B.减轻模型过拟合← 正确答案
  • C.提高显存利用率
  • D.降低训练迭代次数

答案:B。标签平滑把独热硬标签改成 0.9/0.05/0.05 之类的软标签,相当于告诉模型“正确答案并非 100% 确定”,避免 Softmax 输出被推到极端,从而减轻过拟合与过度自信。它跟数据加载、显存、迭代次数没有直接关系。小遥若把账本记得过于绝对,遇到真实波动反而更容易翻车。

Q8. 关于交叉熵的性质,下列哪些说法正确?

多选题 · mid

  • A.交叉熵通常不小于信息熵← 正确答案
  • B.交叉熵是分布之间的对称度量
  • C.标签固定时等价于最小化 KL← 正确答案
  • D.二分类可用二元交叉熵损失← 正确答案

答案:ACD。由 D_KL = H(p,q) − H(p) ≥ 0 可知 H(p,q) ≥ H(p),A 对;交叉熵与 KL 都非对称,B 错;固定标签时 H(p) 是常数,最小化 H(p,q) 与最小化 KL 等价,C 对;二分类确实用 BCE,D 对。这就像“总账单 ≥ 理想账单”永远成立,但把账本方向拿反会得到不同答案。

Q9. 下列哪些做法有助于提升交叉熵训练的数值稳定性?

多选题 · hard

  • A.Softmax 与交叉熵融合计算← 正确答案
  • B.网络输出先减去最大值← 正确答案
  • C.直接对概率取对数计算
  • D.使用框架内置损失函数← 正确答案

答案:ABD。A 把 Softmax 与交叉熵合并成 LogSoftmax,避免中间结果出现 log(0);B 是 LogSumExp 的减最大值技巧;D 借助框架经过验证的融合实现。C 先算概率再取对数最容易踩中 −inf,是错误示范。顺序很重要:先平移、再指数、最后取对数,账本才不会爆。

Q10. 关于 KL 散度与交叉熵的关系,下列说法正确的是?

多选题 · extreme

  • A.KL 散度的值恒为非负← 正确答案
  • B.KL 等于交叉熵减信息熵← 正确答案
  • C.交叉熵与 KL 数值恒相等
  • D.两分布一致时 KL 取最小← 正确答案

答案:ABD。D_KL(p‖q) = Σp log(p/q) = H(p,q) − H(p),且由吉布斯不等式恒有 D ≥ 0,A、B 正确;C 错误——交叉熵等于信息熵加 KL,仅当信息熵为 0(真实分布退化)时才与 KL 数值相同。当 p=q 时 KL=0 取最小值,D 正确。这正是“冤枉钱 = 总账单 − 理想账单”的数学表达。