Deep Learning with Pytorch - autograd
Deep Learning with Pytorch: A 60 Minute Blitz
Autograd: automatic differentiation
Autograd: 自动微分
在 Pytorch 中所有神经网络的中心就是 autograd 包
让我们首先短暂地了解一下,然后我们将训练我们第一个神经网络.
autograd 包提供了在 Tensors 上所有操作的自动微分. 这是一个运行时定义的框架, 即你的反向传播算法是由你的代码怎样运行定义的, 每一次迭代都将不同.
Variable
autograd.variable 是这个包的中心类. 它包装了一个 Tensor 并且支持几乎所有定义在 Tensor 上的操作.一旦你结束计算你可以调用 .backward()使你的所有梯度都自动计算
你可以通过 .data特性访问任何 raw Tensor, 关于(w.r.t.with respect to)这个变量的梯度可以被积累至.grad
h还有一个对autograd实现非常重要的类 Function
Variable 和 Function 相互联系共同构建了一个循环图, 图编码了计算的全部历史. 每个Variable都有一个.grad_fn特性, 指向创造Varaible的Function ( 除了Varaibles是被用户创建,这是grad_fn为None ).
如果你想计算导数,可以对Variable调用.backward().如果Variable是一个标量,并不需要对backward()指明任何参数,但是如果Variable有很多元素,就要指明一个梯度参数, 该参数是匹配形状的张量.
import torch
from torch.autograd import Variable
x = Varaible(torch.ones(2, 2), requires_grad=True); # 创建一个Variable
print(x)
y = x + 2
print(y)
# 因为y作为一个操作的结果被创建,所以它有grad_fn
print(y.grad_dn)
z = y * y * 3
out = z.mean()
print(z, mean)
Gradient
让我们backprop, out.backward() 就是 out.backward(torch.Tensor([1, 0]))# 这里相当给出了x的初始值,就是算出求导公式后带入x计算的x的值
out.backward();
print(x.grad)`
我们应该会得到一个所有元素都是4.5的矩阵,
我们称out为Variable”o”
O=14∑iZi O = 1 4 ∑ i Z i ;
Zi=3(xi+2)2 Z i = 3 ( x i + 2 ) 2 ;
Zi|xi=1=27 Z i | x i = 1 = 27 ;
dodx=32(xi+2) d o d x = 3 2 ( x i + 2 )
dodxi|xi=1=92=4.5 d o d x i | x i = 1 = 9 2 = 4.5
你可以用autograd做很多疯狂的事情
x = torch.randn(3)
x = Variable(x, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
gradients = torch.FloatTensor([0.1, 1.0, 0.001])
y.backward(gradients)
# y 对 x 的求导结果就是1024
print(x.grad)
# result:
# 102.4000
# 1024.0000
# 1.0240
还没有评论,来说两句吧...