最近找工作需要,因此看看梯度下降法和反向传播算法,顺手来个手撕笔记。
首先来个图:
好吧,定义一下这个图
其中:
- 表示第层第个输出
- 表示第层第个输入
- 和中间的竖线表示激活函数,用来表示
- 表示第层第个神经元与层第个神经元的权重
- 表示第层第个神经元的偏置
- 表示的当然是数字咯
前向传播
有了以上定义后,可以描述前向传递过程。前向传播公式描述:
这个公式应该特别好理解,直观意义就是上一层的每个输出乘以对应权重得到下一层输入,然后由激活函数进行非线性变换,得到下一层的输出。前向传播过程如图2所示:
反向传播
前向传播的过程比较简单,一般难的是在后面反向传播和梯度更新的部分。
1. 输出层的梯度更新过程
首先看输出层的传播过程,图3展示了输出层的传播过程:
定义:
- 表示损失函数(总误差),为各输出误差之和
- 表示神经网络的最大层数,即输出层
- 表示反向传播到第层第个神经元的误差(其位置与相同,即在竖线前)
可看到部分实际就是对激活函数求导,因此可以将其记作
这部分应该比较好理解了,试着求最后一层(第层)的某个权重梯度和偏置梯度,观察图3可得:
显然:
于是:
同样地:
这样,输出层的权重更新和偏置的梯度都求出来了,应用下面两公式来进行更新即可,其中表示学习率。
2. 任意层的梯度更新过程
经过了输出层的折腾后,相信任意层的就不远了,用一句话说,把上面和中的换成就是任意层的权重和偏置的更新方法。不信?下面来推导。
现在来看任意第层的情况,假设第层就和输出层相连,如图4的情况,首先来求,简化来看,输出层就两个神经元,于是有:
实际上,折腾一大圈,这个不就是总代价对就梯度吗?
即:
好吧,这是两个神经元的情况,那如果是多个神经元咋办?其实你观察下那条很长的式子就可以得到:
这还是一个套路嘛,即还是:
既然第层的误差都有了,权重和偏置的梯度是不是就有了?
同样地:
有人会觉得这是因为第层和输出层就隔着,所以才能得到这样的结论,其实不管第层在哪,这个结论都是一样的,读者可以自行验证啦。
权重更新同样用梯度下降法更新即可:
3. 误差传递的层间关系
先整理一下上面重要的式子
反向传递到任意层任意一个神经元的误差公式:
损失函数对任意一个权重和偏置的梯度:
有人就会想,第层的误差得一层层从后往前求梯度,这么麻烦,如果我知道层的误差的话,是否会容易些呢?于是便来探讨和之间的关系。
首先要引入层:
注意:
因此:
故误差传播的层间关系式为:
必须注意的是,这里是而不是,如果不清楚的话看看图4或者自己画个图看看就明白了。
所以最后的式子便是误差传播的层间关系式,整理前面3个式子以及层间关系式,便可以得到描述反向传播的4个重要式子,也就图5的4个式子:
到这里,反向传播算法基本就结束了。如果有写的不好,不对的地方请猛喷!哈哈哈!