基于反向传播算法(BP算法)的前馈神经网络

作者:神秘网友 发布时间:2020-10-05 16:57:42

基于反向传播算法(BP算法)的前馈神经网络

基于反向传播算法(BP算法)的前馈神经网络

这是笔者的第一篇博客,内容或排版上有些许不足,还请各位读者谅解。本文主要对神经网络与深度学习中的前馈神经网络进行了浅谈,内容以整合为主,是笔者通过查阅资料和拜读其他大牛的博客撰写出来的,其中有一些自己的观点和思考,供读者参考。

笔者希望能通过这一篇包括以后所写的博客能够让笔者结交到更多志同道合的朋友,毕竟思想的碰撞才能产生进步的动力,笔者诚挚的希望能够和各位朋友进行交流与讨论。

最后,有不足之处,欢迎大家在下面评论,笔者一定有则改之无则加勉,再接再厉写出更多优质的博客。

人工神经网络是指一系列受生物学和神经学启发的数学模型。这些模型主要是通过对人脑的神经元网络进行抽象,构建人工神经元,并按照一定拓扑结构来建立人工神经元之间的连接,来模拟生物神经网络。在人工智能领域,人工神经网络也常常简称为神经网络或神经模型。
神经网络最早是作为一种主要的连接主义模型。20世纪80年代后期,最流行的一种连接主义模型是分布式并行处理网络,其有 3个主要特性:

(1)信息表示是分布式的(非局部的);

(2)记忆和知识是存储在单元之间的连接上;

(3)通过逐渐改变单元之间的连接强度(即突触权重)来学习新的知识。

连接主义的神经网络有着多种多样的网络结构以及学习方法,虽然早期模型强调模型的生物可解释性,但后期更关注于对某种特定认知能力的模拟,比如物体识别、语言理解等。尤其在引入误差反向传播来改进其学习能力之后,神经网络也越来越多地应用在各种模式识别任务上。随着训练数据的增多以及(并行前馈神经网络是人工智能领域中最早发明使用的简单神经网络类型,也是目前应用最广泛、发展较为迅速的神经网络之一,从人工智能概念诞生之初就开始被人研究,目前在学术理论和实践应用上都达到了较高水平。

二、神经元和激活函数

1、神经元

生物神经元:也称神经细胞,是神经系统最基本的结构和功能单位。它分为细胞体和突体两个部分,突体又分为树突和轴突。一个生物神经元通常具有多个树突和一条轴突,树突用来接受信息,轴突用来发送信息。当神经元所获得的输入信号的积累超过某个阈值时,它就处于兴奋状态,产生电脉冲。轴突尾端有许多末梢可以给其他个神经元的树突产生连接(突触),并将电脉冲信号传递给其它神经元。

简单来说,生物神经元可以用树突来接受信息并通过轴突将信息传递给其他神经元上的树突。当然信息要在细胞体里面进行一定的加工和处理。

人工神经元:简称神经元,是构成神经网络的基本单元,其主要是模拟生物神经元的结构和特性,接受一组输入信号并产出输出。人工神经元的主要组成部分就是激活函数,它相当于生物神经元的细胞体。神经元接收到的信号经过激活函数得到活性值,再传递给下一个神经元,完成信息的传递。

2、神经元传递信息的过程

     假设一个神经元接收d个信号x的加权和:

其中 是d维的权重向量,b为偏置。

净输入z在经过一个非线性函数f(·)后,得到神经元的活性值a:a=f(z)

其中非线性函数就被称为激活函数

3、激活函数

激活函数的作用是对输入的信息进行非线性变换。在神经元和神经网络中,激活函数都扮演着重要的角色。

1、概述

给定一组神经元,我们可以以神经元为节点来构建一个网络,称为神经网络。不同的神经网络有着不同的拓扑结构。一种比较直观的拓扑结构是前馈网络。前馈神经网络是人工智能领域最早发明使用的简单神经网络类型,也是目前应用最广、发展较为迅速的神经网络之一,从人工智能的概念诞生之初就被人研究,目前在学术理论和实践中都达到了较高的水平。

前馈神经网络作为一种简单的神经网络形式,各个神经元按照层次结构分层排列,层与层之间通过“全连接”进行连接并且层与层之间没有反馈,层内的神经元之间没有任何连接,其中第0层被称为输入层,最后一层是输出层,中间其他层称为隐藏层。整个神经网络结构无反馈,可以用一个有向无环图表示。

注意:无反馈并不意味着神经网络中的参数没有反向传播(实际上参数的学习正依赖于反向传播),而是指神经网络的拓扑结构上不存在环路或者回路。

前馈神经网络也经常被称为多层感知器,但这种叫法并不是十分合理,因为前馈神经网络其实是由多层的Logistic回归模型(连续的非线性函数)组成,而不是由多层的感知器(不连续的非线性函数)组成。

2、前馈神经网络三层结构的特点

输入层:

  • 输入层神经元接收来自外部的多个信息,通常是一个N维实数向量X。
  •  一般来说,FNN的输入层神经元仅起到信息传递作用,每个节点对应1维信息,然后将该节点信息根据权重传递到第二层神经元。中间没有激活过程。
  • 主要是起到一个信息通路作用。

隐藏层

  • 所谓隐含层,是指其中神经元的状态在输出端无法直接观测,看起来是“隐藏”的。
  • 在FNN中,隐含层均为 标准神经元,带有sigmoid激活函数,其输入的权重需要学习得到。
  • 输入层与隐含层、两个隐藏层之间所有神经元均存在连接,即后一层的每个神经元接受到的输入信号为前一层所有神经元的输出加权和,又称为全连接。
  • 同层的神经元之间不存在连接,这样保证了信息可以逐层向下传递,前馈神经网络由此得名。

 输出层

  • 可以由一个或多个神经元组成
  • 输出结果可以是向量,也可以是二值编码,取决于所要解决的问题。

3、前馈神经网络中信息传递的过程

符号表示:

L:表示神经网络的层数;

       前馈神经网络通过下面公式进行信息传播:

这样,前馈神经网络可以通过逐层的信息传递,得到网络最后的输出其中W,b表示网络中所有层的连接权重和偏置。

四、参数学习(或者称为参数更新)与梯度下降法

1、FNN中的前馈计算

对于一个输入特征向量X,输入层根据权重将输入信号分配给第一个隐含层,第一个隐含层根据该信号计算每个神经元的激活“强度”,并传递给下一层,经过多层传递,逐渐把信息传递给输出层,最终求得输出结果。整个过程中,信号单向向前”馈送“。

2、FNN中的学习问题

给前馈神经网络输入一个N维信号X,最终能在输出端得到一个期望值,但这个期望值跟实际值之间往往会存在误差,这并不完全符合我们的要求,所以对前馈神经网络要进行参数学习,通过更新其中的参数从而使最后的结果更贴合实际值。

前馈神经网络的参数更新主要体现在权重的更新以及偏置的更新上。本文重点讲解用梯度下降法来实现参数的迭代和学习。实际上梯度下降法也是前馈神经网络中最常用的参数学习方法之一。

3、梯度下降法

实现参数学习的目的是让模型的预测值与实际值之间的差值尽可能的小。用损失函数来量化模型预测与真实标签之间的差异,计算经验风险(即在训练集上的平均损失)并使其尽量的小。梯度下降法则是实现经验风险值尽可能小的较好选择。

损失函数使用交叉熵损失函数,下面讲解梯度下降法的原理和流程。

对于样本(x,y),其交叉熵损失函数为:

有了学习准则和训练样本,网络参数就可以通过梯度下降法来进行学习,在梯度下降法的每次迭代中,第l层的参数其中的α为学习率。

从上面可以看出,梯度下降法需要计算损失函数对参数的偏导数如果通过链式法则逐一对

每个参数进行求偏导比较低效。在神经网络的训练中经常使用反向传播算法来高效地计算梯度。

五、反向传播算法

反向传播算法,也称误差反向传播算法、BP算法,是用来求解误差项的绝佳选择,从输出、层开始计算一步步逆向推导出神经网络各层的误差项,从而计算目标函数对各参数的偏导进而进行迭代更新。

有关反向传播算法这一块的内容笔者在此不过多赘述,想进一步了解的读者可以参考邱锡鹏的《神经网络与深度学习》第四章内容,讲的非常详细,有兴趣的朋友可以去了解一下。

注意:反向传播算法在前馈神经网络中占有重要地位,甚至可以说是整个前馈神经网络中的核心,建议感兴趣的朋友了解一下!

我们所讨论的前馈神经网络的核心是梯度下降法,而梯度下降法的核心是BP算法,换言之,BP算法出现的问题会直接影响到整个前馈神经网络的性能。

实际上,5层以内的神经网络,我们可以用BP算法训练,5层以上的神经网络用BP算法训练就很不理想了。深度结构(涉及多个非线性处理单元层)非凸目标函数中普遍存在的局部最小是训练困难的主要来源。

BP算法存在的另一个问题是梯度消失问题。在神经网络中误差反向传播的迭代公式为:

误差从输出层反向传播时,在每一层都要乘以该层的激活函数的导数,当我们使用Sigmoid型函数,Logistic函数σ(x)或Tanh函数时,其导数为:

Sigmoid函数导数的值域小于或等于1,如图4.11所示:

由于Sigmoid型函数的饱和性,饱和区的导数更是接近于0,这样误差经过每一层传递都会不断衰减。当网络层数很深时,梯度就会不停的衰减,甚至消失,使得整个网络很难训练。这就是梯度消失问题,有时也称为梯度弥散问题。

在深层神经网络中,减轻梯度消失问题的方法有很多种,一种简单有效的方法是使用导数比较大的激活函数,比如ReLU函数。

机器学习在本质上就是找到一个好用的函数。

而人工神经网络最牛的地方就在于它能在理论上证明:一个包含足够多隐含层神经元的多层前馈神经网络,能以任意精度逼近任意预定的连续函数。

这个定理也就是下面我们要说的通用近似定理:

根据通用近似定理,神经网络在某种程度上可以作为一个“万能”函数来使用,可以用来进行复杂的特征转换,或逼近一个复杂的条件分布。即不管函数f(x)在形式上有多复杂,我们总能确保找到一个神经网络,对任何可能的输入,以任意高的精度近似输出f(x)(即使函数有多个输入和输出,即f(但使用通用近似定理要注意几点:

  • 通用近似定理可以以任意精度去近似任意连续函数,但它不能准确的计算出这个函数,我们只能通过增加隐含层神经元的个数来提升近似的精度。
  • 被近似的函数,必须是连续函数,如果函数不连续,那通用近似定理或者说是神经网络就很难去近似了。

即使函数时连续的,有关神经网络能不能解决所有问题也是有争议的。深度学习新星、生成对抗网络的提出者伊恩·古德费洛就曾说过:“仅含有一层的前馈神经网络的确足以有效的表示任何函数,但这样的网络结构可能会格外庞大,进而无法正确的学习和泛化。”

事实上,通用近似定理早在1989年就被提出了,直到到2006年深度学习开始厚积薄发,这期间神经网络并没有因为这个理论而得到蓬勃发展。在一定程度上也证实了伊恩·古德费洛的结论。

所以,神经网络往深的方向发展才是正道,这也就是深度学习的重要性。

有关更多神经网络与深度学习的内容,可以参考几本资料:

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

《神经网络与深度学习》吴岸城(内容上不如邱锡鹏那一版的深奥,但胜在入门门槛低,讲的也比较有趣,适合科普读物。)

《深度学习之美》张玉宏

基于反向传播算法(BP算法)的前馈神经网络相关教程

  1. 物联网基于RSSI的无线传感器网络距离修正定位算法

    【物联网】基于RSSI的无线传感器网络距离修正定位算法 对于大多数无线传感器网络应用来说,没有位置信息的数据是毫无意义的。无线传感器网络目标定位跟踪的前提是节点自身定位。无线传感器网络节点定位算法可分为基于距离和距离无关两大类,基于距离的定位算

  2. 【项目实战】基于Yolov5 火灾浓烟检测与天池免费算力的教学篇

    【项目实战】基于Yolov5 火灾浓烟检测与天池免费算力的教学篇 文章目录 免费算力,白嫖党顶级薅羊毛! 一 阿里天池的使用篇 二 开启我们在天池服务器的第一个项目: 火灾浓烟与吸烟检测 2.1 演示 2.2 介绍 三 模型训练 四 天池端训练 五 总结与技巧 六 总结

  3. Python 基于距离的噪声检测实践

    Python 基于距离的噪声检测实践 基于距离的噪声检测 from numpy import * #导入numpy的库函数import numpy as nps1=np.array([1,2,0])s2=np.array([3,1,4])s3=np.array([2,1,5])s4=np.array([0,1,6])s5=np.array([2,4,3])s6=np.array([4,4,2])s=np.array([s1,

  4. 基于docker consul服务发现集群搭建

    基于docker consul服务发现集群搭建 基于docker consul服务发现集群搭建 一、Consul简介 Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。它具有很多优点。包括:基于raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP

  5. 基于scrapy的爬虫项目

    基于scrapy的爬虫项目 基于scrapy的爬虫项目——爬取学校新闻页为例 scrapy爬虫框架简介 新闻页面html分析 一级页面爬取 二级页面爬取 json格式转换为csv格式 结果展示 网络上各种scrapy的简介有很多,列举一个如下: https://blog.csdn.net/zjiang1994/artic

  6. 初识Netty -- 基于Netty的DayTime时间服务器

    初识Netty -- 基于Netty的DayTime时间服务器 1. 关于Netty的基本认知: 在 JDK 1.4推出Java NIO之前,基于Java的所有Socket通信都采用的BIO(同步阻塞式IO),同步阻塞式IO存在巨大的性能和可靠性瓶颈,无法适用于高性能服务器的开发。虽然后来出现了伪异步I

  7. 深度学习入门

    深度学习入门 深度学习入门:基于python的理论与实现 2 感知机perceptron 感知机是由美国学者 Frank Rosenblatt 在 1957 年提出来的。 感知机也是作为神经网络(深度学习)的起源的算法。 感知机接收多个输入信号,输出一个信号。 输入信号被送往神经元时,会

  8. 基于carla和python的自动驾驶仿真系列6

    基于carla和python的自动驾驶仿真系列6 欢迎来到自动驾驶汽车/自动驾驶汽车的第6部分,以及使用Carla、Python和TensorFlow增强学习。在这一部分中,我们将讨论我们工作的一些初步发现。我将使用“我们”这个短语,因为这是我和Daniel Kukiela共同努力的结果。