反向传播BP算法

神经网络的反向传播

  • 反向传播机制与代码
    • 微分引擎与代码
    • 原理阐述

如需转载,请注明出处!
如有帮助点赞收藏关注!

反向传播机制与代码

这里主要介绍反向传播是如何运作的,代码中会加注释,便于大家理解。
在训练神经网络时,最常用的算法是反向传播(back propagation)。在该算法中,根据损失函数计
算给定参数的梯度来调整参数(模型权重)。

微分引擎与代码

为了计算反向传播中的梯度,PyTorch有一个内置的微分引擎,叫做torch.autograd。它支持任何计算图的梯度自动计算。

  • 假设一个简单的一层神经网络,输入x,输出为z,参数是w和b.在这个网络中,w和b是我们需要
    优化的参数。因此,我们需要能够计算关于这些变量的损失函数的梯度。
  • 为了做到这一点,我们设置了这些张量的requires_grad性质。在pytorch中实现如下:
import torch
x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b #z=wx+b
#交叉熵损失函数
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
#反向传播函数的引用存储在一个张量的grad_fn属性中
print('Gradient function for z =',z.grad_fn)
print('Gradient function for loss =', loss.grad_fn)
#优化器
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
  • 梯度计算,为了优化神经网络中参数的权值,我们需要计算损失函数对参数的导数,可以直接
    调用 loss.backward()
loss.backward()
print(w.grad)
print(b.grad)
  • 禁用梯度计算:默认情况下,所有requires_grad=True的张量都跟踪它们的计算历史并支持
    梯度计算。但是,在某些情况下,我们并不需要这样做,例如,当我们训练了模型,只是想跑
    一下前向测试我们的数据。我们可以通过使用detach()或者torch.no_grad()块包围计算代码来
    禁止梯度计算
z = torch.matmul(x, w)+b
print(z.requires_grad)
#方法1 使用no_grad
with torch.no_grad():
z = torch.matmul(x, w)+b
print(z.requires_grad)
#方法2 使用detach()
z_det = z.detach()
print(z_det.requires_grad)

原理阐述

1.前向传播:输入样本经过神经网络的前向传播,得到输出值。
2.计算误差:将输出值与期望值进行比较,得到误差值。
3.反向传播误差:将误差值从输出层开始反向传播,计算每个神经元的误差贡献。
4.更新权重和偏置:根据误差贡献来更新权重和偏置,使得误差逐渐减小。
5.重复以上步骤,知道神经网络的性能达到预期。

反向传播算法的性能主要取决于初始权重和偏置的选择,学习率的设置以及训练数据集的多样性。如果权重和偏置的初始值选的不太好,可能会导致神经网络无法收敛。如果学习率设置的过高,可能会导致权重和偏置更新过于频繁。无法收敛,如果学习率设置的过低,可能会导致收敛速度过慢。

在正常的图像测试模型准确率的情况下,不开启反向传播,直接正向传播计算。

你可能感兴趣的:(python,算法,深度学习,pytorch)