手撕反向传播算法

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

首先来个图:

手撕反向传播算法_第1张图片
图1. 简单的神经网络

好吧,定义一下这个图
其中:

  • 表示第层第个输出
  • 表示第层第个输入
  • 和中间的竖线表示激活函数,用来表示
  • 表示第层第个神经元与层第个神经元的权重
  • 表示第层第个神经元的偏置
  • 表示的当然是数字咯

前向传播

有了以上定义后,可以描述前向传递过程。前向传播公式描述:


这个公式应该特别好理解,直观意义就是上一层的每个输出乘以对应权重得到下一层输入,然后由激活函数进行非线性变换,得到下一层的输出。前向传播过程如图2所示:

手撕反向传播算法_第2张图片
图2. 前向传播过程

反向传播

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

手撕反向传播算法_第3张图片
图3. 输出层的反向传播

定义:

  • 表示损失函数(总误差),为各输出误差之和
  • 表示神经网络的最大层数,即输出层
  • 表示反向传播到第层第个神经元的误差(其位置与相同,即在竖线前)

可看到部分实际就是对激活函数求导,因此可以将其记作
这部分应该比较好理解了,试着求最后一层(第层)的某个权重梯度和偏置梯度,观察图3可得:
\frac{\partial{C}}{\partial{w_{jk}^L}}=\frac{\partial{C}}{\partial{c_j}}\frac{\mathrm{d}{c_j}}{\mathrm{d}{a_j^L}}\sigma'(z_j^L)\frac{\partial{z_j^L}}{\partial{w_{jk}^L}}=\delta_{j}^{L}\frac{\partial{z_j^L}}{\partial{w_{jk}^L}}
显然:

于是:

同样地:
\frac{\partial{C}}{\partial{b_{j}^L}}=\frac{\partial{C}}{\partial{c_j}}\frac{\mathrm{d}{c_j}}{\mathrm{d}{a_j^L}}\sigma'(z_j^L)\frac{\partial{z_j^L}}{\partial{b_{j}^L}}=\delta_{j}^{L}\frac{\partial{z_j^L}}{\partial{b_{j}^L}}=\delta_{j}^{L}
这样,输出层的权重更新和偏置的梯度都求出来了,应用下面两公式来进行更新即可,其中表示学习率。


2. 任意层的梯度更新过程
经过了输出层的折腾后,相信任意层的就不远了,用一句话说,把上面和中的换成就是任意层的权重和偏置的更新方法。不信?下面来推导。

手撕反向传播算法_第4张图片
图4. 任意层的反向传播

现在来看任意第层的情况,假设第层就和输出层相连,如图4的情况,首先来求,简化来看,输出层就两个神经元,于是有:

\delta_{j}^{l}=(\frac{\partial{C}}{\partial{c_j}}\frac{\mathrm{d}{c_j}}{\mathrm{d}{a_j^{l+1}}}\sigma'(z_j^{l+1})\frac{\partial{z_j^{l+1}}}{\partial{a_{j}^{l}}}+\frac{\partial{C}}{\partial{c_{j+1}}}\frac{\mathrm{d}{c_{j+1}}}{\mathrm{d}{a_{j+1}^{l+1}}}\sigma'(z_{j+1}^{l+1})\frac{\partial{z_{j+1}^{l+1}}}{\partial{a_{j}^{l}}})\sigma'(z_{j}^{l})
实际上,折腾一大圈,这个不就是总代价对就梯度吗?
即:

好吧,这是两个神经元的情况,那如果是多个神经元咋办?其实你观察下那条很长的式子就可以得到:

这还是一个套路嘛,即还是:

既然第层的误差都有了,权重和偏置的梯度是不是就有了?

同样地:

有人会觉得这是因为第层和输出层就隔着,所以才能得到这样的结论,其实不管第层在哪,这个结论都是一样的,读者可以自行验证啦。

权重更新同样用梯度下降法更新即可:


3. 误差传递的层间关系
先整理一下上面重要的式子
反向传递到任意层任意一个神经元的误差公式:

损失函数对任意一个权重和偏置的梯度:


有人就会想,第层的误差得一层层从后往前求梯度,这么麻烦,如果我知道层的误差的话,是否会容易些呢?于是便来探讨和之间的关系。
首先要引入层:
\delta_{j}^{l}=\frac{\partial{C}}{\partial{z_{j}^{l}}}=\Sigma_{k}\frac{\partial{C}}{\partial{z_{k}^{l+1}}}\frac{\partial{z_{k}^{l+1}}}{\partial{z_{j}^{l}}}=\Sigma_{k}\delta_{k}^{l+1}\frac{\partial{z_{k}^{l+1}}}{\partial{z_{j}^{l}}}
注意:

因此:

故误差传播的层间关系式为:

必须注意的是,这里是而不是,如果不清楚的话看看图4或者自己画个图看看就明白了。
所以最后的式子便是误差传播的层间关系式,整理前面3个式子以及层间关系式,便可以得到描述反向传播的4个重要式子,也就图5的4个式子:

手撕反向传播算法_第5张图片
图5. 反向传播重要公式

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

参考文献:
  1. https://blog.csdn.net/mao_xiao_feng/article/details/53048213
  2. https://www.jianshu.com/p/964345dddb70
  3. https://blog.csdn.net/xierhacker/article/details/53431207

你可能感兴趣的:(手撕反向传播算法)