CNN卷积神经网络反向传播推导总结及推导细节
CNN卷积神经网络在当下图像分类领域是很常用的一种神经网络,它的权值共享特性使得它在图像处理中训练的参数要比普通的神经网络训练参数少的多。
从池化层推导上层误差


这几天自己用java实现了一下CNN的正向计算与误差反向传播,正向计算很好理解,也比较容易实现,但反向传播由于与普通的神经网络不同,实现会稍微复杂一些,看了很多博主的文章,感觉对卷积层的误差后向传递及卷积层自身weight和bias的计算有些细节没有说清楚,这里再总结一下。
定义误差
全连接层与一般的神经网络bp算法相同,此处将与单元n相关的误差项定义为 (注意此处误差的定义中有‘-’号),则更新权值时有
为单元n的输出(
)
为
通过sigmoid后的输出,本文中设
从池化层推导上层误差
池化层如果是取max,则把池化层的
的值放在之前做前向传播算法得到最大值的位置。例:
假设前层最大值位置分别为左上,右下,右上,左下,则
池化层如果取平均值,则将误差平均即
从卷积层推导上层误差
对下一层来说误差可以用下面的公式推导(注:DownStream表示下层输入中包含单元j的输出的所有下层单元)
目标:已知k单元所在的层(即本层卷积层)的误差项,求前一层j单元的误差项
- 现在考虑
如何计算,用最简单的例子(这里设前向传播时只是简单的和卷积核weight的乘法而不是卷积):
- 则有
对于只有
的值与其相关联,则
而对于有
和
与其关联,则
其他的同理求得。
- 此时发现这个这些误差项和卷积核weight的乘积可以用卷积来表示:将卷积层误差项补0,和卷积核做卷积
- 那在程序实现的时候补多少0呢,补0的目标是在卷积回去时与原输入的矩阵大小一致,如:上层矩阵大小为l,卷积核大小为k,步长为1,则卷积层矩阵大小为l-k+1,此时卷积层误差项矩阵大小肯定也为l-k+1,将此矩阵填充到l+k-1大小即可。
从卷积层误差项推导卷积核weight的梯度
这里先说明下:梯度本身是一个向量,表示函数沿这个方向上升最快,所以在更新weight时需用-1乘weight的梯度
这里与上面的推导有些像
- 有
对于有
其余的同理可以推出
- 此时发现对于误差项与上一层对本层输入的乘积可以表示为上层输入与本层误差项的乘
特别说明:如果前向传播为对应的乘,这里就是乘操作;如果前向传播为卷积,这里才是卷积。(这点在有些博客中可能没有说清楚,如果混淆了,可以自己按照上面的方法推导一下)
- 对于偏置bias:大多博客没有给出证明,所以我在这里证明下,在本例中
即将本层的误差项求和
文中数学用语可能不太标准,推导方面的问题欢迎指正交流
参考:
- Machine Learing (美)Mitchell,T.M.