当前位置:   article > 正文

人工智能 | BP神经网络_bp神经网络模型

bp神经网络模型

BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络模型之一。

上面这段是官方对BP神经网络的定义,只有这句“按照误差逆向传播算法训练的多层前馈神经网络”点出了BP神经网络的特点,需要理解的重点按照先后顺序排列如下:

1. 多层神经网络是什么?

2. 误差如何定义?

3. 算法用哪个?

4. 逆向和前馈是什么?

5. 如何训练?

 

一、最简单的神经网络——感知机

“神经元”这个概念来自于生物学,在人工智能领域引申成了一种类比,指的是连接输入和输出的最小单位,当输入达到一定水平或者有一定类型的输入产生时,神经元就给出输出。所以,神经元可以看成是只有输入和输出的数学模型。

最简单的神经网络可以只包含一个神经元,如下图1所示,这种网络通常被称为感知机(Perceptron)。感知机是一种二分类算法,由Frank Rosenblatt在1957年提出,它是神经网络和机器学习领域中的一个基础模型。

e675d15798ee411284b767ccf078f4b6.png

图1 最简单的神经网络

图中x是输入,w是权重,b是偏置,经过一个激活函数f得到最终输出y,图中只画出了2路输入,实际可以有n路输入,感知机的输出y可以通过公式(1)计算:

eq?y%3Df%28%7B%5Ctextstyle%20%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%7D%28w_%7Bi%7D%20%5Ccdot%20x_%7Bi%7D%29+b%29                         (1)

 

二、多层神经网络的灵魂——激活函数

    神经元不是独立存在的,它们彼此之间也有联系,多个神经元联系在一起构成了神经网络,网络级联起来,就构成了多层神经网络,以最简单的两层神经网络为例,其结构如下图2所示:

ef706e227ca1439384edc9d0550c2ceb.png

图2 两层神经网络

n_i:输入层的节点数

n_h:隐藏层的节点数

n_o:输出层的节点数

x_j:输入层的第 j 个节点的值

w_ij:连接输入层节点j和隐藏层节点i的权重

b_i:隐藏层节点i的偏置

z_i:隐藏层节点i的加权和

a_i:隐藏层节点i的激活值

v_ik:连接隐藏层节点i和输出层节点k的权重

c_k:输出层节点k的偏置

z_k:输出层节点k的加权和

a_k:输出层节点k的激活值,即网络的预测输出

t_k:目标输出值

不考虑激活函数,这个两层的神经网络是由两个线性方程构成的(如公式2所示),因为一系列线性方程的运算最终都可以用一个线性方程表示,所以这两层神经网络等同于一层神经网络,这样的神经网络是解决不了多少问题的。

 eq?%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%20z_%7Bi%7D%3D%20%7B%5Ctextstyle%20%5Csum_%7Bj%3D1%7D%5E%7Bn_%7Bi%7D%7Dw_%7Bij%7Dx_%7Bj%7D+b_%7Bi%7D%7D%20%5C%5C%20z_%7Bk%7D%3D%20%7B%5Ctextstyle%20%5Csum_%7Bi%3D1%7D%5E%7Bn_%7Bh%7D%7Dv_%7Bik%7Dz_%7Bi%7D+c_%7Bk%7D%7D%20%5Cend%7Bmatrix%7D%5Cright.                           (2)

因此网络中引入了激活函数,加入激活函数之后,公式(2)就变成了公式(3)和(4):

eq?%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%20z_%7Bi%7D%3D%7B%5Ctextstyle%20%5Csum_%7Bj%3D1%7D%5E%7Bn_%7Bi%7D%7Dw_%7Bij%7Dx_%7Bj%7D+b_%7Bi%7D%7D%20%5C%5C%20a_%7Bi%7D%3D%5Csigma%20%28z_%7Bi%7D%29%20%5Cend%7Bmatrix%7D%5Cright.                            (3)

eq?%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%20z_%7Bk%7D%3D%20%7B%5Ctextstyle%20%5Csum_%7Bi%3D1%7D%5E%7Bn_%7Bh%7D%7Dv_%7Bik%7Dz_%7Bi%7D+c_%7Bk%7D%7D%20%5C%5C%20a_%7Bk%7D%3D%5Csigma%20%28z_%7Bk%7D%29%20%5Cend%7Bmatrix%7D%5Cright.                             (4)

这样网络中就有了非线性因素,这样就可以应用到非线性模型中,常用的激活函数有以下几种:

7f9450975b474a5492bdce5bd6acf1df.png

图3 常用的激活函数

Sigmoid:当输入趋近于正无穷/负无穷时,输出无限接近于1/0。

eq?f%28x%29%3D%5Cfrac%7B1%7D%7B1+exp%28-x%29%7D                             (5)

tanh:与Sigmoid函数很像,tanh输出是[-1,1],是0均值的,实际应用中会比Sigmoid好。

eq?f%28x%29%3Dtanh%28x%29%3D%5Cfrac%7Be%5E%7Bx%7D-e%5E%7B-x%7D%7D%7Be%5E%7Bx%7D+e%5E%7B-x%7D%7D             (6)

ReLU:全称是Rectified Linear Units,当输入小于0时,输出为0,当输入大于0时,输出等于输入。

eq?f%28x%29%3Dmax%280%2Cx%29                           (7)

以上3个激活函数挑一个放进图2中,一个两层神经网络就搭建好了,如果是已经训练好的网络,也就是说已经得到了稳定的w_ij、b_i、v_ik和c_k,那么该网络就可以投入使用了,用户自定义输出,网络给出答案,但是如果是正在建设中的网络,此时w_ij、b_i、v_ik和c_k是未知的,则还需要经过“训练”这一步。

三、误差——训练的标杆

神经网络是没有智商的,它需要经过多次“学习”才可以作出正确的判断,那如何确认学习的是否正确呢?当然是和标准答案做对比,就像考试一样,答对了加分,答错了扣分。为了衡量输出离标准答案有多远,定义“误差”作为学习标准,误差越小说明学习效果越好。

从图2可以想到,假设标准答案是t=(1,0,0,0),则输出ak和标准答案之间的误差为(ak-tk),但是一般会写成式(8)的样子,前面的1/2是为了求导后抵消平方的,这个E也被称为损失函数(Loss Function)。

 eq?E%3D%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bk%7D%5E%7B%7D%28t_%7Bk%7D-a_%7Bk%7D%29%5E%7B2%7D                         (8)

到这里,神经网络的训练任务就变成了,找到一组最佳的w和b,使得E最小。要让E能调整w和b,这就需要往前一层一层的传递某种变量,用专业的词来说就是“逆向”和“前馈”。

此外,图2中不同的激活函数得到的结果是不一样的,如果选择sigmoid,输出范围为[0,1],如果选择tanh,输出是[-1,1],如果选择ReLU,输出是[0,+∝],这意味着,为了匹配不同的输出,标准答案还得改格式?

倒也不用这么麻烦,把输出统一成指定格式就可以了。

常用的做法是在输出这里使用Softmax函数把输出映射到(0,1)区间,也就是概率范围,最终得到类似(0.85,0.1,0.02,0.03)这样的结果,0.85比其他三个都大,说明结果可信。使用概率不仅可以得到结果,还能知道最优解是多少,Softmax函数如(9)所示:

eq?%5Csigma_%7Bi%7D%3D%5Cfrac%7Be%5E%7Bi%7D%7D%7B%5Csum_%7Bk%7D%5E%7B%7De%5E%7Bk%7D%7D         (9)

用(9)求出的结果中,所有元素的和一定为1,且每个元素可以代表概率值,此时图2中的神经网络可以进化一下,把“逆向”、“前馈”和Softmax都加进去,图2变成了图4。

320bdd3ad26b4cfa94658bdaa39884ee.png

图4 完整的BP神经网络

这就是一个完整的BP神经网络了,它包含正向的计算,和逆向的参数调整,每逆向调整完一次参数再正向做一次计算,重复这个过程,直到损失函数E达到最小值,就获得了稳定的w_ij、b_i、v_ik和c_k,训练结束。但是如何获得损失函数E的最小值?最简单的方法是用梯度下降算法。

 

四、梯度下降——寻求最优解

    

图2是个两层的网络,用曲面更容易理解梯度下降的意义。假设楼主带着一个铅球去爬山,到了山顶上,先把铅球沾满粉笔灰然后往山下一扔,粉笔灰描绘出的路径就是铅球最快到达山底的路线,这就是神经网络梯度下降追求的最优路径。就算楼主自己往山下走,也不会走出比铅球更佳的路径,这是为什么呢?因为受重力影响,铅球大概率是沿着坡度最陡的角度下去的,这个最陡的方向,就是神经网络中梯度下降想找到的参数的调整方向。

现在要用数学来描述这个过程,就是是对损失函数E分别求w_ij、b_i、v_ik和c_k的一阶导,得到输出层和隐藏层的误差梯度:

eq?%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%20%5Cdelta%20_%7Bk%7D%3D%5Cfrac%7B%5Cpartial%20E%7D%7B%5Cpartial%20z_%7Bk%7D%7D%3D%28a_%7Bk%7D-t_%7Bk%7D%29%5Ccdot%20%5Csigma%20%27%28z_%7Bk%7D%29%20%5C%5C%20%5Cdelta%20_%7Bi%7D%3D%5Cfrac%7B%5Cpartial%20E%7D%7B%5Cpartial%20z_%7Bi%7D%7D%3D%20%7B%5Ctextstyle%20%5Csum_%7Bk%3D1%7D%5E%7Bn_%7Bo%7D%7D%7D%5Cdelta%20_%7Bk%7Dv_%7Bik%7D%20%5Ccdot%20%5Csigma%20%27%28z_%7Bi%7D%29%20%5Cend%7Bmatrix%7D%5Cright.                        (10)

接下来就可以得到输出层和隐藏层的权重和偏置,其中η为学习率,它的意思是每次更新多少进参数中,前面的负号是因为现在要求的是下降的梯度,它是梯度上升的反方向。

eq?%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%20v_%7Bik%7D%5E%7B%28new%29%7D%3Dv_%7Bik%7D%5E%7B%28old%29%7D-%5Ceta%20%5Cdelta%20_%7Bk%7Da_%7Bi%7D%20%5C%5C%20c_%7Bk%7D%5E%7B%28new%29%7D%3Dc_%7Bk%7D%5E%7B%28old%29%7D-%5Ceta%20%5Cdelta%20_%7Bk%7D%20%5Cend%7Bmatrix%7D%5Cright.                                    (11)

eq?%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%20w_%7Bij%7D%5E%7B%28new%29%7D%3Dw_%7Bij%7D%5E%7B%28old%29%7D-%5Ceta%20%5Cdelta%20_%7Bi%7Dx_%7Bj%7D%20%5C%5C%20b_%7Bi%7D%5E%7B%28new%29%7D%3Db_%7Bi%7D%5E%7B%28old%29%7D-%5Ceta%20%5Cdelta%20_%7Bi%7D%20%5Cend%7Bmatrix%7D%5Cright.                                  (12)

从(11)和(12)的公式可以看出,w_ij只和输出层有关,但是v_ik不仅和输出层有关,还和隐藏层有关,另外公式中的f1、f2求导和选择的激活函数有关,选择哪个激活函数,就套用其求导结果。

 

五、总结

到这里已经可以重新描述BP神经网络的定义了,官方的说法是“按照误差逆向传播算法训练的多层前馈神经网络”,白话版是“拥有2个以上的权重矩阵,通过最小化误差多次调整权重,最终获得稳定参数的可定制的黑盒子”。“可定制”指的是网络中的输入输出个数、隐藏层数、激活函数和寻求最优解的算法都是可以根据实际情况选择的。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/833362
推荐阅读
相关标签
  

闽ICP备14008679号