• 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 求导的结果
  • 计算内容也就是
  • grad_output 一项为 中的初值 。如果对标量求导可以不传;如果想要单独对 output 每一个分量求导要传入一个等长的全 1 向量。