损失函数(Loss Function)是机器学习模型训练的核心目标函数,它量化了模型预测值与真实值之间的差异。训练过程本质上就是寻找使损失函数最小化的模型参数。选择合适的损失函数直接影响模型的收敛速度、最终性能和泛化能力。
损失函数是一个映射 f:Y×Y→R≥0,将预测值 y^ 和真实值 y 映射为一个非负实数,数值越小表示预测越准确。给定训练数据集 D={(xi,yi)}i=1N,模型的经验风险定义为:
Remp(θ)=N1i=1∑NL(f(xi;θ),yi)
其中 θ 为模型参数,f(xi;θ) 为模型对样本 xi 的预测输出,L 为损失函数。训练目标为 minθRemp(θ)。
一个好的损失函数应具备以下性质:
| 性质 |
描述 |
重要性 |
| 凸性 |
函数在参数空间上是凸的(或至少是凸的近似) |
保证全局最优解存在 |
| 可微性 |
对模型参数可导(至少几乎处处可导) |
梯度下降需要梯度信息 |
| 一致性 |
在样本量趋近无穷时,经验风险最小化收敛到真实风险最小化 |
保证统计一致性 |
| 鲁棒性 |
对异常值不敏感,梯度不会无限增长 |
防止训练不稳定 |
回归任务的目标是预测连续值,常见的回归损失函数包括以下几种。
最常用的回归损失,计算预测值与真实值之差的平方:
LMSE(y,y^)=(y−y^)2
示例:假设真实房价为 100 万元,模型预测为 90 万元,则 MSE 损失为 (100−90)2=100。若预测为 120 万元,MSE 同样为 (100−120)2=400,对偏离更远的预测惩罚更大。
梯度:∂y^∂L=−2(y−y^),梯度与误差成正比。
优缺点:
- ✅ 可微、凸函数,优化稳定
- ✅ 对大误差给予平方级别惩罚,迫使模型关注大偏差样本
- ❌ 对异常值极其敏感(平方放大效应):一个离谱的异常值会主导整个损失
典型案例:在房价预测中,如果数据中有几栋价值 10 亿的豪宅而大多数房屋在 100 万左右,MSE 会让模型过度拟合这些豪宅而忽略普通房屋。
计算预测值与真实值之差的绝对值:
LMAE(y,y^)=∣y−y^∣
示例:同样的房价预测,预测 90 万时 MAE 为 ∣100−90∣=10,预测 120 万时 MAE 为 ∣100−120∣=20。
梯度:∂y^∂L={−11if y>y^if y<y^,梯度恒为 ±1。
对比:当误差为 100 时,MSE=10000 而 MAE=100;当误差为 1 时,MSE=1 而 MAE=1。MSE 对小误差和大误差的惩罚差异巨大。
结合 MSE 和 MAE 的优点,在误差较小时使用 MSE(平滑),误差较大时使用 MAE(鲁棒):
LHuber(y,y^)={21(y−y^)2δ∣y−y^∣−21δ2if ∣y−y^∣≤δif ∣y−y^∣>δ
其中 δ 是阈值参数(通常取 1.0 或中位数绝对偏差的倍数)。
示例:设定 δ=5,真实值 100,预测值 102(误差 2 < 5),使用 MSE 部分:21⋅22=2。若预测值为 120(误差 20 > 5),使用 MAE 部分:5⋅20−21⋅52=100−12.5=87.5。
| 损失函数 |
对异常值敏感度 |
平滑性 |
梯度行为 |
推荐场景 |
| MSE |
极高 |
处处平滑 |
梯度随误差线性增长 |
无异常值的正态分布数据 |
| MAE |
低 |
在0处不可导 |
梯度恒定±1 |
存在异常值的鲁棒估计 |
| Huber |
中等 |
处处平滑 |
梯度被δ限幅 |
综合场景(推荐默认) |
| Log-Cosh |
低 |
处处平滑(二阶可导) |
类似Huber但更平滑 |
需要二阶信息的场景 |
交叉熵是分类任务中最常用的损失函数,源自信息论。对于二分类问题:
LBCE(y,p^)=−[ylogp^+(1−y)log(1−p^)]
其中 y∈{0,1} 是真实标签,p^∈[0,1] 是模型预测为正类的概率。
示例:真实标签 y=1,模型预测正类概率 p^=0.9,则损失为 −log(0.9)≈0.105。若模型只预测 p^=0.1,则损失为 −log(0.1)≈2.302。
| 真实标签 |
预测概率 |
损失值 |
说明 |
| y=1 |
p^=0.99 |
0.01 |
高置信度正确 |
| y=1 |
p^=0.6 |
0.51 |
低置信度正确 |
| y=1 |
p^=0.4 |
0.92 |
错误! |
| y=1 |
p^=0.01 |
4.61 |
高置信度错误(巨大惩罚) |
对于多分类问题(K 个类别),使用 Categorical Cross-Entropy:
LCE(y,p^)=−k=1∑Kyklogp^k
其中 yk 是 one-hot 编码的第 k 个标签,p^k 是 softmax 输出的第 k 个概率。
Softmax + Cross-Entropy 的梯度:组合后的梯度形式极其简洁:
∂zk∂LCE=p^k−yk
其中 zk 是 softmax 之前的 logits。这个简洁形式是交叉熵在神经网络中广泛应用的关键原因。
用于支持向量机和最大间隔分类器:
LHinge(y,y^)=max(0,1−y⋅y^)
其中 y∈{−1,1},y^ 是模型的原始输出(非概率)。当正确分类且间隔足够大时(yy^≥1),损失为 0。
示例:真实标签 y=1,模型输出 y^=2,则 yy^=2≥1,损失为 0。若 y^=0.5,损失为 max(0,1−0.5)=0.5。若 y^=−1(完全分类错误),损失为 max(0,1−(−1))=2。
用于人脸识别、度量学习等任务,将同一类别的样本拉近、不同类别的推开:
LTriplet(a,p,n)=max(0,∥f(a)−f(p)∥22−∥f(a)−f(n)∥22+α)
其中 a 为锚点样本,p 为正样本(同类),n 为负样本(异类),α 为间隔参数(通常设为 0.2~1.0)。
示例:锚点图像与同类图像的距离为 0.3,与异类图像的距离为 0.8,α=0.2,则损失为 max(0,0.3−0.8+0.2)=max(0,−0.3)=0(已满足约束)。若正样本距离为 0.7,负样本距离为 0.4,则损失为 max(0,0.7−0.4+0.2)=0.5。
LInfoNCE=−log∑k=12N1[k=i]exp(sim(zi,zk)/τ)exp(sim(zi,zj)/τ)
其中 sim(⋅,⋅) 为余弦相似度,τ 为温度参数。这个损失在自监督学习(SimCLR, MoCo)中广泛应用。
为防止过拟合,在原始损失基础上添加正则化项:
Ltotal=N1i=1∑NL(yi,y^i)+λΩ(θ)
常见的正则化项:
| 正则化 |
公式 |
效果 |
特性 |
| L1 (Lasso) |
λ∥θ∥1 |
产生稀疏权重 |
特征选择 |
| L2 (Ridge) |
2λ∥θ∥22 |
权重衰减 |
防止过拟合 |
| Elastic Net |
λ1∥θ∥1+λ2∥θ∥22 |
综合效果 |
兼顾稀疏与稳定 |
| Entropy |
−λ∑p^logp^ |
鼓励预测熵高 |
防止过自信 |
NCE(Noise Contrastive Estimation)将无监督问题转化为二分类问题:
LNCE=−E[logpθ(x)+kq(x)pθ(x)]−k⋅Eq[logpθ(x)+kq(x)kq(x)]
其中 pθ 为模型分布,q 为噪声分布,k 为噪声样本数。Word2Vec 和许多自监督学习算法均使用 NCE 或其变体。
针对类别不平衡问题,在交叉熵基础上增加聚焦参数:
LFocal(pt)=−(1−pt)γlog(pt)
其中 pt 为正确类别的预测概率,γ≥0 为聚焦参数。
核心思想:当 γ>0 时,已正确分类的样本(pt 较大)损失贡献被大幅降低,使模型更专注于难分类样本。
示例:设 γ=2,对于已正确识别的样本 pt=0.9,交叉熵损失为 −log(0.9)≈0.105,而 Focal Loss 为 −(0.1)2×0.105=0.00105,降低了 100 倍。对于困难样本 pt=0.3,交叉熵为 −log(0.3)≈1.204,Focal Loss 为 −(0.7)2×1.204=0.590,只降低了约 2 倍。
| γ |
pt=0.9 的减轻比例 |
pt=0.3 的减轻比例 |
推荐场景 |
| 0 |
1×(等价CE) |
1× |
无类别不平衡 |
| 1 |
10×减轻 |
1.4×减轻 |
中等不平衡 |
| 2 |
100×减轻 |
2×减轻 |
严重不平衡 |
| 5 |
10万×减轻 |
5.7×减轻 |
极端不平衡(目标检测) |
RetinaNet 使用 γ=2 在目标检测任务上取得了当时最先进的成果,证明了 Focal Loss 在类别极度不平衡场景下的有效性。
任务类型?
├── 回归 → 异常值较多?→ 是 → Huber Loss
│ → 否 → MSE (默认)
│
├── 二分类 → 类别不平衡?→ 是 → Focal Loss
│ → 否 → Binary Cross-Entropy (默认)
│
├── 多分类 → Cross-Entropy (默认)
│
├── 排序/度量学习 → Triplet Loss / Contrastive Loss
│
├── 生成模型 → 连续数据 → MSE (AE/VAE)
│ → 离散数据 → Cross-Entropy (LM/GAN)
│
└── 自监督学习 → Contrastive Loss (SimCLR/MoCo)
→ Masked Reconstruction (MAE/BERT)
训练一个 MNIST 手写数字分类模型,使用不同损失函数的效果:
| 损失函数 |
训练准确率 |
测试准确率 |
收敛速度 |
备注 |
| Cross-Entropy |
99.8% |
99.2% |
快 |
默认首选 |
| MSE(概率输出) |
98.5% |
97.8% |
慢 |
梯度衰减问题 |
| Hinge Loss |
99.5% |
98.9% |
中 |
适用于 SVM |
| Focal Loss (γ=2) |
99.6% |
99.1% |
中 |
在均衡数据集上无明显优势 |
数据来源:在 MNIST(10 分类,60000 训练样本)上使用相同 3 层 MLP 架构(256-128-64),SGD 学习率 0.01,训练 20 epochs 的实验对比。
- 任务对齐:损失函数必须直接或间接优化任务指标(如 Accuracy、IOU、BLEU)
- 可微性:确保损失函数对模型参数可微,以支持反向传播
- 数值稳定:避免数值溢出(如对 log(0) 的处理,通常添加 ϵ=1e−8)
LCE stable=−∑yklog(p^k+ϵ)
- 尺度敏感性:不同量纲的特征可能需要缩放或自适应损失
- 代理损失:当目标指标不可微(如 Accuracy 是离散的)时,使用可微的代理损失
损失函数是机器学习的核心组成部分,选择合适的损失函数需要综合考虑任务类型、数据特性、模型架构和优化算法。下表提供了主流损失函数的速查参考:
| 场景 |
推荐损失函数 |
对应激活函数 |
| 线性回归 |
MSE |
无(线性) |
| 鲁棒回归 |
Huber Loss |
线性 |
| 二分类 |
Binary Cross-Entropy |
Sigmoid |
| 多分类 |
Categorical Cross-Entropy |
Softmax |
| 多标签分类 |
Binary Cross-Entropy(多输出) |
Sigmoid(每个输出) |
| 类别不平衡分类 |
Focal Loss |
Softmax / Sigmoid |
| 对比学习 |
InfoNCE / Triplet Loss |
L2 归一化 |
| 生成对抗网络 |
Binary Cross-Entropy(判别器) |
Sigmoid |
| 变分自编码器 |
MSE + KL Divergence |
线性(解码器) |
| 序列到序列 |
Cross-Entropy + Label Smoothing |
Softmax + 温度 |
| 度量学习 |
Triplet Loss / ArcFace |
L2 归一化 |
在实际项目中,建议从最成熟的损失函数开始(回归用 MSE,分类用 Cross-Entropy),然后根据具体问题调整。没有最好的损失函数,只有最适合特定任务的损失函数。