损失函数详解
概述
损失函数是大模型训练的核心组件,用于衡量模型预测结果与真实标签之间的差异。不同的任务场景需要选择不同的损失函数,合理的选择对模型收敛和最终性能至关重要。
核心损失函数
交叉熵损失(Cross-Entropy Loss)
公式:
多分类交叉熵:
CE=−i=1∑Nyilog(pi)
二分类交叉熵:
CE=−[ylog(p)+(1−y)log(1−p)]
物理意义:交叉熵衡量真实分布与预测分布之间的"信息差"。当两个分布完全一致时,交叉熵损失为0;分布差异越大,损失值越大。
适用场景:
- 预训练阶段的语言建模(next token prediction)
- 分类任务(多分类、二分类)
- 指令微调(SFT)
KL散度(Kullback-Leibler Divergence)
公式:
KL(P∣∣Q)=i∑P(i)logQ(i)P(i)
特点:
- KL散度衡量两个概率分布之间的差异,是非对称的
- KL散度 ≥ 0,值越小表示分布越接近
- KL散度 = 熵 - 交叉熵
与交叉熵的区别:
- 交叉熵是KL散度的一种特殊形式,当真实分布P为one-hot时,交叉熵等价于KL散度
- KL散度可用于衡量任意两个分布之间的差异,而交叉熵通常用于预测分布和真实标签之间
适用场景:
- 知识蒸馏(教师模型分布与学生模型分布对齐)
- DPO(直接偏好优化)
- 分布一致性训练
对比损失(Contrastive Loss)
对比学习通过训练使得相同样本的表示更接近,不同样本的表示更远离,从而学习到更好的特征表示。
常见形式:
- Siamese网络对比损失
- Triplet网络对比损失
- SimCLR系列损失
适用场景:
- 对比学习预训练
- 语义表征学习
- 检索任务
- 图像-文本对齐训练
均方误差(MSE)
公式:
MSE=N1i=1∑N(yi−y^i)2
适用场景:
- 回归任务
- 连续值预测
- KL散度拟合(如在知识蒸馏中软化标签)
关键细节
分类问题为什么用交叉熵而不是MSE?
- 概率分布特性:分类问题输出是概率分布,交叉熵对概率差异更敏感
- 梯度特性:交叉熵在使用sigmoid/softmax激活时,梯度计算更稳定,不会出现梯度饱和
- 数学性质:交叉熵是凸函数,更容易优化;MSE在分类场景下非凸,容易陷入局部最优
Softmax数值溢出解决方案
当softmax输入的指数超过浮点范围时,将分子分母同时除以输入中的最大值:
softmax(xi)=∑jexj−max(x)exi−max(x)
多任务学习中损失差异过大的处理方法
- 动态权重调整:根据各任务损失的量级动态调整权重
- 梯度归一化:对不同任务的梯度进行归一化,平衡贡献
- 加权损失:手动设置不同任务的权重系数
- 不确定性加权:通过学习每个任务的不确定性来自动调整权重
- 改变模型架构:引入任务特定的头和层,避免梯度干扰
损失函数选择对比
| 损失函数 | 适用场景 | 优势 | 注意事项 |
|---|
| 交叉熵 | 分类、语言建模 | 梯度稳定,收敛快 | 对噪声标签敏感 |
| KL散度 | 知识蒸馏、分布对齐 | 衡量分布差异 | 非对称,计算量稍大 |
| 对比损失 | 表征学习、检索 | 无监督/自监督学习 | 负样本构造成本高 |
| MSE | 回归、连续预测 | 优化简单 | 分类场景表现差 |
面试常见问题
-
**交叉熵和KL散度的区别是什么?
- KL散度衡量两个分布之间的差异,是不对称的;交叉熵是衡量预测分布与真实标签分布的差异,当真实标签为one-hot分布时,交叉熵等价于KL散度加上常数熵项。
-
**为什么分类问题用交叉熵而不是MSE?
- 分类问题输出是概率分布,交叉熵对概率差异更敏感;交叉熵梯度计算更稳定,不会出现梯度饱和;交叉熵是凸函数更容易优化,而MSE在分类场景下是非凸的。
-
**Softmax指数溢出如何解决?
- 将分子分母同时减去输入中的最大值,保持指数部分不溢出,同时不改变最终结果。
-
**对比学习中负样本重要吗?负样本构造成本太高怎么办?
- 负样本对对比学习很重要,可以帮助模型学习到更好的区分度。解决方法:设计更高效的负样本生成算法;利用数据增强生成合成负样本;重点关注关键负样本,不需要对所有负样本都构造;利用预训练模型的成果,减少重复工作。
-
**多任务学习中各个任务损失差异很大怎么处理?
- 可以通过动态调整权重、梯度归一化、手动加权、不确定性自动加权等方法来平衡各任务的贡献。
-
**什么是信息增益?
- 信息增益是决策树中用于选择分裂特征的指标,衡量了知道某个特征后,样本不确定性减少的程度,等于原始熵减去条件熵。信息增益越大,特征的分类能力越强。