loss.backward():
- 计算 Loss 对所有参数的导数。
- 导数直接存进每个参数的
grad 属性里,准备给 optimizer.step() 用。
- 计算图通常会被销毁。
torch.autograd.grad:
- 计算任意张量(Output)对任意张量(Input)的导数。
- 直接返回计算出来的梯度(一个 Tensor),而不会去修改任何参数的
.grad。
- 可以保留计算图(
create_graph=True),让你能对得到的梯度再求导。
gradients = torch.autograd.grad(
outputs=d_interpolates, # 谁对...
inputs=interpolates, # 谁求导?
grad_outputs=fake, # 外部梯度链
create_graph=True, # 创建、保留计算图
retain_graph=True,
only_inputs=True, # 只返回 input 的梯度,而不会去修改网络参数的 grad 属性
)[0] # 返回值为一个元组,为分别对多个 input 求导的结果
- 计算内容也就是 ∂inputs∂outputs
grad_output 一项为 dxdL=dgdL⋅dxdg 中的初值 dgdL。如果对标量求导可以不传;如果想要单独对 output 每一个分量求导要传入一个等长的全 1 向量。