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

梯度累积训练效果与批量训练不一致的问题排查求助

梯度累积训练效果与批量训练不一致的问题排查求助

作为个人练手项目,我正在尝试实现一个Transformer模型来预测一组数字的最小值。用常规批量训练时效果很不错,但切换到梯度累积策略后就出问题了——模型完全学不到正确的最小值,只会输出最小值的均值。我已经试过很多调整手段(比如把损失除以累积步数、调整学习率、打印梯度查看情况等等),但都没有任何改观。另外我也确认过,我的模型里没有批量归一化层(就是普通的Transformer结构后面接了一个简单的线性层,全程没有用任何归一化操作)。

下面是我的训练循环代码:

model = MinValuePredictor().cuda()
model.train()
loss_fn = nn.MSELoss()
accum_steps = 8 # 要测试大批量训练的话可以把这个值改成1
optimizer = optim.AdamW(model.parameters(), lr=0.000001)
# 训练循环
input_count = 10
epochs = 50000
batch_size = 1
optimizer.zero_grad()

for epoch in range(epochs):
    # 生成数据
    inputs, targets = generate_data(batch_size, input_count)

    # 前向传播
    predictions = model(inputs).squeeze(1)

    loss = loss_fn(predictions, targets) / accum_steps
    if epoch % 100 == 0:
        print(f"Difference: {predictions.item() - targets.item()}")

    # 反向传播
    loss.backward()
    loss.retain_graph = False

    # 每8个epoch执行一次优化器更新并清空梯度
    if (epoch + 1) % accum_steps == 0:
        optimizer.step()
        optimizer.zero_grad()  # 清除累积的梯度

    if (epoch + 1) % 50 * accum_steps == 0:
        print(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")


# 测试模型
test_input, test_target = generate_data(batch_size=1)
test_output = model(test_input).item()
print(f"Test Input: {test_input}")
print(f"Predicted Min: {test_output:.4f}, Actual Min: {test_target.item():.4f}")

我的随机数生成逻辑如下:

# 最大值固定为30
def generate_data(batch_size=64, n=10):
    min_values = 10 + (5 * torch.rand(batch_size, 1).cuda())  # 每个样本随机生成最小值
    max_values = 30 * torch.ones(batch_size, 1).cuda()  # 固定最大值
    input_tensors = (min_values + (max_values - min_values) * torch.rand(batch_size, n).cuda())
    targets = torch.min(input_tensors, dim=1).values
    return input_tensors, targets

就像我之前说的,当批量大小设为8时,不管累积步数是多少,代码都能正常工作;但当批量大小设为1时,无论累积步数设成多少,模型的表现都和批量大小、累积步数都是1的情况一模一样。有没有大佬能帮我看看我到底哪里写错了?

备注:内容来源于stack exchange,提问作者Davide

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:19:36