PyTorch中带动量的optim.SGD如何查看上一步的velocity?
问题解答
- 首先明确:
nn.Parameter本身不包含prev_v这类和优化器运行状态相关的自定义属性,它仅内置了.data(参数值)、.grad(梯度值)等和参数本身强相关的基础属性。 - SGD带动量所需的上一步velocity,统一保存在SGD优化器实例自身的
state字典中,没有和参数对象绑定。
PyTorch的所有优化器都遵循「参数本身和优化状态分离」的设计逻辑:
state是优化器自带的一个嵌套字典结构,字典的key是对应的nn.Parameter实例,value是存储该参数所有优化相关状态的子字典。- 对于带动量的SGD来说,velocity对应的存储key是
momentum_buffer,第一次调用optimizer.step()时会自动初始化这个值,后续每步更新时会读取、更新这个缓存值。
你可以参考下面的示例代码直观查看存储位置:
import torch import torch.nn as nn # 定义模型和带动量的SGD优化器 model = nn.Linear(3, 1) optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9) # 执行一次前向、反向、参数更新 input = torch.randn(2, 3) loss = model(input).mean() loss.backward() optimizer.step() # 取出第一个参数对应的动量velocity target_param = next(model.parameters()) velocity = optimizer.state[target_param]['momentum_buffer'] print(velocity)
这种设计把参数本身和优化器状态解耦,避免了参数对象挂载大量非核心属性,同一个参数切换不同优化器时也不会出现状态残留的问题。
内容的提问来源于stack exchange,提问作者Sam-gege
相关产品推荐
相关产品推荐

