本节摘要:损失函数的刻度桌不止摆着回归与分类两大派,还有几位特殊选手:合页损失(SVM)、KL 散度(生成模型)、以及稳健派其他变体。本节逐一讲清它们"在什么时候会显得自然、在什么时候别拿来硬凑",帮你识别特殊任务该请哪尊佛。
回归看了平方与绝对,分类看了熵与对数,可有些任务既不是"算连续差值"也没有明确标签概率。这时主角换成一群异类:合页、KL、再到一系列针对分布与边缘的损失。它们不在主干道,却在你遇到特定项目时非认识不可。
合页损失长这样:max(0, 1 − y·f(x)),其中 y 是 ±1 标签、f(x) 是分值。它的脾气和交叉熵很不一样:
它的适用主场是支持向量机(SVM)——目标是让正确与错误类别的分数拉开一个安全间隔,而不是把每个概率都填满。你要是拿交叉熵去硬套传统 SVM 风格的间隔目标,反而会违背它的初衷。
直觉类比:合页是"及格线思维"——分够了就满意,不够才补考;交叉熵是"精益求精思维"——差一口气也盯着不放。两个都好,看你要的是边距还是校准。
KL 散度(Kullback-Leibler 散度)度量一个概率分布 q 跟另一个 p 差多远:D_KL(p‖q) = Σ p(x)·log(p(x)/q(x))。它永远不小于 0,等于 0 当且仅当两个分布完全一致。注意它不对称——D_KL(p‖q) ≠ D_KL(q‖p),顺序不同度量意义也不同。
它是生成模型的重要刻度:很多变分、生成式目标(最大化似然的下界)推到最后都会冒出一个"让输出分布逼近真实分布"的 KL 项。它的价值在于"分布对齐",而不是标量回归里的"逐样本距离"。
还有一些损失专为"序数"与"多任务校准"设计:比如让排序的 hinge 变体、针对多标签的 BCEWithLogits(带 logits 的二元交叉熵)、以及各种距离变体。它们共同点是想把"我该对哪个类别更有把握"的信息塞进训练,而不是只盯着单体预测的对错。见到这类损失,先问一句:任务里头"把握有多高"这件事,到底重不重要?
| 损失 | 度量对象 | 适用任务 | 一句话 |
|---|---|---|---|
| 合页 | 分值的间隔 | SVM、间隔分类 | 及格线思维,不够再罚 |
| KL 散度 | 两个分布之差 | 生成模型、分布对齐 | 不对称,顺序别搞反 |
| 其他稳健变体 | 逐样本差异的柔性 | 带噪声或不确定标签 | 想再保留一点平滑 |
很多人在二分类里顺手用 BCE,却不知道 BCEWithLogits 会算两个 logits。又在做生成任务时想用 MSE 走到底,结果模型只会学"像素平均",对分布的形状毫无感知。这两种错都会让你"越来越努力、却越来越不对齐目标"。
正确的做法是:先确认你的任务到底在喊哪句口号。 是要把数值的差距压小(回归、用 MSE/MAE),是要让分类概率更像真标签(分类、用交叉熵),还是要让输出分布贴近真实分布(生成、用 KL 及其变体)?口号不同,请的刻度尺就不同。
⚠️ 常见坑:把 KL 散度当对称的"距离指标"来调参,结果前向与反向方向不同,越调越乱。KL 非对称,它是"从 p 的视角看 q 差多少",别当双向衡器。
合页与交叉熵都是分类用的,这正是初学者最容易纠结去留之所在。我们把两者的"目标哲学"摆在一起,记牢一条分界线:
因此:做生成式、蒸馏、不确定度外推这类需要可靠概率的任务,交叉熵更贴切;做SVM 风格的间隔分类、排序这类只要"拉开边距"的任务,合页更顺手。这不是谁更好,而是各自的"正确"定义不同(呼应第 3.1 节"损失是立法者")。
KL 散度用途广泛,也因此常被拿来乱用。下面几个句子,判断哪个对哪个错:
能在遇到 KL 时先做这样一次自检,就说明你真的理解它,而不是只背了个名字。这比再背十个新符号都重要。
最后给一个更高层的视角,帮你把整章收拢起来:很多损失函数,都可以看作一个"你能定义出多少种错"的能量函数。回归的能量看重"偏离量的大小",分类的能量看重"错类别的信任度",KL 的能量看重"两堆分布的错位"。你在选损失时,本质上在回答"我的任务里,哪种不对劲最该被惩罚"。这个视角一旦建立,遇到再冷门的损失也不会发怵——你先问它是惩罚偏离、惩罚错信、还是惩罚分布错位,再决定它合不合你的任务口号。它和 3.1 的"损失是立法者"一脉相承,只是把那双站在更高处看的眼睛擦亮了。
量尺的品种掰扯完了,下一步要挑:面对一个真项目,三把标尺怎么落地。下一节收网,讲选型的三个标尺。