一、卷积与互相关
卷积是信号处理、图像处理和其他工程/科学领域中广泛使用的技术。在深度学习中,一种模型架构,即卷积神经网络 (CNN),就是以这种技术命名的。然而,深度学习中的卷积本质上是信号/图像处理中的互相关。这两个操作之间存在细微差别。
在信号/图像处理中,卷积定义为:
(
f
∗
g
)
(
t
)
=
∫
−
∞
∞
f
(
τ
)
g
(
t
−
τ
)
d
τ
(f * g)(t)=\int_{-\infty}^{\infty} f(\tau) g(t-\tau) d \tau
(f∗g)(t)=∫−∞∞f(τ)g(t−τ)dτ
信号处理中的卷积。filter(滤波器) g 反转,然后沿水平轴滑动。对于每个位置,我们计算 f 和反向 g 之间的交点面积。交集区域就是那个特定位置的卷积值。 另一方面,互相关被称为两个函数的滑动点积或滑动内积。互相关 filter 没有反转,它直接滑过函数 f。f 和 g 之间的交叉区域是互相关。下图展示了相关性和互相关性之间的区别。
在深度学习中,卷积中的 filter 并没有反转。严格地说,它是互相关。我们本质上是执行逐元素乘法和加法。但在深度学习中,直接将其称之为卷积更加方便。这没什么问题,因为过滤器的权重是在训练阶段学习到的。如果上面例子中的反转函数 g 是正确的函数,那么经过训练后,学习得到的过滤器看起来就会像是反转后的函数 g。因此,在训练之前,没必要像在真正的卷积中那样首先反转过滤器。
二、2D 卷积
做卷积的目的是从输入中提取有用的特征。在图像处理中,可以选择多种不同的 filter 进行卷积。每种类型的 filter 都有助于从输入图像中提取不同的方面或特征,例如水平/垂直/对角线边缘。类似地,在卷积神经网络中,使用在训练过程中自动学习权重的 filter,再通过卷积提取不同的特征。然后将所有这些提取的特征“组合”以做出决策。一般来说,在深度学习中,filter被称作卷积核。
进行卷积有一些优点,例如权重共享和平移不变性。卷积还考虑了像素的空间关系。这些可能非常有用,尤其是在许多计算机视觉任务中,因为这些任务通常涉及识别某些组件与其他组件具有特定空间关系的对象(例如,狗的身体通常与头部、四条腿和尾巴相连)。
2.1 单通道卷积
在深度学习中,卷积是逐元素的乘法和加法。对于具有 1 个通道的图像,卷积如下图所示。这里的卷积核是一个 3 x 3 矩阵,权重为
(
0
1
2
2
2
0
0
1
2
)
\begin{pmatrix} 0 & 1 & 2 \\ 2 & 2 & 0 \\ 0 & 1 & 2 \end{pmatrix}
020121202
卷积核在输入中滑动。在每个位置,它都在进行逐元素乘法和加法。每个滑动位置以一个数字结束。最终输出是一个 3 x 3 矩阵。(注意本例中的 stride = 1 和 padding = 0。这些概念将在下面的部分进行描述)
2.2 多通道卷积
在许多应用场景中,我们需要处理具有多个通道的图像。一个典型的例子是 RGB 图像。每个 RGB 通道强调原始图像的不同方面,如下图所示。
多通道数据的另一个例子是卷积神经网络中的层。卷积网络层通常由多个通道(通常为数百个通道)组成。每个通道描述前一层的不同方面。我们如何在不同深度的层之间进行过渡?我们如何将深度为 n 的层转换为深度为 m 的下一层?
如上图,层和filter在同一个层级,通道和kernel在同一个层级 。filter和kernel之间的区别有点混乱。有时,它们可以互换使用,这可能会造成混淆。但本质上,这两个术语有细微的差别。kernel指的是权重的二维数组。filter指的是堆叠在一起的多个kernel的 3D 结构。对于2D filter,filter与kernel相同。但是对于 3D filter和深度学习中的大多数卷积,filter是kernel的集合。每个kernel都是独一无二的,强调输入通道的不同方面。在实际中,我们不太区分filter和kernel的区别,都认为是卷积核。
有了这些概念,多通道卷积如下。每个内核都应用于前一层的输入通道以生成一个输出通道。这是一个内核方面的过程。我们对所有内核重复此过程以生成多个通道。然后将这些通道中的每一个相加在一起形成一个单一的输出通道。下面通过一个例子解释多通道卷积。
- 这里的输入层是一个 5 x 5 x 3 的矩阵,有 3 个通道。filter 是一个 3 x 3 x 3 矩阵。首先,filter 中的每个内核分别应用于输入层中的三个通道。执行三个卷积,产生 3 个大小为 3 x 3 的通道
- 然后将这三个通道相加(按元素相加)以形成一个通道 (3 x 3 x 1)。该通道是使用 filter(3 x 3 x 3 矩阵)对输入层(5 x 5 x 3 矩阵)进行卷积的结果。
等价地,我们可以将此过程视为在输入层中滑动 3D filter 矩阵。请注意,输入层和 filter 具有相同的深度(通道数 = 内核数)。3D filter 仅在图像的二维方向:高度和宽度上移动(这就是为什么这种操作被称为 2D 卷积,尽管 3D filter 用于处理 3D 数据)。在每个滑动位置,我们执行逐元素乘法和加法,得到一个数字。在下面所示的示例中,filter 在水平 5 个位置和垂直 5 个位置执行。总的来说,我们得到一个单一的输出通道。
现在我们可以看到如何在不同深度的层之间进行过渡。假设输入层有 Din 通道,我们希望输出层有 Dout 通道。我们需要做的只是将Dout 个卷积核应用于输入层。每个 filter 都有Din 个内核。每个 filter 提供一个输出通道。应用Dout 个 filter 后,我们有Dout 通道,然后可以将它们堆叠在一起形成输出层。
三、3D 卷积
在上一节多通道卷积中,我们实际上是在对 3D 执行卷积。但通常,我们在深度学习中仍然称该操作为 2D 卷积。它是 3D 数据的 2D 卷积。filter 深度与输入层深度相同。3D filter 仅在 2 个方向(图像的高度和宽度)移动。这种操作的输出是一个 2D 图像(只有 1 个通道)。
与此相对的,还有 3D 卷积。它们是2D 卷积的推广。在 3D 卷积中,filter 深度小于输入层深度(内核大小 < 通道大小)。因此,3D filter 可以在所有 3 个方向(图像的高度、宽度、通道)上移动。在每个位置,filter 提供一个结果。由于 filter 在 3D 空间中滑动,因此输出数字也排列在 3D 空间中。然后输出 3D 数据。
与编码 2D 域中对象空间关系的 2D 卷积类似,3D 卷积可以描述 3D 空间中对象的空间关系。这种 3D 关系对于某些应用很重要,在生物医学成像的 3D 分割/重建中,例如 CT 和 MRI,其中诸如血管在 3D 空间中曲折蜿蜒。
四、1 × 1卷积
在了解卷积的基本知识以后,我们来看一个有意思的内容:1 × 1卷积。
表面来看,1 × 1卷积就是把输入层的一个通道乘以一个权重并相加,似乎没有什么作用,但真的是这样吗?在单通道来看,确实如此。不过进入到多通道,就变得不同了。
最初,Network-in-network中提出了 1x1 卷积。然后,它们在 Google Inception中被频繁使用,1x1 卷积的一些优点是:
- 对通道数实现升维/降维
- 实现跨通道的信息交互与整合
- 卷积后添加非线性特征
对于前面两点,在上图中很明显。经过卷积后,通道数实现了降维,并且对输入层通道的信息进行了融合,嵌入到输出层的一个通道上。在经过卷积以后,我们可以实现第三点,添加一些非线性的激活,允许网络学习更复杂的特征。
Yann LeCun 认为“在卷积网络中,没有‘全连接层’这样的东西。只有带有 1x1 卷积核和全连接表的卷积层。”也就是说, 1x1 卷积可以替代全连接层。
为什么呢?我们以单通道 3x3 特征图 为例:
1 2 3 4 5 6 7 8 9 \begin{array}{|l|l|l|} \hline 1 & 2 & 3 \\ \hline 4 & 5 & 6 \\ \hline 7 & 8 & 9 \\ \hline \end{array} 147258369
我们把该特征图拉直,做全连接
得到第一个输出为
1 ∗ w 1 + 2 ∗ w 2 + ⋯ ⋯ + 9 ∗ w 9 1 * w_{1}+2 * w_{2}+\cdots \cdots+9 * w_{9} 1∗w1+2∗w2+⋯⋯+9∗w9
原有特征图被flatten,再对其做 1× 1× 9 卷积:
[
1
2
3
4
5
6
7
8
9
]
∙
[
w
1
w
2
w
3
w
4
w
5
w
6
w
7
w
8
w
9
]
\begin{bmatrix} 1\\ 2\\ 3\\ 4\\ 5\\ 6\\ 7\\ 8\\ 9 \end{bmatrix}\bullet \begin{bmatrix} w_{1}\\ w_{2}\\ w_{3}\\ w_{4}\\ w_{5}\\ w_{6}\\ w_{7}\\ w_{8}\\ w_{9} \end{bmatrix}
123456789
∙
w1w2w3w4w5w6w7w8w9
得到的结果显然也是,
1
∗
w
1
+
2
∗
w
2
+
⋯
⋯
+
9
∗
w
9
1 * w_{1}+2 * w_{2}+\cdots \cdots+9 * w_{9}
1∗w1+2∗w2+⋯⋯+9∗w9
这样,我们求得全连接层输出的一个结点。对被flatten的特征图,做全连接层输出维度次数(如示例中,输出维度为5)的1 × 1卷积(忽略了深度,示例中深度为9),就得到了与全连接层相同的结果。
五、卷积算法
我们已经知道,卷积如何在深度方向上作用,接下来我们看一下在宽度和高度的2D 平面上,卷积如何作用。
首先我们了解一些术语:
- 内核大小:内核大小定义了卷积的视野。2D 的常见选择是 3,即 3x3 像素。
- 步幅(Stride):步幅定义了内核遍历图像时的步长。虽然它的默认值通常是 1,但我们可以使用步长 2 对图像进行下采样,类似于 MaxPooling。
- 填充(Padding):填充定义样本边界的处理方式。填充卷积将保持空间输出维度等于输入,而如果内核大于 1,则未填充卷积将裁剪掉一些边界。
- 输入和输出通道:卷积层采用一定数量的输入通道 (I) 并计算特定数量的输出通道 (O)。层所需的参数可以通过 I × O × K 计算,其中 K 等于内核大小(如3x3 )。
下图描述了 k = 3、s = 1 和 p = 1 的 2D 卷积。
对于大小为 i、内核大小为 k、填充为 p 和步幅为 s 的输入图像,卷积输出图像通道为
o = ⌊ i + 2 p − k s + 1 ⌋ \quad o=\left\lfloor\dfrac{i+2p-k}{s}+1\right\rfloor o=⌊si+2p−k+1⌋
六、扩张卷积(空洞卷积)
扩张卷积(Dilated Convolutions),也叫做空洞卷积(Atrous Convolution),是一种典型的离散卷积。
扩张卷积如下:
扩张卷积向卷积层引入了另一个参数,称为扩张率L(dilation rate)。这定义了内核中权重之间的间距。膨胀率为 2 的 3x3 内核将具有与 5x5 内核相同的视野,但仅使用 9 个参数。
实现可能会有所不同,但通常在内核元素之间插入 l-1 个空格。下图显示了 l = 1、2和4时的内核大小。
上图中,3 x 3 的红点表示经过卷积后,输出图像为 3 x 3 像素。尽管三个扩张卷积都提供相同维度的输出,但模型观察到的感受野却截然不同。对于 l = 1 ,感受野是 3 x 3 。l = 2是 7 x 7 。当 l = 4时,感受野增加到 15 x 15 。有趣的是,这些操作相关参数数量基本相同。我们在不增加额外费用的情况下“观察”了一个更大的区域。正因为如此,扩张卷积用于在不增加内核大小的情况下廉价地增加输出单元的感受野,这在多个扩张卷积依次堆叠时特别有效。
相关论文作者用多层扩张卷积构建了一个网络,其中扩张率 l 在每一层呈指数增长。结果,有效感受野呈指数增长,而参数数量仅随层数线性增长!论文中的扩张卷积用于在不损失分辨率的情况下系统地聚合多尺度上下文信息。
6.1 扩张卷积的问题
但实际上,扩张卷积虽然在不损失特征图尺寸的情况下增大了感受野,但是也会带来新的问题,主要是体现在卷积的输入,由于内核是有间隔的,这意味着不是所有的输入都参与计算,整体特征图上体现出一种卷积中心点的不连续,尤其是当叠加的卷积层都是用相同的 dilation rate 的时候:
解决这个问题最直接的方法当然就是不使用连续的 dilation rate 相同的扩展卷积,但是这还不够,因为如果 dilation rate 是成倍数的,那么问题还是存在。所以最好的方式是将连续排布的扩张卷积的 dilation rate 设置为“锯齿状”,比如分别是(1,2,3),那么卷积中心的分布就会变成下面这样,不在有遗漏的情况。
七、转置卷积(Transposed convolution)
对于许多应用和网络中,我们通常希望在与普通卷积相反的方向上进行转换,即我们希望执行上采样。例如在自动编码器或语义分割中,我们需要生成高分辨率图像并将低维特征图映射到高维空间。
传统上,可以通过应用插值方案或手动创建规则来实现上采样。另一方面,神经网络等现代架构倾向于让网络本身自动学习正确的转换,而无需人工干预。为此,我们可以使用转置卷积。
转置卷积有时候也被称为反卷积(Deconvolution),但是这种说法是不准确的。因为转置卷积并不是信号/图像处理中定义的真正的反卷积。从技术上讲,信号处理中的反卷积与卷积运算相反,可以完全恢复卷积之前的状态。但在深度学习上,真正的反卷积是不存在的。
我们可以用直接卷积来实现转置卷积。对于下图中的示例,我们在一个 2 × 2 的输入(周围加了 2 × 2 的零填充)上应用一个 3 × 3 核。上采样输出的大小是 4 × 4
同样的,我们可以通过应用不同的填充和步幅将相同的 2 x 2 输入映射到不同的图像尺寸。下面,转置卷积被用在了同一张 2 × 2 输入上(输入之间插入了一个零,并且周围加了 2 × 2 的单位步长的零填充),所得输出的大小是 5 × 5。
观察上述例子中的转置卷积能帮助我们构建起一些直观认识。但为了泛化其应用,了解其如何通过计算机的矩阵乘法实现是有益的。从这一点上我们也可以看到为何转置卷积才是合适的名称。
在卷积中,我们定义 C 为卷积核,Large 为输入图像,Small 为输出图像。经过卷积(矩阵乘法)后,我们将大图像下采样为小图像。这种矩阵乘法的卷积的实现遵照:C x Large = Small。
下面的例子展示了这种运算的工作方式。它将输入平展为 16×1 的矩阵,并将卷积核转换为一个稀疏矩阵(4×16)。然后,在稀疏矩阵和平展的输入之间使用矩阵乘法。之后,再将所得到的矩阵(4×1)转换为 2×2 的输出。
现在,如果我们在等式两边乘以矩阵 C 的转置,并使用矩阵与其转置矩阵相乘得到单位矩阵的性质,那么我们有以下公式 CT x Small = Large,如下图所示。
显然,这就是我们需要的上采样,清晰的说明了为什么叫做转置卷积。
7.1 棋盘效应
在使用转置卷积的过程中,人们发现了一个问题
这就是棋盘效应:由于转置卷积的“不均匀重叠”(Uneven overlap)的结果。使图像中某个部位的颜色比其他部位更深。
下图中,最上面的层是输入层,最下面的层是转置卷积后的输出层。在转置卷积过程中,尺寸较小的层被映射到尺寸较大的层。
在示例 (a) 中,步幅为 1,卷积核大小为 2。如红色轮廓所示,输入上的第一个像素映射到输出上的第一个和第二个像素。如绿色所示,输入上的第二个像素映射到输出上的第二个和第三个像素。输出端的第二个像素从输入端的第一个和第二个像素接收信息。总的来说,输出中间部分的像素从输入接收相同数量的信息。这里存在一个内核重叠的区域。随着示例 (b) 中卷积核大小增加到 3,接收最多信息的中心部分缩小。但这可能不是什么大问题,因为重叠仍然是均匀的。输出中心部分的像素从输入接收相同数量的信息。
现在对于下面的示例,我们更改步幅 = 2。在示例 (a) 中,卷积核大小 = 2,输出上的所有像素从输入接收相同数量的信息。它们都从输入上的单个像素接收信息。这里没有转置卷积的重叠。
如果我们在示例 (b) 中将卷积核大小更改为 4,则均匀重叠的区域会缩小。但是,仍然可以使用输出的中心部分作为有效输出,其中每个像素从输入接收相同数量的信息。然而,如果我们在示例 © 和 (d) 中将卷积核大小更改为 3 和 5,事情就会变得有趣。对于这两种情况,输出上的每个像素与其相邻像素相比接收到不同数量的信息。无法在输出中找到连续且均匀重叠的区域。
当卷积核大小不能被步幅整除时,转置卷积具有不均匀的重叠。这种“不均匀的重叠”使某些地方的信息比其他地方多,从而产生了棋盘效果。事实上,不均匀重叠的区域在二维上往往更极端。
在应用转置卷积的同时,可以做两件事来减少此类现象。首先,确保使用的输入大小整除步幅,避免重叠问题。其次,可以使用 stride = 1 的转置卷积,这有助于减少棋盘效应。然而,正如最近的许多模型中所见,棋盘效应依然会产生。
有论文提出了一种更好的上采样方法:先调整图像的大小(使用最近邻插值或双线性插值),然后再做一个卷积层。通过这样做,该文章避免了棋盘效应
八、可分离卷积
可分离卷积用于某些神经网络架构,例如 MobileNet。可以在空间上进行可分离卷积(spatially separable convolution),也可以在深度上进行(depthwise separable convolution)。
8.1 空间可分离卷积
空间可分离卷积对图像的二维空间维度(即高度和宽度)进行操作。从概念上讲,空间可分离卷积将一个卷积分解为两个独立的操作。对于下面显示的示例,一个 3 x 3 卷积核被分为 3 x 1 和 1 x 3 卷积核。
在卷积中,3 x 3 核直接与图像进行卷积。在空间可分离卷积中,3x1 核首先与图像进行卷积。然后应用 1 x 3 内核。在执行相同的操作时,这将只需要 6 个参数。
此外,与卷积相比,在空间可分离卷积中需要更少的矩阵乘法。举一个具体的例子,在一个 5 x 5 的图像上用一个 3 x 3 的卷积核(stride=1,padding=0)进行卷积需要水平扫描 3 个位置(和垂直 3 个位置)。总共有 9 个位置,如下图中的点所示。在每个位置,应用 9 个元素乘法。总的来说,这是9 x 9 = 81 次乘法。
另一方面,对于空间可分离卷积,我们首先在 5 x 5 图像上应用 3 x 1 卷积核。我们在水平 5 个位置和垂直 3 个位置扫描这样的卷积核。总共有5 x 3=15 个位置,在下图中用点表示。在每个位置,应用 3 个元素乘法。即15 x 3 = 45次乘法。我们现在获得了一个 3 x 5 矩阵。该矩阵现在与 1 x 3 内核进行卷积,该内核在水平方向和垂直方向扫描矩阵的 3 个位置。对于这 9 个位置中的每一个,应用 3 个元素乘法。这一步需要9 x 3=27次乘法。因此,总体而言,空间可分离卷积需要45 + 27 = 72乘法,小于正常卷积。
虽然空间可分离卷积节省了成本,但在深度学习中很少使用。主要原因之一是并非所有内核都可以分为两个较小的内核。如果我们用空间可分离的卷积替换所有传统的卷积,我们将限制自己在训练期间使用所有可能的内核。训练结果可能不是最佳的。
8.2 深度可分离卷积
深度可分离卷积在深度学习中更为常用,深度可分离卷积由两个步骤组成:深度卷积和 1x1 卷积。
在描述这些步骤之前,有必要重新审视一下我们在前几节中谈到的 2D 卷积和 1 x 1 卷积。让我们快速回顾一下标准二维卷积。举个具体的例子,假设输入层的大小为 7 x 7 x 3(高 x 宽 x 通道),卷积核的大小为 3 x 3 x 3。经过一个卷积核的 2D 卷积后,输出层为大小为 5 x 5 x 1(只有 1 个通道)。
通常,在两个神经网络层之间应用多个卷积核。假设我们这里有 128 个卷积核。在应用了这 128 个 2D 卷积之后,我们有 128 个 5 x 5 x 1 输出图。然后我们将这些地图堆叠成一个大小为 5 x 5 x 128 的单层。通过这样做,我们将输入层 (7 x 7 x 3) 转换为输出层 (5 x 5 x 128)。空间维度,即高度和宽度被缩小,而深度被扩展。
现在有了深度可分离卷积,让我们看看如何实现相同的转换。
首先,我们将深度卷积应用于输入层。我们没有在 2D 卷积中使用大小为 3 x 3 x 3 的单个卷积核,而是分别使用了 3 个卷积核。每个卷积核的大小为 3 x 3 x 1。每个内核与输入层的 1 个通道进行卷积(仅 1 个通道,而不是所有通道!)。每个这样的卷积都提供一个大小为 5 x 5 x 1 的图。然后我们将这些图堆叠在一起以创建一个 5 x 5 x 3 的图像。在此之后,我们得到大小为 5 x 5 x 3 的输出。我们现在缩小空间维度,但深度仍然和以前一样。
作为深度可分离卷积的第二步,为了扩展深度,我们应用卷积核大小为 1x1x3 的 1x1 卷积。将 5 x 5 x 3 输入图像与每个 1 x 1 x 3 卷积核进行卷积,产生 5 x 5 x 1 的映射。
因此,在应用 128 个 1x1 卷积之后,我们可以得到一个大小为 5 x 5 x 128 的层。
通过这两个步骤,深度可分离卷积将输入层 (7 x 7 x 3) 转换为输出层 (5 x 5 x 128)。
深度可分离卷积的整体流程如下图所示:
那么,做深度可分离卷积有什么好处呢?效率!与 2D 卷积相比,深度可分离卷积需要更少的操作。
让我们回顾一下二维卷积示例的计算成本。有 128 个 3 x 3 x 3 的卷积核移动 5x5 次。即 128 x 3 x 3 x 3 x 5 x 5 = 86400 次乘法。
可分离卷积怎么样?在第一个深度卷积步骤中,有 3 个 3 x 3 x 1 的卷积核移动了 5 x 5 次。即 3 x 3 x 3 x 1 x 5 x 5 = 675 次乘法。在1 x 1卷积的第二步中,有128个1 x 1 x 3的核移动5x5次。即 128 x 1 x 1 x 3 x 5 x 5 = 9600 次乘法。因此,总体而言,深度可分离卷积需要 675 + 9600 = 10275 次乘法。这只是 2D 卷积成本的 12% 左右!实际上,现代网络的通道数更多,效率体现也会更明显。
使用深度可分离卷积有什么缺点吗?当然有。深度可分离卷积减少了卷积中的参数数量。因此,对于小型模型,如果将 2D 卷积替换为深度可分离卷积,则模型容量可能会显着降低,导致模型的结果不是最好的。但是,如果使用得当,深度可分离卷积可以在不显着损害模型性能的情况下提高效率。
九、分组卷积
分组卷积于 2012 年在 AlexNet 论文中引入。实现它的主要原因是允许在内存有限(每个 GPU 1.5 GB 内存)的两个 GPU 上进行网络训练。下面的 AlexNet 在大多数层上显示了两个独立的卷积路径。它跨两个 GPU 进行模型并行化(当然,如果有更多 GPU 可用,可以进行多 GPU 并行化)。
在这里,我们描述了分组卷积的工作原理。首先,传统的 2D 卷积遵循如下所示的步骤。在此示例中,通过应用 128 个卷积核(每个卷积核的大小为 3 x 3 x 3),将大小为 (7 x 7 x 3) 的输入层转换为大小为 (5 x 5 x 128) 的输出层。或者在一般情况下,通过应用 Dout 个卷积核(每个卷积核的大小为 h x w x Din),将大小为 (Hin x Win x Din) 的输入层转换为大小为 (Hout x Wout x Dout) 的输出层。
在分组卷积中,卷积核被分成不同的组。每个组负责具有一定深度的常规 2D 卷积。下面的例子可以更清楚地说明这一点。
上面是带有 2 个卷积核组的分组卷积的图示。单个卷积核深度仅为标称 2D 卷积中深度的一半。它们的深度为 Din/2。每个卷积核组包含 Dout /2个卷积核。第一个卷积核组(红色)与输入层的前半部分([:, :, 0:Din/2])卷积,而第二个卷积核组(蓝色)与输入层的后半部分([: , :, Din/2:Din]) 卷积。因此,每个卷积核组都会创建 Dout /2个通道。总体而言,两组创建 2 × Dout /2 = Dout 通道。然后,我们使用 Dout 通道将这些通道堆叠在输出层中。
9.1 分组卷积与深度卷积
如果卷积核组的数量与输入层通道相同,则每个卷积核的深度为1。这与深度卷积中的卷积核深度相同。另一方面,每个卷积核组现在都包含 Dout / n 个卷积核(n为分组数)。总的来说,输出层的深度为Dout。这与深度卷积不同,深度卷积不改变层深度。在深度可分离卷积中通过1 × 1 卷积改变层深度。
进行分组卷积有几个优点:
- 高效的训练。由于卷积被分成几条路径,每条路径可以由不同的 GPU 单独处理。此过程允许以并行方式在多个 GPU 上进行模型训练。与使用一个 GPU 进行所有训练相比,这种在多 GPU 上的模型并行化允许每一步将更多图像输入网络。模型并行化被认为优于数据并行化。后者将数据集分成批次,然后我们对每批次进行训练。然而,当批量变得太小时,我们本质上是在做随机而不是批量梯度下降。这会导致收敛速度变慢,有时甚至更差。
- 模型更有效,即模型参数随着分组数量的增加而减少。
- 分组卷积可以提供比标称 2D 卷积更好的模型。
对于第三点,或许看起来不太好理解。原因与稀疏卷积核关系有关。如下图所示,是相邻层卷积核之间的相关性,可见关系稀疏,没有什么明显的相关性。
那分组卷积的相关性怎么样呢,如下图
上图是使用 1、2、4、8 和 16 个卷积核组训练模型时,相邻层卷积核之间的相关性。有文章提出了一个推理:“卷积核组的作用是通过通道维度上的块对角结构稀疏性来学习……具有高相关性的卷积核在具有卷积核组的网络中以更结构化的方式学习。实际上,不必学习的卷积核关系在更长的时间参数化。以这种显着的方式减少网络中的参数数量,就不会那么容易过度拟合,因此类似正则化的效果可以让优化器学习更准确、更高效的深度网络。”
此外,每个卷积核组学习数据的唯一表示。正如 AlexNet 的作者所注意到的,卷积核组似乎将学习到的卷积核结构化为两个不同的组,黑白卷积核和彩色卷积核。
参考
如何理解扩张卷积(dilated convolution) - CSDN
A Comprehensive Introduction to Different Types of Convolutions in Deep Learning - medium.com
An Introduction to different Types of Convolutions in Deep Learning - medium.com