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

模型训练过程中Training loss几乎无变化,请求技术排查解决

训练损失无变化的排查与解决

用户提供的训练代码

optimizer = optim.SGD(model.parameters(), lr=args.learning_rate)
criterion = InfoNCELoss(temperature=0.1)
scheduler = optim.lr_scheduler.StepLR(optimizer, 1.0, gamma=0.1)

log_iter = 100

for e in range(1, args.epoch + 1):
    model.train()
    t0 = time.time()
    total_train_loss = 0

    for i, batch in enumerate(train_dataloader):

        optimizer.zero_grad()
        sentence1_embedding, sentence2_embedding = model(batch["sentence1"], batch["sentence2"])
        train_batch_loss = criterion(sentence1_embedding, sentence2_embedding, batch["sentence1_label"], batch["sentence2_label"])

        total_train_loss += train_batch_loss.item()
        train_batch_loss.backward()
        optimizer.step()
        scheduler.step()

训练损失曲线

训练损失曲线

排查方向与解决方法

  • 学习率调度器误用:当前StepLR的step_size=1.0意味着每1个batch就将学习率乘以0.1,会导致学习率瞬间衰减到几乎为0,参数完全无法更新。正确做法是把step_size设为epoch数(比如10),并将scheduler.step()移到epoch循环末尾,每个epoch结束后调用一次:

    scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
    # ...
    for e in range(1, args.epoch + 1):
        # ... batch循环逻辑 ...
        scheduler.step()  # 放在当前epoch的最后执行
    
  • 初始学习率过低:如果args.learning_rate设置过小(如1e-6),即使调度器正常,参数更新幅度也微乎其微。建议从1e-3开始尝试调整学习率,观察loss变化。

  • InfoNCELoss参数或逻辑问题:温度系数temperature=0.1过小,会让softmax输出过于集中,导致梯度消失。尝试将温度调高到0.5或1.0。同时要确认Loss的正负样本划分、标签传入是否符合任务逻辑,比如是否正确将同类样本作为正例、不同类作为负例。

  • 模型参数未解冻:检查模型是否存在冻结层(如预训练模型的部分参数requires_grad=False),导致参数无法更新。可以通过打印[p.requires_grad for p in model.parameters()]确认所有需要训练的参数都开启了梯度更新。

  • 梯度异常:在train_batch_loss.backward()后,打印梯度的均值或最大值,判断是否存在梯度消失(梯度趋近于0)或爆炸(梯度极大)。如果是梯度消失,可尝试添加梯度裁剪、更换激活函数(如用GELU替代ReLU);如果是梯度爆炸,同样用梯度裁剪,或调整模型初始化方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:33:29