【PyTorch】第三节:反向传播算法

 作者️‍♂️:让机器理解语言か

专栏:PyTorch

描述:PyTorch 是一个基于 Torch 的 Python 开源机器学习库。

寄语:没有白走的路,每一步都算数! 

介绍

        反向传播算法是训练神经网络的最常用且最有效的算法。本实验将阐述反向传播算法的基本原理,并用 PyTorch 框架快速的实现该算法。

知识点⛳

  • ⚽正向传播算法
  • ⚽梯度下降算法
  • ⚽反向传播算法

正向传播算法⏩

在讲解反向传播算法之前,让我们先来讲解一下正向传播。

神经网络的本质其实就是一个非常复杂的且具有大量参数的复合函数,我们将数据作为函数(网络)的输入,将结果作为函数(网络)的输出。

正向传播算法其实就是通过函数的输入以及神经网络(一个复杂的复合函数),得到函数的输出的过程。

我们可以使用一个简单的例子,如下:

【PyTorch】第三节:反向传播算法_第1张图片

该函数的输入数据为 x,参数为 w ,输出为 loss。

则该函数的正向传播过程如下:

\hat{y} = x*w

s = y-\hat{y}

loss = s^2

上面的步骤就是正向传播的全部过程,我们可以定义正向传播的函数如下:

import torch


def forward(x, y, w):
    # 其中 x,y 为输入数据,w为该函数所需要的参数
    y_predicted = w * x
    loss = (y_predicted - y)**2
    return loss


# 测试代码
x = torch.tensor(1.0)
y = torch.tensor(2.0)
w = torch.tensor(1.0, requires_grad=True)
forward(x, y, w)  # (2-1)²=1
# tensor(1., grad_fn=)

反向传播⏪

        反向传播,顾名思义就是正向传播的反向计算。其实反向传播的目的就是计算输出值和参数之间的梯度关系。

        在正向传播中,我们的参数 w 被随机定义为了 1。可以看出,此时的 w 并不能很好地根据 x 值预测出 y 值。我们需要更佳的参数值。那么如何获得更佳的参数值呢?我们一般采用的方法就是梯度下降法。该方法在下一个实验【PyTorch】第四节:梯度下降算法中会详细的进行阐述。

        由于我们必须知道参数的偏导才能够使用梯度下降算法,因此,反向传播孕育而生。利用反向传播求取函数关于权重的偏导(即梯度),然后根据偏导使用梯度下降算法找到最佳的参数。这个过程其实就是深度学习中模型训练的过程。

利用 PyTorch 实现反向传播

        其实和上一个试验中求取梯度的方法一致,即利用 loss.backward() 进行后向传播,求取所要可偏导变量的偏导值:

x = torch.tensor(1.0)
y = torch.tensor(2.0)
# 将需要求取的 w 设置为可偏导
w = torch.tensor(1.0, requires_grad=True)
loss = forward(x, y, w)  # 计算损失
loss.backward()  # 反向传播,计算梯度
print("此时,loss 关于 w 的偏导为:", w.grad)
w.grad.zero_()  # 得到偏导后,清空梯度
# 此时,loss 关于 w 的偏导为: tensor(-2.)
# tensor(0.)

实验总结

        本实验内容较为简洁,主要是对上个实验中的 loss.backward() 函数进行详细的讲解。这个函数是所有神经网络模型训练过程中,都会使用到的函数。注意,在进行反向传播和梯度下降后,记得对梯度进行清空,防止梯度累加。

你可能感兴趣的:(PyTorch,深度学习,神经网络,机器学习)