参考博客:https://blog.csdn.net/qq_21190081/article/details/72871704

    在看卷积神经网络的时候,突然想起来池化是会改变特征图的尺寸的,那反向传播是怎么实现的呢。于是搜了一些博客,感觉上面这个博客写得最清晰直观,就从这个博客里面搬了点东西过来作为笔记。

    Pooling 池化操作的反向梯度传播

    CNN 网络中另外一个不可导的环节就是 Pooling 池化操作,因为 Pooling 操作使得 feature map 的尺寸变化,假如做 2×2 的池化,假设那么第 l+1 层的 feature map 有 16 个梯度,那么第 l 层就会有 64 个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把 1 个像素的梯度传递给 4 个像素,但是需要保证传递的 loss(或者梯度)总和不变。根据这条原则,mean pooling 和 max pooling 的反向传播也是不同的。

    1、mean pooling

    mean pooling 的前向传播就是把一个 patch 中的值求取平均来做 pooling,那么反向传播的过程也就是把某个元素的梯度等分为 n 份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的,图示如下 :

    [未读]Pooling池化操作的反向梯度传播 - 图1

    mean pooling 比较容易让人理解错的地方就是会简单的认为直接把梯度复制 N 遍之后直接反向传播回去,但是这样会造成 loss 之和变为原来的 N 倍,网络是会产生梯度爆炸的。

    2、max pooling

    max pooling 也要满足梯度之和不变的原则,max pooling 的前向传播是把 patch 中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为 0。所以 max pooling 操作和 mean pooling 操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是 max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示 :

    [未读]Pooling池化操作的反向梯度传播 - 图2
    https://blog.csdn.net/qinghuaci666/article/details/81870750