反向传播就是先计算每一个神经元的误差,然后通过误差来得到梯度。
反向传播的原理
反向传播的基本原理就是高数中,求导的链式法则
链式法则
链式法则 告诉我们有多个层次的多元复合函数,下一层次的导数可以由上一层次推得。
所以
一般的,对于函数 y ,如果它能看做 z1,z2⋯,zn 的函数,而 zi 为 t 的函数,则:
公式推导
首先,我们引入一个变量δ,定义:
其中l为第几层,j表示第l层的第j个神经元,z为中间变量,δ被称为第l层第j个神经元的误差。
首先,对输出层误差,由链式法则得到:
其中,K为有多少个分类,L为神经网络共有多少层
而只有当 k==j 时,右边部分才不为 0 ,所以:
其中,g'(zlj)是sigmod函数的求导,具体求导过程可看下这篇文章((7条消息) Sigmoid 函数的求导过程_Linky1990的博客-CSDN博客_sigmoid函数的导数)
对于其它层的误差:
使用链式法则得:
注意:其中,Sl为每层神经元个数
而其中:
求偏导得:
所以
反向传播
现在开始实现算法,大概步骤如下:
1.我们要对所有的i,l,j初始化
2.使用for循环,对m组训练集,k值从一到m:
- 令a(1) = x(1)
- 前向传播,计算各层激活向量
- 使用(1)式,计算输出层误差
- 使用(2)式,计算其他层误差
- 使用(3)式,累加
3.计算梯度矩阵
4.更新权值
如图:
资料来源:知乎:拼搭小怪及csdn中的一些文章