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

PyTorch中torch.optim.Adam的使用疑问求助

Adam优化器核心用法解析

1. 为什么要创建opt = torch.optim.Adam([y], lr=0.1)?

说白了,PyTorch的优化器就是帮你自动更新可训练参数的工具。你代码里的y是带requires_grad=True的张量,意思是这个变量是需要被调整、优化的(比如模型的权重,或者你自定义的要优化的目标变量)。

创建这个Adam优化器,就是告诉PyTorch两件事:

  • 我要优化的参数是y
  • 用Adam算法来优化,学习率设为0.1

打印optimizer看到的参数组,就是它正在跟踪的、要更新的参数集合,这里就是y。没有这个优化器的话,你得自己写代码手动更新y(比如y = y - 0.1 * y.grad),但Adam算法涉及动量、自适应学习率这些复杂逻辑,优化器帮你把这些细节都封装好了,不用自己实现。

2. opt.zero_grad()到底在干嘛?

PyTorch里的梯度是累加模式——每次调用loss.backward()计算梯度时,新算出来的梯度会加到参数的.grad属性里,而不是直接覆盖原来的值。如果不清零,多次反向传播后梯度会越积越大,导致参数更新完全偏离预期。

opt.zero_grad()的作用就是把优化器跟踪的所有参数(这里就是y)的.grad全部重置为0,确保每次计算的梯度都是当前步骤的新鲜结果,不会和之前的旧梯度混在一起。

3. opt.step()的作用是什么?

这是让参数真正“更新”的一步。当你通过loss.backward()算出了y的梯度后,调用opt.step(),优化器会按照Adam算法的规则,用刚才算好的梯度去调整y的值——比如结合之前的动量、自适应调整学习率,最终得到更新后的y。

标准的训练流程就是:opt.zero_grad() → 计算损失 → loss.backward() → opt.step(),这四步循环执行,直到参数达到你想要的状态。

4. 三者的依赖关系

  • opt是核心容器:它存着要优化的参数(y)、学习率,还有Adam算法运行需要的中间状态(比如动量项)。
  • opt.zero_grad()必须依赖opt:因为它要找到opt跟踪的所有参数,把它们的梯度清零。
  • opt.step()也必须依赖opt:它需要读取opt里的参数梯度、学习率、算法状态,才能完成正确的参数更新。

给你个完整的小例子,跑一遍就懂了:

import torch

# 定义可训练参数y,初始值是1.0
y = torch.tensor([1.0], requires_grad=True)
# 创建Adam优化器,指定优化y,学习率0.1
opt = torch.optim.Adam([y], lr=0.1)

# 模拟3次训练迭代
for i in range(3):
    # 定义损失:让y尽量接近0,损失就是y的平方
    loss = y ** 2
    # 清空之前的梯度
    opt.zero_grad()
    # 反向传播算梯度
    loss.backward()
    # 更新y
    opt.step()
    print(f"第{i+1}次更新后:y={y.item():.4f},损失={loss.item():.4f}")

运行后你会看到y逐渐变小,损失也越来越低,这就是优化器在帮你自动调整参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:30:57