python - 为什么更新优化器会产生不好的结果?
问题描述
我试图更改我的优化器,但首先,我想检查以下两个代码是否给出相同的结果:
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()
结果变坏了。为什么会发生这种情况?优化器不只是从损失中接收梯度并像步骤一样操作梯度下降吗?
解决方案
不同的优化器可能有一些“记忆”。
例如,Adam
更新规则跟踪每个参数的梯度的一阶和二阶矩,并使用它们来计算每个参数的步长。
因此,如果您初始化优化器,您会删除此信息,从而使优化器“不太了解”,从而导致步长的次优选择。
推荐阅读
- r - 检查多个子字符串的文本
- android - getActiveNotifications 返回 null
- javascript - 如何在接收服务器响应时动态创建标签?
- java - 将数组列表内容添加到提供空文本的文本视图
- java - 多个弹跳点问题
- c++14 - C++中虚函数的意义
- c++ - 从源安装 gcc: bash: gcc -v /usr/bin/gcc: 是一个目录
- java - List 类型中的方法 add(? extends Customer)不适用于参数 (Customer)
- javascript - Angular 5 - 从请求中删除默认 HTTP 标头
- meteor - 在流星中安装摩卡后出错