【深度学习基础】反向传播BP算法原理详解及实战演示(附源码)

这篇具有很好参考价值的文章主要介绍了【深度学习基础】反向传播BP算法原理详解及实战演示(附源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需要源码请点赞关注收藏后评论区留言私信~~~

神经网络的设计灵感来源于生物学上的神经网络。如图所示,每个节点就是一个神经元,神经元与神经元之间的连线表示信息传递的方向。Layer 1表示输入层,Layer 2、Layer 3表示隐藏层,Layer 4表示输出层。我们希望通过神经网络,对输入数据进行某种变换,从而获得期望的输出,换句话说,神经网络就是一种映射,将原数据映射成期望获得的数据。BP算法就是其中的一种映射,下面通过一个具体的例子来演示BP算法的过程

强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

假设现在的网络层如图 所示,第一层有两个神经元x1、x2,一个截距项c1;第二层有两个神经元y1、y2,一个截距项c2;第三层是输出,有两个神经元h1、h2;每条线上表示神经元之间连接的权重(具体数值如图 1‑2所示),激活函数σ选用Sigmoid函数。Sigmoid函数及其对x的导数如下所示:

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

输入:x_1=0.05, x_2=0.1,目标:输出h1、h2尽可能接近[0.03, 0.05]

1:前向传播

输入层->隐藏层

强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法 

隐藏层->输出层

强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法 

 

 至此,已经完成了前向传播的过程,此时输出为[0.694,0.718],和期望的输出[0.03, 0.05]相差较大。接下来,通过反向传播,更新每条边上的权值,重新计算输出

强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

2:反向传播

 计算总误差:均方误差作为我们的总误差函数

强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

target_outℎ_i表示第i个真实值;out_ℎ_i表示预测值;N取值为2

因为每个权值对误差都产生了影响,我们希望了解每个权值对误差产生了多少影响,可以用整体误差对特定的权值求偏导来实现这一目的。从输出层到隐藏层,共有5个参数需要更新,分别为b11,b12,b21,b22,c2。以b22为例,通过链式法则进行计算,如下式:

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

其中ρ表示学习率,本例设定为0.5。同理可得:b_11^new=0.458,b_12^new=0.560,b_21^new=0.658

对于偏置项,求解方法类似,但由于偏置项对于每个神经元的损失都有贡献,所以应为对每个神经元求偏导后再求和。由于最后一项在本例中求导后值为1,一般情况下都为1,故可简化

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

隐藏层->输入层 

方法与“输出层—>隐藏层”类似,但是有一点区别。如图 ,可以发现神经元h1向后就直接输出了,没有再输入下一个神经元,而神经元y1的输出值要输入到神经元h1、h2,导致神经元y1会接受来自h1、h2两个神经元传递的误差,因此h1、h2均要计算

从隐藏层到输入层,共有5个参数需要更新,分别为a11,a12,a21,a22,c1,以a11为例计算

式中几项偏微分均已在输出层—>隐藏层的权值更新中有相应的计算公式

强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

 同理可得,a_12^new=0.199,a_21^new=0.298,a_22^new=0.398

偏置项的求法与输出层->隐含层方法一致,这里不再赘述,但应注意的是c1的更新与y1、y2、h1、h2均有关系,带入数值可得:c_1^new=0.307

至此,所有参数均已更新完毕

利用更新完毕之后的参数可以计算得到新的输出为[0.667, 0.693] (原来的输出为[0.694, 0.718],目标输出为[0.03, 0.05]) 新的总误差为0.44356(原来的总误差为0.444)

通过新的权值计算,可以发现输出值与目标值逐渐接近,总误差逐渐减小,随着迭代次数的增加,输出值会与目标值高度相近

3:Numpy实现反向传播算法

1:导入数据集

数据集采用sklearn.make_moons()数据集(下图),并借助sklearn包进行数据预处理,数据集可视化如下

强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

 2:预处理

我们的模型基于梯度下降的优化方式算法,为了让这类算法能更好的优化神经网络,我们需要对数据集进行归一化,我们借用sklearn的库函数完成

重新搭建一个两层的神经网络,如图所示

强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

其中X是一个p×q的矩阵。选取交叉熵损失函数作为该神经网络的损失函数。学习率为0.05,采用梯度下降法进行参数更新

对于权重矩阵W及偏置矩阵B,采用随机初始化的方法。W和B的纬度较高时,不易手工初始化。且若W和B初始化为0或者同一个值,会导致在梯度下降的更新过程中梯度保持相等,权值相同,导致不同的隐藏单元都以相同的函数或函数值作为输入,可以通过参数的随机初始化打破这种僵局。
  同时要注意参数初始化应合理,否则会出现梯度消失或梯度爆炸

在实现sigmoid时,当x很大的时候,会存在上溢问题,我们可以使用scipy.expit()实现sigmoid

至此,我们完成了基本框架的搭建,现在我们编写训练模型 我们假定 学习率为0.05

3:训练和测试

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

测试集预测结果如下

定义预测函数,在测试集上通过以下代码预测,并将预测结果可视化,可以发现可以较为明显的将数据集分为两类

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

误差绘图如下 可见在迭代次数在300次左右时基本已经趋于稳定

 强化学习的反向传播是如何实现的,深度学习,算法,深度学习,人工智能,神经网络,反向传播算法

 最后 部分代码如下

# 导入模块
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib.colors import ListedColormap
from sklearn.datasets import make_moons
X, y = make_moons(n_samples=2000, noise=0.4, random_state=None)
# 将数据集可视化
plt.figure(figsize=(8, 8))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=ListedColormap(['#B22222', '#87CEFA']), edgecolors='k')
# 60%作为训练集,40%作为测试集
from sklearn.model_selection import train_test_split
trainX, ard.fit_transform(trainX)

# 使用标准化器在训练集上的均值和标准差,对测试集进行归一化
testX = standard.transform(testX)# 定义神经网络
# 我们选用较简单的神经网络,它只有两个参数,W(权重矩阵)和 B(偏置矩阵)
def _init_(q):
    # q:W的维度(也就是有 q 个神经元)
    # 我们将 W 与 B 随机初始化
    np.ranB
def train(trainX, trainY, testX, testY, W, B, epochs, flag):
    # trainX: np.ndarray, 训练集, 维度 = (p,q)
    # trainY: np.ndarray, 训练集标签, 维度 = (p, )
    # testX: np.ndarray, 测试集, 维度 = (m,q)
    # testY: np.ndarray, 测试集标签, 维度 = (m, )
    # W:np.ndarray, 权重矩阵, 维度 = (q,)
    # B: np.ndarray, 偏置项, 维度 = (1,)
    # epochs: 迭代次数
    # flag: flag == True 打印损失值\\ flag == False不打印损失值

    train_loss_list = []
    test_loss_list = []
    for i in range(epochs):
        # 训练集
        pred_train_Y = forward(trainX, W, B)
        train_loss = loss_func(trainY, pred_train_Y)
        
        # 测试集
        pred_test_Y = forward(testX, W, B)
        test_loss = loss_func(testY, pred_test_Y)
        
        if flag == True:
            print('the traing loss of %s epoch : %s'%(i+1, train_loss))
            print('the test loss of %s epoch : %s'%(i+1, test_loss))
            print('=========================')
        
        train_loss_list.append(train_loss)
        test_loss_list.append(test_loss)
        
        #反向传播
        backword(W, B, trainY, pred_train_Y, trainX, learning_rate)
    return train_loss_list, test_loss_list
def predict(X, W, B):
    # X: np.ndarray, 训练集, 维度 = (n, m)
    # W: np.ndarray, 参数, 维度 = (m, 1)
    # B: np.ndarray, 参数b, 维度 = (1, )
    
    y_pred = forward(X,W,B)
    n = len(y_pred)
    prediction = np.zeros((n,1))
    for i in range(n):
        if y_pred[i] > 0.5:
            prediction[i,0] = 1
        else:
            prediction[i,0] = 0
    return prediction
def plot_loss(train_loss_list, test_loss_list):
    plt.figure(figsize = (10,8))
    plt.plot(train_loss_list, label='train_loss')
    plt.plot(test_loss_list, label='test_loss')
    
    plt.xlabel('epoch')
    plt.ylabel('loss')
    plt.legend()

创作不易 觉得有帮助请点赞关注收藏~~~文章来源地址https://www.toymoban.com/news/detail-812943.html

到了这里,关于【深度学习基础】反向传播BP算法原理详解及实战演示(附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习17:训练神经网络-反向传播算法

    反向传播算法对于快速训练大型神经网络至关重要。本文将介绍算法的工作原理。 目录 1.简单的神经网络 2.激活函数 3.错误函数 4.正向传播 4.1 更新隐藏层 5.反向传播 5.1 求导数

    2024年02月12日
    浏览(43)
  • 【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture04反向传播

    lecture04反向传播 课程网址 Pytorch深度学习实践 部分课件内容: pytorch的机制是动态计算图, tensor里面既有data也有gradient

    2024年02月22日
    浏览(34)
  • 深度学习之反向传播

    (在pytorch包中)Tensor数据成员:data(存放数据w,也是Tensor变量,但是取data不会构建计算图)和grad(存放梯度loss对w的导,调用bacward之后grad也是个Tensor,每次引用结束要zero) backward会释放计算图,每一次运行神经网络时计算图可能是不同的,所以没进行一次反向传播就释放

    2024年02月16日
    浏览(22)
  • 误差反向传播算法

    通过单个感知机或者单层神经网络只能够实现线性分类的问题,而多层神经网络可以解决非线性分类问题。 神经网络中的模型参数,是神经元模型中的连接权重以及每个功能神经元的阈值, 这些模型参数并不是我们人工设计或者指定的,而是通过算法自动学习到的。 和其他

    2024年02月06日
    浏览(25)
  • 【初学人工智能原理】【4】梯度下降和反向传播:能改(下)

    本文教程均来自b站【小白也能听懂的人工智能原理】,感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白,由于缺少图片可能无法理解,故放到了最后,建议直接看代码(代码放到了前面)。 在引入b后绘制代价函数界面,看看到底是不是一个碗 在w和b两个方向

    2024年02月05日
    浏览(34)
  • 【初学人工智能原理】【3】梯度下降和反向传播:能改(上)

    本文教程均来自b站【小白也能听懂的人工智能原理】,感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白,由于缺少图片可能无法理解,故放到了最后,建议直接看代码(代码放到了前面)。 dataset.py 事实上三种方法的效果图是差不多的,所以只放出两张图 上一

    2024年02月06日
    浏览(29)
  • 分类问题:人工神经网络(ANN)+BP算法(误差后向传播)+考试例题讲解

     学习链接:分类问题:人工神经网络(ANN)+BP算法(误差后向传播)+考试例题讲解 资料链接:链接:https://pan.baidu.com/s/1ijvMQmwtRgLO4KDSsNODMw  提取码:vyok        神经网络的应用非常的广,它核心思想非常简单,就是人是如何认知感知并且处理这个世界中的现实问题的。我

    2024年01月18日
    浏览(27)
  • 机器学习 day27(反向传播)

    1. 导数 函数在某点的导数为该点处的斜率,用height / width表示,可以看作若当w增加ε,J(w,b)增加k倍的ε,则k为该点的导数 2. 反向传播 tensorflow中的计算图,由有向边和节点组成。从左向右为正向传播,神经网络模型使用正向传播来输出结果 从右向左为反向传播,tensorflow使用

    2024年02月16日
    浏览(36)
  • 机器学习之前向传播(Forward Propagation)和反向传播(Back propagation)

    前向传播(Forward Propagation)和反向传播(Back propagation)是深度学习中神经网络训练的两个关键步骤。 前向传播(Forward Propagation) : 定义 :前向传播是指从神经网络的输入层到输出层的过程,通过输入数据和当前的模型参数,计算网络的输出。 步骤 :在前向传播中,数据

    2024年02月10日
    浏览(40)
  • [ML从入门到入门] 初识人工神经网络、感知机算法以及反向传播算法

    人工神经网络 (Artificial neural networks,ANNs)被广泛认为诞生于 20 世纪四五十年代,其核心理论可以追溯到 19 世纪初 Adrien-Marie Legendre 发明的最小二乘法,而在今天,经过了半个世纪互联网和计算机技术的迅猛发展,这片耕耘良久的沃土重新掀起了机器学习的研究热潮。 本文

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包