关于optimizer(torch.optim)的使用

参考https://zhuanlan.zhihu.com/p/52491687
一般,使用optimizer的流程就是三行代码:

optimizer.zero_grad()
loss.backward()
optimizer.step()

具体一点写的话就是:

params=set(model.encoder.parameters())
optimizer_encoder=optim.Adam(params, lr=5e-4)
opt=optimizer_encoder
for optimizer in opts:
  optimizer.zero_grad()
loss=model(一些需要的参数)
loss.backward()
for optimizer in opts:
  optimizer.step()

这一句就是创建一个optimizer对象。Adam可以换成其他优化器。

optimizer_encoder=optim.Adam(params, lr=5e-4)

之后,optimizer in opts我理解成是或许每个变量都拥有一个优化器吧,所以需要在循环里逐个zero_grad(),也就是清理掉上一步的残余值。

下一步,计算参数更新值。也就是gradient。
optimizer和backward之间有什么联系呢?参考https://stackoverflow.com/questions/53975717/pytorch-connection-between-loss-backward-and-optimizer-step
首先,在初始化optimizer的时候,已经知道它应该更新模型的那些parameters(tensors)了(就是optim.Adam的参数params)。
之后,对loss调用backward()的时候,它们的gradients会被保存在自身的两个属性(grad和requires_grad)当中。总之tensor就是具有这样的属性。

loss.backward()

最后,调用optimizer.step(),就是一个apply gradients的过程。将更新的值加到model的parameters上。

optimizer.step()

求导和优化是两个独立的过程。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容