Deep Learning with Pytorch - autograd

你的名字 2024-05-24 03:50 227阅读 0赞

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有很多元素,就要指明一个梯度参数, 该参数是匹配形状的张量.

  1. import torch
  2. from torch.autograd import Variable
  3. x = Varaible(torch.ones(2, 2), requires_grad=True); # 创建一个Variable
  4. print(x)
  5. y = x + 2
  6. print(y)
  7. # 因为y作为一个操作的结果被创建,所以它有grad_fn
  8. print(y.grad_dn)
  9. z = y * y * 3
  10. out = z.mean()
  11. 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做很多疯狂的事情

  1. x = torch.randn(3)
  2. x = Variable(x, requires_grad=True)
  3. y = x * 2
  4. while y.data.norm() < 1000:
  5. y = y * 2
  6. print(y)
  7. gradients = torch.FloatTensor([0.1, 1.0, 0.001])
  8. y.backward(gradients)
  9. # y 对 x 的求导结果就是1024
  10. print(x.grad)
  11. # result:
  12. # 102.4000
  13. # 1024.0000
  14. # 1.0240

发表评论

表情:
评论列表 (有 0 条评论,227人围观)

还没有评论,来说两句吧...

相关阅读