pytorch Tensor.backward

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} x1y100x2y2 = ( 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值