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

PyTorch中Adam优化器损失值恒定问题的解决请求

问题分析与解决方案

首先看你的Adam训练循环代码,最明显的问题是缺失optimizer_adam.step()调用——这是Adam优化器更新模型参数的核心操作,没这一步模型参数完全不会更新,损失自然保持不变。而L-BFGS的step(closure)本身就包含了参数更新逻辑,所以能正常下降。

先补上这关键一步,修改后的Adam训练循环如下:

for epo in range(epo_adam):
    model.train()
    optimizer_adam.zero_grad()
    loss , momentum_loss , loss_data , loss_BC , continuity_loss = adop_loss_Weight(model, x, y, z, u_exact, v_exact , w_exact , p_exact ,
           x_b, y_b, z_b, u_b, v_b, w_b ,p_b)
    loss.backward()
    optimizer_adam.step()  # 补上参数更新步骤
    if epo %500 == 0:
        print(f'Epoch Adam {epo}, Total Loss: {loss.item():.10f}')
    if loss.item() <=0.15 :
        print("Optimzation Method is swtiching to L-BFGS . . . ")
        break

如果补完后损失仍无变化,再排查以下方向:

  • 学习率适配问题:Adam默认学习率0.001,若你的损失函数量级过大/过小,这个值可能不合适。可以尝试在1e-4到1e-2范围内调整学习率测试。
  • 损失权重失衡:从函数名adop_loss_Weight来看,总损失是多个子损失的加权和。如果某一个子损失的权重远大于其他,可能导致梯度被单一损失主导,或者其他损失的梯度被淹没。可以打印各子损失的数值,调整权重平衡。
  • 梯度异常:在loss.backward()后,随机选取模型参数打印param.grad.norm(),如果梯度接近0(消失)或数值极大(爆炸),会导致Adam无法有效更新参数。可尝试加梯度裁剪(torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0))或调整模型结构(比如添加残差连接)。
  • Adam超参数不匹配:默认betas=(0.9, 0.999)可能不适配你的任务,比如数据噪声大时,可尝试调小beta1的值;若开启了权重衰减,可先关闭测试是否有变化。
  • 参数初始化问题:不当的参数初始化可能让Adam陷入局部最优或鞍点。可以更换初始化方式,比如用Xavier或He初始化模型参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:57:40