技术 BP算法研究

元宵节快乐

1

BP算法的意义

1969年,作为人工神经网络创始人的 Marrin Minsky与Seymour Papert合作出版了《感知器》一书,论证了简单的线性感知器功能有限,不能解决如“异或”(XOR )这样的基本问题,而且对多层网络也持悲观态度。这些论点给神经网络研究以沉重的打击,很多科学家纷纷离开这一领域,神经网络的研究走向长达10年的低潮时期。1974年哈佛大学的Paul Werbos发明BP算法时,正值神经外网络低潮期,并未受到应有的重视。1983年,加州理工学院的物理学家John Hopfield利用神经网络,在旅行商这个NP完全问题的求解上获得当时最好成绩,引起了轰动。然而,Hopfield的研究成果仍未能指出明斯基等人论点的错误所在,要推动神经网络研究的全面开展必须直接解除对感知器——多层网络算法的疑虑。

真正打破明斯基冰封魔咒的是David Rumelhart等学者出版的《平行分布处理:认知的微观结构探索》一书。书中完整地提出了BP算法,系统地解决了多层网络中隐单元连接权的学习问题,并在数学上给出了完整的推导。这是神经网络发展史上的里程碑,BP算法迅速走红,掀起了神经网络的第二次高潮。

BP算法是迄今最成功的神经网络学习算法,现实任务中使用神经网络时,大多是在使用BP算法进行训练,包括最近炙手可热的深度学习概念下的卷积神经网络(DNN、CNN、RNN等)。

2

BP算法原理

1、概念及基本思想

BP算法全称叫作误差反向传播(error Back Propagation,或者也叫作误差逆传播)算法。其算法基本思想为:在前馈网络中,输入信号经输入层输入,通过隐层计算由输出层输出,输出值与标记值比较,若有误差,将误差反向由输出层向输入层传播,在这个过程中,利用梯度下降算法对神经元权值进行调整。

2、建立模型

如何建立神经网络模型?说到这里,不得不先提几个关键词:神经网络、前向传播、激活函数以及梯度下降算法。神经网络是由神经元构成,下图中的神经元输入侧为x1、x2、x3以及常数偏置项1。经过加权传到神经元的激活函数f(x)得到神经元的输出y。激活函数可以选取sigmoid、双曲正切函数(tanh)、Relu等非线性函数。那么可以得到:

图1 神经元模型

了解了神经元,那么我们看下神经元是如何组成一张网络的,也就是我们常说的神经网络。下面举了一个例子,图2给出了是一个三层的神经网络,第一层是输入层,最后一层是输出层,中间的叫做隐藏层。那么从数据从输入层流向输出层,叫做前向传播。我们现在手里有一堆数据X=,已知输出对应的是Y=。现在需要一个模型,希望从X映射到Y。这里的X可以是一张图像或是一段视频,而Y则可能是图像或者视频的识别结果。如此,我们可以构建一张复杂的神经网络,让你把数据灌进去后,经过前向传播得到你期望的输出,这个步骤则是神经网络的建模。

图2 神经网络

3、求解模型

模型建好了,怎样才能让模型的输出与预期的输出一致呢?如果将模型的输出与预期输出的“差值”(例如一范数或者二范数)作为优化目标,这里称为目标函数,且该问题是一个优化问题。BP算法实际上是一种求解该优化问题的近似最优的解决方案,其原理使用了梯度下降以及链式法则。

在介绍BP算法前,先简单介绍一下梯度下降算法。梯度下降算法,从字面的意思理解就是沿着目标函数梯度方向求解极小值。即求解函数的梯度,利用更新x,其中 为步长。如果步长足够小,则可以保证目标函数值的每一次迭代都在减小,直到收敛到极小值。

图3:梯度下降算法

如下图所示,黄色点代表的是极小值,红色点是最小值。对于非凸函数,可以存在多个极小值,而凸函数的极小值就是函数的最小值。对于非凸目标函数,初始点不同,梯度下降算法求得的极小值也不同。

图4:非凸函数极小值与最小值

图5:凸函数最小值

下面我们来看看BP算法究竟是什么样的。这里以图2中的神经网络为例,假设给定n个训练样本,输入为X=,输出为Y=,其中Xi=是一个3维的向量。那么,隐藏层中第1个神经元的输出记为a1(1),其中(1)代表第一个隐藏层,隐藏层中第2个神经元的输出记为a2(1)。

4、伪码表示

BP算法的python伪代码为:

class ComputationalGraph(object):

#...

def forward(inputs):

#1.[pass input to input gates…..]

#2.forward the computational graph:

gate.forward()

return loss #the final gate in the graph outputs the loss

def backward():

gate.backward()

return inputs_gradients #l ittle piece of backprop (chain rule applied)

3

BP算法优化探索

人们常说,用于BP算法的神经网络设计与其说是科学,不如说更像一门艺术,从某种意义上来说这个论断是正确的。但是,也有方法能对算法有显著提高,如下所述:

1、 最大信息内容。

作为一个基本原则,对呈现给BP算法的每一个训练样本的挑选必须建立在其信息内容对解决问题有最大可能的基础上,达到这个目标的的方法是:

• 使用训练误差最大的样本。

• 使用的样本要与以前使用的有根本区别。

2、 随机方式更新。

BP学习的随机方式(串行)要比批量方式计算得更快,特别是当训练集很大且高度冗余时更是如此。

3、 激活函数。

在考虑学习速度的情况下,较好的选择是采用关于其自变量为奇函数的激活函数(sigmoid、tanh等)。

4、 目标值。

在激活函数的范围内选取目标值(期望响应)是很重要的。更具体的说(以sigmoid为例),神经网络的神经元j的期望响应必须与sigmoid激活函数的极限偏离某个Ɛ值,具体取决于极限是正是负。否则反向传播算法会使网络的自由参数趋向无穷大,驱使隐藏神经元到饱和从而减慢学习过程。

5、 输入的标准化。

每一个输入变量都需要预处理,使得它关于整个训练集的均值接近于0,或者与标准偏差相比是比较小的。要加速反向传播学习的过程,输入变量的标准化必须包含以下两个步骤:

• 训练集包含的输入变量应该是不相关的。

• 除去相关后的输入变量应调整其长度使得它们的协方差近似相等,因此可以保证网络中的不同权值以大约相等的速度进行学习。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190219B10CUW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券