神经网络之BP算法【图文并茂】

2023-11-05

神经网络之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)都适应于设置阈值来停止程序的方法。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Python:从javascript按钮获取下载链接

    我正在尝试让我的脚本从 www subscene com 下载字幕 问题是网页上的下载按钮是用java制作的 由于某种原因 即使我提取了URL 我也无法下载字幕 我认为这是下载按钮的代码 a class downloadLink ratin
  • python 中 matlibplot 中散点图的缩放轴

    我正在使用 matlibplot 进行数据可视化 我的绘图共有 6502 个数据值 运行良好 但值接近且密集 例如 我的 y 轴值范围在 3 到 10 之间 我需要清楚地获取它们之间的每个点 即像 9 2 和 9 8 这样的值至少要以 1
  • Pandas 中的索引如何工作?

    我是Python新手 这似乎是一个需要问的基本问题 但我真的很想了解这里发生了什么 import numpy as np import pandas as pd tempdata np random random 5 myseries on
  • 如何使用Python从pdf文件中删除页面?

    我有一些超过 500 页的 pdf 文件 但每个文件中只需要几页 有必要保留文档的标题页 我确切地知道程序应该删除的页数 如何使用安装在 MS Visual Studio 上的 Python 2 7 环境来完成此操作 尝试使用PyPDF2
  • Cassandra:在 session.execute() 期间“无法完成对任何主机的操作”

    卡桑德拉版本 1 2 2Thrift API 版本 19 35 0CQL支持的版本 2 0 0 3 0 1 默认 3 0 1 适用于 python 3 4 的 cassandra 驱动程序使用 sudo 运行 cassandra bin c
  • 加快 pandas groupby 中的滚动总和计算

    我想按组计算大量组的滚动总和 但我很难快速地完成它 Pandas 内置了滚动和展开计算器的方法 这是一个例子 import pandas as pd import numpy as np obs per g 20 g 10000 obs g
  • Django - 403 Forbidden CSRF 验证失败

    我在 Django 中为我的网站提供了一个联系表单 当我在本地测试它时 它工作正常 但现在当我尝试 实时 提交我的联系表单时 它总是出现 403 禁止 CSRF 验证失败 view def contact request if reques
  • Python 的贝叶斯垃圾邮件过滤库

    我正在寻找一个可以进行贝叶斯垃圾邮件过滤的 Python 库 我查看了 SpamBayes 和 OpenBayes 但两者似乎都没有维护 我可能是错的 谁能推荐一个好的 Python 或 Clojure Common Lisp 甚至 Rub
  • 为什么del是Python中的指令而不是方法? [复制]

    这个问题在这里已经有答案了 为什么Python的创建者更喜欢这种语法 指令 del list index 超过这个 方法 list del index 在我看来 这del属于同一 类别 append remove find ETC 因此应该
  • “unicode”对象没有属性“_meta”

    我正在尝试创建一个视图 用户在其中从下拉菜单中选择一个选项 提交它 然后返回一些数据 具体来说 他们将从数据库中的模型中进行选择 并返回该类的所有实例 我使用 django tables2 输出数据 以便可以排序 但这是我的症结所在 Vie
  • 动态组装 Python 模块,动态导入

    我正在努力让自己熟悉importlib钩子 我想实现直接导入用其他语言编写的非Python文件并维护源映射的能力 因此提高SyntaxError带有行号的 s 仍然会给出有意义的堆栈跟踪 我加载外部文件的方法是组装 Pythonic 源代码
  • 访问具有动态名称的变量的值

    我发现了几个主题 其中讨论了在循环中动态创建单个变量是不好的做法 最好使用字典 就我而言 我不需要动态创建它们 我想要access他们在循环中 我不想用字典对于他们来说 因为这些变量在代码中的很多地方使用 并且只有一个地方我需要这种动态访问
  • HTML 和 BeautifulSoup:当结构事先不知道时如何迭代解析?

    我从一个简单的 HTML 结构开始 如下所示 感谢 alecxe 的帮助 我能够创建这个 JSON 字典 u Outer List u Inner List u info 1 u info 2 u info 3 使用他的代码 from bs
  • 保持 WebSocket 连接处于活动状态

    我正在研究 WebSocket 协议 并尝试在后端使用 Python 实现一个简单的 ECHO 服务 它似乎工作正常 但连接建立后立即断开 这是我的客户
  • 从 DST 感知日期时间对象在 Dataframe 中创建 pandas DatetimeIndex

    我从在线 API 收集了一系列数据点 每个数据点都有一个值和一个 ISO 时间戳 不幸的是我需要循环它们 所以我将它们存储在临时的dict然后从中创建一个 pandas 数据帧并将索引设置为时间戳列 简化示例 from datetime i
  • 从 Keras 检查点加载

    我正在 Keras 中训练一个模型 我使用以下代码保存了所有内容 filepath project model hdh5 checkpoint ModelCheckpoint project model hdf5 monitor loss
  • 将人员分配到床位 - 自动化方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我每年都会帮助举办青年营 将与会者分配到卧室是一项艰巨的任务 有 92 个卧室 活动持续一周 与会者停留的时间长短不一 而且床需要重复
  • 在 Django 1.7 中使用 html 发送电子邮件

    In 发送邮件 我们有一个新参数 html message Docs https docs djangoproject com en dev topics email send mail I have 电子邮件 html文件 我想发送我的消
  • Django ALLOWED_HOSTS 与 CORS(django-cors-headers)

    ALLOWED HOSTS 和 CORS 之间有什么区别 如果我定义了 ALLOWED HOSTS 我还需要定义 CORS 吗 我没有使用 django 模板 我也有可能动态定义这两个吗 我认为没有 我使用 django 作为后端 并在不同
  • python函数中的Return语句不返回任何内容[重复]

    这个问题在这里已经有答案了 我不明白退货和打印之间的区别 有人告诉我应该在函数语句中使用 return 但它不会返回任何内容 所以我一直在函数中使用 print 但我想了解为什么我的函数中的 return 语句不起作用 def triang

随机推荐

  • 区分电角度和机械角度

    电角度的区别和联系 以下内容均来自于网络搜索 这里仅用作于自己记录笔记 解释1 机械角度意为空间几何角度 相当于360 电角度是指通过一个完整的周期内电流完成变化 从电磁分布的角度来看 永磁体 或励磁 产生的磁场空间分布呈现周期性变化 一个
  • 《SQL中有关DQL、DML、DDL、DCL的概念与区别》

    SQL Structure Query Language 结构化查询语言是数据库的核心语言 是高级的非过程化编程语言 它功能强大 效率高 简单易学易维护 SQL语言基本上独立于数据库本身 使用的机器 网络 操作系统 基于SQL的DBMS产品
  • 解决使用layui上传文件时提示“请求上传接口出现异常”

    在做网站的过程中 需要用户上传文件 接收文件的接口已经写好 经过测试确定可用 现在需要在网页上提供一个文件上传的按钮 由于原生input type file 组件太丑 考虑使用现成的框架layui 跑到layui官网上查看官方文档进行学习
  • 2023必须掌握的10大Web3技术

    2023必须掌握的10大Web3技术 1 区块链技术 Blockchain Technology 2 智能合约 Smart Contracts 3 物联网 IoT Internet of Things 4 云计算 Cloud Computi
  • git报错fatal: unable to access ‘XXX‘: SSL certificate problem: certificate has expired

    一 问题 在git bash中执行git clone xxx之后 并没有弹出登陆框 而是报以下错误 git报错fatal unable to access XXX SSL certificate problem certificate ha
  • Java中的直接赋值、浅拷贝和深拷贝

    将一个对象的引用复制给另外一个对象 一共有三种方式 第一种方式是直接赋值 第二种方式是浅拷贝 第三种是深拷贝 所以大家知道了哈 这三种概念实际上都是为了拷贝对象啊 直接赋值 好 下面我们先看第一种方式 直接赋值 在Java中 A a1 a2
  • 华为OD机试 - 数组分组(C++ & Java & JS & Python)

    描述 输入int型数组 询问该数组能否分成两组 使得两组中各元素加起来的和相等 并且 所有5的倍数必须在其中一个组中 所有3的倍数在另一个组中 不包括5的倍数 不是5的倍数也不是3的倍数能放在任意一组 可以将数组分为空数组 能满足以上条件
  • pandas.DataFrame.notnull返回非空值

    gt gt gt import pandas as pd gt gt gt df pd read csv test csv gt gt gt print df name id 0 ZhangSan 1 0 1 LiSi 2 0 2 Wang
  • 关于UML时序图与类图的学习(程序开发)

    时序图 时序图可以帮助我们更加清晰地看到一个系统之中各个对象的运行情况 有助于我们 梳理业务代码的结构 梳理一些框架的源码理清启动流程以及各个层次之间的关系 在绘制时序图的时候 我们需要接触七种元素 角色 Actor 对象 Object 生
  • 七. OpenFeign 服务接口调用

    目录 一 基础介绍 二 使用 OpenFeign 调用服务接口的实现步骤 服务提供方 服务消费方 OpenFeign 调用服务超时问题 OpenFeign 日志打印功能 服务消费方 yml 中配置 Feign 调用超时与 Feign 日志
  • 智源论坛:人工智能与国际知识产权

    人工智能作为新一轮科技革命的核心技术 已经成为推动科技创新和经济发展的关键因素 在政策和市场的双重推动下 中国人工智能产业已进入高速发展阶段 技术红利快速释放 创新成果不断涌现 应用领域日益拓展 其中 厘清人工智能与知识产权保护的关系 是确
  • 即时AI设计领跑新视界

    Part1前言 随着人工智能技术的不断发展 越来越多的设计师开始关注AIGC Artificial Intelligence Generated Content 并开始思考AIGC对设计师的影响以及如何运用AIGC即时为设计服务 作为全球首
  • 最新RemObjects,您值得拥有

    最近想学习一下分布式等技术 在网上找了一些资料 为了方便俺记了下来 以下转载自 http blog csdn net chinaeband archive 2009 06 19 4282506 aspx http blog csdn net
  • 中南林注册教育邮箱加获取JetBrains个人许可证,续订许可证

    文章目录 1 注册中南林教育邮箱 1 1 注册 1 2 登录 1 3 speech balloon 有话说 2 注册JetBrains个人账号 2 1 进入登录 注册 2 2 查看邮箱信息 2 3 填写基本信息并提交 2 4 注册成功 3
  • 软件测试的艺术

    软件测试 软件测试 是一个过程或一系列过程 用来确认计算机代码完成了其应该完成的功能不执行其不该有的操作 软件应当是可预测且稳定的 不会给用户带来意外惊奇 更准确的说 测试是为发现错误而执行程序的过程 软件测试的重要原则 编号 原则 0 软
  • Java项目---图片服务器

    图片服务器 gt 服务器 图床 核心功能 上传图片 展示图片等 比如 编写博客时我们会插入图片 本质上是往文章中放了一个链接 URL 这个URL资源在另外一个服务器上 核心知识点 1 简单的Web服务器设计开发能力 Servlet Web服
  • Linux编程(获取系统时间)

    include
  • 事务中间件 CICS 原理及应用开发

    https www ibm com developerworks mydeveloperworks blogs cicschina entry cics transaction gateway69 lang en 事务中间件 CICS 原理
  • 转行IT为什么必须学Python?Python的职业发展是什么?

    Python这个词估计听烂了 那么为什么那么多小伙伴都在学Python呢 Python到底有啥魔力 学了Python都能干啥 为什么有必要学python 1 为什么Python适合作为第一个学习的编程语言 Python语言设计的初衷就是容易
  • 神经网络之BP算法【图文并茂】

    神经网络之BP算法 图说神经网络 BP算法理论推导 例子运用 代码 最近在学习 Deep Learning 这本书 书中在前馈神经网络 全连接神经网络以及卷积神经网络等内容中 都有提到反向传播算法 这一算法可以说是神经网络中求解参数比较核心