1. 程式人生 > >backward與自動求導詳解

backward與自動求導詳解

匯入

首先匯入模組

import torch 
from torch.autograd import Variable

標量

設定requires_grad=True

x=Variable(torch.Tensor([10]),requires_grad=True)
y=x*5
y.backward()
print x.grad
Variable containing:
 5
[torch.FloatTensor of size 1]

輸出y是一個標量,所以backward()不需要引數

再次反向傳播

y.backward()
print x.grad

Variable containing:
 10
[torch.FloatTensor of size 1]

x.grad 進行了累加

向量

x=Variable(torch.Tensor([2,3]),requires_grad=True)
y=x*5
y.backward(torch.Tensor([2,3]))
print x.grad
Variable containing:
 10
 15
[torch.FloatTensor of size 2]

y1=5*x1
y2=5*x2
backward傳入torch.Tensor([2,3]),即y=2*y1+3*y2,y=10*x1+15*x2,
再分別求導得到10,15。

再次反向傳播,x.grad 進行了累加。

y.backward(torch.Tensor([2,3]))
print x.grad
Variable containing:
 20
 30
[torch.FloatTensor of size 2]

backward( ),必須傳入引數,並且維度和y一致。

retain_variables=True

x=Variable(torch.Tensor([2,4]),requires_grad=True)
y=x*5
y[0] = x[ 0] ** 2 + 3 * x[1]
y[1] = x[ 1] ** 2 + 2 * x[0]
y.backward
(torch.FloatTensor([1, 0])) print x.grad x.grad.data.zero_()

求導時,對y0求得,2*x0+3,
對y1求導為,2*x1+2,
這裡都用到了x0,x1,一般反向傳播後都會釋放掉,所以再次傳播需要設定retain_variables
y.backward(torch.FloatTensor([1, 0]),retain_variables=True)