backwad() 函数有一个需要传入的参数 grad_variables,可以看作是根节点各部分的权重系数。如果根节点是标量,则该参数可以省略,默认为1。如果根节点是向量,应配以对应尺寸大小的权重,并求和得到标量,再反传。
叶节点的梯度默认是累加的
x ∗ x x * x x∗x 表示两个张量在对应的位置上进行数值相乘,即
[ y 1 y 2 y 3 y 4 ] = [ x 1 2 x 2 2 x 3 2 x 4 2 ] \begin{bmatrix} y_{_1} & y_{_2} \\ y_{_3} & y_{_4} \\ \end{bmatrix}= \begin{bmatrix} x^{_2}_{_1} & x^{_2}_{_2} \\ x^{_2}_{_3} & x^{_2}_{_4} \\ \end{bmatrix} [y1y3y2y4]=[x12x32x22x42]
import torch
x = torch.ones(2, 2, requires_grad=True)
y = x * x
o u t out out 是对张量 y y y 求平均数,是标量。
out = y.mean()
反向传播,得到 o u t out out 的表达式
o u t = 1 4 ∑ i = 1 4 y i = 1 4 ∑ i = 1 4 x i 2 out=\frac{1}{4}\sum_{i=1}^{_4}y_i=\frac{1}{4}\sum_{i=1}^{_4}x_i^{_2} out=41i=1∑4yi=41i=1∑4xi2
# out 是标量
out.backward()
# 或
out.backward(torch.tensor(1))
现在可以对叶结点 x x x 进行求导了(只有叶结点 x x x 才能计算 grad 信息,非叶节点 y y y 则不能)
print(x.grad)
o u t x i ′ = 1 2 x i = 0.5 out_{x_i}'=\frac12x_i=0.5 outxi′=21xi=0.5 [ o u t x 1 ′ o u t x 2 ′ o u t x 3 ′ o u t x 4 ′ ] = [ 0.5 0.5 0.5 0.5 ] \begin{bmatrix} out_{x_1}' & out_{x_2}' \\ out_{x_3}' & out_{x_4}' \\ \end{bmatrix}= \begin{bmatrix} 0.5 & 0.5 \\ 0.5 & 0.5 \\ \end{bmatrix} [outx1′outx3′outx2′outx4′]=[0.50.50.50.5]
tensor([[0.5000, 0.5000],
[0.5000, 0.5000]])
如果根节点是向量,应配以对应尺寸大小的权重 grad_variables 作为参数传入 backward(),并求和得到标量,再反传。
import torch
x = torch.ones(2, 2, requires_grad=True)
y = x * x
# 设置根节点对应大小的权重
v = torch.tensor([[1, 2], [3, 4]])
# y 是张量
y.backward(v)
print(x.grad)
结果
[ y 1 y 2 y 3 y 4 ] = [ x 1 2 x 2 2 x 3 2 x 4 2 ] \begin{bmatrix} y_{_1} & y_{_2} \\ y_{_3} & y_{_4} \\ \end{bmatrix}= \begin{bmatrix} x^{_2}_{_1} & x^{_2}_{_2} \\ x^{_2}_{_3} & x^{_2}_{_4} \\ \end{bmatrix} [y1y3y2y4]=[x12x32x22x42] 令 o u t = 1 y 1 + 2 y 2 + 3 y 3 + 4 y 4 = 1 x 1 2 + 2 x 2 2 + 3 x 3 2 + 4 x 4 2 令out=1y_{_1}+2y_{_2}+3y_{_3}+4y_{_4}=1x^{_2}_{_1}+2x^{_2}_{_2}+3x^{_2}_{_3}+4x^{_2}_{_4} 令out=1y1+2y2+3y3+4y4=1x12+2x22+3x32+4x42 [ o u t x 1 ′ o u t x 2 ′ o u t x 3 ′ o u t x 4 ′ ] = [ 2 x 1 4 x 2 6 x 3 8 x 4 ] = [ 2 4 6 8 ] \begin{bmatrix} out_{x_1}' & out_{x_2}' \\ out_{x_3}' & out_{x_4}' \\ \end{bmatrix}= \begin{bmatrix} 2x_{_1} & 4x_{_2} \\ 6x_{_3} & 8x_{_4} \\ \end{bmatrix}= \begin{bmatrix} 2 & 4 \\ 6 & 8 \\ \end{bmatrix} [outx1′outx3′outx2′outx4′]=[2x16x34x28x4]=[2648]
tensor([[2., 4.],
[6., 8.]])
import torch
x = torch.randn(2, 1, requires_grad=True)
a = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)
y = torch.mm(a, x)
# 设置根节点对应大小的权重
v = torch.ones(2, 1)
# y 是张量
y.backward(v)
print(x.grad)
结果
[ y 1 y 2 ] = [ 1 2 3 4 ] × [ x 1 x 2 ] = [ x 1 + 2 x 2 3 x 1 + 4 x 2 ] \begin{bmatrix} y_{_1} \\ y_{_2} \\ \end{bmatrix}= \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ \end{bmatrix}\times \begin{bmatrix} x_{_1} \\ x_{_2} \\ \end{bmatrix}= \begin{bmatrix} x_{_1} + 2x_{_2} \\ 3x_{_1} + 4x_{_2} \\ \end{bmatrix} [y1y2]=[1324]×[x1x2]=[x1+2x23x1+4x2] 令 o u t = 1 y 1 + 1 y 2 = 4 x 1 + 6 x 2 令out=1y_{_1}+1y_{_2}=4x_{_1}+6x_{_2} 令out=1y1+1y2=4x1+6x2 [ o u t x 1 ′ o u t x 2 ′ ] = [ 4 6 ] \begin{bmatrix} out_{x_1}' \\ out_{x_2}' \\ \end{bmatrix}= \begin{bmatrix} 4 \\ 6 \\ \end{bmatrix} [outx1′outx2′]=[46]
# x.grad
tensor([[4.],
[6.]])