1.应用
import torch
import torch.nn as nn
# 1.全部为1
x = torch.tensor([1.0,3.0], requires_grad = True) # tensor([1., 3.], requires_grad=True)
y = x*x # tensor([1., 9.], grad_fn=<MulBackward0>)
y.backward(torch.ones(2)) # 1*x[0] + 1*x[1]
x.grad
## 等价于
x = torch.tensor([1.0,3.0], requires_grad = True) # tensor([1., 3.], requires_grad=True)
y = x*x # tensor([1., 9.], grad_fn=<MulBackward0>)
z = y.sum() # 1*x[0] + 1*x[1]
z.backward()
x.grad
## 结果是和pytorch的输出是一样的.反过来想想,其实所谓的"标量对向量求导"本质上是函数对各个自变量求导,这里只是把各个自变量看成一个向量.和数学上的定义并不矛盾.
## 本质上向量对向量求导,就是将向量先求和,然后标量对向量求导
# 不为1时
x = torch.tensor([1.0,3.0], requires_grad = True) # tensor([1., 3.], requires_grad=True)
y = x*x # tensor([1., 9.], grad_fn=<MulBackward0>)
y.backward(torch.tensor([2.0,1.0])) # 2*x[0] + 1*x[1]
x.grad
## 等价于
x = torch.tensor([1.0,3.0], requires_grad = True) # tensor([1., 3.], requires_grad=True)
y = x*x # tensor([1., 9.], grad_fn=<MulBackward0>)
z = 2*y[0] + 1*y[1] # 2*y[0] + 1*y[1]
z.backward()
x.grad
2.API
计算当前节点的梯度
backward(gradient=None, retain_graph=None, create_graph=False)
参数 | 描述 |
---|---|
gradient (Tensor or None) | 如果 Y Y Y是向量,则可理解为上层的偏导的权重,最好全部为1;如果 Y Y Y为标量,则不需要提供,默认为1 |
retain_graph (bool, optional) | |
create_graph (bool, optional) |
其他
假设我们有向量X:
X
=
[
x
1
,
x
2
]
X = [x_1,x_2]
X=[x1,x2]
在Tensor中Element-Wise的运算
Y
=
X
2
Y=X^2
Y=X2
结果是:
Y
=
[
y
1
=
x
1
2
,
y
2
=
x
2
2
]
Y = [y_1 = x_1^2,y_2=x_2^2]
Y=[y1=x12,y2=x22]
其中:
y
1
=
f
1
(
x
1
+
x
2
)
=
x
1
2
y_1=f_1(x_1+x_2)=x_1^2
y1=f1(x1+x2)=x12,既
y
1
y_1
y1是关于
(
x
1
,
x
2
)
(x_1,x_2)
(x1,x2)的函数,而非仅是
x
1
x_1
x1的函数。
同理,我们可以得出:
y
2
=
f
2
(
x
1
+
x
2
)
=
x
2
2
y_2=f_2(x_1+x_2)=x_2^2
y2=f2(x1+x2)=x22
Y
Y
Y对
X
X
X的倒数是一个Jacobian矩阵,既向量求导矩阵:
J
J
J =
(
∂
y
1
∂
x
1
0
0
∂
y
2
∂
x
2
)
\begin{pmatrix} \frac{\partial y_1}{\partial x_1} & 0 \\\\ 0 & \frac{\partial y_2}{\partial x_2} \\\\ \end{pmatrix}
⎝⎜⎜⎛∂x1∂y100∂x2∂y2⎠⎟⎟⎞ =
(
2
x
1
0
0
2
x
2
)
\begin{pmatrix} 2x_1 & 0 \\\\ 0 & 2x_2 \\\\ \end{pmatrix}
⎝⎜⎜⎛2x1002x2⎠⎟⎟⎞
在反向求偏导的时候需要加上,向量 v = ( 1 , 1 ) v=(1,1) v=(1,1),既对 2 x 1 2x_1 2x1和 2 x 2 2x_2 2x2分别添加权重系数1。
参考:
https://pytorch.org/docs/stable/autograd.html#torch.Tensor.backward
https://zhuanlan.zhihu.com/p/65609544
https://zhuanlan.zhihu.com/p/29923090
https://www.cnblogs.com/zhouyang209117/p/11023160.html
https://www.cnblogs.com/marsggbo/p/11549631.html