【Deep Learning 3】BP反向传播算法

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 🍊本文从梯度下降算法开始介绍BP反向传播算法背景,并使用一个实际案例来模拟BP过程来讲解其原理。最后做了三个实验进行BP实战🍊实验一手撸一个y=ω*x模拟反向传播过程🍊实验二将BP应用到线性回归模型中进行参数拟合🍊实验三使用Pytorch重现实验二过程。

image.gif编辑

 

🍊本文从梯度下降算法开始介绍BP反向传播算法背景,并使用一个实际案例来模拟BP过程来讲解其原理。最后做了三个实验进行BP实战

🍊实验一手撸一个y=ω*x模拟反向传播过程

🍊实验二将BP应用到线性回归模型中进行参数拟合

🍊实验三使用Pytorch重现实验二过程

一、Introductiaing

以下是一个常见的神经网络图

image.gif编辑

直观的讲,经典神经网络的训练就是求解各个权重w,从正向传播的角度看,想要求解各个参数需要使用链式求导法则和梯度下降法,一个权重w 需要嵌套很多层,求解的时间代价很高😕,咋普通人手里的家伙是扛不住的

那么是否有一种更加快捷的方式呢?我们将网络逆向的看,随后标注其公式,我们可以惊奇的发现它就是一个反向传播的神经网络

image.gif编辑

那么我们从输出值出发,逆向的进行网络的传播,这样求解的效率比较高

二、Principle

2.1 偏导数

首先简单的回顾一下偏导数的相关的知识,来看看以下这个题目

已知J(a,b,c)=3(a+bc),令u=a+v,v=bc,求a,b,c各自的偏导数

image.gif编辑

2.2 BP推导

求解了偏导数之后,我们就可以进行BP推导了,假设这里有一个最简单的神经元,y= ω*x

image.gif编辑

神经网络本身也是做预测功能的,预测结果使用损失函数来判断好坏,所以我们的目标是使得损失函数最小,如何计算呢?回到梯度下降算法中,求一个函数的最值就是要不断的求梯度,此时这里的自变量可以看做是ω,那么最终目标自然是求解image.gif编辑

损失函数如下图中所示

image.gif编辑

我们将该求解Loss的过程转化为计算图(下图中的有向无环图),假设初始化参数x和ω均为1,随后进行反向的传播

image.gif编辑

求解出了image.gif编辑之后,就可以更新权重了

image.gif编辑

重复的更新参数就完成了整个反向传播的过程

三、Experiment

3.1 伪代码

思路

1 初始化数据集

2 正向传播计算预测值,计算损失

3 反向传播

4 更新参数

3.2 实验一:y=ω*x模拟反向传播过程

题目:使用y=ω*x(没有偏置b,也没有激活函数)来模拟反向传播的过程。此外,日志化输出Loss来观察模型的好坏

image.gif编辑

import torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = torch.tensor([1.0])
w.requires_grad = True  # Pytorch中默认Tensor是不需要求梯度的
def forward(x):
    return x * w  # w为Tensor,这里的*其实已经重载了,两个Tensor进行点乘
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2
for epoch in range(100):
    for x, y in zip(x_data, y_data):  # SGD随机梯度下降
        l = loss(x, y)  # 正向传播,计算损失。
        l.backward()  # 反向传播,每次进行backward时,loss的计算图就会被自动释放掉
        print('\tgrad:', x, y, w.grad.item())
        w.data = w.data - 0.01 * w.grad.data  # 权重更新时,grad也是一个tensor
        # 这里为什么要使用data呢?因为使用data只是进行数值修改,并不会影响建立一个新计算图
        w.grad.data.zero_()
        # 这里梯度一定要清零,因为如果不清零,比如第一次是Loss1的梯度,第二次就是Loss1的梯度+Loss2的梯度。
        # 实际上我们只要Loss2的梯度
    print('progress:', epoch, l.item())  # 取出loss使用l.item,不要直接使用l(l是tensor会构建计算图)
print("predict (after training)", 4, forward(4).item())

image.gif

 Result

image.gif编辑

训练结果可以有两个角度。第一个角度,截取最后5个Epoch的训练结果,我们可以明显的发现Loss已经完成收敛。第二个角度, ω实际值为2,输入为4时预测输出的7.99999与实际值8非常相近了,说明预测效果不错

3.3 实验二:线性回归拟合(非Pytorch版)

题目:使用BP算法来进行线性回归,假设我们使用的是一个全连接层,即模型为y=wx+b。实例化使用y=4x+0.6来构造数据集x,y,最后通过模型拟合出的w和x是否接近4和0.6?

# Linear propagation via BP
import torch
import numpy
from  matplotlib import pyplot as plt
# Prepare for the dataset
x=torch.rand([100])
y=4*x+0.6
w=torch.rand(1,requires_grad=True)
b=torch.rand(1,requires_grad=True)
# Define the loss function
def loss_fn(y,y_predict):
    loss=(y_predict-y).pow(2).mean()
    # Set the grad as zero every BP
    for i in [w,b]:
        if i.grad is not None:
            i.grad.data.zero_()
    loss.backward()
    return loss.data
# Define the optimizer
def optimize(learning_rate):
    w.data-=learning_rate*w.grad.data
    b.data-=learning_rate*b.grad.data
for i in range(3000):
    y_predict=x*w+b
    loss=loss_fn(y,y_predict)
    if i%500==0:
        print(i,loss)
    optimize(0.01)
# Draw the image
predict=x*w+b
plt.scatter(x.data.numpy(),y.data.numpy(),c="r")
plt.plot(x.data.numpy(),predict.data.numpy())
plt.show()
print("w",w)
print("b",b)

image.gif

Result

image.gif编辑

image.gif编辑

可以看到,使用BP反向传播之后,w和b的值已经非常的接近4和0.6了

3.4 实验三:线性回归拟合(Pytorch版)

我们再使用Pytorch+GPU来重写上述内容

# 使用Pytorch内置函数
import torch
from torch import nn
from torch import optim
from matplotlib import pyplot as plt
# Define the dataset
x = torch.rand([50, 1])
y = x * 4 + 0.6
# Define the module
class Lr(nn.Module):
    def __init__(self):
        super(Lr, self).__init__()
        self.linear = nn.Linear(1, 1)
    def forward(self, x):
        out = self.linear(x)
        return out
# Instantiate the model, loss and optimizer
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
x, y = x.to(device), y.to(device)
model = Lr().to(device)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=1e-3)
# Train the module
for i in range(30000):
    out = model(x)  # Get the prediction
    loss = criterion(y, out)  # Calculate loss
    optimizer.zero_grad()  # Gradient zeroing
    loss.backward()  # Calculate Gradient
    optimizer.step()  # Update the Gradient
    if (i + 1) % 20 == 0:
        print('Epoch[{}/{}],loss:{:.6f}'.format(i, 30000, loss.data))
# Module evaluation
model.eval()  # Set module as evaluation mode
predict = model(x)
predict = predict.cpu().detach().numpy()
plt.scatter(x.cpu().data.numpy(), y.cpu().data.numpy(), c="r")
plt.plot(x.cpu().data.numpy(), predict, )
plt.show()

image.gif

image.gif编辑

image.gif编辑

参考资料

《机器学习》周志华

《深度学习与机器学习》吴恩达

《神经网络与与深度学习》邱锡鹏

《Pytorch深度学习实战》刘二大人

目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
1月前
|
机器学习/深度学习 算法 5G
基于BP神经网络的CoSaMP信道估计算法matlab性能仿真,对比LS,OMP,MOMP,CoSaMP
本文介绍了基于Matlab 2022a的几种信道估计算法仿真,包括LS、OMP、NOMP、CoSaMP及改进的BP神经网络CoSaMP算法。各算法针对毫米波MIMO信道进行了性能评估,通过对比不同信噪比下的均方误差(MSE),展示了各自的优势与局限性。其中,BP神经网络改进的CoSaMP算法在低信噪比条件下表现尤为突出,能够有效提高信道估计精度。
36 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习还不如浅层网络?RL教父Sutton持续反向传播算法登Nature
【9月更文挑战第24天】近年来,深度学习在人工智能领域取得巨大成功,但在连续学习任务中面临“损失可塑性”问题,尤其在深度强化学习中更为突出。加拿大阿尔伯塔大学的研究人员提出了一种名为“持续反向传播”的算法,通过选择性地重新初始化网络中的低效用单元,保持模型的可塑性。该算法通过评估每个连接和权重的贡献效用来决定是否重新初始化隐藏单元,并引入成熟度阈值保护新单元。实验表明,该算法能显著提升连续学习任务的表现,尤其在深度强化学习领域效果明显。然而,算法也存在计算复杂性和成熟度阈值设置等问题。
62 2
WK
|
2月前
|
机器学习/深度学习 监控 算法
反向传播算法是如何工作的
反向传播算法通过最小化损失函数优化神经网络。首先,输入数据经由前向传播得到预测结果,并计算损失;接着,反向传播计算各参数的梯度,并利用梯度下降法更新权重和偏置。这一过程反复进行,直至满足停止条件。算法具备高效性、灵活性及可扩展性,能处理复杂模式识别与预测任务,适用于不同类型与规模的神经网络,显著提升了模型的预测准确性和泛化能力。
WK
48 3
|
3月前
|
机器学习/深度学习 存储 人工智能
【博士每天一篇文献-算法】改进的PNN架构Progressive learning A deep learning framework for continual learning
本文提出了一种名为“Progressive learning”的深度学习框架,通过结合课程选择、渐进式模型容量增长和剪枝机制来解决持续学习问题,有效避免了灾难性遗忘并提高了学习效率。
60 4
|
4月前
|
机器学习/深度学习 数据采集 监控
Python基于BP神经网络算法实现家用热水器用户行为分析与事件识别
Python基于BP神经网络算法实现家用热水器用户行为分析与事件识别
106 2
|
4月前
|
数据采集 存储 算法
基于BP算法的SAR成像matlab仿真
**摘要:** 基于BP算法的SAR成像研究,利用MATLAB2022a进行仿真。SAR系统借助相对运动合成大孔径,提供高分辨率图像。BP算法执行回波数据预处理、像素投影及图像重建,实现精确成像。优点是高精度和强适应性,缺点是计算量大、内存需求高。代码示例展示了回波生成、数据处理到插值显示的全过程。
|
5月前
|
机器学习/深度学习 算法
**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。
【6月更文挑战第28天】**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。数据从输入层流经隐藏层到输出层,计算预测值。接着,比较预测与真实值计算损失。然后,从输出层开始,利用链式法则反向计算误差和梯度,更新权重以减小损失。此过程迭代进行,直到损失收敛或达到训练次数,优化模型性能。反向传播实现了自动微分,使模型能适应训练数据并泛化到新数据。
69 2
|
5月前
|
机器学习/深度学习 算法 数据可视化
基于BP神经网络的64QAM解调算法matlab性能仿真
**算法预览图省略** MATLAB 2022A版中,运用BP神经网络进行64QAM解调。64QAM通过6比特映射至64复数符号,提高数据速率。BP网络作为非线性解调器,学习失真信号到比特的映射,对抗信道噪声和多径效应。网络在处理非线性失真和复杂情况时展现高适应性和鲁棒性。核心代码部分未显示。
|
6月前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
91 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长