【paddle】详解 padde.autograd.backward

发布于:2025-02-27 ⋅ 阅读:(15) ⋅ 点赞:(0)

backward

paddle.autograd.backward(tensors, grad_tensors=None, retain_graph=False)[源代码]

参数

  • tensors (list[Tensor]) – 将要计算梯度的 Tensors 列表。Tensors 中不能包含有相同的 Tensor。
  • grad_tensors (None|list[Tensor|None],可选) – tensors 的初始梯度值。如果非 None,必须和 tensors 有相同的长度,并且如果其中某一 Tensor 元素为 None,则该初始梯度值为填充 1.0 的默认值;如果是 None,所有的 tensors 的初始梯度值为填充 1.0 的默认值。默认值:None。
  • retain_graph (bool,可选) – 如果为 False,反向计算图将被释放。如果在 backward()之后继续添加 OP,需要设置为 True,此时之前的反向计算图会保留也可以视为静态计算图。将其设置为 False 会更加节省内存。默认值:False, 此时相当于动态计算图。

需要注意的是 grad_tensors 默认是 None, 如果给该 参数赋值与自变量相同维数的张量,则会按照该张量中的元素作为梯度的权重,一般在多节点机器学习任务中使用。

如果需要计算高阶微分信息或者反复求梯度,例如 Hessian 矩阵则也需要 retain_graph 为真。

二次函数案例

f ( x ) = x 0 2 + x 1 2 f(x)=x_0^2+x_1^2 f(x)=x02+x12
∇ f ( x ) = [ 2 x 0 2 x 1 ] \nabla f(x)= \left[\begin{matrix} 2x_0\\ 2x_1 \end{matrix}\right] f(x)=[2x02x1]
x = [ 1 , 2 ] ⊤ x=[1,2]^\top x=[1,2] ∇ f ( x ) = [ 2 , 4 ] ⊤ \nabla f(x)=[2,4]^\top f(x)=[2,4]

paddle 代码

import paddle
root = paddle.to_tensor([1.0, 2.0], dtype='float32', stop_gradient=False)
def fobj(x):
    return(paddle.sum(x**2))
y = fobj(root)
paddle.autograd.backward(y,None,True)
print('paddle:',root.grad)
print(2*root)

pytorch 代码

import torch
root = torch.tensor([1.0, 2.0], dtype=torch.float32, requires_grad=True)
def fobj(x):
    return torch.sum(x**2)
y = fobj(root)
y.backward(retain_graph=True)
print('torch:',root.grad)
print(root*2)