学习时间:2022.04.09~2022.04.09
2. BP神经网络
上一节了解了感知机模型(Perceptron),当结构上使用了多层的感知机递接连成一个前向型的网络时,就是一个多层感知机(MLP,Multilayer Perceptron),是一种前馈人工神经网络模型。
单个感知机只能实现二分类问题,MLP引入了隐含层(Hidden Layer),可用于多分类。
而BP神经网络,就是在MLP的基础上,引入非线性的激活函数,加入了BP(Back Propagation,反向传播)算法,采用了梯度下降等优化算法进行参数调优的神经网络。
简单理解:BP神经网络指的是用了“BP算法”进行训练的“多层感知机模型”。
2.1 理论基础
首先,从整体上理解一下BP神经网络的实现过程(实线代表正向传播,虚线代表反向传播)。
当完成了一次正反向传播,也就完成了一次神经网络的训练迭代,反复迭代,误差越来越小,完整的模型也就诞生了。

2.1.1 正向传播
数据(信息、信号)从输入端输入后,沿着网络的指向,乘以对应的权重后再加和,再将结果作为输入在激活函数中计算,将计算的结果作为输入传递给下一个节点。依次计算,直到得到最终结果。
通过每一层的感知器/神经元,层层计算,得到输出,每个节点的输出作为下一个节点的输入。这个过程就是正向传播。
2.1.2 反向传播
反向传播的基本思想就是通过计算输出层与期望值之间的误差来调整网络参数,从而使得误差变小,本质是一个“负反馈”的过程。
通过多次迭代,不断地对网络上的各个节点间的权重进行调整(更新),权重的调整(更新)采用梯度下降学习法。
反向传播的思想很简单,然而人们认识到它的重要作用却经过了很长的时间。后向传播算法产生于1970年,但它的重要性一直到David Rumelhart,Geoffrey Hinton和Ronald Williams于1986年合著的论文发表才被重视。
事实上,人工神经网络的强大力量几乎就是建立在反向传播算法基础之上的。反向传播基于四个基础等式,数学是优美的,仅仅四个等式就可以概括神经网络的反向传播过程,然而理解这种优美可能需要付出一些脑力。
2.1.3 梯度下降
在正向传播的过程中,有一个与期望的结果比较是否满意的环节,在这个环节中实际的输出结果与期望的输出结果之间就会产生一个误差,为了减小这个误差,这也就转换为了一个优化过程。
对于任何优化问题,总是会有一个目标函数 (objective function),这个目标函数就是损失函数(Loss Function)/代价函数(Cost Function)。让实际的输出结果与期望的输出结果之间的误差最小,就是利用梯度下降法原理,慢慢地寻找损失函数的最小值,从而得到模型的最终参数。
梯度下降法 是一个很重要很重要的计算方法,要说明这个方法的原理,就又涉及到另外一个问题:逻辑回归。下面只用一个图进行一个简单地说明。

假设上图中的曲线就是损失函数的图像,它存在一个最小值。梯度是一个利用求导得到的数值,可以理解为参数的变化量。从几何意义上来看,梯度代表一个损失函数增加最快的方向,反之,沿着相反的方向就可以不断地使损失逼近最小值,也就是使网络逼近真实的关系。
那么反向传播的过程就可以理解为,根据损失loss ,来反向计算出每个参数(如 u 1 , 1 , u 1 , 2 u_{1,1}, u_{1,2} u1,1,u1,2等的梯度 d ( u 1 , 1 ) , d ( u 1 , 2 ) , … d(u_{1,1}), d(u_{1,2}), … d(u1,1),d(u1,2),…等等,再将原来的参数分别加上自己对应的梯度,就完成了一次反向传播。
但实际中的梯度下降学习法,有些像高山滑雪运动员总是在寻找坡度最大的地段向下滑行。当他处于A点位置时,沿最大坡度路线下降,达到局部极小点,则停止滑行;如果他是从B点开始向下滑行,则他最终将达到全局最小点。

补充:逻辑回归
逻辑函数:Sigmoid函数。
可以看出逻辑函数的导函数可以转化成本身的一个表达式,这在后面用梯度下降法求解参数时会用到。
g ( y ) = e y 1 + e y 经 转 换 : g ′ ( y ) = g ( y ) ⋅ [ 1 − g ( y ) ] g(y) = \frac{e^y}{1+e^y}\\经转换:g'(y) = g(y)·[1 - g(y)] g(y)=1+eyey经转换:g′(y)=g(y)⋅[1−g(y)]
逻辑回归的原理:用逻辑函数把线性回归的结果 ( − ∞ , + ∞ ) (-∞,+∞) (−∞,+∞)映射到 ( 0 , 1 ) (0,1) (0,1)。(把线性回归函数的结果y,放到sigmod函数中去,就构造了逻辑回归函数。)
用公式描述上面这句话:
g ( y ) = 1 1 + e − y = 1 1 + e − ( θ 0 + θ 1 x 1 + … + θ n x n ) = 1 1 + e − θ γ x g(y) = \frac{1}{1+e^{-y}} = \frac{1}{1+e^{-(θ_0+θ_1x_1+…+θ_nx_n)}} = \frac{1}{1+e^{-θ^γx}} g(y)=1+e−y1=1+e−(θ0+θ1x1+…+θnxn)1=1+e−θγx1
转换一下逻辑回归函数,过程如下:
g ( y ) = 1 1 + e − y → y = l n g ( y ) 1 − g ( y ) g(y) = \frac{1}{1+e^{-y}} → y = ln^{\frac{g(y)}{1-g(y)}} g(y)=1+e−y1→y=ln1−g(y)g(y)
2.2 BP算法原理
来源:一文搞定BP神经网络。
2.2.1 四个等式
首先,使用以下符号约定:
-
W j k l W_{jk}^l Wjkl表示:从网络中第 ( l − 1 ) (l-1) (l−1)层中的第 k k k个神经元指向第 l l l层中的第 j j j个神经元的连接的权重;
-
b j l b_j^l bjl表示:第 l l l层中第 j j j个神经元的偏置;
-
z j l z_j^l zjl表示:第 l l l层中第 j j j个神经元的线性结果(权值求和);
-
a j l a_j^l ajl表示:第 l l l层中第 j j j个神经元的激活函数输出的值;
-
σ σ σ表示:激活函数。
-
因此,第 l l l层中第 j j j个神经元的激活值为: a j l = σ ( ∑ k W j k l ⋅ a k l − 1 + b j l ) a_j^l = σ(\sum_k W_{jk}^l·a_k^{l-1} + b_j^l) ajl=σ(∑kWjkl⋅akl−1+bjl)

反向传播能够知道如何更改网络中的权重 W W W和偏置 b b b来改变代价函数值。最终这意味着它能够计算偏导数 ∂ L ( a l , y ) ∂ W j k l \frac{∂L(a^l,y)}{∂W_{jk}^l} ∂Wjkl∂L(al,y)和 ∂ L ( a l , y ) ∂ b j l \frac{∂L(a^l,y)}{∂b_j^l} ∂bjl∂L(al,y)。为了计算这些偏导数,我们首先引入一个中间变量 δ j l δ_j^l δjl,代表:网络中第 l l l层中第 j j j个神经元的误差,由反向传播计算得出。如果为第 l l l层第 j j j个神经元添加一个扰动 Δ z j l Δz_j^l Δzjl,使得损失函数或者代价函数变小,那么就是一个好的扰动。 Δ z j l Δz_j^l Δzjl与 δ j l = ∂ L ( a l , y ) ∂ z j l δ_j^l = \frac{∂L(a^l,y)}{∂z_j^l} δjl=∂zjl∂L(al,y)符号相反。于是,每一层的误差向量可以表示为: δ j l = [ δ 1 l δ 2 l … δ 2 n ] δ_j^l = \begin{bmatrix}δ_1^l\\δ_2^l\\…\\δ_2^n\end{bmatrix} δjl=⎣⎢⎢⎡δ1lδ2l…δ2n⎦⎥⎥