Pytorch中使用backward()求导详解

backward()是Pytorch中用来求梯度的方法,可以分为三种情况来使用。

1.out.backwark()中out是一个标量

此时可以直接使用out.backwark():

import torch
from torch.autograd import Variable

#生成一个内容为[2,3]的张量,Varibale 默认是不要求梯度的,如果要求梯度,
#需要加上requires_grad=True来说明
#这里的Variable是为了设置变量,把a0=2,a1=3设置为两个变量
a = Variable(torch.tensor([2,3]),requires_grad=True)
b = a+3
c = b*3
out=c.mean() #求均值
out.backward()
print("a=",a)
print("out=",out)
print(a.grad)  #求out对a的偏导

结果为

a= tensor([2., 3.], requires_grad=True)
out= tensor(16.5000, grad_fn=<MeanBackward0>)
tensor([1.5000, 1.5000])

将上面的程序写成数学表达式就是:
在这里插入图片描述
求偏导的过程为:
在这里插入图片描述

2. out.backward()中的out是一个向量(或者理解成1xN的矩阵)

import torch
from torch.autograd import Variable

#生成一个内容为[2,4]的张量,Varibale 默认是不要求梯度的,如果要求梯度,
#需要加上requires_grad=True来说明
a = Variable(torch.Tensor([[2,4]]),requires_grad=True)
b = torch.zeros(1,2)
b[0,0] = a[0,0]**2+a[0,1]
b[0,1] = a[0,1]**3+a[0,0]
out = 2*b

#括号里面的参数要传入和out维度一样的矩阵
#这个矩阵里面的元素会作为最后加权输出的权重系数
out.backward(torch.FloatTensor([[1,2]]))
print("a=",a)
print("out=",out)
print(a.grad)  #求out对a的偏导

结果为:

a= tensor([[2., 4.]], requires_grad=True)
out= tensor([[ 16., 132.]], grad_fn=<MulBackward0>)
tensor([[12., 194.]])

将上面的程序写成数学表达式就是:
a 0 = 2 , a 1 = 4 a_0=2,a_1=4 a0=2,a1=4
b 0 = a 0 2 + a 1 b_0=a_0^2+a_1 b0=a02+a1
b 1 = a 0 + a 1 3 b_1=a_0+a_1^3 b1=a0+a13
o u t 0 = 2 b 0 = 2 a 0 2 + 2 a 1 out_0=2b_0=2a_0^2+2a_1 out0=2b0=2a02+2a1
o u t 1 = 2 b 1 = 2 a 0 + 2 a 1 3 out_1=2b_1=2a_0+2a_1^3 out1=2b1=2a0+2a13
∂ o u t ∂ a = [ ∂ o u t 0 ∂ a 0 ∂ o u t 0 ∂ a 1 ∂ o u t 1 ∂ a 0 ∂ o u t 1 ∂ a 1 ] = [ 8 2 2 96 ] \frac{\partial out}{\partial a}=\begin{bmatrix} \frac{\partial out_0}{\partial a_0} &\frac{\partial out_0}{\partial a_1} \\ \frac{\partial out_1}{\partial a_0}& \frac{\partial out_1}{\partial a_1} \end{bmatrix}=\begin{bmatrix} 8 & 2 \\ 2 & 96 \end{bmatrix} aout=[a0out0a0out1a1out0a1out1]=[82296]
这儿有个疑问,为什么上面的程序计算出来是[12,194]呢?大家可以看到这一行传进去的两个参数[1,2]

out.backward(torch.FloatTensor([[1,2]]))

有:
[ 1 2 ] ∗ [ 8 2 2 96 ] = [ 12 194 ] \begin{bmatrix} 1 & 2 \end{bmatrix}*\begin{bmatrix} 8 & 2 \\ 2 & 96 \end{bmatrix}=\begin{bmatrix} 12 & 194 \end{bmatrix} [12][82296]=[12194]

3. out.backward()中的out是一个矩阵

import torch
from torch.autograd import Variable

#生成一个内容为[2,3]的张量,Varibale 默认是不要求梯度的,如果要求梯度,
#需要加上requires_grad=True来说明
a = Variable(torch.Tensor([[2,3],[1,2]]),requires_grad=True)
w = Variable(torch.ones(2,1),requires_grad=True)
out = torch.mm(a,w)

#括号里面的参数要传入和out维度一样的矩阵
#这个矩阵里面的元素会作为最后加权输出的权重系数
out.backward(torch.FloatTensor([[1],[1]]))
print("gradients are:{}".format(w.grad.data))

结果为:

gradients are:tensor([[3.],
        [5.]])
  • 33
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

comli_cn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值