跳到主要内容

损失函数

问题

深度学习中常用的损失函数有哪些?各自适用什么场景?交叉熵损失的数学原理是什么?

答案

损失函数衡量模型预测与真实标签之间的差距,是训练的"指南针"——梯度下降的方向由损失函数决定。

一、损失函数全景

二、分类损失

交叉熵损失(Cross-Entropy Loss)

最常用的分类损失。对于 CC 类分类:

L=i=1Cyilog(y^i)\mathcal{L} = -\sum_{i=1}^{C} y_i \log(\hat{y}_i)

其中 yy 是 one-hot 标签,y^\hat{y} 是 Softmax 输出的概率。实际计算中只有正确类别的项非零:

L=log(y^correct)\mathcal{L} = -\log(\hat{y}_{\text{correct}})
直觉理解

交叉熵的作用:正确类的概率越高,损失越低。如果模型给正确类 0.9 的概率,log(0.9)=0.105-\log(0.9) = 0.105;如果只有 0.1,log(0.1)=2.302-\log(0.1) = 2.302

二元交叉熵(Binary Cross-Entropy)

用于二分类或多标签分类(每个标签独立预测概率):

L=[ylog(y^)+(1y)log(1y^)]\mathcal{L} = -[y \log(\hat{y}) + (1-y) \log(1-\hat{y})]

Focal Loss

严重类别不平衡设计(如目标检测中前景/背景比例 1:1000):

LFL=αt(1y^t)γlog(y^t)\mathcal{L}_{FL} = -\alpha_t (1-\hat{y}_t)^{\gamma} \log(\hat{y}_t)
  • (1y^t)γ(1-\hat{y}_t)^{\gamma}:当模型预测很有信心(y^\hat{y} 接近 1)时,权重趋近 0——自动降低简单样本的权重
  • γ=2\gamma = 2 是常用值

Label Smoothing

将硬标签 [0, 0, 1, 0] 替换为软标签 [0.033, 0.033, 0.9, 0.033](假设 ϵ=0.1\epsilon = 0.1):

ysmooth=(1ϵ)yhard+ϵCy_{\text{smooth}} = (1 - \epsilon) \cdot y_{\text{hard}} + \frac{\epsilon}{C}

好处:防止模型过度自信,提升泛化能力。

三、回归损失

损失函数公式对异常值敏感度可导性
MSE1n(yy^)2\frac{1}{n}\sum(y - \hat{y})^2高(平方放大误差)处处可导
MAE1nyy^\frac{1}{n}\sum\lvert y - \hat{y}\rvert低(线性)在 0 点不可导
Huber小误差用 MSE,大误差用 MAE中等处处可导
Huber Loss
Lδ(y,y^)={12(yy^)2if yy^δδyy^12δ2otherwise\mathcal{L}_{\delta}(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & \text{if } |y - \hat{y}| \leq \delta \\ \delta|y - \hat{y}| - \frac{1}{2}\delta^2 & \text{otherwise} \end{cases}

兼顾 MSE 在小误差时的梯度平滑性和 MAE 对异常值的鲁棒性。

四、对比学习损失

InfoNCE / NT-Xent

对比学习的核心损失——拉近正样本对,推开负样本对:

L=logexp(sim(zi,zj+)/τ)k=12Nexp(sim(zi,zk)/τ)\mathcal{L} = -\log \frac{\exp(\text{sim}(z_i, z_j^+) / \tau)}{\sum_{k=1}^{2N} \exp(\text{sim}(z_i, z_k) / \tau)}
  • zi,zj+z_i, z_j^+:正样本对(同一数据的两种增强)
  • τ\tau:温度参数(越小越尖锐)
  • 应用:SimCLR、CLIP、Embedding 模型训练

三元组损失(Triplet Loss)

L=max(0,d(a,p)d(a,n)+margin)\mathcal{L} = \max(0, d(a, p) - d(a, n) + \text{margin})
  • aa:锚点样本,pp:正样本(同类),nn:负样本(不同类)
  • 要求:锚-正距离 < 锚-负距离,有一定 margin

五、LLM 相关损失

负对数似然(NLL / Language Modeling Loss)

LLM 预训练的标准损失——预测下一个 Token 的交叉熵

L=1Tt=1TlogP(xtx<t)\mathcal{L} = -\frac{1}{T}\sum_{t=1}^{T}\log P(x_t | x_{<t})

这就是困惑度(Perplexity)的对数形式:PPL=eL\text{PPL} = e^{\mathcal{L}}

KL 散度

衡量两个概率分布的差异,用于知识蒸馏:

DKL(PQ)=iP(i)logP(i)Q(i)D_{KL}(P \| Q) = \sum_i P(i) \log \frac{P(i)}{Q(i)}
  • PP:教师模型的输出分布
  • QQ:学生模型的输出分布

RLHF 中的 PPO 目标

LPPO=E[min(r(θ)A^,clip(r(θ),1ϵ,1+ϵ)A^)]βDKL(πθπref)\mathcal{L}_{PPO} = \mathbb{E}\left[\min\left(r(\theta)\hat{A}, \text{clip}(r(\theta), 1-\epsilon, 1+\epsilon)\hat{A}\right)\right] - \beta \cdot D_{KL}(\pi_\theta \| \pi_{\text{ref}})

第一项最大化奖励,第二项约束策略不偏离参考模型太远。


常见面试问题

Q1: 为什么分类用交叉熵而不用 MSE?

答案: 两个原因:

  1. 梯度更好:MSE 对 Softmax 的梯度包含 y^(1y^)\hat{y}(1-\hat{y}) 项,当预测值接近 0 或 1 时梯度趋零(学得慢)。交叉熵对 Softmax 的梯度就是 y^y\hat{y} - y,简单且不饱和。
  2. 概率匹配:交叉熵源于最大似然估计,是概率模型中理论上最优的损失函数。

Q2: Focal Loss 解决了什么问题?

答案: 解决类别极度不平衡的问题。在目标检测中,绝大多数是"背景"(负样本),如果用标准交叉熵,模型倾向于都预测成背景也能获得很低的损失。Focal Loss 通过 (1y^)γ(1-\hat{y})^\gamma 自动给简单样本低权重、难样本高权重,让模型聚焦于难分类的样本。

Q3: 温度参数 τ\tau 在对比学习中起什么作用?

答案

  • τ\tau(如 0.05):Softmax 更尖锐,模型更关注难负样本,学习更精细的区分
  • τ\tau(如 1.0):Softmax 更平滑,负样本权重更均匀,训练更稳定但区分度低
  • 实践中 τ=0.07\tau = 0.07 是 CLIP 的默认值,通常需要搜索最优值

Q4: 知识蒸馏中为什么用 KL 散度而不是交叉熵?

答案: 实际上蒸馏中两者效果非常接近。交叉熵 H(P,Q)=H(P)+DKL(PQ)H(P, Q) = H(P) + D_{KL}(P \| Q),当教师分布 PP 固定时,优化 H(P,Q)H(P, Q) 和优化 DKL(PQ)D_{KL}(P \| Q) 等价。蒸馏中还会引入温度 TT——用高温 Softmax 使教师输出更平滑,传递更多"暗知识"(dark knowledge)。


相关链接