神经网络之BP算法(图说神经网络+BP算法理论推导+例子运用+代码)

最近在学习《Deep Learning》这本书,书中在前馈神经网络、全连接神经网络以及卷积神经网络等内容中,都有提到反向传播算法,这一算法可以说是神经网络中求解参数比较核心的部分了。为了更好地理解神经网络工作的原理,认识反向传播在神经网络中的运算机制,在综合《Deep Learning》书中的有关部分并且学习了b站讲解神经网络的相关视频及一些有关于BP算法的博客文章之后,笔者将自己的理解写下来,希望能为初学者理解反向传播算法起到一定的帮助。

关于反向传播算法,我们首先需要清楚它的应用途径;其次,做一些神经网络知识的前期储备;之后,学习BP算法的工作原理;最后,认识到BP算法的局限性,了解改进方法。因此,本文从这4个点来讲解,划分为6部分:

1、 反向传播算法应用领域

反向传播算法应用较为广泛,从字面意思理解,与前向传播相互对应。在简单的神经网络中,反向传播算法,可以理解为最优化损失函数过程,求解每个参与运算的参数的梯度的方法。在前馈神经网络中,反向传播从求解损失函数偏导过程中,步步向前求解每一层的参数梯度。在卷积神经网络中,反向传播可以求解全连接层的参数梯度。在循环神经网络中,反向传播算法可以求解每一个时刻t或者状态t的参数梯度(在RNN\LSTM\GRU中,反向传播更多是BPTT)。笔者如今对于BP的理解,认为是在优化损失函数或者目标函数过程中,求解参与运算的参数的梯度方法,是一种比较普遍的说法。

2、准备知识–反向传播(BP)算法应用于神经网络

反向传播(BP)算法在深度学习中,应用广泛。这里仅以前馈神经网络中的BP算法作为介绍。神经网络是一个由输入层、隐藏层、输出层三部分组成的网络,如图(1):数据从输入层,经过权重值和偏置项的线性变换处理,再通过激活层,得到隐藏层的输出,也即下一层的输入;隐藏层到输出层之间是,经过权重值和偏置项的线性变换,之后通过激活层,得到输出层。

图表示一个网络层为2的前馈神经网络:一个隐藏层,一个输出层;隐藏单元为5,记输入层到隐藏层的权重值为W,偏置项为b1,激活函数为g1,隐藏层到输出层的权重值为V,偏置项为b2,激活函数为g2,则图2的模型即为:

图是一个比较简单的神经网络,通常,我们见到的神经网络,是具有多个隐藏层的网络,如图3:这是一个隐藏层个数为N个,每层隐藏单元数为5的神经网络。(PS:隐藏层设计,可以考虑层数设计和隐藏单元设计,可根据自己的需要自行设计。)

从输入层到隐藏层再到输出层,这一向前传递的过程,我们称之为前向传播。前向传播过程,往往是我们设定模型的过程,也可以理解为设定数学表达式或者列方程的过程。

3、BP算法原理及其实施步骤

BP算法的核心思想:使用梯度下降来搜索可能的权向量的假设空间,以找到最佳的拟合样例的权向量。具体而言,即利用损失函数,每次向损失函数负梯度方向移动,直到损失函数取得最小值。

或者说,反向传播算法,是根据损失函数,求出损失函数关于每一层的权值及偏置项的偏导数,也称为梯度,用该值更新初始的权值和偏置项,一直更新到损失函数取得最小值或是设置的迭代次数完成为止。以此来计算神经网络中的最佳的参数。

由此,正式介绍BP算法前,我们需要知道前向传播过程,确定网络的设计。为此先设定一个只有一层的神经网络,作为讲解,如图所示:

设定:从输入层数据为X,输入层到隐藏层参数为w,b1,隐藏层到输出层参数为v,b2,激活函数用为g1,g2。于是模型设定为:

输入层到隐藏层:

隐藏层到输出层:

模型:

损失函数:

其中:

以上述的模型设定为例,下面介绍BP算法步骤,通过BP算法的步骤,了解反向传播,是如何实现模型的参数更新。

实施步骤:

1)初始化网络中的权值和偏置项,分别记为

2)激活前向传播,得到各层输出和损失函数的期望值

其中,y表示真实值,y^表示预测值,1/2表示对总的误差值取平均,所以一般情况下,输出单元多少维,误差值求平均就除以多少;本模型设定中,输出值为2维列数据,故用误差值除以2。一般情况下,损失函数的期望值表示为:

这是一组n维数据的输出,若是有m组这样的数据,损失函数的期望值为:

若真实值与输出值表示为y和y^上式可表示为:

一般情况下,输出数据为1维或是2维,输出的数据有多组。

3)根据损失函数,计算输出单元的误差项和隐藏单元的误差项

输出单元的误差项,即计算损失函数关于输出单元的梯度值或偏导数,根据链式法则有:

隐藏单元的误差项,即计算损失函数关于隐藏单元的梯度值或偏导数,根据链式法则有:

PS: 对于复合函数中的向量或矩阵求偏导,复合函数内部函数的偏导总是左乘;对于复合函数中的标量求偏导,复合函数内部函数的偏导左乘或者右乘都可以。

4) 更新神经网路中的权值和偏置项

输出单元参数更新:

隐藏单元参数更新:

其中,\eta表示学习率,k=1,2,…,n表示更新次数或迭代次数,k=1表示第一次更新,以此类推。此处可能和别处博客不太一样,但实质是一样的,此处的’+‘或者’-'主要取决于损失函数.

如何定义损失函数或者定义参数更新均可,但参数的更新一定是向参数的负梯度方向。

5) 重复步骤2-4,直到损失函数小于事先给定的阈值或迭代次数用完为止,输出此时的参数即为目前最佳参数。

这便是BP算法的一个具体步骤,下面我们详细介绍BP算法步骤中的每一步:

步骤1)初始化参数值(输出单元权值、偏置项和隐藏单元权值、偏置项均为模型的参数),是为激活前向传播,得到每一层元素的输出值,进而得到损失函数的值。参数初始化,可以自己设定,也可以选择随机生成;一般情况下,自己写代码或者调用tensorflow或keras时,都是随机生成参数。因为初始参数对最终的参数影响不大,只会影响迭代的次数。

步骤2)在步骤1的基础上,激活前向传播,得到net_{1},h,net_{2},\hat{y}的值,进而得到的值;其中的计算,根据前面模型设定中的公式计算。计算这些值是为计算步骤3中的误差项。

步骤3)计算各项误差,即计算参数关于损失函数的梯度或偏导数,之所以称之为误差,是因为损失函数本身为真实值与预测值之间的差异。计算参数的偏导数,根据的是微积分中的链式法则。具体推导如下:

输出单元的误差项:输出单元v与损失函数E,不是直接相关,而是通过复合函数的形式关联,以设定的模型为例:

其中E(v,b{2})表示损失函数化为与参数v,b2相关的表达式。

根据链式法则,输出单元v与损失函数E的误差项为:

求出上式中每一个偏导:


其中,net{2}关于激活函数g{2}求偏导,需要根据具体的激活函数而定,每一层的激活函数可以选择不同的函数,一般情况下,为简单化模型设计和求导方便,会设定为同一个函数。此处假设选择激活函数为sigmoid函数,那么有:

PS:因为sigmoid(z)中z是标量,对z求偏导,有:

本文定义了z为向量,对于向量就有了式(3-17)的逐元素相乘的式子。

于是,为简化后面的计算,记

其中,S ^{(k)}表示第k次求损失函数关于net{2}的偏导;*表示逐元素相乘,即两个向量或两个矩阵对应的元素相乘,例如:

于是,输出单元的误差项为:

此处说明:若遇式(3-15)的偏导(对权值求偏导),链式法则处理方式均如式(3-19);若遇式(3-16)的偏导(对偏置项求偏导),链式法则处理方式均如式(3-20)。

隐藏单元的误差项:隐藏单元w与损失函数E,通过复合函数的形式关联,以设定的模型整理为:

根据链式法则,隐藏单元w与损失函数E的误差项为:

同样的求导法则,得到隐藏单元的误差项为:

其中:

说明:若遇式(3-25)(对隐藏单元求偏导),链式法则处理如式(3-23);式(3-15)和(3-26)同,故有相同的处理方式;式(3-16)和(3-27)同,故有相同的处理方式。

补充:若有多个隐藏层时,逐步计算隐藏层的权值和偏置项误差,推导的规则同上。例如:一个隐藏层为2,隐藏单元为5的神经网络:

实例运用

1、前向运算

2、反向传播

3、反向传播与参数更新

BP算法缺陷与改进

BP算法缺陷:

1)局部极小值

对于多层网络,误差曲面可能含有多个不同的局部极小值,梯度下降可能导致陷入局部极小值。

2)权值过多

当隐藏节点过多,层数越多时,权值成倍增长。权值的增长意味着对应的空间维数的增加,过高的维数易导致训练后期的过拟合。

3)容易过拟合

训练的次数过多、空间维数过高均容易过拟合。

BP算法改进:

1)利用动量法改进BP算法

动量法权值调整算法的具体做法是:将上一次权值调整量的一部分迭加到按本次误差计算所得的权值调整量上,作为本次的实际权值调整量,即:

其中,\bta表示动量系数,\eta表示学习率。

2)自适应调整学习率

调整的基本指导思想是:在学习收敛的情况下,增大\eta以缩短学习时间;当\eta偏大致使不能收敛时,要及时减小它的值,知道收敛为止。此方法适用于设置阈值的情况下。

3)动量-自适应学习速率调整算法

采用动量法,BP算法可以找到更优的解;采用自适应学习速率法时,BP算法可以缩短训练时间。将以上两种方法结合起来,就得到动量-自适应学习率调整算法。

上述2)和3)都适应于设置阈值来停止程序的方法。

致谢:请给小编一点爱心!!!

神经网络之BP算法【图文并茂】相关推荐

  1. ML之NN:利用神经网络的BP算法解决XOR类(异或非)问题(BP solve XOR Problem)

    ML之NN:利用神经网络的BP算法解决XOR类(异或非)问题(BP solve XOR Problem) 目录 输出结果 实现代码 输出结果 实现代码 #BP solve XOR Problem im ...

  2. python bp神经网络 异或_【神经网络】BP算法解决XOR异或问题MATLAB版

    第一种 %% %用神经网络解决异或问题 clear clc close ms=4;%设置4个样本 a=[0 0;0 1;1 0;1 1];%设置输入向量 y=[0,1,1,0];%设置输出向量 n=2 ...

  3. bp神经网络算法的优缺点,bp神经网络与bp算法区别

    前馈神经网络.BP神经网络.卷积神经网络的区别与联系 一.计算方法不同1.前馈神经网络:一种最简单的神经网络,各神经元分层排列.每个神经元只与前一层的神经元相连.接收前一层的输出,并输出给下一层.各层 ...

  4. 全连接神经网络的BP算法(BP神经网络模型)与卷积神经网络的BP算法

    1.神经网络模型 1.1神经网络模型的演变: 神经元模型------->感知机模型------->神经网络模型 神经元模型:1943年,W.S.McCulloch和W.Pitts根据生物学 ...

  5. 从神经网络到BP算法(纯理论推导)

    作者述:之前有学习过一遍,但是一段时间过后,很多细节地方已经模糊.最近重新推导了一遍,为了尽可能保留推导思路,特地写作此博文.一方面供自己日后回忆,另一方面方便跟大家交流学习. 关于本博文,说明如下: ...

  6. 深度学习系列:全连接神经网络和BP算法

    前言 注:以后我的文章会写在个人博客网站上,本站文章也已被搬运.本文地址: https://xiaodongfan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E ...

  7. 神经网络之BP算法学习记录(大多借鉴于《神经网络与机器学习——邱锡鹏》)

    神经网络之BP算法 神经网络 前馈神经网络 反向传播算法 损失函数 梯度下降法 梯度下降法在前馈神经网络中的应用 反向传播算法中的梯度下降法 反向传播算法MATLAB示例 使用newff建立神经网络 ...

  8. 深度学习——神经网络之DNN全连接神经网络、BP算法原理

    深度学习--神经网络之DNN全连接神经网络.BP算法原理 深度学习--神经网络之DNN全连接神经网络.BP算法原理 1.啥是人工神经网络 2.神经网络的应用 3.神经网络的组成 3.1.神经元 3.2 ...

  9. 机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)

    目录 一.理论知识回顾 1.神经网络模型 2.明确任务以及参数 1)待估参数: 2)超参数: 3)任务 3.神经网络数学模型定义 1)激活函数 ​ 2)各层权重.阈值定义 3)各层输入输出定义 4.优 ...

  10. 入门讲解:使用numpy实现简单的神经网络(BP算法)

    用pytorch跟tensorflow实现神经网络固然爽.但是想要深入学习神经网络,光学会调包是不够的,还是得亲自动手去实现一个神经网络,才能更好去理解. 一.问题介绍 传说中线性分类器无法解决的异或 ...

最新文章

  1. java 三角依次递增在递减_java中用for循环怎样打印三角行啊,主要是不理解什么情况外层循环递增什么时候递减,如等腰三角形...
  2. 通过History Trends Unlimited通过统计台式机Edge浏览器Top10网页历史访问量(截止至2021.11.23)
  3. 学术好帮手Publons使用指南
  4. java nio socket长连接_netty学习实战—实现websocket长连接和socket之间进程通信
  5. 一个略显复杂的transformation算子_distinct
  6. python闭环最短路径_最短路径算法的实现(dijskstra):Python
  7. strcat在某种特定条件下的优化
  8. TensorFlow神经网络(三)神经网络优化
  9. 【第四次JAVA课,java语法基础】课件总结
  10. SQL执行异常系列之——绑定变量窥探导致的执行异常
  11. JAVA(三)java基础知识
  12. 物流仿真在AGV调度方面应用案例
  13. 小程序的优势和劣势是什么?
  14. 猴子摘香蕉-人工智能实验的思考
  15. 如何入门Python与机器学习
  16. 【清华大学陈渝】 第十一章_死锁
  17. 记一次扩容U盘修复(主控: ChipsBank(芯邦))
  18. 阿里飞冰的介绍以及使用
  19. linux 开源视频剪辑,Linux 上的开源视频剪辑软件Olive
  20. 如何恢复误删除的微信聊天记录?看完这个技巧分享保证你一清二楚!

热门文章

  1. layoutit+Bootstrap html页面布局+CSS
  2. YYText 库学习总结
  3. 数据结构C语言双向循环链表,数据结构和算法(双向链表和双向循环链表)
  4. **容易混淆的4中park变换**(转载)
  5. IBM人工智能进入法律行业:推世界首位AI律师ROSS
  6. 最大子段和(动态规划算法)
  7. 纽泰格深交所上市:市值52亿 扣非净利下降52%
  8. ofd软件linux,数科和福昕OFD软件同银河麒麟桌面操作系统完成互相兼容认证
  9. 思科模拟器5506防火墙配置_企业办公网络配置不求人之三——端口映射
  10. Excel中关于数组函数的研究