引言

  • 在模型训练时,每个Batch反向传播完成后我们需要手动清除计算图上本次迭代的所有梯度
  • 在阅读不同的代码时,总能看到不同的清空代码:
    • model.zero_grad()
    • optimizer.zero_grad()

正文

  • 上述两种梯度清空的方式均有效,区别在于起作用的范围不同
  • model.zero_grad()
    • 此时mdoel包含的所有参数上的梯度均被清空
  • optimizer.zero_grad()
    • 此时该优化器中负责更新的模型参数上的梯度被清空,即不一定是全部的梯度被清空
    • 若模型训练过程中只有一个优化器,即优化器构造时使用
       optimizer = optim.Optimiers(model.parameters(), lr=args.lr)
    
    此时上述两种梯度清空方式完全等价

总结

  • 两种不同的梯度清零方式在多数场景下基本等价,其区别在于作用范围不同
  • 对于多任务训练、多优化器的训练中,需要根据具体训练策略的不同对参数梯度进行不同作用范围的清空