首页 > 解决方案 > 为什么更新优化器会产生不好的结果?

问题描述

我试图更改我的优化器,但首先,我想检查以下两个代码是否给出相同的结果:

optimizer = optim.Adam(params, lr)
for epoch in range(500):
    ....
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
for epoch in range(500):
    ....
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

如果我在“for循环”之间插入相同的优化器,

optimizer = optim.Adam(params, lr)
for epoch in range(500):
    ....
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

optimizer = optim.Adam(params, lr)
for epoch in range(500):
    ....
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

结果变坏了。为什么会发生这种情况?优化器不只是从损失中接收梯度并像步骤一样操作梯度下降吗?

标签: pythonoptimizationpytorch

解决方案


不同的优化器可能有一些“记忆”。
例如,Adam更新规则跟踪每个参数的梯度的一阶和二阶矩,并使用它们来计算每个参数的步长。
因此,如果您初始化优化器,您会删除此信息,从而使优化器“不太了解”,从而导致步长的次优选择。


推荐阅读