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

如何通过批次损失计算训练集总损失?CUDA显存不足时如何统计全量损失

全量训练损失计算方案

完全可以通过各批次损失换算得到和全量加载计算一致的总损失,无任何精度误差:
你当前使用的nn.MSELoss()默认reduction='mean',返回的是单批次内所有样本损失的平均值,换算全量平均损失的公式为:
全量平均损失 = (Σ 单批次损失 × 单批次样本数) / 训练集总样本数
计算时需要关闭梯度计算和模型训练状态,避免额外显存占用,你可以把原代码中标注#1的部分替换为以下代码:

if epoch%100==0:
    model.eval()
    total_loss = 0.0
    # 关闭梯度计算,不存储计算图,大幅降低显存占用
    with torch.no_grad():
        for btch in range(n_total_steps):
            stind,endind=seperator(btch,n_total_steps,[0,len(trainx)])
            thisx = trainx[stind:endind].to(device)
            thisy = trainy[stind:endind].to(device)
            outputs = model(thisx)
            loss = criterion(outputs , thisy)
            total_loss += loss.item() * (endind - stind)
    avg_total_loss = total_loss / len(trainx)
    print(avg_total_loss)
    # 切回训练模式继续后续迭代
    model.train()
无法过拟合训练集的隐藏层设置建议

你当前的模型实际仅启用了3层全连接层,隐藏层宽度640,总参数量不足1M,对于40万条样本的拟合能力是足够的,无法过拟合大概率不是隐藏层大小的问题,可按以下优先级调整:

  • 首先排查输入输出标准化:MSE损失对数值尺度非常敏感,如果输入特征之间数值差几个数量级,或者标签范围太大,模型很难收敛,先对trainx做Z-Score标准化(减均值除标准差),标签trainy如果数值范围大也做同样处理,预测时再反归一化即可。
  • 调整批次大小:你当前设置的batch_size=20000过大,大batch会让模型更新方向更稳定,但也更容易陷入鞍点或者局部最小值,无法拟合训练集,可以先把batch_size降到2000~5000,学习率保持不变或者小幅下调到0.0005。
  • 隐藏层调整优先加深而非加宽:
    • 先把你注释掉的l4、l5层依次打开,每加一层测试一次拟合能力,加深网络对拟合能力的提升效率远高于单纯加宽,且显存开销更小。
    • 不需要继续加大hidden_size,当前640的宽度对于83维的输入已经足够,继续加宽只会徒增显存开销,对拟合能力提升有限。
    • 如果加了深层之后出现梯度消失问题,可以在每个LeakyReLU层之前加nn.LayerNorm(hidden_size),稳定训练过程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 20:15:02