目录
- backward
- 二次函数案例
- paddle 代码
- pytorch 代码
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__27">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)