assignment_1_BP算法
算法简介
BP算法,全称为反向传播算法(Backpropagation),是训练人工神经网络(Artificial Neural Network,ANN)的一种有效且广泛应用的方法。它是一种监督学习算法,用于根据输入数据和对应的目标输出数据,调整神经网络的权重,使得网络能够对输入数据做出正确的预测。
算法原理
BP算法,即误差反向传播算法(Back Propagation),是一种在神经网络中用于训练多层前馈神经网络的监督学习算法。它通过两个主要的过程来实现:正向传播和误差反向传播。
- 正向传播:在这个阶段,输入数据在网络中向前流动,经过每一层的神经元,每一层的输出成为下一层的输入。每一层的节点输出是通过对输入进行加权求和后,通过一个激活函数进行非线性转换得到的。如果输出层的实际输出与期望输出不符,则进入下一个阶段。
- 误差反向传播:这个阶段是BP算法的核心,目的是调整网络中的权重和偏置,以减少输出误差。首先计算输出层的误差梯度,然后根据链式法则将这个误差反向传播回网络,逐层计算每个节点的误差贡献,并更新权重和偏置。这个过程涉及到梯度的计算,通常使用梯度下降法来最小化损失函数。
BP算法的关键是确定隐含层节点的数量,这通常需要一些经验。有一个经验公式可以帮助确定隐含层节点数目,但实际应用中可能需要根据具体问题进行调整。
算法步骤(个人理解)
BP算法是神经网络中加速更新训练参数过程的一个算法,通过结合链式法则,从而减少计算机重复计算的次数,进而提高神经网络的训练速度,是损失函数快速收敛
假设构建一个如下图的神经网络:(第0层是输入层(2个神经元),第1层是隐含层(3个神经元),第2层是隐含层(2个神经元),第3层是输出层。)
我们抽出一条路径分析:
- 输入:\(X\)
- 线性变换:\(Y_i = f(X) = W_i * X + b_i\)
- 非线性变换:(\(sigmoid\)函数)\(\sigma(x)=\frac{1}{1+e^{-x}}\)
- 损失函数\(Loss = loss(x,y)=1/n\sum(y_i-y'_i)^2\)
- 真实值:\(y'_i\)
BP算法的实现涉及到多个步骤:
初始化网络中的权重和偏置。
进行前向传播,计算输出值。
- input : \(X\)
- 线性变换1:\(Y_1 = W_1 * X + b_1\)
- 非线性变换1:\(Z_1 = \frac{1}{1+e^{-Y_1}}\)
- 线性变换2:\(Y_2 = W_2 * Z_1 + b_2\)
- 非线性变换2:\(Z_2 = \frac{1}{1+e^{-Y_2}}\)
计算输出误差,并根据这个误差进行反向传播。
- 损失函数计算:$Loss = 1/2 * (z_2-y’)^2 $
使用链式法则计算每个权重对损失函数的贡献。
- \(d(loss)/d(w_2) = d(Loss)/d(z_2) * d(z_2)/d(y_2) * d(y_2)/d(w_2)\)
- \(d(loss)/d(w_1) = ....\)
- \(d(loss)/d(b_2) = d(Loss)/d(z_2) * d(z_2)/d(y_2) * d(y_2)/d(b_2)\)
- \(d(loss)/d(b_1) = ....\)
更新权重和偏置以减少误差。
- \(w_i = w_i - \eta * d(loss)/d(w_i)\)
- \(b_i = b_i - \eta * d(loss)/d(b_i)\)
算法实现
法一:模拟BP:
1 |
|
法二:使用类来定义一个神经网络并实现BP
1 |
|
BP算法的局限性
收敛时是局部最小值
当有不止一个极小值时,参数调整到最近的极小值便停止更新了,而该极小值未必全局最优
梯度消失
梯度消失原因是链式求导,导致梯度逐层递减,我们BP第一节推倒公式时就是通过链式求导把各层连接起来的,但是因为激活函数是sigmod函数,取值在1和-1之间,因此每次求导都会比原来小,当层次较多时,就会导致求导结果也就是梯度接近于0
参考
assignment_1_BP算法
https://fu-jingqi.github.io/2024/07/12/assignment-1-BP算法/