Deep Learning Note: 4-5 卷积神经网络案例分析(3)
3. 1 乘 1 卷积
在进行卷积时,对于只有 1 个通道的输入,如果参与卷积的过滤器的尺寸为 $1 \times 1$,则只相当于将输入乘以一个固定的系数,如图 1 所示。
而对于有 $n$ 个通道的输入,如果参与卷积的过滤器尺寸为 $1 \times 1 \times n$,则相当于将输入中每个位置上的 $n$ 个值与过滤器中的 $n$ 个值依次相乘再求和,如图 2 所示。
此时这个 $1 \times 1 \times n$ 卷积层就相当于一个神经元,它以输入数据中同一位置上各通道的 $n$ 个值作为输入,输出一个激活值。如果有多个过滤器,则相当于有多个神经元。
像上面这样的 $1 \times 1 \times n$ 卷积有时也称为网络中的网络(Network in Network)。$1 \times 1 \times n$ 卷积可以为网络加入非线性,并且能够调整数据的通道数。
$1 \times 1 \times n$ 卷积可以缩小数据的通道数。如对于图 3 所示的 $28 \times 28 \times 192$ 的数据,通过 32 个 $1 \times 1 \times 192$ 的过滤器卷积,结果的大小为 $28 \times 28 \times 32$,数据的通道数从 192 缩小到 32,高度和宽度保持不变(相比之下,池化层保持通道数,缩小高度和宽度)。
如果想保留通道数,则可以使用 192 个 $1 \times 1 \times 192$ 的过滤器,结果的大小与输入相同,都是 $28 \times 28 \times 192$,此时这个 $1 \times 1 \times n$ 卷积的作用是引入一些非线性,使得网络能够学习更复杂的函数。另外,使用更多的过滤器,还可以增加数据的通道数。
4. Inception 层
在设计卷积神经网络中的各层时,我们面临很多选择,例如使用什么尺寸的过滤器,使用卷积层还是池化层等等。Inception 网络通过在一层中同时使用多种结构,获得更好的性能。
图 4 展示了一个 Inception 层的结构:
在这一个 Inception 层中,输入数据的大小为 $28 \times 28 \times 192$,其中使用了:
- 64 个 $1 \times 1$ 过滤器,卷积结果的大小为 $28 \times 28 \times 64$,如图中绿色方块;
- 128 个 $3 \times 3$ 过滤器,Same Padding,卷积结果的大小为 $28 \times 28 \times 238$,如图中蓝色方块;
- 32 个 $5 \times 5$ 过滤器,Same Padding,卷积结果的大小为 $28 \times 28 \times 32$,如图中紫色方块;
- 一个最大池化层,Same Padding,Stride = 1,池化结果再通过一层 $1 \times 1$ 卷积缩小通道数,最终结果的大小为 $28 \times 28 \times 32$,如图中黄色方块。
最后将上面四层的结果拼接起来,得到该 Inception 层的输出,其大小为 $28 \times 28 \times 256$。由于这里要进行拼接操作,所以要求其中各层输出的高度和宽度要一致,如上面第 2 和 第 3 各卷积层使用了 Same Padding 保证输入和输出具有相同的高度和宽度;虽然池化层通常不使用 Padding,但这里为了保证池化层的输入和输出也具有相同的高度和宽度,对池化层也使用了 Same Padding,且 Stride 为 1。
Inception 层中使用了各种各样的层,并将所有结果拼接在一起,由网络通过学习自主选择要使用什么样的层及其组合,不再需要人工进行选择。但这也带来一个问题:Inception 层的计算量非常大。
以图 4 中 $5 \times 5$ 的卷积层为例,如图 5 所示:
图 5 中卷积层的输入大小为 $28 \times 28 \times 192$,使用 32 个 $5 \times 5 \times 192$ 的过滤器进行卷积,输出大小为 $28 \times 28 \times 32$。对每个输出,要计算 $5 \times 5 \times 192$ 次乘法,则总共要计算的乘法次数为(加法次数相比乘法次数非常少,这里只统计乘法次数):
\begin{equation}
28 \times 28 \times 32 \times 5 \times 5 \times 192 = 120422400 \approx 1.2亿
\end{equation}
虽然从现代的计算能力来看,1.2 亿次计算并不是无法接受,但这还只是图 4 所示的 Inception 层中的一小部分。通过使用 $1 \times 1$ 卷积降低通道数,可以显著降低运算量。
还以图 5 所示的卷积层为例,现在在输入数据后增加一层 $1 \times 1$ 卷积,如图 6 所示:
此时 $28 \times 28 \times 192$ 的输入数据通过与 16 个 $1 \times 1 \times 192$ 的过滤器卷积,结果大小为 $28 \times 28 \times 16$,然后再与 32 个 $5 \times 5 \times 16$ 的过滤器卷积,得到 $28 \times 28 \times 32$ 的输出。现在的计算所需的乘法次数为:
\begin{align}
& 28 \times 28 \times 16 \times 1 \times 1 \times 192 + 28 \times 28 \times 32 \times 5 \times 5 \times 16 \\
& = 2408448 + 10035200 \\
& = 12443648 \\
& \approx 0.12亿
\end{align}
可见,图 6 和 图 5 中网络输出数据的大小都是 $28 \times 28 \times 32$,而图 6 中网络的计算量只有图 5 的十分之一。
另外可以注意到,在图 6 所示的网络中,中间 $1 \times 1$ 卷积层输出的通道数最少,因此它有时也被称为 Bottleneck 层,即先将输入数据缩小,然后再放大。虽然 Bottleneck 层大幅减少了通道数,但只要设计合理,就不对性能产生明显影响。
综上所述,Inception 层同时了使用多种层结构,不在需要人工选择,但由此也带来了巨大的计算量。通过 $1 \times 1$ 卷积创建一个 Bottleneck 层,可以大幅降低计算量。
5. Inception Network
Inception Network 由多个 Inception Module 组成,对于如图 4 所示的 Inception 层,其对应的 Inception Module 结构如图 7 所示。
可以看到,中间的两个卷积层都先通过 $1 \times 1$ 卷积降低通道数,由此降低计算量。最上面的卷积层使用 $1 \times 1$ 的过滤器,没有必要再在前面添加 $1 \times 1$ 卷积。最下面的池化层使用 Same Padding,Stride = 1,保证输出数据的高度和宽度与输入相同,然后再通过一个$1 \times 1$ 卷积降低通道数。最后,所有结果都拼接在一起,作为这个 Inception Module 的输出。
将多个 Inception Module 组合起来,就构成了一个 Inception Network,图 8 为原论文中给出的一种结构。
图 8 中,蓝色方块为卷积层,红色方块为池化层。网络中使用了很多相同的 Inception Module,各个 Module 之或者间直接连接,或者通过一个池化层来调整数据尺寸。
另外,可以注意到图 8 中的网络中有两个分支,如图 9 中红框所示。这些分支获取了网络中隐藏层的输出,并以此进行预测。这样做是为了确保网络中间的一些特征也足以进行一定程度的预测,可以起到正则化的效果。
自提出以来,Inception Network 出现了很多变种,比如 Inception V2、Inception V3、Inception V4 等等;还有的网络结合了 ResNet,在 Inception Network 使用 Skip Connection。
值得一提的是,Inception Network 的原论文中引用了 “We Need to Go Deeper” 的梗(图 9),表示要建造更深层网络,还在参考文献中给出了引用链接,Inception 的名字就由此而来。