参考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()
求导和优化是两个独立的过程。