第五周:卷积神经网络(CNN)的反向传播

上一个博客描述了CNN的整个过程(链接https://editor.csdn.net/md/?articleId=120914867),这一个博客来说一下池化层(Sampling)反向传播和卷积层的反向传播的公式是怎么来的

1.池化层反向传播

池化层的反向传播就是已知后一层池化层矩阵的误差梯度,推前一层矩阵的误差梯度。
最大池化的正向传播如下:第五周:卷积神经网络(CNN)的反向传播_第1张图片

  • 以上图最大池化举例,池化后的数字6对应于池化前的红色区域,实际上只有红色区域中最大值数字6对池化后的结果有影响,权重为1,而其它的数字对池化后的结果影响都为0。假设池化后数字6的位置delta误差为 δ \delta δ ,误差反向传播回去时,红色区域中最大值对应的位置delta误差即等于 δ \delta δ,而其它3个位置对应的delta误差为0。因此,在卷积神经网络最大池化前向传播时,不仅要记录区域的最大值,同时也要记录下来区域最大值的位置,方便delta误差的反向传播,如下图。

第五周:卷积神经网络(CNN)的反向传播_第2张图片

  • 而平均池化就更简单了,由于平均池化时,区域中每个值对池化后结果贡献的权重都为区域大小的倒数,所以delta误差反向传播回来时,在区域每个位置的delta误差都为池化后delta误差除以区域的大小,如下图。

  • 第五周:卷积神经网络(CNN)的反向传播_第3张图片

    在上一个博客里对应的是池化层的上一层的误差梯度,对应的求上一次层的误差梯度公式为:池化层上一层的误差梯度=采样层误差扩大后*池化层上一层的sigmoid函数导数;因为池化层的上一层是卷积层,卷积层的输出是通过的池化层上一层的上一层对上一层的输出经过sigmoid函数得来的,所以为了之后求池化层上一层的上一层的误差,要求得池化层上一层的上一层对上一层的输出的误差梯度,所以要对池化层上一层的sigmoid函数求导。

2.卷积层反向传播

卷积层的反向传播就是已知后一层卷积层的矩阵的误差梯度,推前一层矩阵的误差梯度。
通过他人的博客(链接)的描述:
如下图所示,我们求原图A处的delta误差,就先分析,它在前向传播中影响了下一层的哪些结点。显然,它只对结点C有一个权重为B的影响,对卷积结果中的其它结点没有任何影响。因此A的delta误差应该等于C点的delta误差乘上权重B。
第五周:卷积神经网络(CNN)的反向传播_第4张图片
我们现在将原图A点位置移动一下,再看看变换位置后A点的delta误差是多少,同样先分析它前向传播影响了卷积结果的哪些结点。经过分析,A点以权重C影响了卷积结果的D点,以权重B影响了卷积结果的E点。那它的delta误差就等于D点delta误差乘上C加上E点的delta误差乘上B,如下图。
第五周:卷积神经网络(CNN)的反向传播_第5张图片
用相同的方法去分析原图中其它结点的delta误差,结果会发现,原图的delta误差,等于卷积结果的delta误差经过零填充后,与卷积核旋转180度后的卷积。如下图所示:
第五周:卷积神经网络(CNN)的反向传播_第6张图片
所以,有上一个我的博客中有,下一层的扩大的误差梯度与kernel转180后相乘,得到当前层的误差梯度。

3.参考

卷积神经网络(CNN)反向传播算法推导 https://zhuanlan.zhihu.com/p/61898234

你可能感兴趣的:(周记,机器学习与深度学习,cnn,深度学习,机器学习)