先记住这个答案
在标签严重不平衡时,可对训练集进行重采样:对少数类过采样(如复制或SMOTE)或对多数类欠采样,使各类样本数接近。也可不改变数据,而在损失函数中按类别频率倒数加权,如torch.nn.CrossEntropyLoss(weight=class_weights)。更稳健的是结合两者:先用欠采样控制总量,再用类别权重微调。
- 重采样调整类别分布
- 加权损失按频率倒数
- 结合两者更稳健
重采样与加权损失的平衡机制
微调时,损失函数通常对所有样本平等对待。若多数类占比99%,模型只需预测多数类即可获得低损失,导致少数类学习不足。过采样通过重复少数类样本,使每个batch中少数类出现频率提高,梯度更新更频繁。但简单复制会引入重复样本,导致模型对少数类过拟合,泛化性下降。
加权损失则在不改变数据分布的前提下,为每个样本的损失乘以系数。常用权重为N / (K * n_c),其中N为总样本数,K为类别数,n_c为类别c的样本数。这样每个类别的贡献被归一化。但权重过大可能使训练不稳定,需适当缩放。
二分类中1%正样本的微调实践
假设微调情感分类模型,正样本仅1%(100条),负样本9900条。直接训练时,模型精度可达99%但召回率为0。首先随机欠采样负样本至2000条,使正负比例约为1:20。然后设置CrossEntropyLoss的权重为[1.0, 20.0]。训练时监控验证集的F1分数,而非精度,因为精度会被多数类主导。
此设置下,模型每个batch平均约有4.8%正样本(即1/21),损失权重又放大20倍,正样本梯度贡献显著。验证集也需保持原始分布,但用F1评估。相对于直接训练,正样本召回率和F1预期会有明显提升。若直接过采样正样本至5000条,模型可能记住重复样本,在验证集上表现波动更大。
失效条件与应对代价
当少数类样本极少(少于10条)时,过采样或加权损失都会导致严重过拟合,模型几乎记住这些样本。此时应放弃采样与加权,改用focal loss或调节分类阈值,同时增加正则化。另一种情况是类别间存在难例重叠,重采样可能放大噪声样本的影响。
处理方式上,可先用异常检测筛选少数类中的离群点,再决定是否重采样。欠采样会丢失多数类信息,若多数类本身包含重要子结构,可考虑集成多个欠采样模型。加权损失则受学习率影响大,需调低学习率或使用梯度裁剪。代价是整体收敛变慢,需要更多验证轮次。
容易答错的地方
- 只看准确率而忽视分布
- 在1%正样本下,模型全预测负类也能达到99%准确率,但实际无用。评估必须用F1、召回率等指标,并确保验证集代表真实分布。
- 过采样比例越高越好
- 过采样至完全平衡(1:1)容易导致过拟合,尤其当少数类样本本身多样性不足时。通常保留一定不平衡度(如1:10)并配合正则化更有效。
面试官还会怎么问?
过采样和加权损失能同时使用吗?
能,但需小心。同时使用可能过度放大少数类信号。建议先重采样至中等比例(如1:10),再设置较小权重(如2倍),用验证集调参。
采样策略对验证集有要求吗?
验证集必须保持原始测试分布,不能重采样,否则评估指标失真。需按真实场景采样,并计算加权指标如宏观F1。
在多分类任务中如何选择权重?
权重可设为max_count / count_c,但需缩放避免过大。也可按有效样本数公式(1-beta^n)/(1-beta)计算,beta通常取0.99。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。