直觉理解

损失函数给模型的每一次预测打一个「错误分数」:预测越离谱,分数越高。训练的全部目标就是让平均损失变小。选什么损失,等于告诉模型「什么样的错误更严重」,所以它直接决定了模型学成什么样。

定义与公式

均方误差(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 中的作用

相关