Roberta句对二分类无法学习正类 类别不平衡处理方法咨询
句对二分类类别不平衡、模型全预测负类的落地方案
你当前遇到的模型真阳性、假阳性均为0的情况,是典型的类别不平衡下模型塌缩到多数类的表现,所谓「BERT可自行适配类别不平衡」的结论仅在不平衡比例低于10:1、标注质量极高的场景下成立,你当前数据集正负比接近25:1,必须做针对性调整,按落地优先级排序可尝试以下方案:
1. 最低成本调整:损失函数替换
- 放弃默认的平等交叉熵,优先换Focal Loss,设置
gamma=2,正类对应的alpha权重初始设为5(不要直接按样本反比设25,梯度过大容易训崩),后续可根据验证集正类召回情况在3~10区间调整。Focal Loss会自动降低易分负样本的损失权重,让模型把梯度注意力放到正类和难分样本上,对BERT类模型的塌缩问题改善最明显。 - 如果不想引入额外损失实现,也可以用加权交叉熵,正类权重同样控制在5~10区间即可。
踩坑提醒:不要直接设置正类权重为负样本数/正样本数(即25左右),训练初期梯度会完全被正类主导,大概率出现假阳性飙升、模型不收敛的问题。
2. 训练采样策略调整
- 不要全量加载14w负样本参与每个epoch的训练,改用动态随机欠采样:每个epoch训练时,正类样本全量保留,负类随机采样35倍正类的样本量(即单epoch负样本量控制在1.6w2.7w区间),大幅降低负类的梯度主导权。
- 训练3个epoch后加入难负例挖掘:把模型在全量负样本上预测为正类的假阳性样本,优先加入下一轮的训练集,和新采样的随机负样本混合训练,避免模型只会区分简单负例。
- 文本任务不要用SMOTE之类的传统表格过采样方法生成正样本,噪声极高;如果要做正类增强,仅用同领域回译、同义改写的方式做1倍以内的扩充即可,不要过量生成。
3. 训练流程与推理阈值修正
- 先查推理阈值:你当前模型输出的正类概率大概率全部低于默认的0.5阈值,才会出现TP、FP均为0的情况。训练完成后在验证集上遍历0.05~0.5区间的阈值(步长0.01),选择让macro F1最高的阈值作为最终推理阈值,多数场景下把阈值降到0.1~0.2区间就能拿到不错的正类召回。
- 调整微调策略:训练前2个epoch冻结Roberta除最后2层transformer外的所有底层参数,仅训练分类头,等分类头能稳定输出超过10%的正类预测结果后,再解冻全参数做小学习率微调(全参数微调学习率不要超过2e-5,比常规设置低30%左右),避免训练初期负类梯度冲掉预训练权重里和正类语义相关的特征,这是多数人跑不平衡BERT任务训崩的核心原因。
- 训练过程中不要只看整体loss,每个epoch单独统计正类的精确率、召回率,如果连续2个epoch正类召回为0,直接回退到上一个有效checkpoint,降低学习率后继续训练,不要等全量训练跑完再排查问题。
4. 前置数据校验
- 先抽样校验200条正类样本的标注质量,PrivacyQA数据集本身存在一定比例的标注错误、句对匹配错误的脏数据,如果正类脏数据占比超过10%,模型无法学到一致的正类特征,任何训练策略调整都很难生效。
- 检查句对输入格式是否符合Roberta要求:正确格式为
<s> 句1 </s></s> 句2 </s>,分隔符错误会导致模型无法区分两个句子的边界,根本学不会句对匹配逻辑。
内容的提问来源于stack exchange,提问作者Sonu Gupta
相关产品推荐
相关产品推荐

