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.]])

將上面的程序寫成數學表達式就是:
a0=2,a1=4a_0=2,a_1=4
b0=a02+a1b_0=a_0^2+a_1
b1=a0+a13b_1=a_0+a_1^3
out0=2b0=2a02+2a1out_0=2b_0=2a_0^2+2a_1
out1=2b1=2a0+2a13out_1=2b_1=2a_0+2a_1^3
outa=[out0a0out0a1out1a0out1a1]=[82296]\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}
這兒有個疑問,爲什麼上面的程序計算出來是[12,194]呢?大家可以看到這一行傳進去的兩個參數[1,2]

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

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

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.]])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章