损失函数的定义通常与概率假设或预测目标有关。本文讨论常见定义的来源,以及损失产生的梯度如何用于更新模型参数。
一、损失函数与训练目标
给定输入 x、真实标签 y 和模型参数 θ,模型产生预测:
y^=fθ(x)
单个样本的损失记为 ℓ(y^,y),训练集共有 N 个样本时,平均经验损失为:
L(θ)=N1i=1∑Nℓ(fθ(xi),yi)
训练希望找到使损失较小的参数:
θ∗=argθminL(θ)
讨论平方误差、交叉熵和成对排序损失时,可以关注三个问题:损失值如何反映预测质量,定义依据什么假设,以及梯度如何影响参数。
损失函数决定训练目标。梯度告诉模型如何更新参数。验证集指标负责评价模型在未见数据上的表现。即使训练损失下降,模型的实际业务指标也仍需独立检查。
二、回归损失:怎样预测连续数值
2.1 MSE:正态误差与条件均值
均方误差(Mean Squared Error,MSE)定义为:
LMSE=N1i=1∑N(y^i−yi)2
例如,真实值为 10,20,30,预测值为 12,19,25,则平方误差分别为 4,1,25,平均损失为 10。平方惩罚使较大的预测误差获得更大的损失。
概率来源。 假设误差独立且服从相同方差的正态分布:
yi=fθ(xi)+ϵi,ϵi∼N(0,σ2)
于是单个样本的条件密度为:
p(yi∣xi,θ)=2πσ21exp[−2σ2(yi−fθ(xi))2]
对所有样本的联合似然取负对数,得到:
−logp(y∣X,θ)=2Nlog(2πσ2)+2σ21i∑(yi−y^i)2
当 σ2 固定时,最小化负对数似然等价于最小化平方误差。这就是 MSE 的统计来源。
为什么预测均值? 如果只能预测一个常数 a,考虑总体风险:
R(a)=E[(Y−a)2∣X=x]
求导:
R′(a)=2(a−E[Y∣X=x])
所以最优预测为:
a∗=E[Y∣X=x]
如何优化? 对单个样本 ℓ=(y^−y)2/2 有:
∂y^∂ℓ=y^−y
若 y^=wx+b,根据链式法则:
∂w∂ℓ=(y^−y)x,∂b∂ℓ=y^−y
梯度下降据此修改 w 和 b,使预测结果朝真实值移动。
2.2 MAE:拉普拉斯误差与条件中位数
平均绝对误差(Mean Absolute Error,MAE)定义为:
LMAE=N1i∑∣y^i−yi∣
如果误差服从位置参数为预测值、尺度参数为 b 的拉普拉斯分布:
p(y∣μ,b)=2b1exp(−b∣y−μ∣)
其负对数似然包含:
−logp(y∣X,θ)=Nlog(2b)+b1i∑∣yi−y^i∣
固定 b 后,最大似然估计对应 MAE。
对于连续分布,最小化 E∣Y−a∣ 的条件满足:
dadE∣Y−a∣=2FY(a)−1=0
所以最优值为条件中位数。对数据 10,12,13,15,100,最优平方误差常数预测是 30,最优绝对误差常数预测是 13。
MAE 在非零误差处的导数为 sign(y^−y)。误差恰好为零时使用次梯度,因此可以应用次梯度法和其他相应的优化方法。
2.3 Huber:小误差与大误差的处理
令 e=y^−y,Huber 损失为:
ℓδ(e)={21e2,δ(∣e∣−21δ),∣e∣≤δ∣e∣>δ
它在较小误差处采用平方惩罚,在较大误差处采用线性惩罚。梯度为:
ℓδ′(e)={e,δsign(e),∣e∣≤δ∣e∣>δ
参数 δ 控制分界位置。对于异常观测较多的回归问题,Huber 可以限制单个大误差产生的梯度。
2.4 Quantile Loss:把预测目标设置为分位数
令 u=y−y^,第 τ 分位数的损失为:
ρτ(u)={τu,(τ−1)u,u≥0u<0,0<τ<1
当 τ=0.9 时,低估真实值的单位损失是高估的 9 倍。对于预测常数 a:
dadE[ρτ(Y−a)]=FY(a)−τ
因此最优解满足 FY(a)=τ,对应条件分位数。此方法常用于销量区间、风险程度和高分位需求预测。
2.5 Poisson 与 Gaussian NLL
如果目标是单位时间的事件次数,可以假设 Y∣x∼Poisson(λ):
p(y∣λ)=y!λye−λ
令模型输出 z,设 λ=ez,则负对数似然为:
ℓ=ez−yz+log(y!),∂z∂ℓ=ez−y
如果希望同时预测连续变量的均值和观测方差,可以采用 Gaussian NLL:
ℓ=2σθ2(x)(y−μθ(x))2+21logσθ2(x)+21log(2π)
方差项控制每个样本的误差权重,对数方差项使模型为给定的不确定性承担相应代价。
2.6 交互实验:回归损失的曲线与梯度
在下面的实验中选择 MSE、MAE、Huber 和 Quantile Loss,拖动预测误差。观察同一个误差对应的损失值、梯度和更新方向。
三、分类损失:从概率分布推导交叉熵
3.1 BCE:伯努利分布的负对数似然
二分类标签 y∈{0,1},模型预测正类概率 p。伯努利分布的概率质量函数为:
P(Y=y∣p)=py(1−p)1−y
取负对数便得到二元交叉熵(Binary Cross-Entropy,BCE):
ℓBCE=−ylogp−(1−y)log(1−p)
真实标签为 1 时,损失为 −logp。预测概率从 0.9 降至 0.1,损失从约 0.105 增加到约 2.303。高置信度的错误预测会受到明显惩罚。
模型通常先输出 Logit z,再通过 Sigmoid 得到概率:
p=σ(z)=1+e−z1
利用链式法则:
∂p∂ℓ=p(1−p)p−y,∂z∂p=p(1−p)
两项相乘:
∂z∂ℓ=p−y
因此,当真实标签为 1、预测概率为 0.2 时,梯度为 -0.8。梯度下降会提高 Logit,从而提高正类概率。
数值计算时采用 Logit 的稳定形式:
ℓ(z,y)=max(z,0)−yz+log(1+e−∣z∣)
PyTorch 的 BCEWithLogitsLoss 接收原始 Logit,适合常见的二分类训练。
3.2 多分类 Cross-Entropy:分类分布与 Softmax
对 K 个互斥类别,网络输出 z1,…,zK,Softmax 定义为:
pk=∑j=1Kezjezk
使用独热编码 yk,分类分布的似然为 ∏kpkyk。因此负对数似然为:
ℓCE=−k=1∑Kyklogpk
Softmax 的雅可比矩阵元素满足:
∂zj∂pk=pk(1k=j−pj)
代入交叉熵并整理,可得:
∂zk∂ℓ=pk−yk
例如真实标签为 (0,1,0)、预测概率为 (0.2,0.7,0.1),则 Logit 梯度为 (0.2,−0.3,0.1)。这组梯度会推动第二类的分数提高,其他类别的分数降低。
3.3 Cross-Entropy 和 KL 散度的关系
给定目标概率分布 q 和模型预测分布 p:
H(q,p)=−k∑qklogpk
DKL(q∥p)=k∑qklogpkqk
有:
H(q,p)=H(q)+DKL(q∥p)
对于固定目标分布,H(q) 为常数,因此最小化交叉熵等价于最小化对应方向的 KL 散度。KL 散度具有方向性,在知识蒸馏和变分推断中需要明确使用哪一种方向。
3.4 Hinge Loss 与 Focal Loss
支持向量机常使用 Hinge Loss。设 y∈{−1,+1},模型分数为 s:
ℓhinge=max(0,1−ys)
当正确类别的间隔 ys 达到 1 时,该样本损失为零。在间隔较小时,损失继续推动分类分数增加。
Focal Loss 通常写为:
ℓfocal=−αt(1−pt)γlogpt
其中 pt 是真实类别对应的预测概率,αt 调整类别权重,γ≥0 控制容易分类样本的相对权重。取 γ=2 时,pt=0.9 的调节系数为 0.01,pt=0.2 的调节系数为 0.64。
3.5 交互实验:Sigmoid、Softmax 和梯度
拖动 Logit,切换二分类与三分类,观察概率分布、交叉熵和 p−y 梯度。通过真实类别切换可以观察梯度方向。
四、推荐系统中的排序损失
4.1 Pointwise:预测单个候选的概率
点击率预测通常把每个用户与物品的曝光记录看作一个二分类样本:
pui=P(click=1∣u,i,x)
使用 BCE 衡量预测点击概率与点击标签的差异。对于同时预测多个相互独立的二元目标,可以分别计算 BCE,并按任务权重组合。
4.2 Pairwise:BPR 直接约束相对顺序
对用户 u,设正样本物品 i 的分数为 sui,负样本物品 j 的分数为 suj。定义:
Δ=sui−suj,P(i≻uj)=σ(Δ)
对成对偏好事件取负对数似然:
ℓBPR=−logσ(Δ)=log(1+e−Δ)
其梯度为:
∂sui∂ℓ=σ(Δ)−1,∂suj∂ℓ=1−σ(Δ)
当正样本分数为 1、负样本分数为 2 时,损失约为 1.313;若变为 3 和 1,损失约为 0.127。训练逐渐提高正样本相对于负样本的分数。
4.3 Listwise:对候选列表计算损失
对于一个含 K 个候选物品的列表,设正样本的编号为 i+:
Llist=−log∑j=1Kexp(sj)exp(si+)
分母包含整组候选分数,因此列表内的物品相互影响。多个相关物品和分级相关性标签可以使用更完整的列表排序方法。
4.4 InfoNCE:温度控制下的对比学习
设查询向量为 q,候选表示为 k1,…,kK,正样本表示为 k+:
LInfoNCE=−log∑j=1Kexp(sim(q,kj)/τ)exp(sim(q,k+)/τ)
温度 τ>0 控制 Softmax 对相似度差异的敏感程度。较小的温度通常会加强分数差异带来的概率变化。它常用于双塔召回、表示学习与自监督训练。
负样本选择会影响排序目标。未点击可能来自用户尚未看到物品,曝光记录和采样方案会影响损失的含义。
4.5 交互实验:BPR、Listwise 与 InfoNCE
固定 A 为正样本、B 和 C 为负样本。切换训练目标,改变分数与温度,观察同一组候选在不同损失下的学习信号。
五、损失函数的定义依据
5.1 根据概率分布建立负对数似然
给定条件概率模型,最大似然估计可写为:
θ^=argθmaxi∏pθ(yi∣xi)=argθmin[−i∑logpθ(yi∣xi)]
不同概率分布对应不同损失:正态分布对应固定方差下的 MSE,拉普拉斯分布对应 MAE,伯努利分布对应 BCE,分类分布对应多分类交叉熵,泊松分布对应计数损失。这一推导能够帮助判断损失函数是否符合数据的概率特点。
5.2 根据决策要求设置误差成本
MSE、MAE 和 Quantile Loss 分别对应条件均值、条件中位数和条件分位数。Hinge Loss 用分类间隔表达决策要求。BPR 使用正负物品之间的分数差。选择损失函数时,需要明确模型最终应当学习哪一种预测结果。
5.3 用可求导目标帮助训练
准确率是离散指标:
Accuracy=N1i∑1(y^i=yi)
当参数变化却没有改变类别时,准确率通常保持不变,因此难以向梯度优化提供足够有用的信息。交叉熵提供了连续、可求导的分类训练目标。
NDCG 涉及离散排序,通常采用 Pairwise、Listwise 或其他可求导方法作为训练目标。最后仍需使用验证集评价真实任务指标。
六、反向传播与优化算法
6.1 损失如何传递给模型参数
考虑三层神经网络:
h1=ϕ(W1x+b1),h2=ϕ(W2h1+b2),z=W3h2+b3
损失为 L=ℓ(z,y)。链式法则给出:
∂W3∂L=∂z∂L∂W3∂z
以及:
∂W2∂L=∂z∂L∂h2∂z∂W2∂h2
反向传播以损失函数的输出梯度为起点,逐层计算权重和偏置的梯度。优化器使用这些梯度更新参数。
6.2 手算一次 BCE 梯度下降
考虑二分类模型:
z=wx+b,p=σ(z)
给定单个样本 x=2,y=1。设初始参数 w=0,b=0,学习率为 0.1。开始时 z=0,p=0.5:
L=−log(0.5)≈0.6931
BCE 与 Sigmoid 的组合满足:
∂z∂L=p−y=−0.5
继续求参数梯度:
∂w∂L=(p−y)x=−1,∂b∂L=p−y=−0.5
更新后得到:
wnew=0−0.1(−1)=0.1,bnew=0−0.1(−0.5)=0.05
新的 Logit 是 0.25,预测概率约为 0.5622,损失约为 0.5759。模型通过梯度逐步提高真实类别的预测概率。
6.3 随机梯度下降 SGD
对当前训练批次计算:
gt=∇θLBt(θt)
最基本的随机梯度下降更新为:
θt+1=θt−ηgt
其中学习率控制参数更新幅度。较大的学习率可能造成训练波动,较小的学习率可能使收敛过程较慢。
6.4 Momentum 动量法
Momentum 将当前梯度与历史梯度进行加权组合:
mt=βmt−1+(1−β)gt
θt+1=θt−ηmt
其中的参数 β 控制历史梯度的影响程度。历史信息有助于平滑相邻批次的更新方向。
6.5 Adam 和 AdamW
Adam 同时维护梯度的一阶矩估计与二阶矩估计:
mt=β1mt−1+(1−β1)gt
vt=β2vt−1+(1−β2)gt2
进行初始误差修正:
m^t=1−β1tmt,v^t=1−β2tvt
最终更新:
θt+1=θt−ηv^t+ϵm^t
平方、开方和除法都对向量各个元素分别计算。Adam 使用历史梯度调整各参数的更新幅度。AdamW 将权重衰减独立处理,是常见的深度学习优化方法。
6.6 交互实验:观察等高线上的梯度下降路径
考虑二维目标函数:
L(w,b)=21(w2+8b2)
因为两个参数方向上的损失变化速度不同,等高线呈椭圆形。切换 SGD、Momentum、Adam,修改学习率与更新次数,观察实际路径。
6.7 数学性质为什么影响训练过程
MSE 的梯度与误差成正比,大误差会产生较大的梯度。MAE 在非零误差处的梯度绝对值为 1。Huber 在大误差区域限制梯度大小,适合关注异常观测的场景。
凸函数的局部最小值也是全局最小值。线性模型配合常见凸损失通常具有较好的优化性质。深度神经网络涉及复杂的非线性变换,其整体训练目标通常属于非凸优化。
对于二分类和多分类,直接使用接收 Logit 的损失实现可以提高数值稳定性,减少极端概率导致的浮点计算问题。
七、正则化与多任务损失
7.1 L1 与 L2 参数约束
训练时经常组合数据损失与正则化项:
J(θ)=Ldata(θ)+λΩ(θ)
L2 约束取 Ω(θ)=∥θ∥22,其梯度会增加 2λθ。这一形式与正态参数先验的最大后验估计具有联系。
L1 约束取 Ω(θ)=∥θ∥1,能够促使部分参数取零。它与拉普拉斯参数先验有关,可以使用次梯度或近端梯度方法优化。
7.2 点击率与转化率的多任务训练
如果模型同时预测点击率和转化率,可以定义:
Ltotal=λ1LCTR+λ2LCVR
总梯度为:
∇Ltotal=λ1∇LCTR+λ2∇LCVR
权重影响不同任务对共享参数的作用。训练时还需要独立检查各任务的验证损失和评价指标。
八、PyTorch 实现与实验检查
8.1 常用损失函数接口
| 目标 |
损失函数 |
PyTorch 接口 |
| 连续回归 |
MSE |
nn.MSELoss |
| 稳健回归 |
MAE / Huber |
nn.L1Loss / nn.HuberLoss |
| 二分类 |
BCE |
nn.BCEWithLogitsLoss |
| 互斥多分类 |
Cross-Entropy |
nn.CrossEntropyLoss |
| 概率分布 |
KL 散度 |
nn.KLDivLoss |
| 计数预测 |
Poisson NLL |
nn.PoissonNLLLoss |
| 均值与方差 |
Gaussian NLL |
nn.GaussianNLLLoss |
二分类中的 nn.BCEWithLogitsLoss 直接接收 Logit。多分类中的 nn.CrossEntropyLoss 也直接接收各类别的 Logit。展示预测概率时,可以再使用 Sigmoid 或 Softmax。
下面的程序复现前文的单样本 BCE 更新:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import torch from torch import nn
feature = torch.tensor([[2.0]]) target = torch.tensor([[1.0]]) model = nn.Linear(1, 1)
with torch.no_grad(): model.weight.fill_(0.0) model.bias.fill_(0.0)
criterion = nn.BCEWithLogitsLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
initial_logit = model(feature) initial_loss = criterion(initial_logit, target) print("before:", initial_loss.item())
optimizer.zero_grad() initial_loss.backward() print("weight gradient:", model.weight.grad.item()) print("bias gradient:", model.bias.grad.item()) optimizer.step()
updated_logit = model(feature) updated_loss = criterion(updated_logit, target) print("after:", updated_loss.item())
|
预期得到权重梯度 -1、偏置梯度 -0.5。一次更新后的损失约为 0.5759。
8.2 模型训练中应该监控什么
| 项目 |
作用 |
| 训练损失 |
观察当前训练目标的变化 |
| 验证损失 |
评价未见样本上的损失 |
| 准确率、AUC、NDCG |
评价具体任务的效果 |
| 梯度和学习率 |
理解每次参数更新的幅度 |
| 类别比例与负样本来源 |
判断分类与推荐排序样本的含义 |
| 多任务损失 |
检查不同目标的训练表现 |
8.3 极端观测对最优预测值的影响
假设有 100 个样本,其中 99 个真实值为 0,另外 1 个真实值为 1,000。模型只能输出常数 a。
对于 MSE,最优值是均值:
aMSE=10099×0+1000=10
对于 MAE,最优值是中位数:
aMAE=0
Huber 取 δ=1。在 0<a<1 时,其平均损失的一阶条件为:
99a−1=0
因此最优常数为:
aHuber=991≈0.0101
数据和模型结构相同,损失函数不同,最优预测值也会不同。选择训练目标时,需要考虑这种差异。
参考资料
评论由 GitHub Giscus 提供。若当前网络无法加载,可 前往 GitHub Discussions 查看或参与讨论。