第 04/24 期:深度学习中的损失函数及其数学解释

文章目录

    • 一、为什么模型需要一个可以优化的误差定义
      • [1.1 从单个样本到整体学习目标](#1.1 从单个样本到整体学习目标)
      • [1.2 损失函数、目标函数与评价指标不是同一个概念](#1.2 损失函数、目标函数与评价指标不是同一个概念)
    • 二、回归问题:损失函数究竟要求模型预测什么
      • [2.1 平方损失为什么对应条件均值](#2.1 平方损失为什么对应条件均值)
      • [2.2 均方误差的梯度和大残差效应](#2.2 均方误差的梯度和大残差效应)
      • [2.3 绝对值损失为什么对应条件中位数](#2.3 绝对值损失为什么对应条件中位数)
      • [2.4 Huber 损失如何折中](#2.4 Huber 损失如何折中)
      • [2.5 损失函数和噪声模型的联系](#2.5 损失函数和噪声模型的联系)
    • 三、分类问题:为什么直接优化类别是否正确并不理想
      • [3.1 从二分类概率到负对数似然](#3.1 从二分类概率到负对数似然)
      • [3.2 为什么使用 sigmoid,而不是直接把分数当概率](#3.2 为什么使用 sigmoid,而不是直接把分数当概率)
      • [3.3 二元交叉熵的梯度为何简洁](#3.3 二元交叉熵的梯度为何简洁)
    • [四、多分类交叉熵:从 softmax 到矩阵梯度](#四、多分类交叉熵:从 softmax 到矩阵梯度)
      • [4.1 从 log-sum-exp 推导梯度](#4.1 从 log-sum-exp 推导梯度)
      • [4.2 批量矩阵形式与维度检查](#4.2 批量矩阵形式与维度检查)
      • [4.3 数值稳定的 softmax 与 log-sum-exp](#4.3 数值稳定的 softmax 与 log-sum-exp)
    • 五、交叉熵为什么可以学习条件概率
      • [5.1 从条件风险到 KL 散度](#5.1 从条件风险到 KL 散度)
      • [5.2 交叉熵与 Brier 分数的共同点](#5.2 交叉熵与 Brier 分数的共同点)
      • [5.3 概率校准与分类正确率之间的区别](#5.3 概率校准与分类正确率之间的区别)
      • [5.4 标签平滑究竟改变了什么](#5.4 标签平滑究竟改变了什么)
    • 六、损失函数与决策目标不一致时会发生什么
      • [6.1 分类阈值由代价决定](#6.1 分类阈值由代价决定)
      • [6.2 类别不平衡并不自动要求加权交叉熵](#6.2 类别不平衡并不自动要求加权交叉熵)
      • [6.3 Focal Loss 的作用与边界](#6.3 Focal Loss 的作用与边界)
    • 七、损失缩放、批量归约与优化动力学
      • [7.1 求和与平均的差别](#7.1 求和与平均的差别)
      • [7.2 多任务损失的权重不是装饰参数](#7.2 多任务损失的权重不是装饰参数)
      • [7.3 正则化不能和数据拟合误差混为一谈](#7.3 正则化不能和数据拟合误差混为一谈)
    • [八、NumPy 实验:从曲线形状到可验证的梯度](#八、NumPy 实验:从曲线形状到可验证的梯度)
      • [8.1 实验一:异常观测如何改变回归结果](#8.1 实验一:异常观测如何改变回归结果)
      • [8.2 实验二:概率损失的不同惩罚结构](#8.2 实验二:概率损失的不同惩罚结构)
      • [8.3 实验三:用有限差分检查 softmax 交叉熵梯度](#8.3 实验三:用有限差分检查 softmax 交叉熵梯度)
      • [8.4 完整可运行代码](#8.4 完整可运行代码)
    • 九、怎样为具体任务选择损失函数
      • [9.1 如果目标是分位数,为什么不使用普通 MSE](#9.1 如果目标是分位数,为什么不使用普通 MSE)
      • [9.2 如果目标是排序或检索,单样本误差可能不够](#9.2 如果目标是排序或检索,单样本误差可能不够)
      • [9.3 损失中的不可微点是否意味着无法训练](#9.3 损失中的不可微点是否意味着无法训练)
      • [9.4 损失值能否跨任务直接比较](#9.4 损失值能否跨任务直接比较)
    • 十、常见概念误区与实际检查方法
    • 十一、进一步理解:曲率、噪声与缺失标签如何影响损失设计
      • [11.1 同样的最优点,优化过程为什么可能不同](#11.1 同样的最优点,优化过程为什么可能不同)
      • [11.2 标签噪声不只是输入噪声的另一种叫法](#11.2 标签噪声不只是输入噪声的另一种叫法)
      • [11.3 有缺失标签时,平均损失的分母应该是什么](#11.3 有缺失标签时,平均损失的分母应该是什么)
      • [11.4 损失函数能否同时保证公平性、校准性与业务收益](#11.4 损失函数能否同时保证公平性、校准性与业务收益)
    • 十二、结语
    • 参考文献

一、为什么模型需要一个可以优化的误差定义

上一期讨论了神经网络的前向传播:输入经过一系列矩阵运算与非线性变换,得到模型输出。然而,前向传播只能回答"模型当前预测了什么",并不能告诉我们"这次预测有多好"。要让参数随着数据改变,就必须把预测结果与学习目标之间的差异转化为可以比较、可以计算、通常还可以求导的数值。这正是损失函数的任务。

损失函数看似只是训练程序中的一行代码,实际却包含了相当多的建模选择。对于同一组预测误差,平方损失会放大大偏差,绝对值损失则按偏差幅度线性计价;对于分类任务,交叉熵关心模型给正确类别分配了多少概率,而分类准确率只关心最后选中了哪个类别。两者评价的对象不同,能够传递给优化算法的信息也不同。因此,损失函数的选择不仅改变训练曲线,还可能改变最终学到的统计量、模型对异常样本的敏感性,以及输出数值能否被解释为概率。

本文从统计决策的基本形式出发,逐步推导回归损失、二分类与多分类交叉熵,并讨论损失、经验风险、正则化项和评价指标之间的区别。随后通过可复现的 NumPy 实验观察不同损失对异常值的响应、概率预测的惩罚结构以及 softmax 交叉熵的梯度。文章关注的是损失函数的数学含义及其适用条件,而不是罗列框架中已有的函数名称。

1.1 从单个样本到整体学习目标

设输入空间为 X \mathcal X X,标签空间为 Y \mathcal Y Y,模型记为 f θ : X → A f_\theta:\mathcal X\to\mathcal A fθ:X→A。这里 A \mathcal A A 是模型输出空间,可能是实数、实向量,也可能是概率单纯形。参数 θ \theta θ 包括网络中所有可训练的权重和偏置。给定样本 ( x , y ) (x,y) (x,y),损失函数写作

ℓ ( f θ ( x ) , y ) . \ell(f_\theta(x),y). ℓ(fθ(x),y).

它把预测动作 f θ ( x ) f_\theta(x) fθ(x) 与真实标签 y y y 映射为一个标量。通常约定损失越小越好,但这只是优化方向的约定;更重要的是损失数值之间的相对关系,以及它们如何随预测改变。一个损失函数不必处处可导,也不必总是非负,不过在工程实践中,非负且具有适当连续性、可微性或次梯度结构的损失更容易处理。

假设观测数据由未知联合分布 P ( X , Y ) P(X,Y) P(X,Y) 生成。我们真正关心的是总体风险,也称期望风险:

R ( θ ) = E ( X , Y ) ∼ P ℓ ( f θ ( X ) , Y ) . R(\theta)=\mathbb E_{(X,Y)\sim P}\left\\ell(f_\\theta(X),Y)\\right. R(θ)=E(X,Y)∼Pℓ(fθ(X),Y).

如果损失的期望存在,那么总体风险刻画了模型在该分布下的平均表现。实际训练时通常不知道 P P P,只能使用有限样本 D = { ( x i , y i ) } i = 1 N \mathcal D=\{(x_i,y_i)\}_{i=1}^N D={(xi,yi)}i=1N,于是用经验风险近似:

R ^ N ( θ ) = 1 N ∑ i = 1 N ℓ ( f θ ( x i ) , y i ) . \widehat R_N(\theta)=\frac{1}{N}\sum_{i=1}^{N}\ell(f_\theta(x_i),y_i). R N(θ)=N1i=1∑Nℓ(fθ(xi),yi).

最常见的经验风险最小化写成

θ ^ ∈ arg ⁡ min ⁡ θ R ^ N ( θ ) . \widehat\theta\in\arg\min_\theta\widehat R_N(\theta). θ ∈argθminR N(θ).

这里使用 ∈ \in ∈ 而不是等号,是因为最小解可能不唯一,也可能需要额外假设才能保证最小值能够达到。经验风险小并不自动意味着总体风险小:训练样本可能不足、数据分布可能改变、模型容量可能过大。泛化问题将在后续专题中专门讨论,本期只强调二者的数学对象不同。

1.2 损失函数、目标函数与评价指标不是同一个概念

实际训练经常优化的不是纯粹的经验风险,而是

J ( θ ) = R ^ N ( θ ) + λ Ω ( θ ) , J(\theta)=\widehat R_N(\theta)+\lambda\Omega(\theta), J(θ)=R N(θ)+λΩ(θ),

其中 Ω ( θ ) \Omega(\theta) Ω(θ) 是正则化项, λ ≥ 0 \lambda\geq0 λ≥0 控制它的权重。此时 ℓ \ell ℓ 是样本损失, R ^ N \widehat R_N R N 是样本损失的平均, J J J 才是优化器实际接收到的目标。不能把正则化项直接称为"每个样本的预测误差",也不能在比较训练损失时忽略是否包含正则化。

评价指标则回答另一个问题。例如,二分类准确率可写为

Acc ⁡ = 1 N ∑ i = 1 N 1 { y ^ i = y i } . \operatorname{Acc}=\frac{1}{N}\sum_{i=1}^{N}\mathbf 1\{\widehat y_i=y_i\}. Acc=N1i=1∑N1{y i=yi}.

这里的 y ^ i \widehat y_i y i 是由模型分数或概率进一步得到的离散类别。准确率对正确与错误给出二值判断;只要预测类别没有变化,模型对正确类别的置信度从 0.51 0.51 0.51 增加到 0.99 0.99 0.99,准确率仍然不变。交叉熵则会反映这种变化。因此,训练时使用可微的代理损失、报告时使用任务相关指标,是有明确原因的,并不是同一概念的两种叫法。

二、回归问题:损失函数究竟要求模型预测什么

回归模型输出连续数值。设 Y Y Y 为随机变量,给定输入 X = x X=x X=x,我们希望选择一个预测值 a a a,使条件期望损失最小:

a ∗ ( x ) ∈ arg ⁡ min ⁡ a E ℓ ( a , Y ) ∣ X = x . a^*(x)\in\arg\min_a\mathbb E\\ell(a,Y)\\mid X=x. a∗(x)∈argaminEℓ(a,Y)∣X=x.

这个表达式非常关键:不同损失函数会对应不同的最优预测统计量。即使网络结构、训练数据与优化器完全相同,只要损失函数改变,模型被要求逼近的目标就可能改变。

2.1 平方损失为什么对应条件均值

最常用的平方损失为

ℓ S E ( a , y ) = ( a − y ) 2 . \ell_{\mathrm{SE}}(a,y)=(a-y)^2. ℓSE(a,y)=(a−y)2.

如果使用 1 2 ( a − y ) 2 \frac12(a-y)^2 21(a−y)2,最优解不变,只是梯度中少了一个常数因子。对固定 x x x,设条件均值 μ ( x ) = E Y ∣ X = x \mu(x)=\mathbb EY\\mid X=x μ(x)=EY∣X=x,并假设条件二阶矩有限。展开条件风险:

E ( a − Y ) 2 ∣ X = x = E ( a − μ + μ − Y ) 2 ∣ X = x = ( a − μ ) 2 + E ( Y − μ ) 2 ∣ X = x , \begin{aligned} \mathbb E(a-Y)\^2\\mid X=x &=\mathbb E(a-\\mu+\\mu-Y)\^2\\mid X=x\\ &=(a-\mu)^2+\mathbb E(Y-\\mu)\^2\\mid X=x, \end{aligned} E(a−Y)2∣X=x=E(a−μ+μ−Y)2∣X=x=(a−μ)2+E(Y−μ)2∣X=x,

因为交叉项包含 E μ − Y ∣ X = x = 0 \mathbb E\\mu-Y\\mid X=x=0 Eμ−Y∣X=x=0。第二项是条件方差,与 a a a 无关,所以

a ∗ ( x ) = E Y ∣ X = x . a^*(x)=\mathbb EY\\mid X=x. a∗(x)=EY∣X=x.

这个结论说明,使用平方损失训练足够灵活且优化充分的回归模型,在理想总体风险意义下,目标是条件均值,而不是"最常出现的标签"或"每个样本的真实值"。若 Y Y Y 在给定 x x x 时仍有随机噪声,任何只根据 x x x 预测的确定性模型都无法消除全部误差;最优预测仍可能具有非零风险。

从另一个角度看,条件风险可以分解为

E ( a − Y ) 2 ∣ X = x = ( a − μ ( x ) ) 2 + Var ⁡ ( Y ∣ X = x ) . \mathbb E(a-Y)\^2\\mid X=x =(a-\mu(x))^2+\operatorname{Var}(Y\mid X=x). E(a−Y)2∣X=x=(a−μ(x))2+Var(Y∣X=x).

第一项反映预测偏离条件均值造成的额外损失,第二项是该条件下不可通过确定性点预测消除的波动。这个分解也提醒我们,训练误差下降并不等价于观测噪声被"学会了"。

2.2 均方误差的梯度和大残差效应

对一个样本,令残差 r = a − y r=a-y r=a−y。平方损失的导数为

∂ ℓ S E ∂ a = 2 ( a − y ) = 2 r . \frac{\partial\ell_{\mathrm{SE}}}{\partial a}=2(a-y)=2r. ∂a∂ℓSE=2(a−y)=2r.

若采用半平方损失 ℓ = 1 2 r 2 \ell=\frac12r^2 ℓ=21r2,则导数是 r r r。因此,残差绝对值越大,单个样本对预测输出的梯度贡献越大。在批量训练中,某个异常观测可能产生远高于普通样本的梯度,从而明显改变参数更新方向。这里的"敏感"并不是平方损失的程序缺陷,而是其数学结构的直接结果。

设模型为线性回归 a = w ⊤ x + b a=w^\top x+b a=w⊤x+b。对于半平方损失,利用链式法则得到

∇ w ℓ = ( w ⊤ x + b − y ) x , \nabla_w\ell=(w^\top x+b-y)x, ∇wℓ=(w⊤x+b−y)x,

∂ ℓ ∂ b = w ⊤ x + b − y . \frac{\partial\ell}{\partial b}=w^\top x+b-y. ∂b∂ℓ=w⊤x+b−y.

这也解释了为什么输入特征的尺度会影响参数梯度:同样的预测残差,较大的 ∥ x ∥ \|x\| ∥x∥ 会放大权重方向的梯度。损失函数与输入数据的预处理不能完全割裂开来讨论。

2.3 绝对值损失为什么对应条件中位数

绝对值损失定义为

ℓ A E ( a , y ) = ∣ a − y ∣ . \ell_{\mathrm{AE}}(a,y)=|a-y|. ℓAE(a,y)=∣a−y∣.

它对残差幅度的惩罚是线性的。对 a ≠ y a\neq y a=y,导数为

∂ ℓ A E ∂ a = sign ⁡ ( a − y ) . \frac{\partial\ell_{\mathrm{AE}}}{\partial a}=\operatorname{sign}(a-y). ∂a∂ℓAE=sign(a−y).

在 a = y a=y a=y 处不可微,但可使用次梯度集合 − 1 , 1 -1,1 −1,1。这并不妨碍基于次梯度的优化方法处理绝对值损失。相较平方损失,绝对值损失的单样本导数幅度不会随着残差无限增大,因此对极端偏差的直接梯度放大效应较弱。

要看清它预测的统计量,考虑条件风险 g ( a ) = E ∣ a − Y ∣ ∣ X = x g(a)=\mathbb E\|a-Y\|\\mid X=x g(a)=E∣a−Y∣∣X=x。在条件分布连续、没有原子点的情形下,形式上求导得到

g ′ ( a ) = P ( Y < a ∣ X = x ) − P ( Y > a ∣ X = x ) = 2 F Y ∣ X = x ( a ) − 1. \begin{aligned} g'(a) &=P(Y<a\mid X=x)-P(Y>a\mid X=x)\\ &=2F_{Y\mid X=x}(a)-1. \end{aligned} g′(a)=P(Y<a∣X=x)−P(Y>a∣X=x)=2FY∣X=x(a)−1.

因此最优点满足 F Y ∣ X = x ( a ) = 1 / 2 F_{Y\mid X=x}(a)=1/2 FY∣X=x(a)=1/2,也就是条件中位数。更一般地,当分布含有离散质量时,最优解集合由满足

P ( Y ≤ a ∣ X = x ) ≥ 1 2 , P ( Y ≥ a ∣ X = x ) ≥ 1 2 P(Y\leq a\mid X=x)\geq\frac12, \qquad P(Y\geq a\mid X=x)\geq\frac12 P(Y≤a∣X=x)≥21,P(Y≥a∣X=x)≥21

的中位数构成。这一形式比简单写成 F ( a ) = 1 / 2 F(a)=1/2 F(a)=1/2 更普遍。若分布存在一段中位数区间,最优点可能不唯一。

均值和中位数并不总相同。例如,某条件分布以 0.9 0.9 0.9 的概率取 0 0 0,以 0.1 0.1 0.1 的概率取 10 10 10。其均值为 1 1 1,中位数为 0 0 0。平方损失的最优点预测是 1 1 1,绝对值损失的最优点预测是 0 0 0。两者并非一个"正确"、一个"错误",而是对预测误差采取了不同的决策准则。

2.4 Huber 损失如何折中

Huber 损失在小残差处采用二次形式,在大残差处转为线性形式。给定阈值 δ > 0 \delta>0 δ>0,定义

ℓ δ ( r ) = { 1 2 r 2 , ∣ r ∣ ≤ δ , δ ( ∣ r ∣ − 1 2 δ ) , ∣ r ∣ > δ . \ell_\delta(r)= \begin{cases} \frac12r^2,&|r|\leq\delta,\\ \delta\left(|r|-\frac12\delta\right),&|r|>\delta. \end{cases} ℓδ(r)={21r2,δ(∣r∣−21δ),∣r∣≤δ,∣r∣>δ.

它的一阶导数为

ψ δ ( r ) = { r , ∣ r ∣ ≤ δ , δ sign ⁡ ( r ) , ∣ r ∣ > δ . \psi_\delta(r)= \begin{cases} r,&|r|\leq\delta,\\ \delta\operatorname{sign}(r),&|r|>\delta. \end{cases} ψδ(r)={r,δsign(r),∣r∣≤δ,∣r∣>δ.

在 r = ± δ r=\pm\delta r=±δ 处左右一阶导数相同,因此 Huber 损失处处一阶可导,但二阶导数在分界点一般不连续。它既保留了小误差区域平滑的二次惩罚,也限制了大残差对梯度的直接影响。

阈值 δ \delta δ 具有实际含义:它决定从二次惩罚过渡到线性惩罚的残差尺度。如果标签从米改成毫米,残差数值扩大一千倍,而 δ \delta δ 不变,那么绝大多数样本可能落入另一种惩罚区域。选择 Huber 损失时必须考虑标签的单位、噪声尺度与异常值定义,而不能只记住"它比 MSE 更稳健"这一口号。

图1将三种损失画在同一残差坐标上。平方损失在远离零点后增长最快;绝对值损失始终保持线性增长;Huber 损失则在阈值附近改变曲率。图中的比较使用半平方形式,使其与 Huber 损失的二次区域直接对应。

图1:半平方损失、绝对值损失与 Huber 损失随残差变化的曲线。

2.5 损失函数和噪声模型的联系

平方损失还有一个常见的概率解释。假设给定输入时,标签满足

Y = f θ ( X ) + ε , ε ∼ N ( 0 , σ 2 ) , Y=f_\theta(X)+\varepsilon, \qquad \varepsilon\sim\mathcal N(0,\sigma^2), Y=fθ(X)+ε,ε∼N(0,σ2),

并假设噪声条件独立、方差 σ 2 \sigma^2 σ2 为已知常数。单个样本的负对数似然为

− log ⁡ p ( y ∣ x ; θ ) = ( y − f θ ( x ) ) 2 2 σ 2 + 1 2 log ⁡ ( 2 π σ 2 ) . -\log p(y\mid x;\theta) =\frac{(y-f_\theta(x))^2}{2\sigma^2} +\frac12\log(2\pi\sigma^2). −logp(y∣x;θ)=2σ2(y−fθ(x))2+21log(2πσ2).

当 σ 2 \sigma^2 σ2 固定时,最小化负对数似然等价于最小化平方误差之和。类似地,若条件误差服从以零为中心、尺度为 b > 0 b>0 b>0 的 Laplace 分布,其负对数似然为

− log ⁡ p ( y ∣ x ; θ ) = ∣ y − f θ ( x ) ∣ b + log ⁡ ( 2 b ) , -\log p(y\mid x;\theta) =\frac{|y-f_\theta(x)|}{b}+\log(2b), −logp(y∣x;θ)=b∣y−fθ(x)∣+log(2b),

固定 b b b 时对应绝对值损失。这种联系帮助我们理解损失函数隐含的误差模型,但不能倒过来断言:使用 MSE 就证明真实噪声一定服从高斯分布。即使噪声并非高斯,平方损失依然可以作为条件均值预测的合理决策损失。

如果模型同时学习异方差噪声的方差,情况还会不同。令 s θ ( x ) = log ⁡ σ θ 2 ( x ) s_\theta(x)=\log\sigma_\theta^2(x) sθ(x)=logσθ2(x),高斯负对数似然可写为

ℓ ( θ ; x , y ) = 1 2 exp ⁡ − s θ ( x ) ( y − μ θ ( x ) ) 2 + 1 2 s θ ( x ) + C . \ell(\theta;x,y) =\frac12\exp-s_\\theta(x)(y-\mu_\theta(x))^2 +\frac12s_\theta(x)+C. ℓ(θ;x,y)=21exp−sθ(x)(y−μθ(x))2+21sθ(x)+C.

第一项按预测方差加权残差,第二项防止模型仅通过把方差无限增大来逃避惩罚。这里的 C C C 与可训练参数无关。这是一个重要例子:一个看似"均方误差"的任务,如果要求同时预测不确定性,就需要更完整的概率目标。

三、分类问题:为什么直接优化类别是否正确并不理想

分类输出的是有限个类别之一,但神经网络通常先产生连续分数。对于 K K K 类分类,令 logits 向量为

z = ( z 1 , ... , z K ) ⊤ ∈ R K . z=(z_1,\ldots,z_K)^\top\in\mathbb R^K. z=(z1,...,zK)⊤∈RK.

最后的预测类别可以是 y ^ = arg ⁡ max ⁡ k z k \widehat y=\arg\max_k z_k y =argmaxkzk。如果直接用错误率作为单样本损失,得到

ℓ 0 - 1 ( z , y ) = 1 { arg ⁡ max ⁡ k z k ≠ y } . \ell_{0\text{-}1}(z,y)=\mathbf 1\{\arg\max_k z_k\neq y\}. ℓ0-1(z,y)=1{argkmaxzk=y}.

这个函数对 logits 的微小变化通常保持常数,只有在类别排序改变时才发生跳变。其几乎处处为零的梯度无法有效告诉网络应该如何改善当前分数。因此,神经网络分类通常使用具有连续变化信息的代理损失,其中最常见的是交叉熵。

3.1 从二分类概率到负对数似然

设 Y ∈ { 0 , 1 } Y\in\{0,1\} Y∈{0,1},模型预测类别 1 1 1 的概率为 p ∈ ( 0 , 1 ) p\in(0,1) p∈(0,1)。Bernoulli 分布的概率质量函数可写为

P ( Y = y ∣ x ) = p y ( 1 − p ) 1 − y . P(Y=y\mid x)=p^y(1-p)^{1-y}. P(Y=y∣x)=py(1−p)1−y.

对观测标签取负对数,得到二元交叉熵:

ℓ B C E ( p , y ) = − y log ⁡ p − ( 1 − y ) log ⁡ ( 1 − p ) . \ell_{\mathrm{BCE}}(p,y) =-y\log p-(1-y)\log(1-p). ℓBCE(p,y)=−ylogp−(1−y)log(1−p).

当 y = 1 y=1 y=1,损失为 − log ⁡ p -\log p −logp;当 y = 0 y=0 y=0,损失为 − log ⁡ ( 1 − p ) -\log(1-p) −log(1−p)。正确类别被分配的概率越高,损失越低;若模型对真实发生的类别给出接近零的概率,损失会迅速增大。这正是对"自信但错误"的预测施加更大惩罚的数学机制。

例如,真实标签为 1 1 1 时,预测概率 0.9 0.9 0.9 的损失约为 0.105 0.105 0.105,预测 0.5 0.5 0.5 的损失约为 0.693 0.693 0.693,预测 0.01 0.01 0.01 的损失约为 4.605 4.605 4.605。这三个数并不只是"预测对或错"的不同写法,它们刻画了模型对真实事件的概率分配程度。

图2把正负类别的对数损失与 Brier 平方概率损失放在一起。对数损失在给真实类别分配接近零概率时趋于无穷大;Brier 损失则有界。这两类损失对极端置信度的惩罚结构不同,训练结果也可能因此有所区别。

图2:二元对数损失与 Brier 损失随类别概率变化的曲线。

3.2 为什么使用 sigmoid,而不是直接把分数当概率

神经网络的线性输出 z ∈ R z\in\mathbb R z∈R 可以为任意实数,不能直接解释为概率。二分类中通常通过 sigmoid 变换得到

p = σ ( z ) = 1 1 + e − z . p=\sigma(z)=\frac{1}{1+e^{-z}}. p=σ(z)=1+e−z1.

由于 p ∈ ( 0 , 1 ) p\in(0,1) p∈(0,1),它可以用于 Bernoulli 负对数似然。代入二元交叉熵,得到

ℓ ( z , y ) = − y log ⁡ σ ( z ) − ( 1 − y ) log ⁡ ( 1 − σ ( z ) ) . \ell(z,y)=-y\log\sigma(z)-(1-y)\log(1-\sigma(z)). ℓ(z,y)=−ylogσ(z)−(1−y)log(1−σ(z)).

利用恒等式 log ⁡ σ ( z ) = z − log ⁡ ( 1 + e z ) \log\sigma(z)=z-\log(1+e^z) logσ(z)=z−log(1+ez) 和 log ⁡ ( 1 − σ ( z ) ) = − log ⁡ ( 1 + e z ) \log(1-\sigma(z))=-\log(1+e^z) log(1−σ(z))=−log(1+ez),整理得

ℓ ( z , y ) = log ⁡ ( 1 + e z ) − y z . \ell(z,y)=\log(1+e^z)-yz. ℓ(z,y)=log(1+ez)−yz.

为避免 z z z 很大时直接计算 e z e^z ez 发生溢出,常用等价的稳定形式

ℓ ( z , y ) = max ⁡ ( z , 0 ) − y z + log ⁡ ( 1 + e − ∣ z ∣ ) . \ell(z,y)=\max(z,0)-yz+\log(1+e^{-|z|}). ℓ(z,y)=max(z,0)−yz+log(1+e−∣z∣).

这说明"从 logits 计算交叉熵"并不是另一种统计损失,而是把 sigmoid 和交叉熵合并成数值更稳定的实现。若使用已经完成该合并的框架接口,就不应再对 logits 预先执行一次 sigmoid;否则计算对象与接口预期不一致。

3.3 二元交叉熵的梯度为何简洁

首先计算 sigmoid 的导数:

d p d z = p ( 1 − p ) . \frac{dp}{dz}=p(1-p). dzdp=p(1−p).

对概率形式的二元交叉熵求导:

∂ ℓ ∂ p = − y p + 1 − y 1 − p = p − y p ( 1 − p ) . \frac{\partial\ell}{\partial p} =-\frac{y}{p}+\frac{1-y}{1-p} =\frac{p-y}{p(1-p)}. ∂p∂ℓ=−py+1−p1−y=p(1−p)p−y.

再由链式法则得到

∂ ℓ ∂ z = ∂ ℓ ∂ p d p d z = p − y . \frac{\partial\ell}{\partial z} =\frac{\partial\ell}{\partial p}\frac{dp}{dz} =p-y. ∂z∂ℓ=∂p∂ℓdzdp=p−y.

这个结果是分类网络中非常重要的计算简化。虽然 sigmoid 的导数包含 p ( 1 − p ) p(1-p) p(1−p),交叉熵关于概率的导数中恰好出现其倒数形式,合并后输出 logit 的梯度成为预测概率与标签的差。不能据此断言所有深层网络都不会出现梯度消失:这里简化的是最后一个 logit 上的局部梯度,向前传播时仍然受到权重矩阵、其他激活函数和网络结构的影响。

当 y = 1 y=1 y=1 且 p p p 接近 0 0 0, ∂ ℓ / ∂ z \partial\ell/\partial z ∂ℓ/∂z 接近 − 1 -1 −1,优化器会得到明确的纠正方向;当 p p p 接近 1 1 1,梯度趋于 0 0 0。相应地,真实标签为 0 0 0 时梯度为 p p p。这个符号和大小都与"让预测概率向标签靠近"的目标一致。

四、多分类交叉熵:从 softmax 到矩阵梯度

二分类可以只用一个概率参数描述两个类别;多分类则需要一个满足非负且总和为一的概率向量。设 logits 为 z ∈ R K z\in\mathbb R^K z∈RK,softmax 定义为

p k = e z k ∑ j = 1 K e z j , k = 1 , ... , K . p_k=\frac{e^{z_k}}{\sum_{j=1}^Ke^{z_j}},\qquad k=1,\ldots,K. pk=∑j=1Kezjezk,k=1,...,K.

所有 p k p_k pk 都为正,且 ∑ k p k = 1 \sum_kp_k=1 ∑kpk=1。若标签为类别索引 c c c,其 one-hot 表示记为 y k = 1 { k = c } y_k=\mathbf 1\{k=c\} yk=1{k=c},则单样本多分类交叉熵为

ℓ ( z , y ) = − ∑ k = 1 K y k log ⁡ p k = − log ⁡ p c . \ell(z,y)=-\sum_{k=1}^Ky_k\log p_k=-\log p_c. ℓ(z,y)=−k=1∑Kyklogpk=−logpc.

将 softmax 代入可得

ℓ ( z , c ) = log ⁡ ( ∑ j = 1 K e z j ) − z c . \ell(z,c)=\log\left(\sum_{j=1}^Ke^{z_j}\right)-z_c. ℓ(z,c)=log(j=1∑Kezj)−zc.

其中 log ⁡ ∑ j e z j \log\sum_j e^{z_j} log∑jezj 称为 log-sum-exp。它可以视为一个平滑的最大值近似,因为设 m = max ⁡ j z j m=\max_j z_j m=maxjzj,则

m ≤ log ⁡ ( ∑ j e z j ) ≤ m + log ⁡ K . m\leq\log\left(\sum_je^{z_j}\right)\leq m+\log K. m≤log(j∑ezj)≤m+logK.

同时,softmax 对所有 logits 加同一个常数保持不变: softmax ⁡ ( z + a 1 ) = softmax ⁡ ( z ) \operatorname{softmax}(z+a\mathbf 1)=\operatorname{softmax}(z) softmax(z+a1)=softmax(z)。因此 logits 的绝对零点不具有唯一的概率意义,真正影响概率的是类别分数之间的相对差异。

4.1 从 log-sum-exp 推导梯度

设 S = ∑ j e z j S=\sum_j e^{z_j} S=∑jezj。对第 k k k 个 logit 求导:

∂ ∂ z k log ⁡ S = 1 S ∂ S ∂ z k = e z k S = p k . \frac{\partial}{\partial z_k}\log S =\frac{1}{S}\frac{\partial S}{\partial z_k} =\frac{e^{z_k}}{S}=p_k. ∂zk∂logS=S1∂zk∂S=Sezk=pk.

另一方面, − z c -z_c −zc 关于 z k z_k zk 的导数为 − 1 { k = c } = − y k -\mathbf 1\{k=c\}=-y_k −1{k=c}=−yk。所以

∂ ℓ ∂ z k = p k − y k . \boxed{\frac{\partial\ell}{\partial z_k}=p_k-y_k.} ∂zk∂ℓ=pk−yk.

写成向量形式就是

∇ z ℓ = p − y . \nabla_z\ell=p-y. ∇zℓ=p−y.

这与二分类中 p − y p-y p−y 的结构一致,但这里的 p , y p,y p,y 都是 K K K 维向量。注意所有分量之和为零:

1 ⊤ ( p − y ) = 1 − 1 = 0. \mathbf1^\top(p-y)=1-1=0. 1⊤(p−y)=1−1=0.

这与 softmax 对整体平移不敏感的性质相符。若错误地把多分类交叉熵理解为对每个类别分别执行相互独立的二元分类,就会忽略 softmax 归一化造成的类别耦合。

4.2 批量矩阵形式与维度检查

设批量大小为 B B B,最后一层输入特征为 H ∈ R B × d H\in\mathbb R^{B\times d} H∈RB×d,权重为 W ∈ R d × K W\in\mathbb R^{d\times K} W∈Rd×K,偏置为 b ∈ R K b\in\mathbb R^K b∈RK。logits 矩阵为

Z = H W + 1 B b ⊤ ∈ R B × K . Z=HW+\mathbf1_Bb^\top\in\mathbb R^{B\times K}. Z=HW+1Bb⊤∈RB×K.

对每一行应用 softmax,得到 P ∈ R B × K P\in\mathbb R^{B\times K} P∈RB×K。设 one-hot 标签矩阵为 Y ∈ { 0 , 1 } B × K Y\in\{0,1\}^{B\times K} Y∈{0,1}B×K,每行恰好有一个 1 1 1。批量平均交叉熵是

L = − 1 B ∑ i = 1 B ∑ k = 1 K Y i k log ⁡ P i k . L=-\frac1B\sum_{i=1}^B\sum_{k=1}^KY_{ik}\log P_{ik}. L=−B1i=1∑Bk=1∑KYiklogPik.

其对 logits 的梯度为

∂ L ∂ Z = 1 B ( P − Y ) ∈ R B × K . \frac{\partial L}{\partial Z}=\frac1B(P-Y)\in\mathbb R^{B\times K}. ∂Z∂L=B1(P−Y)∈RB×K.

利用 Z = H W + 1 B b ⊤ Z=HW+\mathbf1_Bb^\top Z=HW+1Bb⊤,得到最后一层参数梯度

∂ L ∂ W = H ⊤ P − Y B ∈ R d × K , \frac{\partial L}{\partial W}=H^\top\frac{P-Y}{B}\in\mathbb R^{d\times K}, ∂W∂L=H⊤BP−Y∈Rd×K,

∂ L ∂ b = ( P − Y B ) ⊤ 1 B ∈ R K . \frac{\partial L}{\partial b}=\left(\frac{P-Y}{B}\right)^\top\mathbf1_B\in\mathbb R^K. ∂b∂L=(BP−Y)⊤1B∈RK.

如果进一步向隐藏层传播,得到

∂ L ∂ H = P − Y B W ⊤ ∈ R B × d . \frac{\partial L}{\partial H}=\frac{P-Y}{B}W^\top\in\mathbb R^{B\times d}. ∂H∂L=BP−YW⊤∈RB×d.

每一个矩阵乘法的维度都可以检查。例如 H ⊤ H^\top H⊤ 是 d × B d\times B d×B,而 ( P − Y ) / B (P-Y)/B (P−Y)/B 是 B × K B\times K B×K,因此结果恰好是 d × K d\times K d×K,与 W W W 同形状。这里的推导只针对最后一层线性变换;隐藏层非线性及其链式求导将在反向传播专题中系统展开。

4.3 数值稳定的 softmax 与 log-sum-exp

直接计算 e z k e^{z_k} ezk 可能发生上溢,尤其当 logits 很大时。设 m = max ⁡ k z k m=\max_k z_k m=maxkzk,则

log ⁡ ∑ k e z k = m + log ⁡ ∑ k e z k − m . \log\sum_ke^{z_k}=m+\log\sum_ke^{z_k-m}. logk∑ezk=m+logk∑ezk−m.

因为所有 z k − m ≤ 0 z_k-m\leq0 zk−m≤0,指数项不会因正指数过大而上溢。稳定的交叉熵计算可以直接使用

ℓ ( z , c ) = m + log ⁡ ∑ k e z k − m − z c . \ell(z,c)=m+\log\sum_ke^{z_k-m}-z_c. ℓ(z,c)=m+logk∑ezk−m−zc.

如果先计算 softmax,再对概率取对数,极小概率在有限精度下可能舍入为零,从而导致 log ⁡ 0 \log0 log0。稳定的 log-sum-exp 实现能避免一部分这类问题。数值稳定性并不是额外的数学目标,而是让计算机更可靠地实现同一个数学目标。

五、交叉熵为什么可以学习条件概率

"交叉熵适合分类"只是经验性的说法。更深层的问题是:如果真实类别本身带有随机性,为什么最小化交叉熵会使模型输出接近真实的条件概率?

5.1 从条件风险到 KL 散度

固定输入 X = x X=x X=x,设真实条件类别分布为 q = ( q 1 , ... , q K ) q=(q_1,\ldots,q_K) q=(q1,...,qK),模型报告概率 p = ( p 1 , ... , p K ) p=(p_1,\ldots,p_K) p=(p1,...,pK)。假设 p k > 0 p_k>0 pk>0 对所有 q k > 0 q_k>0 qk>0 的类别成立,则条件期望交叉熵为

R ( p ; q ) = − ∑ k = 1 K q k log ⁡ p k . \mathcal R(p;q)=-\sum_{k=1}^Kq_k\log p_k. R(p;q)=−k=1∑Kqklogpk.

在式中加上并减去 − ∑ k q k log ⁡ q k -\sum_kq_k\log q_k −∑kqklogqk,可写为

R ( p ; q ) = H ( q ) + D K L ( q ∥ p ) , \mathcal R(p;q)=H(q)+D_{\mathrm{KL}}(q\|p), R(p;q)=H(q)+DKL(q∥p),

其中

H ( q ) = − ∑ k q k log ⁡ q k , H(q)=-\sum_kq_k\log q_k, H(q)=−k∑qklogqk,

D K L ( q ∥ p ) = ∑ k q k log ⁡ q k p k . D_{\mathrm{KL}}(q\|p)=\sum_kq_k\log\frac{q_k}{p_k}. DKL(q∥p)=k∑qklogpkqk.

按照约定, q k = 0 q_k=0 qk=0 的项贡献为零。KL 散度非负,且在有限类别分布中,当 p = q p=q p=q 时取零。因此,对于能够自由选择概率向量的理想预测器,交叉熵条件风险在 p = q p=q p=q 处达到最小值。这里并不是说有限样本神经网络一定学到精确的真实概率,而是说明交叉熵在总体风险层面具有明确的概率预测目标。

交叉熵和 KL 散度经常被混用。对于固定的真实分布 q q q,两者仅相差与 p p p 无关的熵 H ( q ) H(q) H(q),所以最小化目标相同;但它们的数值并不相等。若比较不同数据分布下的损失,或者解释一个具体损失数值的意义,就不能忽略这项差别。

5.2 交叉熵与 Brier 分数的共同点

二分类还有一个重要的概率损失:Brier 分数。若 y ∈ { 0 , 1 } y\in\{0,1\} y∈{0,1},预测类别 1 1 1 的概率为 p p p,可以定义

ℓ B r i e r ( p , y ) = ( p − y ) 2 . \ell_{\mathrm{Brier}}(p,y)=(p-y)^2. ℓBrier(p,y)=(p−y)2.

固定真实条件概率 q = P ( Y = 1 ∣ X = x ) q=P(Y=1\mid X=x) q=P(Y=1∣X=x),其条件风险为

R B ( p ; q ) = q ( p − 1 ) 2 + ( 1 − q ) p 2 = ( p − q ) 2 + q ( 1 − q ) . \begin{aligned} \mathcal R_B(p;q) &=q(p-1)^2+(1-q)p^2\\ &=(p-q)^2+q(1-q). \end{aligned} RB(p;q)=q(p−1)2+(1−q)p2=(p−q)2+q(1−q).

因此最优预测同样是 p = q p=q p=q。对数损失与 Brier 分数都是严格适当的概率评分规则:在理想总体风险下,报告真实概率分布是唯一的最优选择。两者并不相同,因为对数损失对把真实事件概率压到零附近的行为施加无界惩罚,而 Brier 损失有界。

图3取真实概率 q = 0.7 q=0.7 q=0.7,分别计算两种损失的条件期望。两条曲线的最小点都位于 p = 0.7 p=0.7 p=0.7,但曲线的形状与数值尺度不同。这张图展示的是理论条件风险,而不是有限数据训练后一定能获得的校准效果。

图3:真实类别概率为 0.7 0.7 0.7 时,对数损失与 Brier 损失的期望风险。

5.3 概率校准与分类正确率之间的区别

如果模型在大量预测概率约为 0.8 0.8 0.8 的样本中,真实正类出现的频率也接近 0.8 0.8 0.8,就可以说它在这一概率区间具有较好的校准性。校准关心的是报告概率与事件频率的一致程度,而分类准确率关心离散决策是否正确。一个模型可以具有较高准确率,但对预测置信度过于自信;另一个模型也可能概率校准较好,却因决策阈值不合适而得到较差的任务指标。

严格适当的评分规则为学习概率提供了理论依据,但训练时还受到模型容量、优化、数据偏移和有限样本的影响,因此不能从"使用了交叉熵"直接推出"概率已经校准"。尤其在深度网络中,模型可以在训练集上给出极高置信度,而在分布外样本上表现不可靠。损失的统计目标与实际模型的概率质量必须分开评价。

5.4 标签平滑究竟改变了什么

在 K K K 类分类中,普通 one-hot 标签为 y y y。标签平滑常用形式是

y ~ = ( 1 − ε ) y + ε u , \widetilde y=(1-\varepsilon)y+\varepsilon u, y =(1−ε)y+εu,

其中 u = ( 1 / K , ... , 1 / K ) u=(1/K,\ldots,1/K) u=(1/K,...,1/K) 是均匀分布, 0 ≤ ε < 1 0\leq\varepsilon<1 0≤ε<1。于是目标类别的概率质量从 1 1 1 变为 1 − ε + ε / K 1-\varepsilon+\varepsilon/K 1−ε+ε/K,其他类别获得 ε / K \varepsilon/K ε/K。训练损失改为

ℓ s m o o t h = − ∑ k = 1 K y ~ k log ⁡ p k . \ell_{\mathrm{smooth}}=-\sum_{k=1}^K\widetilde y_k\log p_k. ℓsmooth=−k=1∑Ky klogpk.

对 logits 的梯度也随之成为 p − y ~ p-\widetilde y p−y 。这说明标签平滑并非仅仅在优化器中"让梯度小一点",而是明确改变了训练使用的目标分布。它可能抑制某些过高置信度预测,但并不保证所有任务都受益,也不应把平滑后的标签误称为真实条件概率。

六、损失函数与决策目标不一致时会发生什么

前面讨论了统计目标,但实际应用通常还有具体的决策代价。例如,疾病筛查中漏报和误报的代价可能不同;设备故障检测中,误报会增加维护成本,漏报则可能造成停机。即使模型概率估计准确,直接使用 0.5 0.5 0.5 阈值也未必使业务代价最小。

6.1 分类阈值由代价决定

设二分类中把负类误判为正类的代价为 C F P > 0 C_{\mathrm{FP}}>0 CFP>0,把正类误判为负类的代价为 C F N > 0 C_{\mathrm{FN}}>0 CFN>0,正确分类代价为零。给定条件正类概率 p = P ( Y = 1 ∣ X = x ) p=P(Y=1\mid X=x) p=P(Y=1∣X=x),预测正类的期望代价是

C + ( p ) = C F P ( 1 − p ) , C_+(p)=C_{\mathrm{FP}}(1-p), C+(p)=CFP(1−p),

预测负类的期望代价是

C − ( p ) = C F N p . C_-(p)=C_{\mathrm{FN}}p. C−(p)=CFNp.

当 C + ( p ) ≤ C − ( p ) C_+(p)\leq C_-(p) C+(p)≤C−(p) 时应预测正类,整理得

p ≥ C F P C F P + C F N . p\geq\frac{C_{\mathrm{FP}}}{C_{\mathrm{FP}}+C_{\mathrm{FN}}}. p≥CFP+CFNCFP.

只有两类错误代价相等时,最优阈值才是 0.5 0.5 0.5。这说明训练概率预测器与选择最终决策阈值是两个不同阶段。若模型已经能够提供可靠概率,调整决策阈值可能比重新定义训练损失更直接。

6.2 类别不平衡并不自动要求加权交叉熵

设数据中正类很少。直接使用普通交叉熵,理论上仍以真实条件概率为目标;但在有限数据、模型能力受限或关注少数类召回率时,训练可能出现不理想的结果。常见方法是对不同类别设置权重:

ℓ w ( p , y ) = − w 1 y log ⁡ p − w 0 ( 1 − y ) log ⁡ ( 1 − p ) , \ell_w(p,y)=-w_1y\log p-w_0(1-y)\log(1-p), ℓw(p,y)=−w1ylogp−w0(1−y)log(1−p),

其中 w 0 , w 1 > 0 w_0,w_1>0 w0,w1>0。固定真实正类概率 q q q,其条件期望损失为

R w ( p ; q ) = − w 1 q log ⁡ p − w 0 ( 1 − q ) log ⁡ ( 1 − p ) . \mathcal R_w(p;q)=-w_1q\log p-w_0(1-q)\log(1-p). Rw(p;q)=−w1qlogp−w0(1−q)log(1−p).

对 p p p 求导并令其为零,可得最优预测

p w ∗ = w 1 q w 1 q + w 0 ( 1 − q ) . p_w^*=\frac{w_1q}{w_1q+w_0(1-q)}. pw∗=w1q+w0(1−q)w1q.

除非权重相等,否则 p w ∗ p_w^* pw∗ 一般不等于真实概率 q q q。因此,类别加权交叉熵会改变概率输出的统计含义。它可能有利于特定分类代价或训练目标,但不能不加说明地把加权训练后的输出直接视为未经修正的真实概率。

这一点常被忽视:类别不平衡是数据分布的性质,而是否应该加权,还取决于我们最终希望优化什么。若核心目标是概率估计,应考虑概率校准和采样机制;若核心目标是特定代价下的分类决策,应明确代价函数与阈值。简单地按类别频率倒数设置权重,并不必然与实际业务损失一致。

6.3 Focal Loss 的作用与边界

Focal Loss 在目标类别概率 p t p_t pt 上引入调制因子:

ℓ f o c a l ( p t ) = − α t ( 1 − p t ) γ log ⁡ p t , \ell_{\mathrm{focal}}(p_t)=-\alpha_t(1-p_t)^\gamma\log p_t, ℓfocal(pt)=−αt(1−pt)γlogpt,

其中 γ ≥ 0 \gamma\geq0 γ≥0, α t \alpha_t αt 是类别相关权重。 γ = 0 \gamma=0 γ=0 时退化为加权对数损失;当 γ > 0 \gamma>0 γ>0 时,容易样本的损失受到额外抑制,使训练更关注当前预测较差的样本。这一设计在密集目标检测中有明确的历史背景。

不过,"更关注困难样本"不意味着这些样本必然更有价值。困难样本可能是少数类中的有效信息,也可能是标注错误或本身不可判别的观测。改变样本权重还可能改变概率校准性质。因此,是否使用 Focal Loss,需要结合目标任务、数据噪声和评价指标判断,而不是把它当作交叉熵的通用升级版本。

七、损失缩放、批量归约与优化动力学

很多训练结果差异并不是来自损失的统计定义,而是来自实现细节。例如,使用求和还是平均、是否包含常数因子、不同任务的损失如何组合,都会改变梯度尺度。

7.1 求和与平均的差别

设批量包含 B B B 个样本。两种常见归约方式是

L s u m = ∑ i = 1 B ℓ i , L m e a n = 1 B ∑ i = 1 B ℓ i . L_{\mathrm{sum}}=\sum_{i=1}^B\ell_i, \qquad L_{\mathrm{mean}}=\frac1B\sum_{i=1}^B\ell_i. Lsum=i=1∑Bℓi,Lmean=B1i=1∑Bℓi.

二者具有相同的最优点集合(在 B B B 固定且没有其他项时),但梯度相差 B B B 倍:

∇ θ L s u m = B ∇ θ L m e a n . \nabla_\theta L_{\mathrm{sum}}=B\nabla_\theta L_{\mathrm{mean}}. ∇θLsum=B∇θLmean.

如果使用普通梯度下降 θ t + 1 = θ t − η ∇ L ( θ t ) \theta_{t+1}=\theta_t-\eta\nabla L(\theta_t) θt+1=θt−η∇L(θt),在学习率 η \eta η 不变时,更新幅度会随之改变。即使在自适应优化器中,缩放也可能通过数值稳定项、权重衰减或梯度裁剪产生影响。因此,比较不同实验的"损失值大小"之前,首先要核对归约方式。

对于图像分割或序列任务,平均维度还可能包括像素、时间步和有效 token。若一个批次包含不同长度的序列,先对每条序列取平均再对批次平均,与把所有有效 token 放在一起取平均,并不是同一个目标。前者让每条序列权重相同,后者让每个 token 权重相同。实现时必须明确样本单位是什么。

7.2 多任务损失的权重不是装饰参数

设网络同时执行两个任务,损失分别为 L 1 ( θ ) L_1(\theta) L1(θ) 与 L 2 ( θ ) L_2(\theta) L2(θ)。常见联合目标为

J ( θ ) = λ 1 L 1 ( θ ) + λ 2 L 2 ( θ ) . J(\theta)=\lambda_1L_1(\theta)+\lambda_2L_2(\theta). J(θ)=λ1L1(θ)+λ2L2(θ).

它的梯度是

∇ J = λ 1 ∇ L 1 + λ 2 ∇ L 2 . \nabla J=\lambda_1\nabla L_1+\lambda_2\nabla L_2. ∇J=λ1∇L1+λ2∇L2.

如果两个任务的梯度方向相近,联合训练可能互相促进;如果方向冲突,权重会决定最终更新更偏向哪个任务。损失数值大不一定意味着梯度也大,因此不能仅凭打印出的损失量级确定权重。更严谨的分析应同时考虑任务指标、梯度范数、梯度夹角和训练动态。

若一个任务的标签单位改变,平方损失可能发生平方尺度的变化。例如将米改为厘米,残差扩大一百倍,平方损失会扩大一万倍。这可能在联合目标中无意间改变任务的重要性。损失权重必须与变量单位、数据标准化和目标定义一起设计。

7.3 正则化不能和数据拟合误差混为一谈

以 L 2 L_2 L2 正则化为例:

J ( θ ) = 1 N ∑ i ℓ i ( θ ) + λ 2 ∥ θ ∥ 2 2 . J(\theta)=\frac1N\sum_i\ell_i(\theta)+\frac\lambda2\|\theta\|_2^2. J(θ)=N1i∑ℓi(θ)+2λ∥θ∥22.

其梯度为

∇ J ( θ ) = ∇ R ^ N ( θ ) + λ θ . \nabla J(\theta)=\nabla\widehat R_N(\theta)+\lambda\theta. ∇J(θ)=∇R N(θ)+λθ.

在这种定义下,正则化项鼓励较小的参数范数,却不是预测标签与真实标签之间的误差。某些优化器中的 decoupled weight decay 与把 L 2 L_2 L2 惩罚直接加入目标也不总是等价,尤其在自适应更新规则中更需要区分。正则化方法将在后续专题详细讨论,本期的重点是把它与样本损失分清。

八、NumPy 实验:从曲线形状到可验证的梯度

前面的推导涉及多个数学对象:残差损失、条件风险、概率评分规则与 logits 梯度。为了避免停留在符号层面,下面使用一个完整的 NumPy 脚本复现五张图。实验不需要下载数据集,使用固定随机种子生成回归样本;分类部分直接计算解析概率曲线与有限差分梯度。运行环境建议 Python 3.10 及以上,依赖 NumPy 和 Matplotlib。

8.1 实验一:异常观测如何改变回归结果

我们构造一条线性生成趋势

y ∗ ( x ) = 1.2 x + 0.4 , y^*(x)=1.2x+0.4, y∗(x)=1.2x+0.4,

在 − 2 , 2 -2,2 −2,2 区间取 81 81 81 个输入点,加入标准差为 0.2 0.2 0.2 的高斯噪声,并对其中五个样本额外施加较大的正负偏移。这个实验刻意构造了污染观测,不代表真实数据中的所有异常点都应被删除。随后分别使用平方损失、绝对值损失与 Huber 损失拟合线性模型 y ^ = w x + b \widehat y=wx+b y =wx+b。

为保持对比清楚,三种方法使用相同的模型形式和训练数据;优化时使用对应损失的梯度或次梯度。绝对值损失的学习率单独衰减,以减少次梯度在最优点附近的振荡。因此,三者最终结果既受损失定义影响,也受有限步数优化的影响,不能把本次数字视为所有数据集上的普遍排序。

图4显示污染样本如何牵引拟合直线。平方损失会对远离趋势的点赋予较大的梯度贡献;绝对值和 Huber 损失则限制大残差的直接影响。是否值得采用稳健损失,取决于异常点是测量污染还是任务本身必须重视的罕见事件。

图4:含污染观测的线性回归中,三种损失函数对应的拟合结果。

在本次固定随机种子的运行中,平方损失拟合参数约为 ( w , b ) = ( 1.2233 , 0.4863 ) (w,b)=(1.2233,0.4863) (w,b)=(1.2233,0.4863),绝对值损失约为 ( 1.1822 , 0.4095 ) (1.1822,0.4095) (1.1822,0.4095),Huber 损失约为 ( 1.2097 , 0.4390 ) (1.2097,0.4390) (1.2097,0.4390)。以已知生成趋势 y ∗ ( x ) y^*(x) y∗(x) 为参考,在全部输入点上的均方根偏差分别约为 0.0904 0.0904 0.0904、 0.0229 0.0229 0.0229 和 0.0406 0.0406 0.0406。这些数字来自人为生成的数据,且使用的是相对生成趋势的误差,而不是与污染观测之间的训练误差。两种误差不应混用。

8.2 实验二:概率损失的不同惩罚结构

实验的第二部分令二分类预测概率 p p p 在 ( 0 , 1 ) (0,1) (0,1) 内变化,绘制真实标签为 1 1 1 和 0 0 0 时的对数损失,并以真实标签为 1 1 1 的 Brier 损失作为对照。图2中,对数损失在错误且极端自信的区域迅速增大,Brier 损失则保持有界。这是函数定义的直接结果,与神经网络训练是否收敛无关。

接着固定真实条件概率 q = 0.7 q=0.7 q=0.7,计算

R log ⁡ ( p ; q ) = − q log ⁡ p − ( 1 − q ) log ⁡ ( 1 − p ) , \mathcal R_{\log}(p;q)=-q\log p-(1-q)\log(1-p), Rlog(p;q)=−qlogp−(1−q)log(1−p),

R B ( p ; q ) = q ( 1 − p ) 2 + ( 1 − q ) p 2 . \mathcal R_{B}(p;q)=q(1-p)^2+(1-q)p^2. RB(p;q)=q(1−p)2+(1−q)p2.

图3中的两条曲线都在 p = 0.7 p=0.7 p=0.7 取得最小值,直接验证了前面的条件风险推导。这里使用的是真实概率已知的合成问题,因此可以检查最优点的位置;在现实任务中,真实条件概率通常不可直接观测,需要通过独立验证数据和校准分析间接评价。

8.3 实验三:用有限差分检查 softmax 交叉熵梯度

解析推导得到了 ∇ z ℓ = p − y \nabla_z\ell=p-y ∇zℓ=p−y。为了检查实现,我们取三类 logits

z = ( 1.2 , − 0.4 , 0.7 ) ⊤ , z=(1.2,-0.4,0.7)^\top, z=(1.2,−0.4,0.7)⊤,

真实类别索引为 2 2 2(从零开始编号)。先使用稳定 log-sum-exp 计算交叉熵,再对每个 logit 使用中心差分:

g k n u m = ℓ ( z + h e k ) − ℓ ( z − h e k ) 2 h , g_k^{\mathrm{num}}=\frac{\ell(z+he_k)-\ell(z-he_k)}{2h}, gknum=2hℓ(z+hek)−ℓ(z−hek),

其中 e k e_k ek 是第 k k k 个标准基向量, h = 10 − 5 h=10^{-5} h=10−5。在函数足够光滑且数值误差受控的情况下,中心差分的截断误差通常为 O ( h 2 ) O(h^2) O(h2);但 h h h 过小时,浮点舍入误差会增大,所以不能机械地认为步长越小越好。

本次计算得到 softmax 概率约为 ( 0.5530 , 0.1116 , 0.3354 ) (0.5530,0.1116,0.3354) (0.5530,0.1116,0.3354),交叉熵约为 1.0925 1.0925 1.0925。解析梯度与中心差分梯度的最大绝对差约为 4.96 × 10 − 12 4.96\times10^{-12} 4.96×10−12。图5将两种梯度并列展示,它们在当前绘图尺度上几乎重合。这说明本次局部导数实现与数值差分高度一致,但并不证明任意深层网络的反向传播代码都正确。

图5:softmax 交叉熵的解析梯度与中心差分梯度对照。

8.4 完整可运行代码

下面的脚本同时生成图1至图5。为方便独立复现,所有数据都在程序内部生成;输出图片保存在脚本所在目录的 images/ 子目录。代码中的注释解释计算步骤,不依赖深度学习框架。

python 复制代码
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

OUT = Path(__file__).resolve().parent / 'images'
OUT.mkdir(exist_ok=True)
rng = np.random.default_rng(20261112)
plt.rcParams['font.family'] = 'DejaVu Sans'
plt.rcParams['axes.unicode_minus'] = False

# 图1:残差损失函数
r = np.linspace(-3, 3, 600)
delta = 1.0
mse = 0.5 * r * r
mae = np.abs(r)
huber = np.where(np.abs(r) <= delta, 0.5 * r * r,
                 delta * (np.abs(r) - 0.5 * delta))
fig, ax = plt.subplots(figsize=(7.2, 4.5))
for values, name in [(mse, 'Squared / 2'),
                     (mae, 'Absolute'),
                     (huber, 'Huber (delta=1)')]:
    ax.plot(r, values, label=name, lw=2)
ax.set(xlabel='Residual r', ylabel='Loss',
       title='Regression loss as a function of residual')
ax.legend()
ax.grid(alpha=0.25)
fig.tight_layout()
fig.savefig(OUT / 'figure_01_regression_losses.png', dpi=180)
plt.close(fig)

# 图2:二分类概率损失
p = np.linspace(0.001, 0.999, 600)
fig, ax = plt.subplots(figsize=(7.2, 4.5))
ax.plot(p, -np.log(p), lw=2, label='Log loss (y=1)')
ax.plot(p, (1-p)**2, lw=2, label='Brier loss (y=1)')
ax.plot(p, -np.log1p(-p), lw=2, label='Log loss (y=0)')
ax.set(xlabel='Predicted probability p of class 1',
       ylabel='Loss', ylim=(0, 7), title='Binary probability losses')
ax.legend()
ax.grid(alpha=0.25)
fig.tight_layout()
fig.savefig(OUT / 'figure_02_probability_losses.png', dpi=180)
plt.close(fig)

# 图3:已知真实条件概率时的期望风险
q = 0.7
ce = -q * np.log(p) - (1-q) * np.log1p(-p)
brier = q * (1-p)**2 + (1-q) * p**2
fig, ax = plt.subplots(figsize=(7.2, 4.5))
ax.plot(p, ce, label='Expected log loss', lw=2)
ax.plot(p, brier, label='Expected Brier loss', lw=2)
ax.axvline(q, color='black', linestyle='--', label='True q = 0.7')
ax.set(xlabel='Reported probability p', ylabel='Expected loss',
       ylim=(0, 2.2),
       title='Proper scoring rules recover the true probability')
ax.legend()
ax.grid(alpha=0.25)
fig.tight_layout()
fig.savefig(OUT / 'figure_03_expected_risk.png', dpi=180)
plt.close(fig)

# 图4:污染观测下的线性回归
x = np.linspace(-2, 2, 81)
y_true = 1.2 * x + 0.4
y = y_true + rng.normal(0, 0.20, len(x))
outlier_ids = np.array([7, 19, 40, 64, 74])
y[outlier_ids] += np.array([4, -5, 5, -4, 4.5])
X = np.column_stack([x, np.ones_like(x)])

def fit(kind, delta=0.6, steps=5000):
    w = np.zeros(2)
    for t in range(steps):
        residual = X @ w - y
        if kind == 'mse':
            g = residual
        elif kind == 'mae':
            g = np.sign(residual)
        else:
            g = np.clip(residual, -delta, delta)
        grad = X.T @ g / len(x)
        lr = 0.09 if kind != 'mae' else 0.025 / np.sqrt(1 + t / 100)
        w -= lr * grad
    return w

weights = {kind: fit(kind) for kind in ('mse', 'mae', 'huber')}
xx = np.linspace(-2.2, 2.2, 300)
fig, ax = plt.subplots(figsize=(7.4, 4.6))
ax.scatter(x, y, s=13, alpha=0.65, label='Observed data')
ax.scatter(x[outlier_ids], y[outlier_ids], s=40,
           facecolors='none', edgecolors='black',
           label='Contaminated points')
ax.plot(xx, 1.2 * xx + 0.4, 'k--', lw=2, label='Generating trend')
for kind, w in weights.items():
    ax.plot(xx, w[0] * xx + w[1], lw=2, label=f'{kind.upper()} fit')
ax.set(xlabel='x', ylabel='y',
       title='Linear regression with contaminated observations')
ax.legend(fontsize=8, ncol=2)
ax.grid(alpha=0.2)
fig.tight_layout()
fig.savefig(OUT / 'figure_04_outliers_fit.png', dpi=180)
plt.close(fig)

# 图5:softmax 交叉熵的梯度校验
z = np.array([1.2, -0.4, 0.7])
target = 2

def logsumexp(v):
    a = np.max(v)
    return a + np.log(np.exp(v-a).sum())

def loss(v):
    return logsumexp(v) - v[target]

prob = np.exp(z - logsumexp(z))
analytic = prob - np.eye(len(z))[target]
h = 1e-5
numeric = np.array([
    (loss(z + np.eye(3)[j] * h) - loss(z - np.eye(3)[j] * h))
    / (2*h) for j in range(3)
])
fig, ax = plt.subplots(figsize=(7.2, 4.5))
idx = np.arange(3)
ax.bar(idx - 0.18, analytic, width=0.36, label='Analytic')
ax.bar(idx + 0.18, numeric, width=0.36,
       label='Central difference', alpha=0.75)
ax.set(xticks=idx, xticklabels=['z0', 'z1', 'z2'],
       ylabel='dL / dz', title='Softmax cross-entropy gradient check')
ax.legend()
ax.grid(axis='y', alpha=0.25)
fig.tight_layout()
fig.savefig(OUT / 'figure_05_gradient_check.png', dpi=180)
plt.close(fig)

print('Linear fit parameters (slope, intercept):')
for kind, w in weights.items():
    rmse = np.sqrt(np.mean(((X @ w) - y_true)**2))
    print(kind, np.round(w, 6), 'clean-grid RMSE=', round(float(rmse), 6))
print('softmax=', prob, 'loss=', loss(z),
      'max_gradient_error=', np.max(np.abs(analytic-numeric)))

脚本可以使用 python experiment.py 执行。这些图各自对应不同的分析任务:图1与图2直接展示损失函数的形状,图3展示已知分布下的解析风险,图4比较污染样本下的拟合结果,图5检查解析梯度与数值差分的一致性。把它们混为一种"实验验证",会模糊各自能支持的结论。

九、怎样为具体任务选择损失函数

损失选择不能脱离输出对象。对于连续值点预测,首先应明确希望估计条件均值、条件中位数还是其他分位数;对于类别概率预测,首先应明确是否需要概率解释与校准;对于最终决策,首先应明确误报、漏报及其他错误的代价。这些问题决定了什么叫"预测好",而网络结构只是实现预测器的方式。

9.1 如果目标是分位数,为什么不使用普通 MSE

绝对值损失对应中位数,也就是 0.5 0.5 0.5 分位数。如果希望预测更高或更低的条件分位数,可以使用 pinball loss。令 u = y − a u=y-a u=y−a,对 τ ∈ ( 0 , 1 ) \tau\in(0,1) τ∈(0,1) 定义

ρ τ ( u ) = { τ u , u ≥ 0 , ( τ − 1 ) u , u < 0. \rho_\tau(u)= \begin{cases} \tau u,&u\geq0,\\ (\tau-1)u,&u<0. \end{cases} ρτ(u)={τu,(τ−1)u,u≥0,u<0.

当 τ = 0.5 \tau=0.5 τ=0.5 时, ρ 0.5 ( u ) = 1 2 ∣ u ∣ \rho_{0.5}(u)=\frac12|u| ρ0.5(u)=21∣u∣,因此对应中位数。对于一般 τ \tau τ,其条件风险的最优点是条件 τ \tau τ 分位数,在存在原子或平坦区域时可能不唯一。比如预测交货时间的第 0.9 0.9 0.9 分位数,意味着希望给出一个使大约九成条件结果不超过该值的界限,而不是预测平均交货时间。使用 MSE 得到的均值无法直接替代这个目标。

分位数损失也说明,"可导"不是一个合理损失的必要条件。pinball loss 在零残差处存在折点,但可以通过次梯度或框架提供的自动微分约定进行优化。真正需要关注的是损失与目标统计量是否一致,以及优化方法能否可靠处理相应的数学结构。

9.2 如果目标是排序或检索,单样本误差可能不够

前面讨论的回归和分类损失大多针对单个样本独立计算。但在排序任务中,目标往往是"相关结果应排在不相关结果前面",此时只看单个分数与标签之间的差可能无法完整表达排序质量。设正样本分数为 s + s^+ s+,负样本分数为 s − s^- s−,一个简单的成对 hinge 损失是

ℓ r a n k = max ⁡ ( 0 , m − s + + s − ) , \ell_{\mathrm{rank}}=\max(0,m-s^++s^-), ℓrank=max(0,m−s++s−),

其中 m > 0 m>0 m>0 是期望的分数间隔。当 s + ≥ s − + m s^+\geq s^-+m s+≥s−+m 时损失为零;否则继续惩罚间隔不足。这里的基本学习单位是样本对,而不是单独一个样本。对于检索和对比学习,正负样本的构造方式可能与损失公式本身同样重要。

这种情况提醒我们:损失函数首先要表达任务所关心的关系。一个模型即使对每个样本的数值预测误差很小,也未必在最终排序指标上最好。相反,为排序专门设计的代理损失可能牺牲某些数值精度,却改善检索结果。

9.3 损失中的不可微点是否意味着无法训练

并非如此。ReLU、绝对值损失、hinge 损失都可能包含不可微点。现代优化通常可以在可微区域使用普通梯度,在折点采用某个次梯度或约定导数。对于凸函数,次梯度有严格的数学定义:向量 g g g 是函数 f f f 在 x x x 处的次梯度,如果对所有 u u u 都有

f ( u ) ≥ f ( x ) + g ⊤ ( u − x ) . f(u)\geq f(x)+g^\top(u-x). f(u)≥f(x)+g⊤(u−x).

例如 f ( r ) = ∣ r ∣ f(r)=|r| f(r)=∣r∣ 在 r = 0 r=0 r=0 的次梯度集合为 − 1 , 1 -1,1 −1,1。使用 0 0 0 作为该点的一个次梯度是合法的,但它不是唯一选择。实际深度网络的整体目标通常非凸,因此不能仅凭局部使用了次梯度就得到全局收敛保证。

需要区分两件事:数学上存在可用的广义导数,不等于数值优化一定容易;一个函数处处光滑,也不意味着它的优化地形一定简单。梯度尺度、曲率、条件数、参数化方式与随机批量噪声,都可能影响训练。

9.4 损失值能否跨任务直接比较

一般不能。回归的 MSE 具有标签单位的平方量纲;MAE 与标签单位相同;交叉熵是无量纲的对数概率;某些对比损失还依赖温度系数、负样本数量和归约方式。即使两个模型都报告"验证损失为 0.3 0.3 0.3",如果损失定义不同,这个数值并没有直接的优劣含义。

即使损失函数相同,也要核对样本分布、标签编码、权重、归约维度以及数据预处理。例如一个任务使用归一化后的标签,另一个使用原始单位,二者 MSE 数值可能相差多个数量级,却不代表前者预测能力更强。比较模型应尽量在同一数据集、同一目标定义和同一评价协议下进行。

十、常见概念误区与实际检查方法

学习损失函数时,容易把"优化器能够降低某个标量"误解为"模型正在学习正确的任务目标"。为了避免这种混淆,可以沿着统计目标、数值实现与评价协议三个层面检查。

首先要问,模型输出究竟是什么。若输出是未经归一化的 logits,就不能把它们直接当概率;若输出是已经经过 softmax 的概率,就不应再交给一个期望 logits 的交叉熵接口。若回归目标具有强烈偏态,MSE 和 MAE 所估计的统计量不同,不能只因为其中一个训练损失更低就宣称其更符合业务需求。

其次要问,损失中的每一项是否有清楚的单位和尺度。将多个任务损失相加时,权重决定了它们的相对影响;将样本损失从求和改为平均时,梯度尺度也随之改变。若使用类别权重,概率输出可能不再直接对应原始条件概率。若使用标签平滑,训练目标本身已经发生变化。这些都是数学定义的改变,不只是程序参数的调整。

再次要问,图表和实验究竟支持什么结论。绘制损失曲线可以说明函数的局部形状;在合成数据上观察异常值影响,可以展示一个受控例子;数值差分可以检查某个实现的局部梯度。它们都不能单独证明一个损失在所有真实数据集上更好。要评价实际模型,还需要独立测试集、明确的任务指标、重复实验以及必要的不确定性分析。

最后,选择损失时应保留任务本身的可解释性。对于概率预测,可以优先从负对数似然或适当评分规则出发;对于连续值预测,可以先确定需要条件均值、分位数还是稳健中心;对于不对称决策,可以显式写出代价矩阵并推导决策阈值。把目标写清楚以后,损失函数往往不再是随意挑选的"训练技巧",而是由预测问题自然导出的数学工具。

十一、进一步理解:曲率、噪声与缺失标签如何影响损失设计

前面已经建立了损失函数与统计目标之间的联系,但在实际神经网络训练中,还有三个问题值得进一步讨论:损失的曲率如何影响更新,标签本身不可靠时应该如何理解经验风险,以及并非所有样本都拥有完整标签时如何定义平均损失。这些问题并不要求引入新的网络结构,却能显著影响实验结果的解释。

11.1 同样的最优点,优化过程为什么可能不同

考虑两个只相差正常数倍的损失 L 2 ( θ ) = c L 1 ( θ ) L_2(\theta)=cL_1(\theta) L2(θ)=cL1(θ),其中 c > 0 c>0 c>0。它们具有相同的最小点集合,但梯度满足 ∇ L 2 = c ∇ L 1 \nabla L_2=c\nabla L_1 ∇L2=c∇L1,Hessian 也满足 ∇ 2 L 2 = c ∇ 2 L 1 \nabla^2L_2=c\nabla^2L_1 ∇2L2=c∇2L1。因此,使用固定学习率的梯度下降时,参数更新并不相同。若没有相应调整学习率,一个损失的下降速度更快,并不能单凭这一现象说明它的统计定义更合理。

对单个残差 r r r,半平方损失的二阶导数恒为 1 1 1;Huber 损失在 ∣ r ∣ < δ |r|<\delta ∣r∣<δ 的区域二阶导数为 1 1 1,在 ∣ r ∣ > δ |r|>\delta ∣r∣>δ 的区域二阶导数为 0 0 0。这意味着二者在大残差区域具有不同的局部曲率。绝对值损失在非零残差处为线性函数,二阶导数为零,在零点则不可二阶微分。损失的局部曲率会影响基于二阶信息的方法,也会影响梯度下降在不同区域的行为。

不过,不能把输出层损失关于残差的曲率直接等同于整个神经网络目标关于参数的曲率。若残差 r = r ( θ ) r=r(\theta) r=r(θ),复合函数的 Hessian 还包含模型输出的一阶、二阶导数。即使半平方损失关于残差是凸的,经过非线性神经网络参数化后,整体目标通常仍是非凸的。所谓"平方损失是凸函数"必须说明自变量是什么;在线性回归参数上它是凸的,在一般深度网络参数上则不具备同样保证。

11.2 标签噪声不只是输入噪声的另一种叫法

在回归实验中,我们通过向观测值添加随机扰动构造了噪声。对于分类任务,标签噪声可能表现为真实类别被错误标注。假设二分类真实标签为 Y Y Y,观测标签为 Y ~ \widetilde Y Y ,并且正负类标签分别以概率 η 1 \eta_1 η1、 η 0 \eta_0 η0 被翻转,其中 η 1 = P ( Y ~ = 0 ∣ Y = 1 ) \eta_1=P(\widetilde Y=0\mid Y=1) η1=P(Y =0∣Y=1), η 0 = P ( Y ~ = 1 ∣ Y = 0 ) \eta_0=P(\widetilde Y=1\mid Y=0) η0=P(Y =1∣Y=0)。若翻转机制在给定真实类别后与输入无关,那么

P ( Y ~ = 1 ∣ X = x ) = ( 1 − η 1 ) q ( x ) + η 0 1 − q ( x ) , P(\widetilde Y=1\mid X=x) =(1-\eta_1)q(x)+\eta_01-q(x), P(Y =1∣X=x)=(1−η1)q(x)+η01−q(x),

其中 q ( x ) = P ( Y = 1 ∣ X = x ) q(x)=P(Y=1\mid X=x) q(x)=P(Y=1∣X=x)。整理可得

q ~ ( x ) = η 0 + ( 1 − η 0 − η 1 ) q ( x ) . \widetilde q(x)=\eta_0+(1-\eta_0-\eta_1)q(x). q (x)=η0+(1−η0−η1)q(x).

如果直接用观测标签 Y ~ \widetilde Y Y 训练普通交叉熵,理想情况下模型学习的是 q ~ ( x ) \widetilde q(x) q (x),而不一定是真实标签的条件概率 q ( x ) q(x) q(x)。这不是交叉熵"失去正确性",而是训练目标的随机变量已经发生变化。只有在标签噪声机制已知并满足可识别条件时,才可能进一步从观测概率推回真实概率;在真实应用中,噪声机制往往需要额外建模或审查。

当 η 0 = η 1 = η < 1 / 2 \eta_0=\eta_1=\eta<1/2 η0=η1=η<1/2 时, q ~ ( x ) = η + ( 1 − 2 η ) q ( x ) \widetilde q(x)=\eta+(1-2\eta)q(x) q (x)=η+(1−2η)q(x)。这种对称翻转会把概率向 0.5 0.5 0.5 拉近,但不改变 q ( x ) q(x) q(x) 与 0.5 0.5 0.5 的大小关系,因此在理想总体风险下,以 0.5 0.5 0.5 为阈值的 Bayes 分类边界保持不变。若翻转率不对称,边界可能改变。这个例子说明,概率估计与最终类别决策对标签噪声的敏感性可以不同,讨论"鲁棒性"时应明确具体评价对象。

11.3 有缺失标签时,平均损失的分母应该是什么

考虑一个批次包含 B B B 个样本,每个样本可能有 T T T 个时间步,但部分时间步没有有效标签。令 m i t ∈ { 0 , 1 } m_{it}\in\{0,1\} mit∈{0,1} 表示第 i i i 个样本第 t t t 个位置是否有效。若希望每个有效位置贡献相同权重,可以定义掩码平均损失

L v a l i d = ∑ i = 1 B ∑ t = 1 T m i t ℓ i t ∑ i = 1 B ∑ t = 1 T m i t , L_{\mathrm{valid}}= \frac{\sum_{i=1}^{B}\sum_{t=1}^{T}m_{it}\ell_{it}} {\sum_{i=1}^{B}\sum_{t=1}^{T}m_{it}}, Lvalid=∑i=1B∑t=1Tmit∑i=1B∑t=1Tmitℓit,

其中要求分母大于零。若简单地除以 B T BT BT,那么随着无效位置增多,损失及其梯度会被人为缩小;如果某些批次包含更多 padding,训练更新的尺度就可能受到序列长度分布影响。这是归约定义的问题,不是模型预测能力发生了变化。

另一种合理定义是先对每个样本的有效位置求平均,再对拥有有效标签的样本求平均。设 n i = ∑ t m i t > 0 n_i=\sum_t m_{it}>0 ni=∑tmit>0,则

L s a m p l e = 1 B ∑ i = 1 B ∑ t m i t ℓ i t n i . L_{\mathrm{sample}}= \frac1B\sum_{i=1}^{B}\frac{\sum_t m_{it}\ell_{it}}{n_i}. Lsample=B1i=1∑Bni∑tmitℓit.

这两种定义并不等价。前者对每个有效位置赋予相同权重,因此长序列通常贡献更多;后者对每个样本赋予相同权重,因此长短序列在整体目标中的权重相同。究竟使用哪一种,取决于学习任务将"一个样本"定义为一条序列还是一个时间位置。对于具有不同长度文本的语言模型,token 级归约通常有明确意义;对于按受试者评估的医学时间序列,样本级归约可能更符合研究目标。

如果所有位置都被掩码排除,分母为零,不能把该批次的平均损失当作正常数值继续使用。实现时应明确跳过无有效标签的批次,或者设计其他有定义的处理规则。类似的边界情况还包括类别权重为零、概率被裁剪以及缺失标签与数据本身存在系统关系。对这些细节的检查,往往比反复更换损失函数名称更能提高实验可靠性。

11.4 损失函数能否同时保证公平性、校准性与业务收益

一个常见误解是,只要找到"最先进"的损失函数,就能同时得到较高准确率、良好概率校准、少数群体上的均衡表现以及较低业务代价。事实上,这些目标可能互相制约。交叉熵在总体风险层面鼓励报告真实条件概率,但它本身没有规定业务决策阈值,也没有强制不同群体具有相同错误率。加权损失可能改善某个群体或类别的召回率,却同时改变输出概率的含义;强调极端困难样本的损失可能改善部分错误类型,却放大错误标签的影响。

因此,损失设计应该从可验证的任务目标开始。先写清楚预测对象、数据采样机制和最终决策规则,再确定训练代理目标;随后使用与任务一致的验证指标检查效果。如果需要多个目标,就应明确它们之间的权衡,而不是把所有要求隐藏在一个没有解释的加权和中。对于科研实验,报告损失函数的完整数学定义、归约方式和权重来源,是保证结果可复现的必要部分。

十二、结语

损失函数连接了三个层面:我们希望模型完成什么统计或决策任务,如何把有限样本转化为优化目标,以及梯度如何把这种目标传递给参数。平方损失与条件均值相联系,绝对值损失与条件中位数相联系,交叉熵在总体风险层面对应条件概率的学习;它们各有适用条件,也各有对噪声、异常值和数值实现的要求。

理解这些联系以后,训练曲线就不再只是一个不断下降的数字。我们可以进一步判断下降的是哪一种风险,模型实际上被要求估计什么,哪些误差受到更大惩罚,以及最终评价指标是否与训练目标一致。下一期将转向计算图与自动微分,讨论这些标量目标如何沿网络运算路径被系统地求导。

参考文献

  1. Bishop, C. M. Pattern Recognition and Machine Learning. Springer, 2006. https://link.springer.com/book/9780387310732
  2. Murphy, K. P. Probabilistic Machine Learning: An Introduction. MIT Press, 2022. https://probml.github.io/pml-book/book1.html
  3. Goodfellow, I., Bengio, Y., and Courville, A. Deep Learning. MIT Press, 2016. https://www.deeplearningbook.org/
  4. Huber, P. J. "Robust Estimation of a Location Parameter." The Annals of Mathematical Statistics, 35(1), 1964, pp. 73--101. https://doi.org/10.1214/aoms/1177703732
  5. Gneiting, T., and Raftery, A. E. "Strictly Proper Scoring Rules, Prediction, and Estimation." Journal of the American Statistical Association, 102(477), 2007, pp. 359--378. https://doi.org/10.1198/016214506000001437
  6. Lin, T.-Y., et al. "Focal Loss for Dense Object Detection." IEEE International Conference on Computer Vision, 2017. https://arxiv.org/abs/1708.02002
  7. PyTorch Documentation. CrossEntropyLoss. https://docs.pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html
  8. NumPy Documentation. numpy.logaddexp. https://numpy.org/doc/stable/reference/generated/numpy.logaddexp.html
相关推荐
无责任此方_修行中17 分钟前
「不止技术」AIE 2026 会后感悟
人工智能·后端·ai编程
BYSJMG32 分钟前
计算机毕业设计选题推荐:【基于深度学习的车辆损坏严重程度评估方法研究】ResNet50 图像分类
人工智能·深度学习·目标检测·机器学习·计算机视觉·分类·课程设计
在所不辞兄1 小时前
为什么在电池供电场景下,不能采用固定电压频率策略,而需要动态调整以最大化 Race-to-Sleep 收益?
人工智能·深度学习·神经网络·机器学习
jianqiang.xue1 小时前
3倍向量算力:Arm给最小MCU装上本地AI
arm开发·人工智能·单片机
北京迅为1 小时前
案例分享 | RK182X算力卡:多路视频VLM监控,四路画面AI同时看懂,一句人话说清现场
linux·人工智能·嵌入式·rk3588·算力卡·rk182x
墨林陌2 小时前
AI 热点日报(2026-11-13):黄仁勋辞任英伟达CEO,百度发智能组织,SpaceX斥740亿建算力
人工智能
喵了几个咪2 小时前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
开发语言·人工智能·后端·golang
aneasystone本尊2 小时前
学习大模型训练的 DPO 与 GRPO:偏好对齐的简化与进化
人工智能