直觉理解
损失函数给模型的每一次预测打一个「错误分数」:预测越离谱,分数越高。训练的全部目标就是让平均损失变小。选什么损失,等于告诉模型「什么样的错误更严重」,所以它直接决定了模型学成什么样。
定义与公式
均方误差(MSE)
用于回归,预测连续数值:
误差被平方,所以对大误差惩罚很重,对离群点敏感。从概率角度看,它对应「假设噪声服从正态分布」时的最大似然。
平均绝对误差(MAE)
对离群点更稳健,但在 0 处不可导。
交叉熵损失
用于分类。模型输出 logits ,经过 Softmax 得到各类别概率 ,损失是正确类别概率的负对数:
模型对正确答案越有把握,损失越接近 0;如果它给正确答案的概率接近 0,损失会趋于无穷大。交叉熵的来历见信息论。
二分类时常用二元交叉熵:,其中 由 Sigmoid 给出。
语言模型的损失就是在每个位置上、对整个词表做一次交叉熵分类,再对所有位置取平均:
数值稳定性
直接先算 Softmax 再取对数,指数可能溢出。框架里的交叉熵函数(如 PyTorch 的 F.cross_entropy)直接接收 logits,内部用 log-sum-exp 技巧稳定计算,所以不要自己先做 Softmax 再传进去。
其他常见损失
- 对比损失(如 InfoNCE):让匹配的样本对相似度高、不匹配的低,用于表示学习与检索。
- KL 散度损失:让一个分布逼近另一个分布,用于知识蒸馏。
- 偏好损失:如 DPO 的损失,让模型给「更好的回答」更高的相对概率。
代码示例
import torch
import torch.nn.functional as F
pred, target = torch.tensor([2.5, 0.0, 2.0]), torch.tensor([3.0, -0.5, 2.0])
print(F.mse_loss(pred, target), F.l1_loss(pred, target))
# 语言模型的交叉熵:batch=2,序列长度=3,词表大小=5
logits = torch.randn(2, 3, 5)
labels = torch.randint(0, 5, (2, 3))
loss = F.cross_entropy(logits.view(-1, 5), labels.view(-1)) # 展平成 6 个分类问题
manual = -torch.log_softmax(logits, -1).gather(-1, labels.unsqueeze(-1)).mean()
print(torch.allclose(loss, manual)) # True在 AI 中的作用
- 语言模型预训练与指令微调都以交叉熵为损失,见语言模型和预训练。
- 偏好优化设计了新的损失形式,见指令微调与偏好优化。
- 对比损失是 CLIP 等跨模态模型和嵌入模型的训练目标,见跨模态表示对齐和嵌入与检索模型。
- 蒸馏使用 KL 散度损失,见知识蒸馏与小模型。