七、BP算法
多层神经网络的学习能力比单层网络强得多。想要训练多层网络,需要更强大的学习算法。误差反向传播算法(Back Propagation)是其中最杰出的代表,它是目前最成功的神经网络学习算法。现实任务使用神经网络时,大多是在使用 BP 算法进行训练,值得指出的是 BP 算法不仅可用于多层前馈神经网络,还可以用于其他类型的神经网络。通常说 BP 网络时,一般是指用 BP 算法训练的多层前馈神经网络。
误差反向传播算法(BP)的基本步骤:
- 前向传播:正向计算得到预测值。
- 计算损失:通过损失函数 L ( y pred , y true ) L(y_{\text{pred}}, y_{\text{true}}) L(ypred,ytrue) 计算预测值和真实值的差距。
- 梯度计算:反向传播的核心是计算损失函数 L L L 对每个权重和偏置的梯度。
- 更新参数:一旦得到每层梯度,就可以使用梯度下降算法来更新每层的权重和偏置,使得损失逐渐减小。
- 迭代训练:将前向传播、梯度计算、参数更新的步骤重复多次,直到损失函数收敛或达到预定的停止条件。
1. 前向传播
前向传播(Forward Propagation)把输入数据经过各层神经元的运算并逐层向前传输,一直到输出层为止。
下面是一个简单的三层神经网络(输入层、隐藏层、输出层)前向传播的基本步骤分析。
1.1输入层到隐藏层
给定输入 x x x 和权重矩阵 W 1 W_1 W1 及偏置向量 b 1 b_1 b1,隐藏层的输出(激活值)计算如下:
z ( 1 ) = W 1 ⋅ x + b 1 z^{(1)} = W_1 \cdot x + b_1 z(1)=W1⋅x+b1
将 z ( 1 ) z^{(1)} z(1) 通过激活函数 σ \sigma σ进行激活:
a ( 1 ) = σ ( z ( 1 ) ) a^{(1)} = \sigma(z^{(1)}) a(1)=σ(z(1))
1.2隐藏层到输出层
隐藏层的输出 a ( 1 ) a^{(1)} a(1) 通过输出层的权重矩阵 W 2 W_2 W2和偏置 b 2 b_2 b2 生成最终的输出:
z ( 2 ) = W 2 ⋅ a ( 1 ) + b 2 z^{(2)} = W_2 \cdot a^{(1)} + b_2 z(2)=W2⋅a(1)+b2
输出层的激活值 a ( 2 ) a^{(2)} a(2) 是最终的预测结果:
y pred = a ( 2 ) = σ ( z ( 2 ) ) y_{\text{pred}} = a^{(2)} = \sigma(z^{(2)}) ypred=a(2)=σ(z(2))
前向传播的主要作用是:
- 计算神经网络的输出结果,用于预测或计算损失。
- 在反向传播中使用,通过计算损失函数相对于每个参数的梯度来优化网络。
2. 反向传播
反向传播(Back Propagation,简称BP)通过计算损失函数相对于每个参数的梯度来调整权重,使模型在训练数据上的表现逐渐优化。反向传播结合了链式求导法则和梯度下降算法,是神经网络模型训练过程中更新参数的关键步骤。
2.1 原理
利用链式求导法则对每一层进行求导,直到求出输入层x的导数,然后利用导数值进行梯度更新
2.2. 链式法则
链式求导法则(Chain Rule)是微积分中的一个重要法则,用于求复合函数的导数。在深度学习中,链式法则是反向传播算法的基础,这样就可以通过分层的计算求得损失函数相对于每个参数的梯度。以下面的复合函数为例:
f ( x ) = 1 1 + e − ( w x + b ) \mathrm{f(x)=\frac{1}{1+e^{-(wx+b)}}} f(x)=1+e−(wx+b)1
其中 x x x 是输入数据, w w w 是权重, b b b 是偏置。
2.2.1 函数分解
可以将该复合函数分解为:
函数 | 导数 | 我们假设 w=0, b=0, x=1 |
---|---|---|
h 1 = x × w h_1 = x \times w h1=x×w | ∂ h 1 ∂ w = x , ∂ h 1 ∂ x = w \frac{\partial h_1}{\partial w} = x, \quad \frac{\partial h_1}{\partial x} = w ∂w∂h1=x,∂x∂h1=w | h 1 = x × w = 0 h_1 = x \times w = 0 h1=x×w=0 |
h 2 = h 1 + b h_2 = h_1 + b h2=h1+b | ∂ h 2 ∂ h 1 = 1 , ∂ h 2 ∂ b = 1 \frac{\partial h_2}{\partial h_1} = 1, \quad \frac{\partial h_2}{\partial b} = 1 ∂h1∂h2=1,∂b∂h2=1 | h 2 = h 1 + b = 0 + 0 = 0 h_2 = h_1 + b = 0 + 0 = 0 h2=h1+b=0+0=0 |
h 3 = h 2 × − 1 h_3 = h_2 \times -1 h3=h2×−1 | ∂ h 3 ∂ h 2 = − 1 \frac{\partial h_3}{\partial h_2} = -1 ∂h2∂h3=−1 | h 3 = h 2 × − 1 = 0 × − 1 = 0 h_3 = h_2 \times -1=0 \times -1 = 0 h3=h2×−1=0×−1=0 |
h 4 = e x p ( h 3 ) h_4 = exp(h_3) h4=exp(h3) | ∂ h 4 ∂ h 3 = e x p ( h 3 ) \frac{\partial h_4}{\partial h_3} = exp(h_3) ∂h3∂h4=exp(h3) | h 4 = e x p ( h 3 ) = e x p ( 0 ) = 1 h_4 = exp(h_3) = exp(0)=1 h4=exp(h3)=exp(0)=1 |
h 5 = h 4 + 1 h_5 = h_4 + 1 h5=h4+1 | ∂ h 5 ∂ h 4 = 1 \frac{\partial h_5}{\partial h_4} = 1 ∂h4∂h5=1 | h 5 = h 4 + 1 = 1 + 1 = 2 h_5 = h_4 + 1 = 1 + 1 = 2 h5=h |