本文是Pytorch快速入門第二部分,主要學(xué)習(xí)記錄扶檐,主要翻譯
Pytorch Autograd部分教程原文
autograd
包是PyTorch中神經(jīng)網(wǎng)絡(luò)的核心部分。
torch.autograd
提供了類和函數(shù), 用來對任意標(biāo)量函數(shù)進行求導(dǎo)吧碾。要想使用自動求導(dǎo)烟阐,只需要對已有的代碼進行微小的改變。只需要將所有的tensor
包含進Variable
對象中即可拧晕。
一隙姿、Tensor(張量)
-
torch.Tensor
是程序包的中心類. - 如果將其屬性設(shè)置
.requires_grad
(默認(rèn)為Flase)為True,它將開始跟蹤對其的所有操作. - 一旦你完成張量計算之后就可以調(diào)用
.backward()
函數(shù),它會幫你把所有的梯度計算好. - 通過Variable的
.data
屬性可以獲取到張量. - 通過Variabe的
.grad
屬性可以獲取到梯度.
二、Variable類
-
autograd.Variable
封裝了Tensor厂捞,支持幾乎所有的tensor操作输玷。一般情況下队丝,將代碼中的Tensor換成Variable,幾乎能夠正常工作欲鹏。
Variable的結(jié)構(gòu):
variable結(jié)構(gòu)
Function類
- 對autograd的實現(xiàn)很重要的類就是
autograd.Function
- Variable跟Function一起構(gòu)建無環(huán)圖,完成了前向傳播的計算
- 通過Function函數(shù)計算得到的變量都有一個.grad_fn屬性
- 用戶自定義變量(不是通過函數(shù)計算得到的)的.grad_fn值為空
- 調(diào)用.backward()函數(shù)計算梯度:
1.當(dāng)變量out是標(biāo)量的時候机久,out.backward()等效于out.backward(torch.tensor(1.))
2.當(dāng)變量不是標(biāo)量的時候,需要指定一個跟該變量同樣大小的張量grad_output用來存放計算好的梯度.
以上官方實例 包含簡單的證明。
- 導(dǎo)入包
import torch
from torch.autograd import Variable
- 創(chuàng)建一個張量并設(shè)置requires_grad=True赔嚎,默認(rèn)為False膘盖。
x = Variable(torch.ones(2, 2), requires_grad=True))
print(x)
# output
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
- 張量運算
y = x + 2
print(y)
# output
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward0>)
- y是通過Funciton計算所得,包含grad_fn屬性
print (x.grad_fn)
print (y.grad_fn)
# output
None
<AddBackward0 at 0x127e95c90>
- 在y上進行操作
z = y * y * 3
out = z.mean()
print(z, out)
# output
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
-
requires_grad_( True)
改變Variable的requires_grad的屬性尤误,等同于Variable.requires_grad=True
, 默認(rèn)的是False侠畔,如果沒有指定的話。
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
# output
False
True
<SumBackward0 object at 0x7ff50a1a5c18>
Gradients
現(xiàn)在開始進行 backprop损晤。因為out包含一個標(biāo)量践图,out. backwards()等價于out. backwards(電筒.張量(1.))。
out.backward()
- 輸出
d(out)/dx
print(x.grad)
# output
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
我們獲得了2*2的值為4.5的矩陣沉馆,把 out 簡化為 "o"码党。 ,
同時
, 因此
,最終
.
- 這里的out為標(biāo)量,所以直接調(diào)用backward()函數(shù)即可.
- 一定要注意當(dāng)out為數(shù)組時,用先定義一樣大小的Tensor例如grad_output執(zhí)行
.backgrad(grad_output)
語句.
舉個??:
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
#output
tensor([ 1210.7769, -263.2759, -1356.7284], grad_fn=<MulBackward0>)
此時輸出y不是標(biāo)量斥黑,因此需要給一個和輸出相同維度的向量揖盘。
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
#output
tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])
三、更多
Document about autograd.Function
is at https://pytorch.org/docs/stable/autograd.html#function