机器学习:神经网络 反向传播算法学习笔记

843 阅读2分钟

反向传播就是先计算每一个神经元的误差,然后通过误差来得到梯度。

反向传播的原理

反向传播的基本原理就是高数中,求导的链式法则

链式法则

Snipaste_2022-12-02_19-08-41.png 链式法则 告诉我们有多个层次的多元复合函数,下一层次的导数可以由上一层次推得。

Snipaste_2022-12-02_19-10-32.png

所以

Snipaste_2022-12-02_19-11-36.png

一般的,对于函数 y ,如果它能看做 z1,z2⋯,zn 的函数,而 zi 为 t 的函数,则:

Snipaste_2022-12-02_19-12-31.png

公式推导

首先,我们引入一个变量δ,定义:

Snipaste_2022-12-02_19-19-49.png 其中l为第几层,j表示第l层的第j个神经元,z为中间变量,δ被称为第l层第j个神经元的误差。

首先,对输出层误差,由链式法则得到:

Snipaste_2022-12-02_19-28-14.png 其中,K为有多少个分类,L为神经网络共有多少层

而只有当 k==j 时,右边部分才不为 0 ,所以:

Snipaste_2022-12-02_19-31-12.png

其中,g'(zlj)是sigmod函数的求导,具体求导过程可看下这篇文章((7条消息) Sigmoid 函数的求导过程_Linky1990的博客-CSDN博客_sigmoid函数的导数)

对于其它层的误差:

Snipaste_2022-12-02_19-37-15.png 使用链式法则得:

Snipaste_2022-12-02_19-37-23.png

注意:其中,Sl为每层神经元个数

而其中:

Snipaste_2022-12-02_19-37-32.png

求偏导得:

Snipaste_2022-12-02_19-37-41.png 所以

Snipaste_2022-12-02_19-46-00.png

反向传播

现在开始实现算法,大概步骤如下:

1.我们要对所有的i,l,j初始化

2.使用for循环,对m组训练集,k值从一到m:

  • 令a(1) = x(1)
  • 前向传播,计算各层激活向量
  • 使用(1)式,计算输出层误差
  • 使用(2)式,计算其他层误差
  • 使用(3)式,累加

3.计算梯度矩阵

4.更新权值

如图: Snipaste_2022-12-02_19-57-50.png

资料来源:知乎:拼搭小怪及csdn中的一些文章