Pooling Layers.

池化(pooling)是卷积神经网络中的重要组成部分。通过池化可以对特征图(feature map)进行降采样,从而减小网络的模型参数量和计算成本,也在一定程度上降低过拟合的风险。池化的作用包括:

  1. 通过降采样增大网络的感受野
  2. 通过信息提取抑制噪声,进行特征选择,降低信息的冗余
  3. 通过减小特征图的尺寸降低模型计算量,降低网络优化难度,减少过拟合的风险
  4. 使模型对输入图像中的特征位置变化(变形、扭曲、平移)更加鲁棒

本文介绍卷积神经网络中的池化方法,包括:

⚪ 通用的池化方法

1. 最大池化 Max Pooling

最大池化(Max Pooling)是将输入的图像特征划分为若干个可重叠的子区域,对每个子区域$R$输出其最大值:

\[\tilde{a} = \mathop{\max}_{i \in R} a_i\]

最大池化只选择每个矩形子区域中的最大值,即提取特征图中响应最强烈的部分进入下一层,这种操作能够过滤网络中大量的冗余信息,但也会丢失特征图中的一些细节信息。

可以使用torch.nn.MaxPool2d构造最大池化层:

maxpool_layer = torch.nn.MaxPool2d(
    kernel_size, # 池化窗口的大小
    stride=None, # 池化操作的步长,默认等于窗口大小
    padding=0,   # 零像素的边缘填充数量
    dilation=1,  # 扩张元素的数量
    return_indices=False, # 返回池化取值的索引,并通过nn.MaxUnpool2d()进行反池化
    ceil_mode=False # 在输出尺寸中是否使用向上取整代替向下取整
    )

2. 平均池化 Average Pooling

平均池化(Average Pooling)是将输入的图像特征划分为若干个可重叠的子区域,对每个子区域$R$输出其平均值:

\[\tilde{a} = \sum_{i \in R}^{} \frac{a_i}{|R|}\]

平均池化选择每个矩形子区域中的平均值,可以提取特征图中所有特征的平均信息,从而保留更多的图像背景信息。

可以使用torch.nn.AvgPool2d构造平均池化层:

avgpool_layer = torch.nn.AvgPool2d(
    kernel_size, # 池化窗口的大小
    stride=None, # 池化操作的步长,默认等于窗口大小
    padding=0,   # 零像素的边缘填充数量
    ceil_mode=False # 在输出尺寸中是否使用向上取整代替向下取整
    count_include_pad=True, # 计算均值时是否考虑填充像素
    divisor_override=None # 若指定将用作平均操作中的除数
    )

3. 混合池化 Mix Pooling

最大池化和平均池化各有利弊,混合池化(Mix Pooling)则通过引入一个取值为$0$或$1$的随机数$\lambda$,每次池化操作随机地选用其中之一:

\[\tilde{a} = \lambda \cdot \mathop{\max}_{i \in R} a_i + (1-\lambda) \cdot \sum_{i \in R}^{} \frac{a_i}{|R|}\]

混合池化优于传统的最大池化和平均池化,缓解了过拟合的风险;并且该方法所需的计算开销可以忽略不计。

4. 分数最大池化 Fractional Max-Pooling

分数最大池化(Fractional Max-Pooling)把输入尺寸为$(N_{in},N_{in})$的区域随机划分为与输出尺寸相同的$N_{out}\times N_{out}$块不均匀的子区域,并对每个子区域执行最大池化操作。

子区域的划分通过随机产生的序列构成。若设置池化窗口的大小为$r$,则随机构造两个递增整数序列\((a_i)_{i=0}^{N_{out}}, (b_j)_{j=0}^{N_{out}}\),序列的起始值为$1$,终止值为$N_{in}$,并且相邻元素之间的递增量取值范围是$[1,…,r]$。则子区域的划分有不相交和重叠两种形式:

\[P=[a_{i-1},a_i-1]\times [b_{j-1},b_j-1] \text{ or } P_{i,j} =[a_{i-1},a_i]\times [b_{j-1},b_j]\]

可以使用torch.nn.FractionalMaxPool2d构造分数最大池化层:

fmp_layer = torch.nn.FractionalMaxPool2d(
    kernel_size, # 池化窗口的大小,应设置为k=N_{out}/N_{in}
    output_size=None,  # 输出特征的空间尺寸
    output_ratio=None, # 输出尺寸与输入尺寸的比值 N_{in}/N_{out}
    return_indices=False # 返回池化取值的索引,并通过nn.MaxUnpool2d()进行反池化
    )

5. 幂平均池化 Power Average Pooling

幂平均池化(Power Average Pooling)是将输入的图像特征划分为若干个可重叠的子区域,对每个子区域$R$输出其$L_p$范数:

\[\tilde{a} = \sqrt[p]{\sum_{i \in R}^{} a_i^p}\]

当$p=1$时,该池化方法与平均池化仅相差一个常数;当$p→∞$时,该池化方法等价于最大池化。

可以使用torch.nn.LPPool2d构造幂平均池化层:

lpp_layer = torch.nn.LPPool2d(
    norm_type,   # l_p范数的系数p
    kernel_size, # 池化窗口的大小
    stride=None, # 池化操作的步长,默认等于窗口大小
    ceil_mode=False # 在输出尺寸中是否使用向上取整代替向下取整
    )

6. 随机池化 Stochastic Pooling

随机池化(Stochastic Pooling)的思路是先对池化窗口中的元素进行归一化,得到概率矩阵。再按其概率按照多项分布(multinomial)采样选择一个元素作为池化输出结果:

在反向传播时,只需保留前向传播被选中元素的索引,将梯度反传到该位置,其实现过程与最大池化的反向传播类似。随机池化特征图中的元素按照其概率值大小随机选择,数值大的元素被选中的概率也大,它不像最大池化只取最大元素值,因此随机池化具有更强的泛化能力。

7. 随机空间采样池化 Stochastic Spatial Sampling Pooling (S3Pool)

S3 (Stochastic Spatial Sampling)池化包括两个步骤。

  1. 使用给定尺寸的最大或平均池化窗口按步长为$1$沿特征图滑动,生成空间尺寸不变的新特征图,假设尺寸为$h \times w$;
  2. 给定超参数栅格尺寸(grid size) $g$,将特征图划分为$\frac{h}{g} \times \frac{w}{g}$个子区域。在每个区域中随机采样$\frac{g}{s}$行$\frac{g}{s}$列,即可得到降采样后尺寸为$\frac{h}{s} \times \frac{w}{s}$的特征图。

S3池化相比于随机池化增加了更多的随机性,相当于一个更强的正则化方法,能够提高模型的表达能力。此外S3池化可以看作一种隐式的针对特征图的数据增强方法。

8. 细节保留池化 Detail-Preserving Pooling (DPP)

细节保留池化(Detail-Preserving Pooling, DPP)认为不同空间位置的像素$q$对中心像素$p$的影响是不同的,因此引入通过可学习参数$\alpha$,$\lambda$控制的权重$w[p,q]$衡量像素$p,q$之间的相关性。对于图像$I$中像素点$p$处的池化计算,考虑其邻域$\Omega_{p}$中的像素点$q$对其影响:

\[D_{\alpha,\lambda}(I)[p] =\frac{1}{\sum_{q' \in \Omega_{p}}^{} w_{\alpha,\lambda}[p,q']} \sum_{q \in \Omega_{p}}^{} w_{\alpha,\lambda}[p,q]I[q]\]

权重$w$受可学习参数$\alpha$和$\lambda$控制:

\[w_{\alpha,\lambda}[p,q] = \alpha + ρ_{\lambda}(I[q]-\tilde{I}[p]) , \quad \tilde{I}_F[p]=\sum_{q \in \tilde{\Omega}_p}^{}F[q]I[q]\]

其中$F[\cdot]$是一个可学习的滤波器算子,$\alpha$是一个全局的奖励参数,$\lambda$用于控制一个奖励函数$ρ(\cdot)$决定像素$q$对像素$p$的影响。$ρ(\cdot)$有两种形式:

DPP池化可以放大空间变化并保留重要的图像结构细节,通过引入可学习的参数控制细节的保存量;此外,DPP池化可以与随机池化等方法结合使用,以进一步提高准确率。

9. 局部重要性池化 Local Importance Pooling (LIP)

局部重要性池化(Local Importance Pooling, LIP)是一种通过学习基于输入的自适应重要性权重,从而在采样过程中自动增强特征提取能力的池化方法。具体地,通过一个子网络自动学习输入特征的重要性;这也可以看作是一种局部注意力方法,通过局部卷积产生注意力权值,并在局部归一化。

对于输入特征$I$,首先生成一个自适应重要性权重图$F(I)$(与输入特征尺寸相同,代表每个像素位置的重要性)。为了使重要性权重非负且易于优化,使用指数构造权重图:

\[F(I)=\exp(\mathcal{G}(I))\]

其中$\mathcal{G}(\cdot)$被称为对数模块(Logit Module),因为其为重要性权重的对数。在实践中,对数模块$\mathcal{G}(\cdot)$是由一个子网络实现的,作者给出了两种实现结构:

在池化过程中,对于特征位置$(x,y)$,选取其邻域$\Omega$,对该邻域的重要性权重进行归一化后作用于原特征的局部滑动窗口,计算得到池化后的特征:

\[O_{x',y'} = \frac{\sum_{(\Delta x,\Delta y) \in \Omega}^{} F(I)_{x+\Delta x,y+\Delta y}I_{x+\Delta x,y+\Delta y}}{\sum_{(\Delta x,\Delta y) \in \Omega}^{} F(I)_{x+\Delta x,y+\Delta y}}\]

LIP可以自适应地学习具有可判别性的特征图,汇总下采样特征同时丢弃无信息特征。这种池化机制能保留物体大部分细节,对于细节信息异常丰富的任务至关重要。

10. 软池化 Soft Pooling

软池化(soft pooling)可以在保持池化层功能的同时尽可能减少池化过程中带来的信息损失,更好地保留信息特征并改善网络的性能。与最大池化等不同,软池化是可微的,通过反向传播回传梯度,有助于网络进一步训练。

软池化的步骤如下:

  1. 通过滑动窗口在特征图上选择局部区域$R$;
  2. 通过softmax计算特征区域的每个像素点权重: \(w_i = \frac{e^{a_i}}{\sum_{j \in R}^{}e^{a_i}}\)
  3. 将相应的特征数值与权重相乘后求和获得输出结果: \(\tilde{a} = \sum_{i \in R}^{}w_i \cdot a_i\)

软池化使得整体的局部数值都有所贡献,并且重要的特征占有较高的权重,能够保留更多信息。

11. 动态优化池化 Dynamically Optimized Pooling (DynOPool)

动态优化池化 (DynOPool)通过学习每一层感受野的最佳大小和形状来调整特征映射的空间尺寸。DynOPool通过参数$r=(r_h,r_w)$控制感受野的大小,把空间尺寸为$H_{in} \times W_{in}$的输入特征划分为$H_{out} \times W_{out}$个栅格:

\[\begin{aligned} H_{out} &= \lfloor H_{in} \cdot r_h \rceil \\ W_{out} &= \lfloor W_{in} \cdot r_w \rceil \end{aligned}\]

DynOPool进一步通过参数$\delta=( \delta_h,\delta_w)$控制感受野的形状。对于某个栅格中心$p=(p_h,p_w)$,构造四个查询点$q=(p_h ± \delta_h,p_w± \delta_w)$,四个查询点的像素值通过双线性插值获得。则该栅格的输出可以通过四个查询点的聚合函数(比如最大池化)构造。

⚪ 为下游任务设计的池化方法

1. 全局平均池化 Global Average Pooling (GAP)

早期的卷积神经网络设计中,在卷积层和池化层后通常将特征图展开成一维向量,并设置全连接层用于降维和后续的分类等任务。由于全连接层具有较多参数量,会降低网络的训练速度并引入过拟合的风险;可以使用全局平均池化(Global Average Pooling,GAP)将整个特征图中每个通道的所有元素取平均进行输出:

GAP相当于为每一个分类类别指定一个通道的特征图,使用该特征图的平均值作为该类别的概率。它使得卷积神经网络对输入尺寸不再有限制(全连接层需要固定的输入尺寸),并且没有引入额外的参数,因此没有增加过拟合的风险。GAP也可以看作一种正则化的方法,因为它显式地把最后一层特征图作为类别置信度图。

可以使用torch.nn.AdaptiveAvgPool2d构造全局平均池化层:

gap_layer = torch.nn.AdaptiveAvgPool2d(output_size=1)

2. 协方差池化 Covariance Pooling

协方差池化(Covariance Pooling)是指计算特征图的协方差,从中提取高阶统计信息,以此构造特征向量:

对于尺寸为$D \times H \times W$的特征图,首先将其变换为特征矩阵$X \in \Bbb{R}^{D \times HW}$,之后计算该矩阵的协方差矩阵:

\[C = X \hat{I} X^T\]

其中散点矩阵$\hat{I}=\frac{1}{HW}(1-\frac{1}{HW}11^T)$。对协方差矩阵$C$进行特征值分解$C=U \Sigma U^T$,使用矩阵对数将协方差矩阵投影到欧氏空间,获得池化后的特征:

\[F = U\log(\Sigma)U^T\]

由于$F$是对称矩阵,只取其右上角元素。将其展开后作为长度为长度为$\frac{D(D+1)}{2}$的输出特征向量$f$,并进一步执行后续任务。

3. 空间金字塔池化 Spatial Pyramid Pooling (SPP)

空间金字塔池化能够把任意不同尺寸和不同纵横比的图像特征转换为固定尺寸大小的输出特征向量。在实现时分别把特征划分成$k_i \times k_i$的栅格,然后应用最大池化操作构造长度为$\sum_i k_i^2c$的输出特征。

4. 感兴趣区域池化 Region of Interest Pooling (RoI Pooling)

感兴趣区域池化 (RoI Pooling)是指在目标检测过程中,根据提取的RoI坐标在特征图中选定区域,并把这部分区域转化为固定空间尺寸的输出特征图。构造过程为把特征区域划分成$k \times k$的栅格,然后对每个栅格应用最大池化操作。

5. 双线性池化 Bilinear Pooling

双线性池化主要用于特征融合。对于从同一个样本提取出来的特征$x$和特征$y$,通过双线性池化得到两个特征融合后的向量,并进一步用于下游任务。

对于图像\(\mathcal{I}\)在位置$l$的两个特征\(f_A(l, \mathcal{I}) \mathbb{R}^{1 \times M}\)和\(f_B(l, \mathcal{I}) \mathbb{R}^{1 \times N}\), 对其进行双线性融合后得到矩阵$b$;对图像所有位置的矩阵$b$求和后展开为向量$x$,对$x$进行矩归一化和L2归一化后得到融合特征$z$。

\[\begin{aligned} b\left(l, \mathcal{I}, f_A, f_B\right) & =f_A^T(l, \mathcal{I}) f_B(l, \mathcal{I}) & & \in \mathbb{R}^{M \times N} \\ \xi(\mathcal{I}) & =\sum_l b\left(l, \mathcal{I}, f_A, f_B\right) & & \in \mathbb{R}^{M \times N} \\ x & =\operatorname{vec}(\xi(\mathcal{I})) & & \in \mathbb{R}^{M N \times 1} \\ y & =\operatorname{sign}(x) \sqrt{|x|} & & \in \mathbb{R}^{M N \times 1} \\ z & =y /\|y\|_2 & & \in \mathbb{R}^{M N \times 1} \end{aligned}\]

如果特征$x$和特征$y$来自两个特征提取器,则被称为多模双线性池化(MBP,Multimodal Bilinear Pooling);如果特征$x=y$,则被称为同源双线性池化(HBP,Homogeneous Bilinear Pooling)或者二阶池化(Second-order Pooling

原始的双线性池化存在融合后的特征维数过高的问题,融合后的特征维数等于特征$x$和特征$y$的维数之积。一些降低融合特征维数的方法可参考:Compact Bilinear Pooling (CBP), Multimodal Compact Bilinear Pooling (MCBP), Low-rank Bilinear Pooling (LBP), Grassmann Pooling