PytorchZerotoAll学习笔记(三)--自动求导

Pytorch给我们提供了自动求导的函数,不用再自己再推导计算梯度的公式了

虽然有了自动求导的函数,但是这里我想给大家浅析一下:深度学习中的一个很重要的反向传播

references:https://en.wikipedia.org/wiki/Chain_rule

我们先来看看什么是chain- rule(链式法则)

             Z是由 y经过f函数得到的,y又是x经过g函数得到 

              

                                                 ,    

                                                              

                     正向传播的方向是从左往右,那么反向传播的便是从右到左,梯度是一级级往回传递的

                    我们知道一般输出的时候都要经过一个激活函数,常用的是relu。当前的结果要往后传,

                    那么,这个时候便是函数的复合,一个套一个(俄罗斯套娃)(正向传播)

                    反向传播,就像剥洋葱,一层一层,你会发现它是没有心的.........哈哈哈哈哈哈

tips:当前层的梯度的计算需要后一层计算的梯度的结果

我们再来看看代码

import torch
from torch.autograd import Variable

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

#这里的w,我们是用tensor来生成了,不再是一个python的变量,调用torch.Tensor 需要计算梯度,所以 requires——grad设置为true w = Variable(torch.Tensor([1.0]), requires_grad=True) # Any random value # our model forward pass def forward(x): return x * w # Loss function def loss(x, y): y_pred = forward(x) return (y_pred - y) * (y_pred - y) # Before training print("predict (before training)", 4, forward(4).data[0]) # Training loop for epoch in range(10): for x_val, y_val in zip(x_data, y_data): l = loss(x_val, y_val)
# l.backward()调用这个函数就可以让程序自动求梯度啦,是不是很神奇! l.backward()
# 获取梯度的数值 使用 .data直接调用其属性即可 print("\tgrad: ", x_val, y_val, w.grad.data[0]) w.data = w.data - 0.01 * w.grad.data #手动清零 这里我们迭代10轮,所以下次计算之前都要清零当前的梯度值Manually zero the gradients after updating weights w.grad.data.zero_() print("progress:", epoch, l.data[0]) # After training print("predict (after training)", 4, forward(4).data[0])

今天就讲到这里啦,see you next time!

  

猜你喜欢

转载自www.cnblogs.com/liu-Deeplearning/p/10279923.html