理解MaxPool最大池化的作用与反向传播

目前网络中运用最多的pool操作就是maxpool,最大池化。最开始经典的网络用的较多的是平均池化。操作与机制都差不多,一个是取最大值,一个是取平均值。

作为小白的我最近看文章脑子里浮现出几个问题:

  1. 池化层(我们以最大池化为例)的作用
  2. 池化层如何通过反向传播

池化层的最直观的作用就是降维、减少参数量、去除冗余信息、对特征进行压缩、简化网络复杂度、减少计算量、减少内存消耗等等。

《动手学习深度学习》一书中还提到了这样一个作用: 缓解卷积层对位置的过度敏感性,实际上就是特征不变性。以下是书上的解释(pytorch版的《动手学》):

书中这么解释的:
在这里插入图片描述
能不能理解成增大了感受野呢?通过下采用或者不填充(padding)的卷积操作,会使感受野增大,感受野增大对特征位置的鲁棒性也强了。这也是为什么一般网络的feature map都有一定的下采样率,而没有保留原图的size。

在思考第二个问题,如何反向传播的时候,我发现了(其实有的资料早有了)它好像还有另外一个作用?后来我查阅一些资料也证实了这个作用的存在,来看看我的理解对不对。

先看看这个操作怎么反向传播?反向传播这个高大上的机制通俗一点就是在求多元微分(权重的偏导数),但是这个最大池化的操作肯定是不能进行求导操作的吧。那怎么反向传播的呢?直到动手画了下面这个图,茅塞顿开!!!我们把卷积层类比成全连层,并加入类似最大池化层的操作。
在这里插入图片描述
在这里插入图片描述

如上图所示:通过了最大池化操作保留下来的神经元对输出才有贡献,这样反向传播的时候就更新该保留下来的神经元以及与之有关的权重,其他的不更新。这是不是跟全连层某个操作很类似?dropout层!dropout层根据一定概率抛弃某些神经元使得网络不能过于依赖某些神经元的特征(万一是噪声或是其他无用的特征,多度依赖就不好了),从而达到减缓过拟合的效果。从面类似最大池化的操作没有通过概率抛弃,取而代之的是根据最大值来筛选,剩下的神经元抛弃,真有其曲同工之妙!

这也就解释了池化层的另一个作用:防止或者说缓解过拟合

借用别人一张图,懒得画了,谢谢原图主人。最大池化在在CNN中呈现的样子类似下图。
在这里插入图片描述

### 卷积神经网络中的卷积 卷积操作是卷积神经网络的核心组成部分之一。通过滑动窗口的方式,在输入数据上应用一组权重(即滤波器),从而提取局部特征[^1]。 对于二维图像处理而言,卷积可以表示为: \[ (I * K)(i, j)=\sum_{m}\sum_{n} I(i+m, j+n)K(m, n) \] 其中 \(I\) 是输入矩阵,\(K\) 表示核函数或过滤器,而星号(*)代表离散卷积运算符。此过程能够有效地捕捉空间上的模式并减少计算复杂度。 ```python import numpy as np def convolve2D(image, kernel): # 获取图片尺寸 img_h, img_w = image.shape[:2] # 获取内核大小 k_size = kernel.shape[0] output_shape = (img_h - k_size + 1, img_w - k_size + 1) result = np.zeros(output_shape) for y in range(img_h - k_size + 1): for x in range(img_w - k_size + 1): patch = image[y:y+k_size,x:x+k_size] result[y][x]=np.sum(patch*kernel) return result ``` ### 池化层的作用及其形式——平均池化 为了降低维度以及防止过拟合现象的发生,通常会在多个卷积层之间加入池化层。最常见的两种方法是非重叠最大值池化(Max Pooling)和平局值池化(Average Pooling)[^3]。这里主要介绍后者的工作机制:它会取一个小区域内所有像素点数值的均值得到新的单个输出单元;这样做不仅减少了后续处理的数据量还保留了一定程度的空间不变性。 ```python from skimage.measure import block_reduce def avg_pool(input_data, pool_size=(2, 2)): pooled_output = block_reduce(input_data, pool_size=pool_size, func=np.mean) return pooled_output ``` ### 反向传播原理实现细节 在训练阶段,当完成一次完整的前馈之后便进入误差逆传播环节来更新模型参数。具体来说就是利用链式法则沿着整个网络结构逐层传递梯度信息直至最底层,并据此调整各节点对应的权值以最小化损失函数值。针对CNN架构下的特殊之处在于需要考虑不同类型的激活函数、非线性变换等因素的影响[^2]。 假设当前正在优化某一层L,则其权重W_L的变化可由下述公式给出: \[ ΔW^{(L)}=-ηδ^{(L)}A^{(L-1)T}+\alphaΔW^{(L)}_{prev} \] 此处 η 和 α 分别指学习率和动量项系数; δ^(L) 则是从更高层次传回下来的累积误差信号乘以前一时刻该位置处净输入对本层输出求偏导的结果. ```python class ConvLayer: def backward(self, d_out): self.d_weights = signal.correlate2d(self.input.T, d_out, mode='valid') flipped_kernel = np.flipud(np.fliplr(self.weights)) delta_in = signal.convolve2d(d_out, flipped_kernel, mode="full") if hasattr(self.prev_layer,'backward'): self.prev_layer.backward(delta_in) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值