想象你走进一座夜市,七个摊位一字排开。评委们先给每家打一个“原始印象分”——分数可以是正数,也可以是负数,代表“这一口我没吃明白”。可这样的分数没法直接当“观众支持率”:负分怎么算比例呢?于是举办方发明了一套“榜单转化规则”,把所有分数变成加起来恰好等于 100% 的得票率——这就是 softmax。榜单出来了,组委会还要回答一个问题:这张榜单离“顾客心中的真实喜好”还差多远?交叉熵 就是那把“差距尺子”。更妙的是,当 softmax 和交叉熵一起用时,摊主只需要算“得票率 - 真实票”,就知道每个摊位该往哪个方向调火候——这个简单到让人惊讶的公式,正是几乎所有分类神经网络的标准输出配置。

岗位关联

学懂交叉熵与 softmax 的配对逻辑,是理解分类网络训练入口的第一步;它决定了你写的损失函数是“稳如老狗”还是“一跑就炸”。

目录
  1. 可视化演示
  2. 1. 分类建模:一切从原始分数开始
  3. 2. softmax 原理:把分数变成榜单
  4. 3. 交叉熵定义:给差距打分
  5. 4. 两者关系:黄金搭档的梯度
  6. 5. 数值稳定:先减最高分
  7. 6. 温度参数:榜单软硬可调
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

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

1. 分类建模:一切从原始分数开始

想象夜市里有七个摊位,评委团要对每家小吃打分。打出的分数完全凭第一直觉:可能给 8 分,也可能给 -3 分(“这个味道我实在接受不了”)。这些分数能直接拿来排“群众喜爱榜”吗?不能。首先,负分没法参与“占比”计算;其次,分数高低只是相对概念,没有人规定满分是多少。神经网络做分类时,最后一层输出的 logits 就扮演着这批“原始分”的角色——它们是对每个候选类别的“证据打分”,数值越大的类别,模型越倾向于选它。

在分类网络里,模型并不直接宣布“答案是猫”,而是先给每个候选类别写一个证据分数 $z_i$,所有分数拼成一个向量 $z=(z_1, \dots, z_K)$,其中 $K$ 是类别总数。这个向量就叫 logits。为了让“证据”能被损失函数使用,网络还需要一个“规则”把它变成概率——这就是下一节要讲的 softmax。而训练时我们手里还有一张“标准答案”牌,通常用 one-hot 编码表示:真实类别的位置为 1,其余位置为 0。它代表一个“真实的概率分布”:真实类概率为 1,其余为 0。

模型输出的 logits 是任意实数,而我们要拿一个概率分布 $q$ 去和真实分布 $y$ 对齐。因此,分类头的工作可以拆成两件事:先把 logits 归一化成概率,再拿概率去算损失。这两件事分别由 softmax 和交叉熵完成,而“归一化需求”正是连接两者的桥梁。

夜市管理方拿到“原始分”和“标准答案”后,下一步要做的,就是把原始分变成一张像模像样的榜单——这正是 softmax 的舞台。

yc=1,yi=0  (i≠c)y_c = 1, \quad y_i = 0 \; (i \neq c)
这就是 one-hot 标签的数学形式:只有真实类别那一位是 1,其他都是 0,合计恰好等于 1。
  1. 真实类标记$y_c=1$ 表示标准答案落在第 $c$ 类,one-hot 向量里只有这一位是 1。
    yc=1y_c = 1
  2. 非真实类标记$y_i=0$ 表示其余类别都不是答案,它们对损失的贡献是“静音”的。
    yi=0(i≠c)y_i = 0 \quad (i \neq c)
  3. 分布性质所有分量相加等于 1,所以 $y$ 本身也是一个合法的概率分布。
    ∑i=1Kyi=1\sum_{i=1}^{K} y_i = 1
  4. 训练目标让预测分布 $q$ 在真实类位置 $c$ 上尽量逼近 1。
    qc→1q_c \to 1

2. softmax 原理:把分数变成榜单

举办方公布了转化规则:先把每个“原始分” $z_i$ 代入指数函数 $e^{z_i}$。这条规则的妙处在于,$e$ 的任何次方都大于 0,哪怕原始分是 -100,指数后也只是一个非常小的正数,于是负分问题凭空消失。接着把所有指数加起来作为“总权重”,每个摊位的指数除以总权重,就得到它在这张榜单上的“得票率”。指数还会悄悄放大分数差距:60 分和 50 分只差 10,但 $e^{6}$ 和 $e^{5}$ 的比值约等于 2.72,差距被放大成将近三倍——这让“强者更强”的榜单气质一目了然。

把这条规则写成数学公式,就是 softmax。它有两个关键性质:输出的每个分量都在 0 和 1 之间;所有分量之和为 1。所以 $q$ 是一个合法的概率分布,可以直接作为“预测榜单”使用。而且它处处可导,这是反向传播能够运作的前提。

单独看 softmax 的导数,会得到 $q_i(\delta_{ij} - q_j)$ 这种形式。它本身也能用,但数值上比较啰嗦;当它和交叉熵配成一对时,会得到一个像“魔法”一样简单的梯度——我们留到第 4 节再揭晓。

榜单有了,而且是一张“总和 100%”的漂亮榜单。但榜单准不准,还需要一把尺子来量——交叉熵就是这把尺子。

qi=ezi∑j=1Kezjq_i = \frac{\displaystyle e^{z_i}}{\displaystyle \sum_{j=1}^{K} e^{z_j}}
一句话记忆:先取指数得到正权重,再除以总权重,就得到每个类别的概率。
  1. 分子指数$e^{z_i}$ 把任意实数映射成正数,且保持原来的大小顺序,分数越高指数越大。
    ezi>0e^{z_i} > 0
  2. 归一化因子对全部 $K$ 个类别的指数求和,得到一个“总权重”。
    S=∑j=1KezjS = \sum_{j=1}^{K} e^{z_j}
  3. 除法归一分子除以分母后,每个 $q_i$ 都落在 $(0,1)$ 区间。
    qi=eziSq_i = \frac{e^{z_i}}{S}
  4. 和恒为 1所有概率加起来恰好等于 1,满足概率分布公理。
    ∑i=1Kqi=1\sum_{i=1}^{K} q_i = 1

3. 交叉熵定义:给差距打分

顾客心里其实也有一份“真实榜单”,它可能和评委榜单不一样。组委会需要量化“离谱程度”:如果顾客心中最爱的那家店,评委榜单只给了 0.1 的得票率,组委会会觉得“太意外、太离谱”,于是记下很高的离谱分 $-\log(0.1) \approx 2.3$;如果榜单给了 0.9,就记 $-\log(0.9) \approx 0.1$。这个 $-\log$ 就是“惊讶度”:概率越低的事件,一旦发生越让人惊讶。

把“惊讶度”按真实概率加权平均,就得到交叉熵 $H(p,q)$。在单标签分类任务里,$p$ 是 one-hot 分布,只有真实类那一项是 1,其余都是 0,所以加权平均退化成只需要看真实类的惊讶度:$L = -\log q_c$。这意味着,模型在真实类上给出的概率越低,损失就越大。

交叉熵和 KL 散度关系密切:$D_{KL}(p \| q) = H(p,q) - H(p)$,其中 $H(p)$ 是真实分布的熵,在 one-hot 情况下恰好等于 0。因此,最小化交叉熵就等价于最小化 KL 散度,也就是让预测分布 $q$ 去逼近真实分布 $p$。这正是分类任务“标配”交叉熵的根本原因——它是“分布拟合”这件事的直接度量。

尺子已经准备好。但有趣的是,当尺子遇到 softmax 榜单时,会发生奇妙的化学反应,让梯度简单到让人怀疑人生。

H(p,q)=−∑i=1Kpilog⁡qiH(p,q) = -\sum_{i=1}^{K} p_i \log q_i
通俗理解:把每个类别的“真实概率 × 预测惊讶度”累加起来,就是这张榜单的离谱总分。
  1. 真实分布$p_i$ 是标准答案的概率。one-hot 下只有真实类 $p_c=1$,其余 $p_i=0$。
    pi∈{0,1},∑i=1Kpi=1p_i \in \{0, 1\}, \quad \sum_{i=1}^{K} p_i = 1
  2. 预测对数概率$q_i$ 来自 softmax 输出,始终在 $(0,1)$ 之间,所以 $\log q_i$ 一定是负数。
    0<qi<10 < q_i < 1
  3. 单点惩罚-log 惩罚函数随 $q_c$ 减小而急速增大——真实类概率越低,损失越高。
    −log⁡qc↑当 qc↓-\log q_c \uparrow \quad \text{当 } q_c \downarrow
  4. 最终损失one-hot 情况下交叉熵退化为负对数似然,即只看真实类的对数概率。
    L=−log⁡qcL = -\log q_c

4. 两者关系:黄金搭档的梯度

每个摊主都想快速知道“下一步该加火还是撤火”。组委会规定摊主只许用“我的得票率减去顾客真实票数”来当调整信号:这个数为负,说明真实票没给满,要加火;这个数为正,说明虚火过旺,要撤火。对真实类 $c$ 来说,$q_c < 1$,所以 $q_c - 1 < 0$,梯度为负,梯度下降后 $z_c$ 反而上升;对非真实类 $i$ 来说,$q_i - 0 > 0$,梯度为正,梯度下降后 $z_i$ 被压低。正负号天然指示了“谁该升、谁该降”。

这个“调整信号”并不是拍脑袋想出来的,而是把交叉熵损失 $L = -\log q_c$ 对每个 logit $z_i$ 做链式求导得到的。整个过程分两类路径:真实类路径和非真实类路径。即使 $y_i = 0$,非真实类的梯度也不是 0,因为它的 logits 会通过 softmax 的分母影响 $q_c$。

推导结果异常简洁:梯度等于预测分布减去真实分布。真实类的梯度 $q_c - 1$ 为负,非真实类的梯度 $q_i$ 为正。模型预测“过头”的类别被压低,预测不足的真实类被抬升。这就是为什么 softmax 配交叉熵成为分类网络标配——反向传播只需要一次减法。

这份“加火撤火”指令单,就是整个配对最大的价值:在设计分类网络时,你不需要手写复杂的 Jacobian 矩阵,$p-y$ 一行搞定。

∂L∂zi=qi−yi\frac{\partial L}{\partial z_i} = q_i - y_i
这个公式是整篇文章的“题眼”:梯度的正负号自动告诉你该抬高还是压低每个 logit。
  1. 链式起点损失 $L=-\log q_c$ 对 $z_i$ 求导,先用链式法则展开。
    ∂L∂zi=−1qc⋅∂qc∂zi\frac{\partial L}{\partial z_i} = -\frac{1}{q_c} \cdot \frac{\partial q_c}{\partial z_i}
  2. 真实类路径当 $i=c$ 时,$q_c$ 对自身 logit 的导数为 $q_c(1-q_c)$,代回后得到 $q_c-1$。
    ∂qc∂zc=qc(1−qc)\frac{\partial q_c}{\partial z_c} = q_c(1 - q_c)
  3. 非真实类路径当 $i \neq c$ 时,$q_c$ 对 $z_i$ 的导数为 $-q_c q_i$,代回后得到 $q_i$。
    ∂qc∂zi=−qcqi\frac{\partial q_c}{\partial z_i} = -q_c q_i
  4. 合并统一式利用 one-hot 标签 $y$ 把两类情况合并成一个式子,就是“预测减真实”。
    ∂L∂zi=qi−yi\frac{\partial L}{\partial z_i} = q_i - y_i

5. 数值稳定:先减最高分

评委如果打了 1000 分,直接按 $e^{1000}$ 算,计算器直接显示“无穷大”。分母无穷大、分子也无穷大,最后变成“无穷大除以无穷大”,榜单直接崩溃。但细心的人发现:分数集体减去同一个数后,相对关系一点不变。1000 分和 990 分,同时减去 1000 变成 0 和 -10,$e^0=1$、$e^{-10}$ 很小,计算稳稳当当。

softmax 恰好有这种“平移不变性”:给所有 logits 同时加减同一个常数,输出完全不变。所以实现时先算 $m = \max(z)$,然后对 $z_i - m$ 求指数。最大的指数是 $e^0=1$,其余都落在 $(0,1]$,绝不会溢出。

更彻底的做法是直接在对数空间计算,得到 log_softmax,再组装交叉熵损失。这样 $q_i$ 不会先被算成一个极小的数再取对数,也就避免了 $\log(0)$ 的尴尬。训练框架里的 CrossEntropyLoss 大多内部就是这样实现的:先做 log_softmax,再做负对数似然。

稳定版本让训练过程不会因为一个“超高分”而炸掉,这也是工业框架里普遍采用的标准写法。夜市榜单因此无论分数多夸张,都能安全出炉。

log⁡qi=(zi−m)−log⁡(∑j=1Kezj−m),m=max⁡jzj\log q_i = (z_i - m) - \log\left( \sum_{j=1}^{K} e^{z_j - m} \right), \quad m = \max_j z_j
通俗理解:先集体降降温,再算指数,既保住了相对关系,又不会触发计算器“冒烟”。
  1. 最大平移量$m$ 取所有 logits 的最大值,保证新分数 $z_i-m$ 的最大值为 0。
    m=max⁡jzjm = \max_j z_j
  2. 平移后指数$e^{z_i-m}$ 一定落在 $(0,1]$,不会再出现超大指数。
    ezj−m∈(0,1]e^{z_j - m} \in (0, 1]
  3. logsumexp括号里的整体叫 logsumexp,是 $\log \sum e^{z_j}$ 的数值稳定等价形式。
    logsumexp⁡(z)=m+log⁡∑j=1Kezj−m\operatorname{logsumexp}(z) = m + \log \sum_{j=1}^{K} e^{z_j - m}
  4. 组合损失负对数似然展开后,最终损失等于“logsumexp 减去真实类的 logits”。
    L=log⁡∑j=1Kezj−zcL = \log \sum_{j=1}^{K} e^{z_j} - z_c

6. 温度参数:榜单软硬可调

同一批原始分,举办方可以调节榜单的“情绪”:把分数先除以温度 $T$ 再做 softmax。$T$ 越大,分数被压缩得越狠,榜单越“冷静”,各摊位得票率趋近均匀;$T$ 越小,分数差距被放大,榜单越“沸腾”,第一名几乎通吃。就像同一场比赛,可以在“友谊第一”的轻松氛围里评分,也可以在“一票定胜负”的紧张氛围里评分。

温度 $T$ 是一个正数,公式是 $\operatorname{softmax}(z/T)$。$T=1$ 是标准 softmax;$T>1$ 让分布平滑;$T<1$ 让分布尖锐。这个“额外旋钮”在知识蒸馏里至关重要:教师模型用高温输出软标签,把“猫比桌子更像狗”这类类间相似关系传递给学生,学生模型学到的不再是一个生硬的 one-hot 答案,而是一张信息量更丰富的“柔软榜单”。

部署阶段,温度也被用来校准置信度。如果模型对背景噪声也给出 0.99 的概率,可以用 $T>1$ 让输出更平滑,减少“过度自信”。注意训练和推理可以使用不同温度,二者目的不同:训练时的高温是为了知识迁移,推理时的温度是为了控制输出形态。

夜市既能出“冷静榜”服务大众口味,也能出“沸腾榜”制造话题——同一个原始分,温度一变,榜单性格完全不同。

qi(T)=ezi/T∑j=1Kezj/Tq_i(T) = \frac{\displaystyle e^{z_i / T}}{\displaystyle \sum_{j=1}^{K} e^{z_j / T}}
温度就是 softmax 的“情绪旋钮”:旋大变温和,旋小变尖锐。
  1. 温度缩放每个 logits 先除以温度 $T$,把绝对差距按比例缩放。
    zi′=zi/Tz_i' = z_i / T
  2. 软化分布当 $T \to \infty$ 时,所有 $z_i'$ 趋近 0,概率趋近均匀分布 $1/K$。
    qi→1K(T→∞)q_i \to \frac{1}{K} \quad (T \to \infty)
  3. 尖锐分布当 $T \to 0^+$ 时,最大 logits 对应的概率趋近 1,分布接近 one-hot。
    q→one-hot(T→0+)q \to \text{one-hot} \quad (T \to 0^+)
  4. 蒸馏应用教师网络用高温输出软标签,软标签中保留了类间相似关系。
    qsoft=softmax⁡(zteacher/T)q_{\text{soft}} = \operatorname{softmax}(z_{\text{teacher}} / T)

AI 应用场景

1. 图像分类:ImageNet 上的标配输出层

阶段:模型训练(输出层设计与损失函数选择)

解决的问题:传统图像分类用手工特征(HOG、SIFT)配 SVM,特征工程费时且泛化差。CNN 把特征学习交给网络,最后一层全连接输出 1000 维 logits,用 softmax 归一化、交叉熵训练,端到端可微。softmax+交叉熵的 $p-y$ 梯度让反向传播极简,数值稳定版本避免中间溢出。

具体案例:ResNet 在 ImageNet 上训练时,最后一层输出 1000 维 logits,PyTorch 的 CrossEntropyLoss 内部先做 log_softmax 再做 NLLLoss,这就是标准的稳定实现。温度参数在测试时调成 0.8~1.2 还能改善置信度校准。

2. 文本情感分类:BERT 微调中的置信度校准

阶段:迁移学习微调与模型上线

解决的问题:BERT 输出的 [CLS] 向量经过线性层得到二维 logits(正面/负面)。直接取 softmax 最大值判断类别,模型常常过度自信——遇到未见过的表达也给出 0.99 概率。用温度缩放 $T>1$ 校准置信度,让“低置信度转人工”的拒识策略更可靠。

具体案例:客服工单情感打标时,对训练好的模型做 temperature scaling,把验证集上的期望校准误差(ECE)从 0.13 降到 0.04,然后设定 0.7 的置信度阈值,把不确定样本自动转人工审核,准确率提升 6 个百分点。

3. 知识蒸馏:大模型压缩中的高温软标签

阶段:模型压缩与部署优化

解决的问题:大模型(教师)推理慢,需要蒸馏给小模型(学生)。如果直接用 one-hot 标签训练学生,学生只能学到“正确答案”,学不到“猫比桌子更像狗”这类类间关系。把教师 logits 除以温度 $T=3\sim5$ 得到软标签,学生同时拟合软标签和硬标签,效果显著提升。

具体案例:TinyBERT 蒸馏时,教师 BERT 在温度 $T=4$ 下输出软概率作为训练目标,学生模型在 GLUE 任务上保留了 BERT 的 95% 以上性能,体积却缩小了 7 倍多。这里的温度参数就是 softmax 的“软化旋钮”。

Python 演示

python50 行
import numpy as np  def softmax(logits, temperature=1.0):    """数值稳定的 softmax,temperature 用于缩放 logits"""    z = np.asarray(logits, dtype=np.float64) / temperature    z = z - np.max(z)          # 减去最大值,防止 exp 溢出    e = np.exp(z)    return e / e.sum()  def cross_entropy_loss(logits, label, temperature=1.0):    """交叉熵损失,label 是整数类别索引"""    z = np.asarray(logits, dtype=np.float64) / temperature    z = z - np.max(z)          # 数值稳定偏移    log_probs = z - np.log(np.exp(z).sum())    loss = -log_probs[label]    return loss  def grad_softmax_cross_entropy(logits, label, temperature=1.0):    """softmax + 交叉熵 的梯度 = p - y(one-hot)"""    p = softmax(logits, temperature)    y = np.zeros_like(p)    y[label] = 1.0    return (p - y) / temperature  # 温度会缩放梯度  def main():    np.random.seed(42)    logits = np.array([2.0, 0.5, -1.0, 4.0, 1.2])    label = 3     p = softmax(logits)    loss = cross_entropy_loss(logits, label)    g = grad_softmax_cross_entropy(logits, label)     print("logits:", logits)    print("softmax:", np.round(p, 4), "sum=", round(p.sum(), 4))    print("loss:", round(loss, 4))    print("grad:", np.round(g, 4))    print("手工验证 p-y:", np.round(p - np.eye(len(p))[label], 4))     for T in [0.5, 1.0, 3.0]:        pT = softmax(logits, T)        print(f"T={T}: p = {np.round(pT, 4)}, 峰值={pT.max():.4f}")  if __name__ == "__main__":    main()
目的:演示数值稳定的 softmax、交叉熵损失,以及核心梯度公式“预测概率减 one-hot 标签”,并展示温度参数如何改变概率分布形状。
  1. z = np.asarray(logits, dtype=np.float64) / temperature把输入转成浮点并除以温度,温度是 softmax 的“情绪旋钮”。
  2. z = z - np.max(z)集体减去最大值,防止后面 exp 溢出到无穷大。
  3. e = np.exp(z)取指数,把任意实数变成正权重。
  4. return e / e.sum()除以总权重,得到和为 1 的概率分布。
  5. log_probs = z - np.log(np.exp(z).sum())直接在对数空间算 log_softmax,绕开“先算概率再取 log”的数值陷阱。
  6. loss = -log_probs[label]one-hot 下交叉熵退化为负对数似然,只取真实类那一项。
  7. y[label] = 1.0构造 one-hot 标签,只有真实类位置为 1。
  8. return (p - y) / temperature这就是黄金搭档的梯度公式:预测分布减真实分布,除以温度是因为损失里也用 T 缩放。

常见误区

误区我看到 softmax 输出 0.9,就认为模型有 90% 的把握是对的。既然概率是 0.9,那犯错概率一定是 0.1 吧?

正解softmax 输出的只是“相对分布”,不是校准过的置信度。它把 logits 的差距映射成概率,但网络可能因为过拟合或训练数据偏差而整体过度自信。真正可靠的置信度需要额外做 temperature scaling 等校准方法。0.9 的 softmax 概率只能说明“在这一批类别里它最有把握”,不代表“它有九成概率正确”。

为何常见:概率论里“和为 1 的概率”直觉太强,让人下意识把输出概率当成真实世界的发生频率,忽略了模型校准问题。

误区反正 sigmoid 也能输出 0 到 1,多分类任务里把每个类别都过一遍 sigmoid 不就行了?效果应该差不多。

正解sigmoid 是逐类别独立激活,类别之间互不竞争,适合多标签任务(一张图同时有猫和狗)。单标签多分类任务里类别互斥,必须用 softmax 让所有类别竞争一份概率预算,这样提升一个类别的概率必然会压低其他类别,梯度方向才正确。两者对应的损失函数形态也不同。

为何常见:很多人先学了二分类(sigmoid 配 BCELoss),然后自然想推广到多分类,却没意识到“互斥 vs 独立”这个关键差异。

误区我测试过,logits 一般都在 -3 到 3 之间,直接套 $e^{z_i}$ 不会溢出,为什么要多此一举减去最大值?

正解训练初期或某些异常批次里,logits 完全可能飙到几百甚至上千。一旦出现一次 $e^{1000}$,float32/float64 都会直接溢出成 inf,损失变成 nan,整个训练曲线就崩了。减去最大值几乎零成本,却能换来确定性安全,这是工程上必须养成的习惯。

为何常见:在小数据集上跑通了几次就觉得“不会发生”,但真实训练中的分布漂移很容易突破想象中的安全区间。

误区我习惯先算 softmax 概率,再 `np.log(p)` 计算损失,结果不也一样吗?多一步而已。

正解不一样。softmax 输出可能非常接近 0,例如 $10^{-30}$,这时 log(10^-30) 确实能算,但如果是 $10^{-450}$,float64 直接下溢为 0,log(0) 就是 -inf,再乘以 -1 变成 inf,损失就炸了。标准做法是用 log_softmax 一次到位:先在对数空间把所有项算好,再取负对数似然,中间不出现极端小的概率。

为何常见:数学上“先算概率再取对数”和“直接算对数”完全等价,但数值上误差天差地别,这就是“数学等价不等于数值等价的”经典案例。

误区softmax 配交叉熵梯度恰好是“预测减真实”,感觉是个凑巧的简单结果,换别的损失说不定也能碰出类似的式子。

正解这不是巧合,而是“匹配设计”的必然结果。交叉熵里的 log 会抵消 softmax 分母里那个归一化因子的指数结构,把复杂的链式法则化简成一次减法。这正是设计者的意图:为了让反向传播简单稳定,才刻意让 softmax 与交叉熵配对。换成平方误差或绝对误差,梯度里就会残留 $q_i(1-q_i)$ 这类饱和项,训练会慢得多。

为何常见:只记结论不推公式,就看不到 log 与 exp 天然互逆这个背后的“设计感”。

面试题

Q1. softmax 在分类网络中的核心作用是?

单选题 · easy

  • A.将任意实数向量转换为概率分布← 正确答案
  • B.将每个输出映射到零一区间不求和
  • C.对输入做归一化但不可导
  • D.相当于 ReLU 激活函数的变体

答案:A。softmax 通过指数函数和归一化因子,把任意实数 logits 变成和为 1 的概率分布,并且处处可导,适合反向传播。B 描述的是逐元素归一化,不保证和为 1;C 的错误在于 softmax 可导;D 完全混淆了激活函数与输出层。

Q2. 单标签分类中,交叉熵损失通常写成?

单选题 · easy

  • A.等于真实类概率的对数取负← 正确答案
  • B.等于非真实类概率取对负
  • C.等于真实类概率直接对数
  • D.等于减去真实类概率的差值

答案:A。one-hot 标签下,交叉熵退化为 $-\log q_c$,只关心真实类概率。B 错误地关注非真实类;C 少了负号,会让损失为负;D 是线性误差,不是交叉熵。

Q3. 实现数值稳定的 softmax,关键步骤是?

单选题 · mid

  • A.对 logits 减去最大值再取指数← 正确答案
  • B.对 logits 除以最大值再取指数
  • C.对 logits 加上最大值再取指数
  • D.对 logits 直接取指数并求和

答案:A。softmax 具有平移不变性,减去最大值只会把最大项变成 0,避免 $e^{1000}$ 溢出为 inf。除以或加上最大值都会改变结果或失去作用;D 在大数场景下会溢出。

Q4. 已知损失 $L=-\log q_c$,其中 $q=\operatorname{softmax}(z)$,那么 $\partial L / \partial z_i$ 等于?

单选题 · extreme

  • A.p_i - y_i(预测概率减 one-hot 标签)← 正确答案
  • B.y_i - p_i(one-hot 标签减预测概率)
  • C.p_i × y_i(预测与真实逐项相乘)
  • D.|p_i - y_i|(取预测与真实绝对差值)

答案:A。链式求导后,真实类得到 $q_c-1$,非真实类得到 $q_i$,合并写就是 $q_i-y_i$,即预测减真实。B 符号反了,会把真实类的梯度方向弄反;C 是逐项乘积,毫无依据;D 取绝对值破坏了梯度方向信息,也无法反向传播。

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

多选题 · mid

  • A.交叉熵等于真实熵减去 KL 散度
  • B.交叉熵等于真实熵加上 KL 散度← 正确答案
  • C.最小化交叉熵等价于最小化 KL 散度← 正确答案
  • D.交叉熵与真实熵的大小完全无关

答案:BC。数学恒等式是 $H(p,q)=H(p)+D_{KL}(p\|q)$,所以 B 正确、A 错误。真实分布的熵 $H(p)$ 在优化中通常是常数,因此最小化交叉熵等价于最小化 KL 散度,C 正确。D 显然与公式矛盾。

Q6. 当温度 $T$ 趋近无穷大时,softmax 输出会?

单选题 · hard

  • A.输出趋于均匀分布,每类概率约一除以 K← 正确答案
  • B.输出趋于独热分布,最大类概率趋近于一
  • C.输出逐渐消失,各概率全部趋向于零
  • D.输出保持原样,概率形状不发生任何变化

答案:A。当 $T \to \infty$ 时,$z_i/T$ 全部趋近 0,$e^0=1$,所以每个类别概率都趋近 $1/K$,成为均匀分布。B 是 $T \to 0^+$ 的行为;C 违背概率和为 1 的性质;D 忽视了温度对分布的缩放作用。

Q7. 对于非真实类 $i \neq c$,softmax+交叉熵的梯度行为是?

单选题 · hard

  • A.等于 q_i - 0,梯度为正,将使该类 logit 降低← 正确答案
  • B.等于 q_i - 1,梯度为负,将使该类 logit 升高
  • C.等于 0,该类不需要任何梯度更新
  • D.等于 1 - q_i,梯度为正,将使该类 logit 升高

答案:A。非真实类 $y_i=0$,梯度为 $q_i-0=q_i>0$。梯度下降时参数更新方向是负梯度,所以该类 logits 会下降。B 是真实类的情形;C 忽略了 softmax 分母的耦合;D 符号完全错误。

Q8. 为什么分类头普遍选用 softmax 配交叉熵?

多选题 · mid

  • A.梯度简洁且反向传播计算高效← 正确答案
  • B.数值稳定实现方便并不易溢出← 正确答案
  • C.天然将网络输出限定为概率分布← 正确答案
  • D.能彻底解决深度学习梯度消失问题

答案:ABC。梯度退化为 $q-y$,计算极简;配合 log_softmax 技巧数值稳定;softmax 输出天然满足概率公理。但 D 夸大了它的能力,softmax+交叉熵只能缓解输出层附近的梯度消失,无法解决深层网络中的全部梯度消失问题。

Q9. 训练收敛时,真实类概率趋近 1,交叉熵损失趋近?

单选题 · easy

  • A.趋近于零← 正确答案
  • B.趋近于一
  • C.趋近正无穷
  • D.趋近负一

答案:A。$L=-\log q_c$,当 $q_c \to 1$ 时 $\log q_c \to 0$,所以损失趋近 0。B 是概率的目标值而非损失值;C 是 $q_c \to 0$ 时的行为;D 损失非负,不可能为负。

Q10. 关于知识蒸馏中温度参数的作用,正确的是?

多选题 · hard

  • A.高温使教师软标签分布更平滑← 正确答案
  • B.高温让学生学到类间相似关系← 正确答案
  • C.温度高低与分布形状毫无关系
  • D.低温会让输出分布变得更加尖锐← 正确答案

答案:ABD。高温把 logits 除以更大的 T,softmax 输出更均匀,软标签携带“猫比桌子更像狗”的相似性信息,所以 A、B 正确。低温放大差距,分布更尖锐,D 正确。C 与温度缩放的定义直接矛盾。