最近找工作需要,因此看看梯度下降法和反向传播算法,顺手来个手撕笔记。
首先来个图:

好吧,定义一下这个图
其中:
-
表示第
层第
个输出
-
表示第
层第
个输入
-
和
中间的竖线表示激活函数,用
来表示
-
表示第
层第
个神经元与
层第
个神经元的权重
-
表示第
层第
个神经元的偏置
-
表示的当然是数字
咯
前向传播
有了以上定义后,可以描述前向传递过程。前向传播公式描述:
这个公式应该特别好理解,直观意义就是上一层的每个输出乘以对应权重得到下一层输入,然后由激活函数进行非线性变换,得到下一层的输出。前向传播过程如图2所示:

反向传播
前向传播的过程比较简单,一般难的是在后面反向传播和梯度更新的部分。
1. 输出层的梯度更新过程
首先看输出层的传播过程,图3展示了输出层的传播过程:

定义:

现在来看任意第层的情况,假设第
层就和输出层相连,如图4的情况,首先来求
,简化来看,输出层就两个神经元,于是有:
实际上,折腾一大圈,这个不就是总代价对
就梯度吗?
即:
好吧,这是两个神经元的情况,那如果是多个神经元咋办?其实你观察下那条很长的式子就可以得到:
这还是一个套路嘛,即还是:
既然第层的误差都有了,权重和偏置的梯度是不是就有了?
同样地:
有人会觉得这是因为第层和输出层就隔着,所以才能得到这样的结论,其实不管第
层在哪,这个结论都是一样的,读者可以自行验证啦。
权重更新同样用梯度下降法更新即可:
3. 误差传递的层间关系
先整理一下上面重要的式子
反向传递到任意层任意一个神经元的误差公式:
损失函数对任意一个权重和偏置的梯度:
有人就会想,第层的误差得一层层从后往前求梯度,这么麻烦,如果我知道
层的误差的话,是否会容易些呢?于是便来探讨
和
之间的关系。
首先要引入层:
注意:
因此:
故误差传播的层间关系式为:
必须注意的是,这里是而不是
,如果不清楚的话看看图4或者自己画个图看看就明白了。
所以最后的式子便是误差传播的层间关系式,整理前面3个式子以及层间关系式,便可以得到描述反向传播的4个重要式子,也就图5的4个式子:

到这里,反向传播算法基本就结束了。如果有写的不好,不对的地方请猛喷!哈哈哈!
网友评论