跳到主要内容

分类与现实的冲撞 — softmax、交叉熵、测试集统计学与分布偏移

这一章讲三件事: 回归的流水线怎么改造成分类的(softmax 与交叉熵); 「在测试集上量一量」这件事本身的统计学(多大才够、能测几次); 以及模型走出实验室后,世界不配合的三种方式(分布偏移)。 读完你会理解:分类问题真正的难点,一半在模型,一半在统计学。

1. 顶层全景:四个零件,换掉三个

回归 分类
标签:一个数 y → one-hot 向量 (0,0,1)
输出:一个数 ŷ → 每类一个分数,过 softmax 变概率
损失:平方误差 → 交叉熵 −log(正确类的概率)
优化:minibatch SGD → 不变

图说:第 03 章的流水线只换三个零件,优化算法原封不动。

one-hot 编码:类别之间通常没有天然的大小顺序 (猫、鸡、狗,谁说谁大?),所以不把它们编成 1、2、3, 而是编成「哪一位是 1」的向量:(1,0,0)=猫、(0,1,0)=鸡、(0,0,1)=狗1。 3 个类别就要 3 个输出——每个类别一条自己的仿射函数, 4 个像素特征 × 3 个类别 = 12 个权重 + 3 个偏置。 这就是 softmax 回归:仍然是单层网络,只是输出从一个变成 q 个2

2. softmax:把分数压成概率

直接把线性输出 o 当概率用,有两个毛病: 不保证加起来等于 1,也不保证非负(买豪宅的「概率」可能超过 1)3

softmax 的解法是两步:先取指数(保正),再除以总和(归一化):

ŷ_i = exp(o_i) / Σ_j exp(o_j)

未归一化的原始输出 o 有个名字,叫 logit。 softmax 有三个性质正好都是我们要的:输出非负、和为 1、保序—— logit 最大的类,概率也最大,所以只想知道「预测哪类」时根本不用算 softmax, 直接 argmax logit 就行4

这个想法不是新发明:1902 年 Gibbs 从统计物理借来—— Boltzmann 早就发现气体分子处于能量 E 状态的概率正比于 exp(−E/kT)。 统计学家说的温度(Boltzmann 分布里控制分布平滑程度的那个参数,中文教材常加引号写作「温度」),就是从这套物理语言里来的5

3. 交叉熵:从最大似然到「需要用几个比特」

损失怎么定?还是第 03 章那把钥匙:最大似然—— 让「真实标签在模型看来」的概率最大。 取负对数变成最小化问题,单个样本的损失是6:

l(y, ŷ) = −Σ_j y_j log ŷ_j (y 是 one-hot 时,只剩 −log ŷ_正确类)

这就是交叉熵损失。两个极端值得记住: 损失为 0 要求模型以概率 1 预测正确类——而概率 1 要求 logit 跑到无穷大, 有限参数永远做不到,所以损失永远大于 0; 反过来,给正确类的概率打成 0,损失就是 −log 0 = 无穷大—— 高置信度的错误被无限惩罚7

softmax 和交叉熵配在一起时,梯度有个干净到不像话的形式8:

∂l/∂o_j = softmax(o)_j − y_j = 模型给的概率 − 真实标签

梯度 = 预测 − 真相,和第 03 章回归里「预测−观测」完全同构。 这不是巧合:指数族模型的对数似然梯度都长这样—— 这家人整齐,所以计算便宜。

信息论的视角:交叉熵到底在量什么

「交叉熵」这个名字来自信息论,拆开值得花一分钟, 因为后面语言模型(第 10 章)的困惑度(perplexity,「模型对下一个词平均有多意外」的分数)也是它。

香农 1948 年的定义:一个分布 P 的 H[P] = Σ −P(j) log P(j), 是从 P 中编码数据所需的最少比特数(用自然对数时单位叫 nat,1 nat ≈ 1.44 比特)9。 单个事件的 surprisal(惊讶度)是 −log P(j): 越不可能的事发生,越让人惊讶,携带的信息越多; 熵就是「知道真实概率的人」的平均惊讶度。

交叉熵 H(P,Q) 是「拿错误的世界观 Q、看真实世界 P」的平均惊讶度10。 它永远不小于真实熵,等号只在 P=Q 时成立。 于是分类目标有了两种完全等价的读法:

最小化交叉熵 = 最大化真实标签的似然 = 最小化「用模型的世界观编码真实标签」所需的比特数。

好预测 ⇔ 好压缩——这个等价会一路用到第 10 章的 perplexity。

4. 主走查:测试集的统计学——多大才够,能测几次

分类章的泛化篇把第 04 章的「留出评估」做成了定量的。 两个现实问题,书里给了硬数字。

测试集要多大? 在测试集上量误差,本质是估计一个伯努利变量的均值, 中心极限定理给出收敛速度 O(1/√n): 想让误差估计准到 ±0.01——也就是 1 个标准差(标准差:估计值围绕真值的典型涨落幅度)——,要约 2500 条;

要 95% 置信,约 10000 条——这正是主流基准测试(benchmark,大家约定一起比拼的公开评测)集的大小,不是巧合11。 用 Hoeffding 不等式做有限样本保证更保守:约 15000 条。 作者顺势戳了一下:每年有成千上万篇论文为 0.01 的改进大做文章, 而这个数正好卡在测量的噪声边上12

同一个测试集能测几次? 测一个模型,5% 的概率拿到误导性结果; 测 20 个模型,几乎管不住「至少一个拿了好运气分数」—— 这是多重假设检验问题。 更隐蔽的是:第二个模型是你看了第一个模型的测试成绩之后设计的, 信息一旦从测试集泄漏给建模者,它就永远不再是真正的测试集—— 这叫 adaptive overfitting13。 作者的建议:尽量少碰测试集;办系列赛时,每轮过后把旧测试集降级为验证集。

那能不能绕开测试集、从理论上先验保证泛化? 统计学习理论确实给出了这类保证(样本量(训练数据的条数)够 n,经验误差就贴近真实误差), 但对深度网络,这些界要求的样本量荒谬到可能要上万亿条, 而实践里几千条就泛化得很好14。 所以作者留下那句名言式的话:「测试集是我们真正拥有的全部。」

5. 分布偏移:部署之后,世界不配合

第 04 章的 IID 假设说训练和测试同分布。现实里这个假设常常破产。 先看最吓人的一种破产方式:模型自己改变世界。

作者的思想实验:银行发现穿 Oxford 鞋的申请人违约少、穿球鞋的违约多, 于是按鞋放贷。接下来会发生什么?消息传开,人人都穿 Oxford 来申请—— 特征没变,但它和违约的关系被政策本身摧毁了15。 「把模型决策引入环境,可能把模型打破」——这是分布偏移里最阴险的一种。

系统性分类,偏移有三种16:

类型什么变了什么没变什么时候这个假设合理
协变量偏移P(x) 输入分布P(y|x) 标注规则相信 x 导致 y(照片训练、卡通测试)
标签偏移P(y) 标签占比P(x|y) 类条件分布相信 y 导致 x(疾病引起症状,发病率随时间变)
概念偏移标签的定义本身「汽水叫 pop 还是 soda」随地区变

不加假设,偏移不可学:如果上帝把猫狗的标签全部对调而输入分布不变, 任何方法都无法察觉17

书里的三个事故每个都该记住:

  • 血液检测创业公司:病人血样好拿、健康血样难拿, 就从大学校园征集健康学生当对照。分类器轻松达到近乎满分—— 但它学到的是「学生 vs 病人」的年龄、激素、饮食差异,不是疾病。 极端协变量偏移,无法修复,一大笔钱白花了18;
  • 游戏引擎练自动驾驶:用渲染引擎造合成训练数据,引擎内测试满分, 真车上路一塌糊涂——所有路沿用了同一张纹理,模型学的是纹理;
  • 森林里的坦克:美军航拍森林(无坦克,早晨拍)与森林(有坦克,中午拍), 分类器「完美」——它学会的是「树有没有影子」19

6. 偏移了怎么办:重要性加权与混淆矩阵(把「真实类别 × 预测类别」的计数排成的方阵)

两类可修复的情形,书里给了具体算法。

协变量偏移 → 重要性加权。 如果只有输入分布从 q 变成了 p、标注规则没变, 那么每个训练样本加权 β_i = p(x_i)/q(x_i) 再训练,就在数学上纠正了偏移20。 权重怎么估?训练一个分类器,让它做二分类(只分「是/否」两类):「这条样本来自训练分布还是部署分布」, 分类器越分不清,权重越接近 1——用 logistic 回归即可。 硬前提:部署分布里的每个点,在训练分布里概率必须非零—— 训练时从没见过的输入类型,权重是无穷大,救不了。

标签偏移 → 混淆矩阵反解。 如果只是各类占比变了:拿源分布上训好的分类器, 先在验证集上算混淆矩阵 C(真实 j 被预测成 i 的比例), 再算部署数据上预测结果的平均分布 μ, 解一个线性方程组 C·p(y) = μ,就能估出部署时的标签分布21。 漂亮之处:全程不用碰高维(特征维度成千上万、甚至上百万的)输入,只在低维标签上做文章。

最后一节作者转向伦理:模型部署是在自动化决策,不只是预测。 准确率很少是正确的度量——不同方向的错误代价不同; 预测警务是教科书级的反馈回路:多巡逻→多发现犯罪→更多巡逻, 数据和模型咬成死循环22

7. 作者的判断与证据

书里给了证据的: softmax+交叉熵的梯度推导;±0.01 所需样本量的两种算法 (渐近 10000、Hoeffding 15000);三个分布偏移事故(其中血液检测一例是作者亲历); 协变量/标签偏移纠正算法的推导。

作者的推测与立场: 「渐近分析给的球算数字够用」; 「medium batch 注入的噪声恰到好处」(第 09 章展开); 对刷榜文化的批评(成千上万篇论文追着 0.01)——这是价值判断,我们认同,但它是判断不是测量。

判断(我们的,不是书里的): 「梯度 = 预测 − 真相」这个形式是 深度学习里最值得背下来的公式之一。它意味着:参数更新的方向, 完全由「模型错在哪、错多少」决定——对的类别概率低了就被推高, 错的类别概率高了就被压下,更新量和错误程度成正比。 后面所有分类模型的训练,都可以在这一行上理解。 如果错,会错在: 这个干净形式只在「softmax/指数族 + 对数似然」配对时成立; 换其他损失(如 focal loss、margin loss)梯度形状不同——但「预测−真相」的直觉仍大体成立。

8. 边界与局限

  • softmax 输出的「概率」是模型自评,未必校准(说 90% 不一定真有九成把握)—— 校准问题原书没展开,拆解照实标出;
  • 重要性加权依赖「部署点训练时概率非零」的重叠假设,血液检测那种极端情形救不了;
  • 测试集统计量的是「固定模型」的误差,不含「模型怎么被选出来的」—— adaptive overfitting 只有保守对策,没有解法;
  • 概念偏移只给了识别,没给纠正算法。

9. 可带走的

  1. 分类流水线 = one-hot + softmax + 交叉熵,优化器不变;
  2. softmax:取指数再归一化;保序,所以 argmax 不用算它;logit 是归一化前的分数;
  3. 交叉熵 = 负对数似然 = 用模型的世界观编码真相所需比特数;好预测 ⇔ 好压缩;
  4. softmax+交叉熵的梯度 = 预测概率 − 真实标签,背下来;
  5. 测试误差按 1/√n 收敛:±0.01 要上万条;基准测试集的大小正由此来;
  6. 测试集每多用一次就污染一次;看过成绩再设计的模型,测试集对它永久失效;
  7. 分布偏移三种:协变量(输入变)、标签(占比变)、概念(定义变);不加假设不可学;
  8. 模型会反过来改变世界(Oxford 鞋)——部署是决策,不只是预测

10. 原文地图

主题原书章原文位置
one-hot 编码Softmax Regressiontext/19-softmax-regression.txt:101(搜「one-hot encoding」)
直接当概率的两个毛病Softmax Regressiontext/19-softmax-regression.txt:164(搜「sum up to」)
softmax 公式、保序Softmax Regressiontext/19-softmax-regression.txt:203(搜「softmax」) · text/19-softmax-regression.txt:214(搜「argmax」)
Gibbs/Boltzmann 出处Softmax Regressiontext/19-softmax-regression.txt:218(搜「Gibbs」) · text/19-softmax-regression.txt:229(搜「temperature」)
交叉熵与负对数似然Softmax Regressiontext/19-softmax-regression.txt:314(搜「cross-entropy loss」) · text/19-softmax-regression.txt:330(搜「infinite loss」)
梯度=预测−真相、指数族Softmax Regressiontext/19-softmax-regression.txt:368(搜「exponential family」)
熵、nat、surprisal、交叉熵Softmax Regressiontext/19-softmax-regression.txt:417(搜「nats」) · text/19-softmax-regression.txt:442(搜「surprisal」) · text/19-softmax-regression.txt:456(搜「expected surprisal」)
±0.01 所需样本量Generalization in Classificationtext/24-generalization-in-classification.txt:184(搜「2500」) · text/24-generalization-in-classification.txt:188(搜「10,000」) · text/24-generalization-in-classification.txt:215(搜「15,000」)
多重检验、adaptive overfittingGeneralization in Classificationtext/24-generalization-in-classification.txt:281(搜「false discovery」) · text/24-generalization-in-classification.txt:314(搜「adaptive overfitting」)
万亿条样本的界Generalization in Classificationtext/24-generalization-in-classification.txt:62(搜「trillions」)
test sets are all we haveGeneralization in Classificationtext/24-generalization-in-classification.txt:338(搜「test sets are all」)
Oxford 鞋Environment and Distribution Shifttext/25-environment-and-distribution-shift.txt:27(搜「Oxfords」)
三种偏移Environment and Distribution Shifttext/25-environment-and-distribution-shift.txt:106(搜「covariate shift」) · text/25-environment-and-distribution-shift.txt:163(搜「concept shift」)
血液检测事故Environment and Distribution Shifttext/25-environment-and-distribution-shift.txt:218(搜「university campus」) · text/25-environment-and-distribution-shift.txt:233(搜「extreme covariate shift」)
坦克与影子Environment and Distribution Shifttext/25-environment-and-distribution-shift.txt:265(搜「trees with shadows」)
重要性加权、logistic 估权重Environment and Distribution Shifttext/25-environment-and-distribution-shift.txt:395(搜「logistic regression」) · text/25-environment-and-distribution-shift.txt:444(搜「correcting covariate shift」)
反馈回路、预测警务Environment and Distribution Shifttext/25-environment-and-distribution-shift.txt:662(搜「runaway feedback loops」)

Footnotes

  1. 出处:「Softmax Regression」第 101 段(text/19-softmax-regression.txt:101,搜「one-hot encoding」)。类别有自然顺序(婴儿到老年)时另当别论,那叫 ordinal regression。

  2. 出处:「Softmax Regression」第 145 段(text/19-softmax-regression.txt:145,搜「single-layer neural network」)。

  3. 出处:「Softmax Regression」第 164 段(text/19-softmax-regression.txt:164,搜「sum up to」)。书中还提了另一个历史方案 probit 模型(Fechner, 1860),效果与优化性质都不如 softmax。

  4. 出处:「Softmax Regression」第 209 段(text/19-softmax-regression.txt:209,搜「preserves the ordering」)与第 214 段(text/19-softmax-regression.txt:214,搜「argmax」)。

  5. 出处:「Softmax Regression」第 218 段(text/19-softmax-regression.txt:218,搜「Gibbs」)与第 229 段(text/19-softmax-regression.txt:229,搜「temperature」)。

  6. 出处:「Softmax Regression」第 298 段(text/19-softmax-regression.txt:298,搜「negative log-likelihood」)与第 314 段(text/19-softmax-regression.txt:314,搜「cross-entropy loss」)。

  7. 出处:「Softmax Regression」第 326 段(text/19-softmax-regression.txt:326,搜「infinity」)与第 330 段(text/19-softmax-regression.txt:330,搜「infinite loss」)。

  8. 出处:「Softmax Regression」第 368 段(text/19-softmax-regression.txt:368,搜「exponential family」)。原文:「the derivative is the difference between the probability assigned by our model and what actually happened」;任何指数族模型的对数似然梯度都是这个形式。

  9. 出处:「Softmax Regression」第 417 段(text/19-softmax-regression.txt:417,搜「nats」)与第 420 段(text/19-softmax-regression.txt:420,搜「1.44」)。

  10. 出处:「Softmax Regression」第 456 段(text/19-softmax-regression.txt:456,搜「expected surprisal」)与第 459 段(text/19-softmax-regression.txt:459,搜「P=Q」)。

  11. 出处:「Generalization in Classification」第 184 段(text/24-generalization-in-classification.txt:184,搜「2500」)与第 188 段(text/24-generalization-in-classification.txt:188,搜「10,000」)。Bernoulli 方差最大在 ε=0.5 处,标准差 ≤ √(0.25/n)。

  12. 出处:「Generalization in Classification」第 215 段(text/24-generalization-in-classification.txt:215,搜「15,000」)与第 194 段(text/24-generalization-in-classification.txt:194,搜「big deal」)。

  13. 出处:「Generalization in Classification」第 281 段(text/24-generalization-in-classification.txt:281,搜「false discovery」)与第 314 段(text/24-generalization-in-classification.txt:314,搜「adaptive overfitting」)。

  14. 出处:「Generalization in Classification」第 62 段(text/24-generalization-in-classification.txt:62,搜「trillions」)与第 338 段(text/24-generalization-in-classification.txt:338,搜「test sets are all」)。

  15. 出处:「Environment and Distribution Shift」第 27 段(text/25-environment-and-distribution-shift.txt:27,搜「Oxfords」)与第 40 段(text/25-environment-and-distribution-shift.txt:40,搜「all applicants would be wearing Oxfords」)。

  16. 出处:「Environment and Distribution Shift」第 106 段(text/25-environment-and-distribution-shift.txt:106,搜「covariate shift」)、第 148 段(text/25-environment-and-distribution-shift.txt:148,搜「label shift」)与第 163 段(text/25-environment-and-distribution-shift.txt:163,搜「concept shift」)。汽水 pop/soda 地图见第 173 段。

  17. 出处:「Environment and Distribution Shift」第 83 段(text/25-environment-and-distribution-shift.txt:83,搜「all flipped」)。

  18. 出处:「Environment and Distribution Shift」第 218 段(text/25-environment-and-distribution-shift.txt:218,搜「university campus」)与第 233 段(text/25-environment-and-distribution-shift.txt:233,搜「extreme covariate shift」)。作者注明是「some of we authors worked with」的亲历。

  19. 出处:「Environment and Distribution Shift」第 259 段(text/25-environment-and-distribution-shift.txt:259,搜「tanks in the forest」)与第 265 段(text/25-environment-and-distribution-shift.txt:265,搜「trees with shadows」)。早晨无坦克、中午有坦克,模型学到了光照。

  20. 出处:「Environment and Distribution Shift」第 395 段(text/25-environment-and-distribution-shift.txt:395,搜「logistic regression」)与第 444 段(text/25-environment-and-distribution-shift.txt:444,搜「correcting covariate shift」)。实践中权重常截断到一个常数 c 以防爆炸。

  21. 出处:「Environment and Distribution Shift」第 505 段(text/25-environment-and-distribution-shift.txt:505,搜「confusion matrix」)与第 530 段(text/25-environment-and-distribution-shift.txt:530,搜「simple linear system」)。前提:分类器本身还过得去、目标里没有新类别、标签偏移假设成立。

  22. 出处:「Environment and Distribution Shift」第 662 段(text/25-environment-and-distribution-shift.txt:662,搜「runaway feedback loops」)。三步循环:多巡逻→多发现→更多巡逻。