作者:Redflashing
本文梳理举例总结深度学习中所遇到的各种卷积,帮助大家更为深刻理解和构建卷积神经网络。
本文将详细介绍以下卷积概念:
- 2D卷积(2D Convolution)
- 3D卷积(3D Convolution)
- 1 ∗ 1 1*1 1∗1卷积( 1 ∗ 1 1*1 1∗1 Convolution)
- 反卷积(转置卷积)(Transposed Convolution)
- 扩张卷积(Dilated Convolution / Atrous Convolution)
- 空间可分卷积(Spatially Separable Convolution)
- 深度可分卷积(Depthwise Separable Convolution)
- 平展卷积(Flattened Convolution)
- 分组卷积(Grouped Convolution)
- 混洗分组卷积(Shuffled Grouped Convolution)
- 逐点分组卷积(Pointwise Grouped Convolution)
9. 分组卷积
首次在大规模图像数据集(ImageNet)实现了深层卷积神经网络结构,引发深度学习热潮的AlexNet 论文(https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)在 2012 年引入了分组卷积。实现分组卷积的主要原因是让网络训练可在 2 个内存有限(每个 GPU 有 1.5 GB 内存)的 GPU 上进行。下面的 AlexNet 表明在大多数层中都有两个分开的卷积路径。这是在两个 GPU 上执行模型并行化(当然如果可以使用更多 GPU,还能执行多 GPU 并行化)。
这里我们介绍一下分组卷积的工作方式。首先典型的2D卷积步骤如下图所示。在该例子中通过应用128个大小为
3
∗
3
∗
3
3*3*3
3∗3∗3的滤波器将输入层(
7
∗
7
∗
3
7*7*3
7∗7∗3)变换到输出层(
5
∗
5
∗
128
5*5*128
5∗5∗128)。推广而言,即通过
D
o
u
t
D_{out}
Dout个大小为
h
∗
w
∗
D
i
n
h*w*D_{in}
h∗w∗Din的滤波器将输入层(
H
i
n
∗
W
i
n
∗
D
i
n
H_{in}*W_{in}*D_{in}
Hin∗Win∗Din)变换到输出层(
H
o
u
t
∗
W
o
u
t
∗
D
o
u
t
H_{out}*W_{out}*D_{out}
Hout∗Wout∗Dout)。
而在分组卷积中,滤波器被分成不同的组。每个组负责具有一定深度的2D卷积。下图展示了具有两个滤波器分组的分组卷积。在每个滤波器组中,每个滤波器只有原2D卷积的一半数目。它们的深度是
D
i
n
2
\frac{D_{in}}{2}
2Din个滤波器。第一个滤波器分组(红色)与输入层的前一半(按深度分半,即
[
:
,
:
,
0
:
D
o
u
t
2
]
[:,:,0:\frac{D_{out}}{2}]
[:,:,0:2Dout])进行卷积操作。因此,每个滤波器分组都会创建
D
o
u
t
2
\frac{D_{out}}{2}
2Dout个通道。整体而言,两个分组会创建
2
∗
D
o
u
t
2
=
D
o
u
t
2*\frac{D_{out}}{2}=D_{out}
2∗2Dout=Dout个通道。然后我们将这些通道堆叠在一起得到有
D
o
u
t
D_{out}
Dout个通道的输出层。
9.1. 分组卷积与深度可分卷积比较
从上面的例子已经可以发现分组卷积和深度可分卷积之间的联系和差异。如果滤波器组的数量和输入层通道数相同,则每个滤波器的深度都为1,这与深度可分卷积相同。另一方面,每个滤波器组都包含 D o u t D i n \frac{D_{out}}{D_{in}} DinDout个滤波器。整体而言,输出层的深度为 D o u t D_{out} Dout。这不同于深度可分卷积的情况–深度卷积的第一个步骤并不会改变层的深度。深度可分卷积的深度通过 1 ∗ 1 1*1 1∗1卷积进行深度的扩展。
9.2. 分组卷积的优点
-
高效训练
由于卷积可分为多个路径,因此每个路径可以由不同的GPU进行处理。此过程允许以并行的方式对多个GPU进行模型训练。这种基于多GPU的模型并行化允许网络在每个步骤处理更多图像。一般认为模型并行化比数据并行化效果更好,后者将数据集分成多个批次(Batch),然后分开训练每一批次。但是当批次大小过小时,本质上执行的是随机梯度下降,而非批梯度下降,这会造成收敛速度缓慢切收敛结果更差。
在训练非常深的神经网络时,分组卷积会非常重要,正如下图ResNeXt中那样,图片来自论文(https://arxiv.org/abs/1611.05431)
-
高效模型
即模型参数随着滤波器组的数量的增加而减少。在前面的示例中,滤波器在标准2D卷积中参数量为: h ∗ w ∗ D i n ∗ D o u t h*w*D_{in}*D_{out} h∗w∗Din∗Dout。而具有2个滤波器组的分组卷积的参数量为: ( h ∗ w ∗ D i n 2 ∗ D o u t 2 ) ∗ 2 (h*w*\frac{D_{in}}{2}*\frac{D_{out}}{2})*2 (h∗w∗2Din∗2Dout)∗2。参数量减少了一半。
-
模型性能更优
这有一点让人惊讶,分组卷积在某些情况下能提供比标准2D卷积更好的模型。这在文章(https://blog.yani.io/filter-group-tutorial/)有很好地解释,这里仅做简要的分析。
原因主要和稀疏滤波器(稀疏矩阵)有关。下图是相邻层滤波器的相关性,为稀疏关系。图为在 CIFAR10 上训练的一个 Network-in-Network 模型中相邻层的过滤器的相关性矩阵。高度相关的过滤器对更明亮,而相关性更低的过滤器则更暗。图片来自:https://blog.yani.io/filter-group-tutorial
但当我们用分组卷积后,神奇的事情发生了
上图是当用 1、2、4、8、16 个过滤器分组训练模型时,相邻层的滤波器之间的相关性。那篇文章提出了一个可能的解释:滤波器分组的效果是在通道维度上学习块对角结构的稀疏性……在网络中,具有高相关性的过滤器是使用过滤器分组以一种更为结构化的方式学习到。从效果上看,不必学习的过滤器关系就不再参数化。这样显著地减少网络中的参数数量能使其不容易过拟合,因此,一种类似正则化的效果让优化器可以学习得到更准确更高效的深度网络。
上图是AlexNet中Conv1滤波器分解:正如作者指出的那样,过滤器分组似乎会将学习到的过滤器结构性地组织成两个不同的分组。图片来自 AlexNet 论文(https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)。
此外,每个滤波器分组都会学习数据的一个独特表征。正如 AlexNet 的作者指出的那样,滤波器分组似乎会将学习到的过滤器结构性地组织成两个不同的分组——黑白过滤器和彩色过滤器。
9.3. 混洗分组卷积(Shuffled Grouped Convolution)
混洗分组卷积由旷视(Face++)团队在ShuffleNet(https://arxiv.org/abs/1707.01083)首次提出,ShuffleNet是一种计算效率非常高的卷积结构,专门为计算能力非常有限的移动设备(10-150MFLOP)而设计。
混洗分组卷积背后的思想与分组卷积背后的理念(用于 MobileNet和ResNeXt示例)和深度可分卷积(在Xception 中使用)。总体而言,随机分组卷积涉及分组卷积和通道混洗。
在有关分组卷积的部分中,我们知道滤波器被分成不同的组。每个组负责具有一定深度的传统 2D 卷积。总的计算量显著减少。对于下图中的示例,我们有 3 个滤波器组。第一个滤波器组与输入层中的红色部分进行卷积操作。同样,第二个和第三个滤波器组与输入中的绿色和蓝色部分进行卷积操作。每个滤波器组中的卷积核深度仅占输入层中总通道计数的
1
3
\frac{1}{3}
31。在此示例中,在第一个分组卷积 GConv1 之后,输入图层映射再通过中间层(下文针对该部分进行讲解)。然后,通过第二个分组卷积 GConv2 映射到输出图层。
分组卷积在计算上是有效的。但问题是,每个滤波器组只处理从输入层中的固定部分传递的信息。对于上图中的示例,第一个滤波器组(红色)仅处理从输入通道前 1/3 传递的信息。蓝色滤波器组(蓝色)仅处理从输入通道的最后 1/3 传递的信息。因此,每个滤波器组都仅限于学习一些特定功能。这一特性阻止通道组之间的信息流,并在训练期间削弱了模型表现力。为了克服此问题,ShuffleNet 中引入了通道混洗(Channel Shuffle), 用来进行不同分组的特征之间的信息流动, 以提高性能.。
通道混洗操作(Channel Shuffle Operation)的想法是,我们希望混合来自不同筛选器组的信息。在下图中,我们使用 3 个滤波器组应用第一个分组卷积 GConv1 后获取特征。在将结果输入到第二个分组卷积之前,我们首先将每个组中的通道划分为多个子组。我们混洗了这些子组。
在进行这样的洗牌之后,我们继续一样执行第二组卷积 GConv2。但现在,由于经过混洗后信息已经混合,因此,通过允许通道之间的信息交换,增强了模型的表现力。
9.4. 逐点分组卷积(Pointwise Grouped Convolution)
ShuffleNet 也引入了组点分组卷积.通常对于分组卷积(如 MobileNet或 ResNeXt,组操作在 3 ∗ 3 3*3 3∗3空间卷积上执行,但在 1 ∗ 1 1*1 1∗1卷积上不执行。
ShuffleNet论文认为, 1 ∗ 1 1*1 1∗1卷积在计算上也是昂贵的。并建议在 1 ∗ 1 1*1 1∗1卷积上也应用分组卷积。顾名思义,逐点分组卷积执行 1 ∗ 1 1*1 1∗1卷积的组操作。该操作与分组卷积相同,只有一个修改在 1 ∗ 1 1*1 1∗1筛选器上执行,而不是 n ∗ n n*n n∗n滤波器 ( n > 1 n>1 n>1)。
在ShuffleNet的论文中,作者利用了三种类型的卷积:(1) 混洗分组卷积;(2) 逐点分组卷积;和 (3) 深度可分卷积。这种架构设计在保持精度的同时显著降低了计算成本。例如,ShuffleNet 和 AlexNet 的分类错误在实际移动设备上是可比的。但是,计算成本已大幅降低,从 AlexNet 中的 720 MFLOP 减少到 ShuffleNet 中的 40~140 MFLOP。由于计算成本相对较低,模型性能好,ShuffleNet在移动设备卷积神经网领域越来越受欢迎。
参考资料
-
Intuitively Understanding Convolutions for Deep Learning | by Irhum Shafkat | Towards Data Science
-
An Introduction to different Types of Convolutions in Deep Learning
-
Review: DilatedNet — Dilated Convolution (Semantic Segmentation)
-
ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
-
Separable convolutions “A Basic Introduction to Separable Convolutions
-
Inception network “A Simple Guide to the Versions of the Inception Network”