本文以作者阅读《Dive into Deep Learning》为线索,融合串联了自身理解感悟、原始论文、优秀文章等。如有无意侵权,请联系本人删除。
填充 & 步幅 & 下采样
由上一节,可以得知卷积的输出大小和输入形状、卷积核形状有关:
输出形状为:\((n_h-k_h+1) \times (n_w-k_w+1)\)
很显然,如果这样连续进行多层卷积处理,最终的输出大小会小于输入大小。
对这种情景,通常有两种反应:
- 这会丢失了原始图像边界的不少信息 用 填充 解决
- 正好我们想要降低图像分辨率 用 步幅 解决
填充
在卷积操作中,边缘像素参与计算的次数少于中心像素,导致边界信息在深层网络中逐渐被稀释。
一种简单解决方法为:在输入图像的边界新开多行/列并填充元素(常为0)。
如果希望输入输入和输出具有相同的高度宽度,可以在顶部填充 \(\lceil \frac{k_h-1}{2}\rceil\),在底部填充 \(\lfloor \frac{k_h-1}{2}\rfloor\)。对首尾列的填充同理。这就是 Same Conv. (如果不填充就是 Valid Conv. ,这在降低特征图的空间维度上很有用),通常用于卷积层中步幅为\(1\)的操作中。
一般认为,卷积核的高度、宽度均为奇数:
- 偶数核的对称填充可能导致输入与输出大小无法对齐
- 奇数维度的卷积会有一个中心点,而在CV中有一个中心像素点会更方便,因为可以指出卷积位置
- 奇数方阵卷积核可以计算半径,更加方便表达与计算
拓展一下,我们常用的标准零填充有无缺点?
有的。根据一篇Facebook AI发表的论文(arxiv.org/pdf/2010.02178),当输入尺寸不满足 特定条件 (详见下文) 时,填充只在特征图的单侧被有效应用,另一侧失活浪费,因此卷积核在不同空间位置收到的零值信息不平衡,从而模型在训练中,卷积核的某些位置(如左侧、上侧)会更频繁地与填充的零值相乘,导致其学习到的权重出现系统性偏斜。
而这种不对称的权重会在前向传播中,在特征图上产生不依赖于图像内容的、固定的线条或网格状激活模式,也就是一些在平均图中的可见的线条。这些线条与任何场景特征都不相似,并且始终存在于各个特征图中。
因此,这会在特征图的特定空间位置,模型对某些类别的目标(尤其是小目标)的响应被地抑制,导致漏检(此文以交通灯检测器为例);同时会削弱平移不变性。
这里的 特定条件 是什么呢?
因为步长是跳跃式的,为了保证每边的填充都能被均匀应用,应该满足:(以高度为例)
\[h_{前一层}=stride_{当前层} \cdot (h_{当前层}-1)+k_{当前层}^h - 2\cdot p_{当前层}^h \]
\(p\) 是填充量。
如果这个条件不满足,我们可以认为:卷积核可以覆盖整个填充后的特征图,但覆盖的方式是偏心的。
为了能够覆盖所有有效值,靠右和靠下(如果从左上开始)的卷积核,很可能卷积核只有局部区域与有效特征值相乘,而右侧、下侧部分超出了有效输入区域,只能与零填充相乘;或者是一侧的填充被卷积核消耗,而另一侧的填充则没有。这种不均匀的交互会在训练中诱导卷积核权重变得空间不对称,进而产生特征图伪影并可能形成检测盲区。
有一种缓解这一现象的方法是不用简单的 \(0\) 来进行填充,而是使用对称填充/镜像填充(Mirror Padding ),就是在输入图像的外部,通过复制对称边界像素来填充新的像素值,这能确保填充元素与原始图像的边缘像素在视觉上保持一致。
也可以使用反射填充(Reflect Padding ),就是将输入图像的边缘像素作为对称轴,然后将这些像素向外反射,形成新的填充像素。因此会有4个对称轴,可能比对称填充更加光滑。这与镜像填充的区别:填充的部分其实是从边缘的内部一行开始。
步幅
就是卷积核在输入上每次移动的像素数。
有时候我们希望主动降低特征图的分辨率,以减少模型复杂度,并且想要拓展后续层的感受野,一种直接的方法是增大步幅(Stride )。当步幅大于 \(1\) 时,卷积核跳过一些像素,从而减少输出的空间尺寸。
引入步幅后,卷积输出的形状计算公式为:
\[\begin{align} H_{out}&=\lfloor\frac{H_{in} - k_h + 2p_h}{s}\rfloor + 1\\ W_{out}&=\lfloor\frac{W_{in} - k_w + 2p_w}{s}\rfloor + 1 \end{align}\]
感受野(Receptive Field ), 就是卷积网络中每一层输出的特征图上的像素点在原始图形映射的区域大小,也就是特征图上每个点的信息来源范围。
易知,越深层的神经元看到的底层的输入区域越大。随着网络层数加深,感受野会指数级增长,使深层神经元能够整合更大范围的上下文信息,从而捕获更高级的语义特征。更大的感受野意味着神经元能够捕获更大范围的、更全局的上下文信息,这对于理解图像中的大尺度物体和语义至关重要。
感受野(\(\mathbf{RF}\))递推的计算公式:\(\mathbf{RF}l=\mathbf{RF}{l-1}+(k_l-1)\times \prod_{i=1}^{l-1}s_i\)
下采样
就是将降低特征图的空间分辨率。减少特征图的高度宽度(有时也增加通道数),以对输入数据进行压缩与抽象,有选择得保留重要的特征表示。
目的:
- 降低计算复杂度
- 扩大感受野,感知更多全局信息
- 增强平移不变性
- 起到正则化作用,控制过拟合
- 抽象化特征,增强对细节变化的鲁棒性
常见实现方法:
- 汇聚(池化):
- 最大汇聚:将特征图分割为多个同大小的块,每块中只取最大数字,抛弃该块中的其他数据。比如\(n\times n\xrightarrow{2\times 2\space Pooling\space Filter\space with\space stride=2}\frac{n}{2}\times \frac{n}{2}\),用于保留最显著的特征,适用于纹理识别、边缘检测等对微小偏移、旋转不敏感的任务,一出现某特征就立刻响应,类似于一种二元特征存在检测器。
- 平均汇聚:同上分割,每块取平均值。如:\(n\times n\xrightarrow{2\times 2\space Pooling\space Filter\space with\space stride=2}\frac{n}{2}\times \frac{n}{2}\),用于保留整体统计特征,平滑噪声,常用于分类任务的全连接层之前,或者是用于网格末端的全局特征整合。
- 全局平均/最大汇聚:Filter 的大小等于Feature Map的大小,每个通道返回值为本通道的均值/最大值,有 \(w\times h\times c\xrightarrow{w\times h\space Pooling\space Filter\space }1\times1\times c\) ,一个多维
tensor输出一个一维vector,用于避免全连接层巨大的参数量。
- 步幅卷积:用步幅大于 \(1\) 的卷积层采样,有可学习性,并且可保留更多信息。
加入后的流程:\(卷积\rightarrow 激活函数\rightarrow 下采样\)
写在最后:对D2L的讲解顺序进行了简单的调整,以适应循序渐进性