一、BP神经网络简单介绍
BP神经网络是一种人工神经网络,其主旨是一种进行分布式并行信息处理的数学模型。
其内部包含一个或多个隐含层。
1、基本概念
感知器
代表BP神经网络中的单个节点。
其包含:输入项、权重、偏置、激活函数、输出。
下图可以看出其详细信息:
其中Xi代表输入、Wi代表权重、b代表偏置、f代表激活函数。
引入偏置b的原因在于让其模型适用于更多情况。
图中的工作流程为:从输入端开始,沿着箭头指向乘以相关权重系数后加和(还需加偏重),加和后得到的结果作为激活函数的输入再次计算,此时得到的结果作为此节点的输出。
一个节点的输出将作为下一个节点的输入,依次计算,直到得到最终的输出。
以上工作流程也被称为BP神经网络正向传播
注明:以上图片来源于B站视频:最容易听懂的BP神经网络教程----萌新入门首选课
2、核心步骤
我们在第一轮得到满意结果以后会进行测试。如果测试结果满意那么就可以直接应用。否则就需要多次迭代对权重进行调整(权重调整方法采用梯度下降法),每次调整过后都会进行测试。循环往复直到测试结果满意。
以上图形的工作流程虚线部分也被称为BP神经网络的反向传播过程。
利用梯度下降法寻找函数最小值:
函数为: f(x)=x^2+2
假设设置认定初始值x=3时函数值最小,步长设置为0.2。那么此时将计算f(3.2)与f(2.8)的值,将所获函数值较小的那一方f(2.8)作为下次迭代的中心值,那么下一次就是比较f(3)与f(2.6)。依次迭代直到选择出最小值。
我们也可以通过改变步长来获取最小值,但是需要注意:
步长太小,迭代次数就会多,导致收敛慢 步长太大会引起振荡,可能无法收敛
3、梯度下降法使用解析
参考上面的例子,会因为步长的不正确选择导致振荡无法收敛,所以需要采用在不同的位置选择不同的步长来解决这个问题,即:
其中n为学习率。
以此得到下一个点的值为:
当然其中也会存在误差,误差存在的原因在于x(k+1)的取值可能存在不准确现象。由于误差的存在是在求导之后产生的,即针对求导之后误差为(y为解析值,y*为实际数值):
Loss=∑(y-y*)
那么针对求导之前为:
以上为BP神经网络的误差项
误差项越大,调整越大,误差项越小,调整越小。
4、梯度下降法使用原因
梯度是一个矢量,表示某一个函数在该点处的方向导数沿着该方向取得的最大值。也就是说函数在该点沿着该方向(梯度方向)变化最快,变化率(梯度的模)最大。
梯度取正时,上升最快,梯度取负时下降最快。
在目前深度神经网络模型中,梯度下降法是最优化的方法。但是使用梯度下降法很容易遭遇梯度消散和梯度爆炸的问题。参考:神经网络使用梯度下降的原因
具体使用过程中是通过计算梯度,通过梯度进行迭代并更新参数向量。
5、反向传播过程
反向传播使用梯度下降法,这里引入局部梯度,即不考虑之前的梯度值,只关注局部一个变量的梯度。
反向传播过程中涉及到上游梯度和本地梯度,最终该节点的值为:
节点的值=上游梯度*本地梯度
例如在神经网络中经常使用的激活函数Sigmoid函数:
反向传播解析如下:
从(1)开始进行作为输入到达(5)的输出表示正向传播,反向从(5)开始求导进行反向传播。
(5)过程表示初始值1,由于(5)的下一步是输出,假设上游梯度为1,由于下一步为输出,那么此过程值为1。
(4)过程上游梯度为1,本地梯度为-1/x^2,其中x为1.14,那么此过程值为-0.77。
(3)过程上游梯度为-0.77,本地梯度为1【为1的原因是:f(x)=x+a求导之后就是f’(x)=1也就是+1的效果,那么原函数的梯度就是1】,那么过程值为-0.77。
(2)过程上游梯度为-0.77,本地梯度为e^x【因为f(x)= e^x 的导数还是e^x】,过程值为-0.1。
(1)过程上游梯度为-0.1,本地梯度为-1【由于f(x)=ax求导之后为a】。其过程值为0.1。
其中要注意如果存在输入为两个变量的情况,例如如下:
此时w0的值是所在支线的本地梯度*上游梯度,但是需要注意w0的本地梯度是一个偏导值,即为0.2 * -1=-0.2。
6、反向传播和正向传播中特殊的运算结构
Max和Min函数所在结点的本地梯度,如果参与后续运算,则本地梯度为1,否则为0。
如下图所示的情况,上游梯度为两个方向上的梯度相加。
7、反向传播(矩阵)
矩阵的反向传播需要遵循:求解出来的梯度矩阵的形式应当与原矩阵完全一致,这一点可以作为检验计算结果是否正确的标准。
二、BP神经网络Python实现
代码:
BP神经网络Python实现 理解:
其中main.py是完整版的解释程序。