You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BERT二分类交叉验证中后续折验证精度异常飙升求助

BERT 5折交叉验证后续折精度异常飙升的问题排查与修复

问题背景

使用BERT进行二分类任务,为获取全量样本的样本外预测值用于后续线性回归,采用5折交叉验证,设置5个训练Epoch:

  • 第1折验证精度正常收敛至约0.86,与常规80-10-10划分的结果匹配
  • 第2至5折验证精度持续异常上升,最终分别达到0.90、0.95、0.98乃至1.0
  • 已确认数据划分随机且无重叠,初步排查代码逻辑无明显错误,怀疑核心原因是各折训练前模型权重未重新初始化

核心问题验证

可通过打印模型初始权重的方式验证权重复用问题:
在每折训练前,输出BERT词嵌入层的部分权重值:

print(model.bert.embeddings.word_embeddings.weight[:3, :3])

若后续折的初始权重与第一折完全一致,说明模型权重未被重置,直接复用了上一折训练后的状态。

修复方案

1. 每折训练前重新初始化模型

将模型初始化代码放入交叉验证循环内部,确保每折都使用全新的随机初始化权重:

from transformers import BertForSequenceClassification, AdamW
import torch

# 交叉验证循环
for fold, (train_idx, val_idx) in enumerate(kf.split(dataset)):
    # 每折初始化全新模型
    model = BertForSequenceClassification.from_pretrained(
        'bert-base-uncased',
        num_labels=2,
        output_attentions=False,
        output_hidden_states=False
    )
    # 每折初始化全新优化器
    optimizer = AdamW(model.parameters(), lr=2e-5, eps=1e-8)
    
    # 数据集划分、训练、验证逻辑...
    
    # 折结束后清理资源
    del model, optimizer
    torch.cuda.empty_cache()  # 使用GPU时必须清理缓存

2. 确保训练循环梯度清零正确

训练时每步必须执行梯度清零,避免跨折梯度累积:

for epoch in range(5):
    model.train()
    for batch in train_dataloader:
        optimizer.zero_grad()  # 每次前向传播前清零梯度
        outputs = model(**batch)
        loss = outputs.loss
        loss.backward()
        optimizer.step()

3. 额外排查点

  • 验证数据集独立性:打印每折val_idx与之前所有折train_idx的交集,确认无样本重叠
  • 评估指标校验:检查精度计算代码,避免将预测值与标签位置颠倒,或误将训练集数据混入验证评估

内容的提问来源于stack exchange,提问作者roma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:06:05