在大模型微调过程中,损失函数的选择直接影响模型的收敛速度和最终性能。本文将分享几种常用的损失函数及其调整技巧。
常用损失函数
1. 交叉熵损失(CrossEntropyLoss)
这是最基础也是最常用的损失函数,适用于分类任务。在微调时可以通过调整标签平滑参数来防止过拟合:
import torch.nn.functional as F
loss = F.cross_entropy(logits, targets, label_smoothing=0.1)
2. Focal Loss
针对类别不平衡问题,Focal Loss通过降低易分类样本的权重来关注难分类样本:
from focal_loss import FocalLoss
focal_loss = FocalLoss(alpha=0.25, gamma=2.0)
loss = focal_loss(logits, targets)
3. Label Smoothing
通过在标签中加入噪声来提升模型泛化能力:
# 自定义LabelSmoothing
class LabelSmoothingLoss(nn.Module):
def __init__(self, smoothing=0.1):
super().__init__()
self.smoothing = smoothing
self.confidence = 1.0 - smoothing
def forward(self, x, target):
logprobs = F.log_softmax(x, dim=-1)
nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1))
smooth_loss = -logprobs.mean(dim=-1)
loss = self.confidence * nll_loss + self.smoothing * smooth_loss
return loss.mean()
调整技巧
- 动态调整学习率:根据损失值变化调整学习率,避免陷入局部最优
- 多阶段训练:先用大损失函数训练,再切换到小损失函数微调
- 损失函数组合:将交叉熵与KL散度结合使用
实践建议
在实际应用中,建议从基础的交叉熵开始,通过验证集性能来决定是否需要调整。对于特定任务,可以尝试组合不同的损失函数以获得最佳效果。

讨论