BP 神经网络原理

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

1 BP 神经网络的结构和传播规则

BP神经网络由 输入层、隐含层(也称中间层)和 输出层 构成 ,其中隐含层有一层或者多层。每一层可以有若干个节点。层与层之间节点的连接状态通过 权重 来体现。

在这里插入图片描述

BP神经网络的核心步骤如下。其中,实线代表正向传播,虚线代表反向传播。

在这里插入图片描述

1.1 正向传播

数据(信息、信号)从输入端输入后,沿着网络的指向,乘以对应的权重后再加和,再将结果作为输入在激活函数中计算,将计算的结果作为输入传递给下一个节点。依次计算,直到得到最终结果。
通过每一层的感知器,层层计算,得到输出,每个节点的输出作为下一个节点的输入。这个过程就是正向传播。

1.1.1 激活函数

必须处处可导(一般都使用S型函数)。

sigmoid 函数:

δ ( x ) = 1 1 + e − x \delta(x) = \frac{1}{1 + e^{-x}} δ(x)=1+ex1

sigmoid 函数的导函数:

δ ′ ( x ) = δ ( x ) ( 1 − δ ( x ) ) \delta ^{'} (x) = \delta(x) (1 - \delta(x)) δ(x)=δ(x)(1δ(x))

1.1.2 前向传播计算

如前面的 BP 神经网络结构图所示,使用 w j k l w_{jk}^{l} wjkl 表示从网络第 (l-1)层中的第 k 个神经元指向网络第 l 层中的第 j 个神经元的连接权重; b j l b_{j}^{l} bjl 表示网络第 l 层中的第 j 个神经元的 bias; y j l y_{j}^{l} yjl 表示网络第 l 层中的第 j 个神经元的线性输出的结果; x j l x_{j}^{l} xjl 表示网络第 l 层中的第 j 个神经元的激活函数的输出。

那么网络第 l 层中的第 j 个神经元的激活函数的输出可以表示成:

x j l = δ ( ∑ k w j k l a k l − 1 + b l l ) x_{j}^{l} = \delta (\sum _k w_{jk}^{l}a_k^{l-1} + b_l^l) xjl=δ(kwjklakl1+bll)

写成矩阵形式,定义权重矩阵 w l w^l wl,权重矩阵的每一个元素都代表一个权重:

w l = [ w 11 l w 12 l w 13 l w 21 l w 22 l w 23 l w 31 l w 32 l w 33 l ] w^l = \left[ \begin{matrix} w_{11}^l & w_{12}^l & w_{13}^l \\ w_{21}^l & w_{22}^l & w_{23}^l \\ w_{31}^l & w_{32}^l & w_{33}^l \\ \end{matrix} \right] wl= w11lw21lw31lw12lw22lw32lw13lw23lw33l

同样可以写出 x、b、y 的矩阵形式:

x l = [ x 1 l x 2 l x 3 l ] x^l = \left[ \begin{matrix} x_1^l \\ x_2^l \\ x_3^l \\ \end{matrix} \right] xl= x1lx2lx3l

b l = [ b 1 l b 2 l b 3 l ] b^l = \left[ \begin{matrix} b_1^l \\ b_2^l \\ b_3^l \\ \end{matrix} \right] bl= b1lb2lb3l

y l = δ ( [ w 11 l w 12 l w 13 l w 21 l w 22 l w 23 l w 31 l w 32 l w 33 l ] ⋅ [ x 1 l − 1 x 2 l − 1 x 3 l − 1 ] + [ b 1 l b 2 l b 3 l ] ) y^l = \delta \left( \left[ \begin{matrix} w_{11}^l & w_{12}^l & w_{13}^l \\ w_{21}^l & w_{22}^l & w_{23}^l \\ w_{31}^l & w_{32}^l & w_{33}^l \\ \end{matrix} \right] \cdot \left[ \begin{matrix} x_1^{l-1} \\ x_2^{l-1} \\ x_3^{l-1} \\ \end{matrix} \right] + \left[ \begin{matrix} b_1^l \\ b_2^l \\ b_3^l \\ \end{matrix} \right] \right) yl=δ w11lw21lw31lw12lw22lw32lw13lw23lw33l x1l1x2l1x3l1 + b1lb2lb3l

即,

y l = δ ( [ w 11 l x 1 l − 1 + w 12 l x 2 l − 1 + w 13 l x 3 l − 1 + b 1 l w 21 l x 1 l − 1 + w 22 l x 2 l − 1 + w 23 l x 3 l − 1 + b 2 l w 31 l x 1 l − 1 + w 32 l x 2 l − 1 + w 33 l x 3 l − 1 + b 3 l ] ) y^l = \delta \left( \left[ \begin{matrix} w_{11}^lx_1^{l-1} + w_{12}^lx_2^{l-1} + w_{13}^lx_3^{l-1} + b_1^l \\ w_{21}^lx_1^{l-1} + w_{22}^lx_2^{l-1} + w_{23}^lx_3^{l-1} + b_2^l \\ w_{31}^lx_1^{l-1} + w_{32}^lx_2^{l-1} + w_{33}^lx_3^{l-1} + b_3^l \\ \end{matrix} \right] \right) yl=δ w11lx1l1+w12lx2l1+w13lx3l1+b1lw21lx1l1+w22lx2l1+w23lx3l1+b2lw31lx1l1+w32lx2l1+w33lx3l1+b3l

前向传播的一般形式:

y l = δ ( w l ⋅ x l − 1 + b l ) y^l = \delta (w^l \cdot x^{l-1} + b^l) yl=δ(wlxl1+bl)

这里的输入只有一条数据,因此输入数据表现为一维列向量。多样本输入的时候是一样的,只是输入数据变成了一个二维的矩阵,矩阵的每一列都是一个输入样本数据。

多样本输入可以表示为:

Y l = δ ( w l ⋅ X l − 1 + b l ) X l = δ ( Y l ) Y^l = \delta (w^l \cdot X^{l-1} +b^l) \\ X^l = \delta (Y^l) Yl=δ(wlXl1+bl)Xl=δ(Yl)

1.2 梯度下降算法

梯度下降法是训练神经网络和线性分类器的一种普遍方法。斜率是函数的导数。梯度上的每个元素都会指明函数在该点处各个方向的斜率,梯度指向函数变化最快的方向。正梯度和负梯度指向变大最快的方向和变小最快的方向。

在正向传播的过程中,有一个 与期望的结果比较是否满意 的环节,在这个环节中实际的输出结果与期望的输出结果之间就会产生一个误差。为了减小这个误差,这个问题就转换为了一个优化问题。在这个优化问题中,目标函数就是损失函数(Loss function)。

L o s s = 1 2 ∑ i = 1 n ( y i − y ^ i ) 2 = 1 2 ∑ i = 1 n [ y i − ( w x i + b ) ] 2 Loss = \frac{1}{2} \sum _{i=1}^{n} (y_i - \hat{y}_{i})^2 \\ = \frac{1}{2} \sum _{i=1}^{n} [y_i - (wx_i + b)]^2 Loss=21i=1n(yiy^i)2=21i=1n[yi(wxi+b)]2

为了让实际的输出结果与期望的输出结果之间的误差最小,需要寻找损失函数的最小值。

1.2.1 使用迭代的方式寻找最小值

解析解:通过严格的公示推倒计算,给出的方程的精确解,任意精度下满足方程。

数值解:在一定条件下,通过某种近似计算得到的解,能够在给定的精度下满足方程。

迭代的方法寻找损失最小值 就是通过 梯度下降 + 迭代 的方式寻找数值解。

在这里插入图片描述

在迭代过程中,每次迭代各层节点之间的权重将不断地更新。

W ( t + 1 ) = W ( t ) − η ∂ L o s s ∂ w + α [ W ( t ) − W ( t − 1 ) ] W_{(t+1)}=W_{(t)} - \eta \frac{\partial Loss}{\partial w} + \alpha [W_{(t)} - W_{(t - 1)}] W(t+1)=W(t)ηwLoss+α[W(t)W(t1)]

  • η ∂ L o s s ∂ w \eta \frac{\partial Loss}{\partial w} ηwLoss,每次更新权重的调整量
  • α [ W ( t ) − W ( t − 1 ) ] \alpha [W_{(t)} - W_{(t - 1)}] α[W(t)W(t1)],更新权重时的平滑项

每次迭代都会更新一次权重,之后将更新的权重与训练样本进行正向传播,如果得到的结果不满意,则进行反向传播,继续迭代。如此往复,直到得到满意的结果为止。

1.2.2 局部最小值和全局最小值

梯度下降学习法,总是沿着梯度下降的方向对权重进行调整。考虑梯度存在多个极值点,那么这些极值点中只有一个时全局最小值点,其他都是局部最小值点。

在这里插入图片描述

当权重调整至某个局部最小值附近的时候,由于总是沿着梯度下降的方向对权重进行调整,那么最终就会将权重调整至这个局部最小值点,并把它当作是全局最小值点了。但是实际上此时权重并不是处于全局最小值点,这样的情况并不是我们期望的。

1.2.3 算法改进
1.2.3.1 引入动量项

W ( t + 1 ) = W ( t ) − η [ ( 1 − α ) ∂ L o s s ∂ W ( t ) + α ∂ L o s s ∂ W ( t − 1 ) ] W_{(t+1)}=W_{(t)} - \eta [(1 - \alpha) \frac{\partial Loss}{\partial W_{(t)}} + \alpha \frac{\partial Loss}{\partial W_{(t-1)}}] W(t+1)=W(t)η[(1α)W(t)Loss+αW(t1)Loss]

  • η > 0 \eta > 0 η>0,为学习率
  • 0 ≤ α < 1 0 \le \alpha < 1 0α<1 ,为动量因子
  • 通过引入动量项,给权重调整量添加一个梯度正方向的修正,类似于物体的惯性的效果,可以一定程度解决把局部最小值当做全局最小值的问题。
1.2.3.2 变步长法

学习率 η \eta η 选的太小,会导致收敛太慢;选的太大,会导致权重调整过头,导致震荡甚至发散。可以采用变步长法进行改进:
W ( t + 1 ) = W ( t ) − η ( t ) ∂ L o s s ∂ w η ( t ) = 2 λ η ( t − 1 ) λ = s g n [ ∂ L o s s ∂ w ( t ) ⋅ ∂ L o s s ∂ w ( t − 1 ) ] W_{(t+1)}=W_{(t)} - \eta (t) \frac{\partial Loss}{\partial w} \\ \eta (t) = 2^{\lambda} \eta (t - 1) \\ \lambda = sgn[\frac{\partial Loss}{\partial w_{(t)}} \cdot \frac{\partial Loss}{\partial w_{(t - 1)}}] W(t+1)=W(t)η(t)wLossη(t)=2λη(t1)λ=sgn[w(t)Lossw(t1)Loss]

  • 上面第三个式子根据相邻两次计算的梯度乘积来计算符号函数,可以实时调整学习率。当连续两次迭代的梯度的方向相同,说明下降太慢,这时通过上面第二个式子使步长加倍;当连续两次迭代的梯度的方向相反,说明下降过头,这时通过上面第二个式子使步长减半。
  • 上面的第二个式子里面的 2,可以根据实际需要,改成其他值,以此来控制步长的变化快慢。
1.2.3.3 引入动量项与变步长法结合

W ( t + 1 ) = W ( t ) − η ( t ) [ ( 1 − α ) ∂ L o s s ∂ w ( t ) + α ∂ L o s s ∂ w ( t − 1 ) ] η ( t ) = 2 λ η ( t − 1 ) λ = s g n [ ∂ L o s s ∂ w ( t ) ⋅ ∂ L o s s ∂ w ( t − 1 ) ] W_{(t+1)}=W_{(t)} - \eta (t) [(1 - \alpha) \frac{\partial Loss}{\partial w_{(t)}} + \alpha \frac{\partial Loss}{\partial w_{(t - 1)}}] \\ \eta (t) = 2^{\lambda} \eta (t - 1) \\ \lambda = sgn[\frac{\partial Loss}{\partial w_{(t)}} \cdot \frac{\partial Loss}{\partial w_{(t - 1)}}] W(t+1)=W(t)η(t)[(1α)w(t)Loss+αw(t1)Loss]η(t)=2λη(t1)λ=sgn[w(t)Lossw(t1)Loss]

1.3 反向传播
1.3.1 求梯度矩阵

假设函数 f : R m × n → R f: R^{m \times n} \rightarrow R f:Rm×nR 可以把输入矩阵映射为一个实数,那么函数 f f f 的梯度定义为:

∇ A f ( A ) = [ ∂ f ( A ) ∂ A 11 ∂ f ( A ) ∂ A 12 … ∂ f ( A ) ∂ A 1 n ∂ f ( A ) ∂ A 21 ∂ f ( A ) ∂ A 22 … ∂ f ( A ) ∂ A 2 n ⋮ ⋮ ⋱ ⋮ ∂ f ( A ) ∂ A m 1 ∂ f ( A ) ∂ A m 2 … ∂ f ( A ) ∂ A m n ] \nabla _A f(A) = \left[ \begin{matrix} \frac{\partial f(A)}{\partial A_{11}} & \frac{\partial f(A)}{\partial A_{12}} & \dotsc & \frac{\partial f(A)}{\partial A_{1n}} \\ \frac{\partial f(A)}{\partial A_{21}} & \frac{\partial f(A)}{\partial A_{22}} & \dotsc & \frac{\partial f(A)}{\partial A_{2n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f(A)}{\partial A_{m1}} & \frac{\partial f(A)}{\partial A_{m2}} & \dotsc & \frac{\partial f(A)}{\partial A_{mn}} \\ \end{matrix} \right] Af(A)= A11f(A)A21f(A)Am1f(A)A12f(A)A22f(A)Am2f(A)A1nf(A)A2nf(A)Amnf(A)

( ∇ A f ( A ) ) i j = ∂ f ( A ) ∂ A i j (\nabla_A f(A))_{ij} = \frac{\partial f(A)}{\partial A_{ij}} (Af(A))ij=Aijf(A)

同样地,对于输入向量的函数 f : R n × 1 → R f: R^{n \times 1} \rightarrow R f:Rn×1R,那么:

∇ x f ( x ) = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ⋮ ∂ f ( x ) ∂ x n ] \nabla_x f(x) = \left[ \begin{matrix} \frac{\partial f(x)}{\partial x_1} \\ \frac{\partial f(x)}{\partial x_2} \\ \vdots \\ \frac{\partial f(x)}{\partial x_n} \\ \end{matrix} \right] xf(x)= x1f(x)x2f(x)xnf(x)

根据上面的矩阵和向量的梯度矩阵的定义,可以得到:

∇ x ( f ( x ) + g ( x ) ) = ∇ x f ( x ) + ∇ x g ( x ) ∇ x ( t f ( x ) ) = t ∇ x f ( x ) , t ∈ R \nabla_x (f(x) + g(x)) = \nabla_x f(x) + \nabla_x g(x) \\ \nabla_x (tf(x)) = t\nabla_x f(x), t \in R x(f(x)+g(x))=xf(x)+xg(x)x(tf(x))=txf(x),tR

1.3.2 海塞矩阵

定义一个输入为 n 维向量,输出为实数的函数 f : R n → R f: R^n \rightarrow R f:RnR,那么海塞矩阵定义为多元函数 f f f 的二阶偏导数构成的方阵:

∇ x 2 f ( x ) = [ ∂ 2 f ( x ) ∂ x 1 2 ∂ 2 f ( x ) ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ( x ) ∂ x 1 ∂ x n ∂ 2 f ( x ) ∂ x 2 ∂ x 1 ∂ 2 f ( x ) ∂ x 2 2 ⋯ ∂ 2 f ( x ) ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ( x ) ∂ x n ∂ x 1 ∂ 2 f ( x ) ∂ x n ∂ x 2 ⋯ ∂ 2 f ( x ) ∂ x n 2 ] \nabla _x ^2 f(x) = \left[ \begin{matrix} \frac{\partial ^2 f(x)}{\partial x_1^2} & \frac{\partial ^2 f(x)}{\partial x_1 \partial x_2} & \cdots & \frac{\partial ^2 f(x)}{\partial x_1 \partial x_n} \\ \frac{\partial ^2 f(x)}{\partial x_2 \partial x_1} & \frac{\partial ^2 f(x)}{\partial x_2 ^2} & \cdots & \frac{\partial ^2 f(x)}{\partial x_2 \partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial ^2 f(x)}{\partial x_n \partial x_1} & \frac{\partial ^2 f(x)}{\partial x_n \partial x_2} & \cdots & \frac{\partial ^2 f(x)}{\partial x_n^2} \\ \end{matrix} \right] x2f(x)= x122f(x)x2x12f(x)xnx12f(x)x1x22f(x)x222f(x)xnx22f(x)x1xn2f(x)x2xn2f(x)xn22f(x)

由上式可以看出,海塞矩阵一定是对称矩阵。

根据梯度矩阵和海塞矩阵可以得到:

b ∈ R n , x ∈ R n , A ∈ R n × n b \in R^n , x \in R^n, A \in R^{n \times n} bRn,xRn,ARn×n,A 为对称矩阵,b 和 x 都是列向量,那么有:
∇ x b T x = b ∇ x x T A x = 2 A x ∇ x 2 x T A x = 2 A \nabla _x b^T x = b \\ \nabla _x x^T Ax = 2Ax \\ \nabla _x ^2 x^T Ax = 2A \\ xbTx=bxxTAx=2Axx2xTAx=2A

1.3.3 矩阵相乘和矩阵对应元素相乘

有矩阵 A = [ 1 2 3 4 ] A = \left[ \begin{matrix} 1 & 2 \\ 3 & 4 \\ \end{matrix}\right] A=[1324] B = [ − 1 − 2 − 3 − 4 ] B = \left[ \begin{matrix} -1 & -2 \\ -3 & -4 \\ \end{matrix}\right] B=[1324]:

  • 矩阵相乘:
    A B = [ 1 × ( − 1 ) + 2 × ( − 3 ) 1 × ( − 2 ) + 2 × ( − 4 ) 3 × ( − 1 ) + 4 × ( − 3 ) 3 × ( − 2 ) + 4 × ( − 4 ) ] = [ − 7 − 10 − 15 − 22 ] AB = \left[ \begin{matrix} 1 \times (-1) + 2 \times (-3) & 1 \times (-2) + 2 \times (-4) \\ 3 \times (-1) + 4 \times (-3) & 3\times (-2) + 4 \times (-4) \\ \end{matrix}\right] = \left[ \begin{matrix} -7 & -10 \\ -15 & -22 \\ \end{matrix}\right] AB=[1×(1)+2×(3)3×(1)+4×(3)1×(2)+2×(4)3×(2)+4×(4)]=[7151022]

  • 矩阵对应元素相乘:
    A ⊙ B = [ 1 × ( − 1 ) 2 × ( − 2 ) 3 × ( − 3 ) 4 × ( − 4 ) ] = [ − 1 − 4 − 9 − 16 ] A \odot B = \left[ \begin{matrix} 1 \times (-1) & 2 \times (-2) \\ 3 \times (-3) & 4 \times (-4) \\ \end{matrix}\right] = \left[ \begin{matrix} -1 & -4 \\ -9 & -16 \\ \end{matrix}\right] AB=[1×(1)3×(3)2×(2)4×(4)]=[19416]

1.3.4 反向传播原理

反向传播可以得到如何调整权重 w w w 和偏差 b b b 能够使损失函数的值沿着梯度下降的方向移动,这表明反向传播需要计算偏导数:
∂ L o s s ( a l , y ) ∂ w j k l ∂ L o s s ( a l , y ) ∂ b j l \frac{\partial Loss(a^l, y)}{\partial w_{jk}^l} \\ \frac{\partial Loss(a^l, y)}{\partial b_{j}^l} wjklLoss(al,y)bjlLoss(al,y)

其中 a l a^l al 是上一层的输出的激活函数输出。

为了计算这些偏导数,引入中间变量 e j l e_j^l ejl,用来表示网络中第 l l l 层第 j 个神经元的误差。后向传播能够计算出 e j l e_j^l ejl,然后将其对应回 $
\frac{\partial Loss(a^l, y)}{\partial w_{jk}^l}$ 和 $\frac{\partial Loss(a^l, y)}{\partial b_{j}^l}
$。

那么,如何定义每一层的误差才合理呢?如果为第 l l l 层的第 j 个神经元添加一个扰动 Δ y j l \Delta y_j^l Δyjl,使得损失函数的值变小,那么我们就可以认为这是一个好的扰动。通过选择 Δ y j l \Delta y_j^l Δyjl ∂ L o s s ( a l , y ) ∂ y j l \frac{\partial Loss(a^l, y)}{\partial y_{j}^l} yjlLoss(al,y) 的符号相反(梯度下降法的原理),就可以每次都添加一个好的扰动最终达到最优。

秉持上面的思想,可以定义网络第 l l l 层中第 j j j 个神经元的误差为:

e j l = ∂ L o s s ( a l , y ) ∂ y j l e_j^l = \frac{\partial Loss(a^l, y)}{\partial y_{j}^l} ejl=yjlLoss(al,y)

从而可以得到每一层误差的向量表示:

e l = [ e 1 l e 2 l ⋮ e n l ] e^l = \left[ \begin{matrix} e_1^l \\ e_2^l \\ \vdots \\ e_n^l \\ \end{matrix} \right] el= e1le2lenl

1.3.4.1 输出层误差

e j l = ∂ L ∂ a j l δ ′ ( y j l ) e_j^l = \frac{\partial L}{\partial a_j^l} \delta ^ {'}(y_j^l) ejl=ajlLδ(yjl)

其中 ∂ L \partial L L 表示 ∂ L o s s ( a l , y ) \partial Loss(a^l, y) Loss(al,y)
上式写成矩阵形式:

e l = ∇ a L ⊙ δ ′ ( y l ) e^l = \nabla _a L \odot \delta ^{'}(y^l) el=aLδ(yl)

说明:
误差定义:
e j l = ∂ L ∂ y j l e_j^l = \frac{\partial L}{\partial y_j^l} ejl=yjlL
根据链式法则得到:
e j l = ∑ k ∂ L ∂ a k l ∂ a k l ∂ y j l e_j^l = \sum _k \frac{\partial L}{\partial a_k^l} \frac{\partial a_k^l}{\partial y_j^l} ejl=kaklLyjlakl
j ≠ k j \ne k j=k 时, ∂ a k l ∂ y j l = 0 \frac{\partial a_k^l}{\partial y_j^l} = 0 yjlakl=0,那么上式可以化简为:
e j l = ∂ L ∂ a j l ∂ a j l ∂ y j l e_j^l = \frac{\partial L}{\partial a_j^l} \frac{\partial a_j^l}{\partial y_j^l} ejl=ajlLyjlajl
考虑到 a j l = δ ( y j l ) a_j ^l = \delta (y_j^l) ajl=δ(yjl):
e j l = ∂ L ∂ a j l δ ′ ( y j l ) e_j^l = \frac{\partial L}{\partial a_j^l} \delta ^ {'}(y_j^l) ejl=ajlLδ(yjl)
即得到了输出层的误差表示。

1.3.4.2 隐藏层误差

e j l = ∑ k w j k l + 1 e j l + 1 δ ′ ( y j l ) e_j^l = \sum _k w_{jk}^{l+1} e_j^{l+1} \delta ^ {'}(y_j^l) ejl=kwjkl+1ejl+1δ(yjl)

写成矩阵形式:

e l = [ ( w l + 1 ) T e l + 1 ] ⊙ δ ′ ( y l ) e^l = [(w^{l+1})^T e^{l+1}] \odot \delta ^ {'}(y^l) el=[(wl+1)Tel+1]δ(yl)

说明:
y k l + 1 = ∑ j ( w l + 1 ) T a j l + b k l + 1 = ∑ j w l + 1 δ ( y j l ) + b k l + 1 y_k^{l+1} = \sum _j (w^{l+1})^T a_j ^l + b_k^{l+1} \\ = \sum _j w^{l+1} \delta (y_j ^l) + b_k^{l+1} ykl+1=j(wl+1)Tajl+bkl+1=jwl+1δ(yjl)+bkl+1
对上式求偏导得到:
∂ y k l + 1 ∂ y l l = w l + 1 δ ′ ( y j l ) \frac{\partial y_k^{l+1}}{\partial y_l^l} = w^{l+1} \delta ^{'} (y_j^l) yllykl+1=wl+1δ(yjl)
结合上面两个式子可以得到:
e j l = ∑ k w j k l + 1 e j l + 1 δ ′ ( y j l ) e_j^l = \sum _k w_{jk}^{l+1} e_j^{l+1} \delta ^ {'}(y_j^l) ejl=kwjkl+1ejl+1δ(yjl)

1.3.4.3 参数变化率

∂ L ∂ b j l = e j l ∂ L ∂ w j k l = a k l − 1 e j l \frac{\partial L}{\partial b_j^l} = e_j^l \\ \frac{\partial L}{\partial w_{jk}^l} = a_k^{l-1} e_j^l bjlL=ejlwjklL=akl1ejl

写成矩阵形式:

∂ L ∂ b l = e l ∂ L ∂ w l = e l ( a l − 1 ) T \frac{\partial L}{\partial b^l} = e^l \\ \frac{\partial L}{\partial w^l} = e^l (a^{l-1})^T blL=elwlL=el(al1)T

说明:
根据求导法则,可以得到:
y j l = ∑ k w j k l a k l + b k l y_j^l = \sum _k w_{jk}^l a_k^l + b_k^l yjl=kwjklakl+bkl
b k l b_k^l bkl 求导:
∂ L ∂ b j l = ∂ L ∂ y j l ∂ y j l ∂ b j l = e j l \frac{\partial L}{\partial b_j^l} = \frac{\partial L}{\partial y_j^l} \frac{\partial y_j^l}{\partial b_j^l} = e_j^l bjlL=yjlLbjlyjl=ejl
w j k l w_{jk}^l wjkl 求导:
∂ L ∂ w j k l = ∂ L ∂ y j l ∂ y j l ∂ w j k l = a k l − 1 e j l \frac{\partial L}{\partial w_{jk}^l} = \frac{\partial L}{\partial y_j^l} \frac{\partial y_j^l}{\partial w_{jk}^l} = a_k ^{l-1}e_j^l wjklL=yjlLwjklyjl=akl1ejl

1.3.4.4 参数更新规则

根据梯度下降原理,想着梯度的反方向更新参数:

b j l ← b j l − η ∂ L ∂ b j l w j k l ← w j k l − η ∂ L ∂ w j k l b_j^l \leftarrow b_j^l - \eta \frac{\partial L}{\partial b_j^l} \\ w_{jk}^l \leftarrow w_{jk}^l - \eta \frac{\partial L}{\partial w_{jk}^l} bjlbjlηbjlLwjklwjklηwjklL

写成矩阵形式:

b l ← b l − η ∂ L ∂ b l w l ← w l − η ∂ L ∂ w l b^l \leftarrow b^l - \eta \frac{\partial L}{\partial b^l} \\ w^l \leftarrow w^l - \eta \frac{\partial L}{\partial w^l} blblηblLwlwlηwlL

1.3.4.5 关于多样本的说明

多样本输入的时候,由于损失函数带有一个 1 m \frac{1}{m} m1 的常数项,因此参数更新规则都需要添加一个 1 m \frac{1}{m} m1 的前缀。

  • 输出层误差

    d Y l = ∇ A C ⊙ δ ′ ( Y l ) dY^l = \nabla _A C \odot \delta ^{'}(Y^l) dYl=ACδ(Yl)

    此时 d Y l dY^l dYl 不再是列向量,而是一个 m 列的矩阵,每一列都对应一个样本的列向量。

  • 隐藏层误差

    d Y l = [ ( w l + 1 ) T d Y l + 1 ] ⊙ δ ′ ( Y l ) dY^l = [(w^{l+1})^TdY^{l+1}] \odot \delta ^{'}(Y^l) dYl=[(wl+1)TdYl+1]δ(Yl)

    此时 d Y l dY^l dYl 的维度时 n × m n \times m n×m,n 表示第 l l l 层中的神经元个数,m 表示样本数量。

  • 参数变化率

    d b l = ∂ C ∂ b l = 1 m M e a n O f E a c h R o w ( d Y l ) d w l = ∂ C ∂ w l = 1 m d Y l ( A l − 1 ) T db^l = \frac{\partial C}{\partial b^l} = \frac{1}{m} MeanOfEachRow(dY^l) \\ dw^l = \frac{\partial C}{\partial w^l} = \frac{1}{m} dY^l (A^{l-1})^T dbl=blC=m1MeanOfEachRow(dYl)dwl=wlC=m1dYl(Al1)T

    更新 B l B^l Bl 时需要对每行求平均值。

  • 参数更新

    b l ← b l − η ∂ C ∂ b l w l ← w l − η ∂ C ∂ w l b^l \leftarrow b^l - \eta \frac{\partial C}{\partial b^l} \\ w^l \leftarrow w^l - \eta \frac{\partial C}{\partial w^l} blblηblCwlwlηwlC

  • 37
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BP神经网络原理推导是通过反向传播算法来调整网络的权值和阈值,以使网络的输出与实际输出之间的误差最小化。BP神经网络的推导过程可以分为以下几个步骤: 1. 变量说明:首先,我们需要定义一些变量来表示神经网络的各个部分。通常,我们使用下面的符号来表示这些变量: - 输入层:输入层的神经元个数记为n,输入层的输出记为x0,其中x0=[x1, x2, ..., xn]T; - 隐藏层:隐藏层的神经元个数记为m,隐藏层的输出记为x1,其中x1=[x11, x12, ..., xm1]T; - 输出层:输出层的神经元个数记为p,输出层的输出记为x2,其中x2=[x21, x22, ..., xp2]T; - 权值矩阵:隐藏层和输出层之间的权值矩阵记为W2,其中W2是一个m×p的矩阵; - 阈值矩阵:隐藏层和输出层之间的阈值矩阵记为θ2,其中θ2是一个p维的列向量;- 隐藏层和输入层之间的权值矩阵记为W1,其中W1是一个n×m的矩阵; - 隐藏层和输入层之间的阈值矩阵记为θ1,其中θ1是一个m维的列向量。 2. 前向传播:首先,我们通过前向传播计算神经网络的输出。具体地,我们有以下公式: - 隐藏层的输入:z1 = W1 * x0 + θ1; - 隐藏层的输出:x1 = f(z1); - 输出层的输入:z2 = W2 * x1 + θ2; - 输出层的输出:x2 = f(z2); 其中,f(·)是一个激活函数,常用的激活函数包括sigmoid函数、ReLU函数等。 3. 反向传播:然后,我们通过反向传播算法来计算网络的误差,并根据误差来调整权值和阈值。具体地,我们有以下步骤: - 计算输出层的误差:δ2 = (x2 - y) ⊙ f'(z2),其中⊙表示元素级别的乘法; - 计算隐藏层的误差:δ1 = (W2^T * δ2) ⊙ f'(z1); - 更新输出层的权值和阈值:W2 = W2 - α * δ2 * x1^T,θ2 = θ2 - α * δ2,其中α是学习率; - 更新隐藏层的权值和阈值:W1 = W1 - α * δ1 * x0^T,θ1 = θ1 - α * δ1; 其中,^T表示转置操作。 4. 重复迭代:通过不断重复前向传播和反向传播的过程,直到网络的输出与实际输出之间的误差满足要求为止。 综上所述,BP神经网络通过反向传播算法来调整网络的权值和阈值,以使网络的输出与实际输出之间的误差最小化。该算法通过迭代的方式不断优化网络的性能,从而实现对非线性问题的解决。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值