由宏观到细节谈谈BP神经网络搭建

序言

自从最近十几年深度学习开始迅速发展以来,越来越普及的应用于我们的生活,在一次竞赛中接触了一些深度学习的东西以后,对神经网络有了一些兴趣。
我一开始觉得神经网络很难,内心有畏惧感,总觉得入门很难,但是慢慢的接触下来,觉得其实也没有想象的那么难,网络上面流传的一些讲BP神经网络的帖子都会讲到一些很深奥但是却无关紧要的东西,本文旨在抓住BP神经网络搭建的主要矛盾,忽略一些搭建的次要矛盾,来实现从整体上把握BP神经网络的思想。

另外笔者断断续续的学了机器学习几个月了,想想还是阶段性的总结一下,疏漏之处希望评论区大神进行批评指正,只有在批评中才可以不断的提高自己。

引言

首先要先引入神经网络的概念。

人工神经网络: 是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。在工程与学术界也常直接简称为“神经网络”或类神经网络。

英文名字叫做Neural Network,有时候也简称NN比如卷积神经网络(Convolutional Neural Networks)就叫做CNN。

是不是感觉很晦涩难懂?

对!
我也感觉特别的难理解。数学上的定义虽然保证的严谨性,但是对我这样的小白来说真的真的不友好。那我重新组织一下语言。

人工神经网络: 指计算机模仿大脑神经网络,采用一系列函数的映射与传递的关系,创造的一个能完成设计者的目的的黑箱模型。

说了半天也不如图形象,不说了,上图:
BP神经网络模型这就是一个BP神经网络模型(箭头表示正向传播),x是特征,一般实际应用中有多个特征输入,但是为了方便叙述,我这里先采用一个输入x,回归方式采用logistic回归
(logistic回归没听过没关系,我后面会讲到,目前只需要知道logistic回归用于二元分类任务就行)。

模型解读

首先介绍一下图片,图片中有一个输入X,7个神经元,组成了三层神经网络,输出了预测值y hat。

因为采用logistic回归,所以我们以二元分类任务为例,二元分类任务简单来说,就是判断一张图片中有没有目标A。

我们的神经网络要实现的目标:

如果神经网络预测有A,
则 y hat ≈ 1;
如果神经网络预测没有A,
则 y hat ≈ 0;

也可以理解y hat 就是神经网络对图片中有A的概率的评估。单纯从功能来看,是不是很神奇,似乎神经网络实现的像人一样的判断,但其实就是对图片特征的一种函数映射。
在这里插入图片描述就是这么一回事,我们就是要完成一个目标:
训练出一个合适的F(),使得F()对含有A的x输出1,对不含有A的x输出0。
换句话说,算了,还是上图吧。

原点表示训练集中有A的,三角形点表示训练集中无A的,实线表示神经网络的划分曲线。
划分
首先需要说明一下,logistic回归使用的函数(sigmoid函数)使得对于任意输入X只会输出0和1区间的y hat,假设k=|y hat - 0.5|为神经网络判断图像是否有A的确定度,越接近0.5说明神经网络越不确定自己的判断,图中的分界线就越粗。
现在我们可以知道训练要完成的目标了:

1.训练出一个合适的函数,使得F()产生的分界线能够尽可能的对输入做出正确的判断。
2.通过一定的方法,使得F()产生的分界线尽可能的细,即神经网络的确定度尽可能的大。

完成这个目标,就可以实现的神经网络的对图像有无A的判断。

具体实现

现在我们实现我们得想办法实现训练要到达的目标。
先说下我们接下来会讲到的关键字:

logistic回归(sigmoid函数)
梯度下降算法(正向传播,反向传播) PS:顺便简单讲讲梯度消失和非凸函数的问题
归一化

正式开始我们的搭建BP神经网络之旅

(为了方便叙述,我先暂时不考虑正则化,以后会写关于正则化的详细讲解)

1. 设置神经元基本结构

我们先假设每个神经元都是线性函数,即y=wx+b的形式,y是神经元的输出,x是神经元的输入,w和b是我们需要训练得到的参数。但是我们会发现一个问题,如果每一个神经元都是线性函数组成,那么整个神经网络不过是若干个线性函数的推进,难以实现拟合任意数据的目标, 直白的说,就是不能形成任意的上图的分割线,会导致神经网络的识别正确率维持在一个较低的水平。

那这怎么办呢?
我们必须引入非线性函数,就是所谓的激活函数

也就是说,我们的神经元必须长这样。
在这里插入图片描述
接受x1作为输入,然后经过线性处理形成z,在经过g()函数进行激活,形成并输出x2,x2再作为下一个神经元的输入。

那这个g()怎么选择呢?幸好,在我们前面有很多伟人帮我们解决了很多的困难,在很多次试验后,前人发现,sigmoid函数是一种很好的激活函数。
那提到了这么多次sigmoid函数,他到底长什么样呢?
在这里插入图片描述

就是这样的一个函数,为什么这个函数激活效果比较好呢?

单纯看函数式子也基本上很难解释,但是图像就简单明了了。
在这里插入图片描述
发现什么了吗?
对!函数的输出全部分布在(0,1)这个区间,刚好和我们要求的y hat吻合了。这不正是我们需要的函数吗?

好,那我们现在就完成了神经元函数的基本结构设置,现在的问题是每个神经元的w,b怎么设置的问题了。

2.正向传播

前面我们已经完成了神经元的基本设置,现在就是求每个神经元的w和b的问题。
w和b如何得到呢?训练得到。
具体思路是我们先给每个神经元随机初始化一个w和b,然后通过训练不断的调整w和b,最终尝试找到一个最优的w和b,来实现神经网络的性能的提高。

正向传播,就是给神经网络我们收集的数据,让数据经过若干层神经网络后,产生预测值y hat。

y hat可能和我们的真实值y很接近,也可能和我们的真实值y相差很远。
为了方便定量表示损失值,我们引入损失函数的概念。
δ=-)这个式子也有另一个名字,叫做二进制交叉熵。

当y hat = y =1时,δ=0;
当y hat = 1,y = 0 时,δ=∞;

因为数据集一般不止一个,所以我们再引入成本函数的概念:

对m个数据的损失函数取均值,可以得到成本函数。

得到成本函数以后,说明我们的一遍正向传播已经完成,现在,开始我们的反向传播,调整w和b。

说明一下,成本函数既用于评估训练的结果,也用于神经网络的反向传播。

3.反向传播

在经历正向传播以后,我们得到了y hat。
正向传播是x的主场,反向传播则是y hat的主场。
由于函数导数的传递性,即
在这里插入图片描述在有了上面这些理论支持以后,现在开始我们的梯度下降
(由于篇幅限制,梯度我就不解释了,不清楚的同学可以去翻翻高数书的下册,里面有很详细的解释。)

更加上述的原理进行反向求导,可以求得
d( z ) = y hat - y
d( w ) = x * d(z)
d( b ) = d(z)

然后更新w和b

w = w - α * d(w)
b = b - α * d(d)

其中α为学习率,目的是设定神经网络在每一次梯度下降时对于样本的学习情况,这个参数也是需要在多次训练中调试来找到最优的。太大的学习率可能导致对某个错误判断样本的过度学习(这主要产生在训练前期),引起梯度难以以较好的情况下降;太小的学习率则可能导致训练后发现神经网络基本上没学到东西。 这都是训练网络是要考虑的东西。

为什么这样更新w和d可行呢?
在这里插入图片描述

之前提到,神经网络是一个函数,现在我们固定住x(之前我们是以x为自变量),现在我们把w和b看做自变量,为了得到较好的训练结果,即成本函数尽可能的接近于0,我们需要找成本函数的最低点。梯度下降可以帮助我们找到最低点(具体论证可以参考高数下)。
但是我们的运气总不是那么好,一般神经网络构造的函数都不是单纯的凸函数,在不合适的学习率下,可能会导致我们的函数在一定次数的梯度下降后进入了一个局部最优解,然后就凉凉,训练的结果会非常差。这就引起了人们对于非凸优化问题的探讨,有兴趣的同学可以去网上查查,其实关于非凸优化的方法还有挺有意思的。

4.迭代训练

然后不断的重复步骤三和步骤四,就完成了BP神经网络的训练过程。
看到这里,相信小伙伴们应该都明白了为什么这个网络叫BP神经网络了吧,没错,就是反向传播神经网络(Back Propagation Neural Network),是一种前馈神经网络。

这里最后在引入一下梯度消失问题:
在这里插入图片描述

可以看到,由于是从后往前导数传递的反馈,在神经网络层数过深时,输入的x产生改变后,经过前面一系列神经网络的处理,传递到最后几层神经网络时,可能和前一次训练传递到这里时的数据差异特别小, 由于神经网络是靠特征进行训练,极小的差异带来的是深层神经网络难以区分每个输入x的特征,所有的输入连起来几乎是一条平滑曲线,导致梯度下降训练效果几乎没有,这就是梯度消失问题。 一样,现在的很多研究者都有对付梯度消失的办法,比如残差连接等等的,也特别有意思,有兴趣的小伙伴也可以去看看这些论文。

总结

整个BP网络其实就一句话:
正向传播,反向更新

花了一天时间写了这个文章,现在就基本上简单的把BP神经网络讲了一下,因为笔者也是一个大二的学生,接触这些东西的时间也还比较短,有纰漏之处在所难免,如果有错,希望各位大神在评论区骂的轻一点(手动滑稽)

不过我内心坚强(装的),不管再怎么骂,我过段时间还是会把如何正则化的博客发出来的,这段时间准备物理考试要紧。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 复数bp神经网络搭建与实现与实数bp神经网络类似,只是在计算过程中需要使用复数运算。具体来说,可以将输入、权重和偏置等参数都表示为复数形式,并使用复数的加、减、乘、除等运算进行计算。同时,还需要使用复数的共轭和模等运算来进行反向传播算法的计算。在实现过程中,可以使用现有的复数库或自行编写复数运算函数来实现复数bp神经网络搭建。 ### 回答2: 复数bp神经网络是一种能够处理复数类型数据的人工神经网络。在搭建复数bp神经网络时,我们需要考虑以下几个关键步骤。 首先,我们需要定义神经网络的结构。复数bp神经网络的结构与传统bp神经网络类似,包括输入层、隐藏层和输出层。每一层都由多个神经元组成,每个神经元都会对输入的复数数据进行加权和激活输出。 其次,我们需要确定各层之间的连接权重。这些权重将在训练过程中被优化,以使网络能够准确地学习和预测复数数据。在训练之前,我们可以使用随机初始化的方式为这些权重设置初始值。 接下来,我们需要定义误差函数。误差函数用于衡量网络的输出与真实值之间的差距。对于复数数据,可以使用欧氏距离或其他适合复数的距离度量来计算误差。 然后,我们可以开始进行网络的训练。在训练过程中,我们将复数数据输入网络,并根据误差函数计算的梯度来更新连接权重。通常使用梯度下降算法或其变种来进行权重的更新。 最后,我们需要确定网络的停止条件。可以设置一个合适的训练轮数或当网络输出达到预先设定的阈值时停止训练。 总结来说,搭建复数bp神经网络需要确定网络结构、连接权重、误差函数以及训练和停止条件。在实践中,还需要对网络进行适当的调参和验证,以获得最佳的网络性能。 ### 回答3: 复数BP神经网络是一种搭建复杂模型的方法,下面是一个基本的步骤: 1. 定义网络结构:首先确定网络的层数和每层的神经元个数。通过分析问题的复杂性和输入输出的要求来决定网络的规模和深度。 2. 初始化权重和偏置:为每一层的神经元随机初始化权重和偏置。可以使用正态分布或均匀分布的随机数来赋初值。 3. 前向传播:将训练样本输入到网络中,通过逐层计算每个神经元的输出值。每一层的输出值又作为下一层的输入,直到到达输出层。 4. 计算损失函数:将网络的输出值与期望的输出进行比较,计算损失函数。常用的损失函数有均方误差和交叉熵等。 5. 反向传播:根据损失函数的值,利用反向传播算法来更新各层之间的权重和偏置。反向传播通过计算梯度来调整参数,使得损失函数尽可能减小。 6. 更新权重和偏置:根据反向传播计算得到的梯度,使用梯度下降法或其他优化算法来更新网络的权重和偏置。这个过程不断迭代,直到收敛或达到一定的迭代次数。 7. 测试和评估:使用训练好的网络对测试数据进行预测,并评估模型的性能。常用的评估指标有准确率、精确率和召回率等。 8. 调参和优化:根据模型在测试集上的表现,调整网络结构和超参数。例如,增加隐藏层的神经元个数、调整学习率等,以提高模型的准确性和鲁棒性。 通过以上步骤,我们可以搭建一个复数BP神经网络,并利用它来解决复杂的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值