本节主要关注卷积神经网络发展过程中具有里程碑意义的基础模块,了解它们的原理和设计细节
1. 批归一化
在机器学习中,一般会假设模型的输入数据的分布是稳定的。如果这个假设不成立,即模型输入数据的分布发生变化,则称为协变量偏移。模型的训练集和测试集的分布不一致,或者模型在训练过程中输入数据的分布发生变化,这些都属于协变量偏移现象。
同样,对于一个复杂的机器学习系统,在训练过程中一般也会要求系统里的各个子模块的输入分布是稳定的,如果不满足,则称为内部协变量偏移。对于深度神经网络,其在训练过程中,每一层的参数都会随之更新。以第 i 层为例,其输入数据与之前所有层(第 1 层到第 i - 1 层)的网络参数取值都有很大关系;在训练过程中,如果之前层的参数被更新后,第 i 层的输入数据的分布必然也会发生变化此即为内部协变量偏移。网络越深,这种现象越明显。
内部协变量偏移会给深度神经网络的训练过程带来诸多问题:
- 网络每一层需要不断适应输入数据的分布的变化,这会影响学习效率,并使学习过程变得不稳定。
- 网络前几层参数的更新,很可能使得后几层的输入数据变得过大或者过小,从而掉进激活函数的饱和区,导致学习过程过早停止。
- 为了尽量降低内部协变量偏移带来的影响,网络参数的更新需要更加谨慎,在实际应用中一般会采用较小的学习率(避免参数更新过快),而这会降低收敛速度。
- 在之前的网络训练过程中,一般会采用非饱和型激活函数(如 ReLU)、精细的网络参数初始化、保守的学习率等方法来降低内部协变量偏移带来的影响。这些方法会使网络的学习速度太慢,并且最终效果也特别依赖于网络的初始化。
批归一化就是为了解决上述问题而提出的:它的主要作用是确保网络中的各层,即使参数发生了变化,其输入/输出数据的分布也不能产生较大变化,从而避免发生内部协变量偏移现象。采用批归一化后,深度神经网络的训练过程更加稳定,对初始值不再那么敏感,可以采用较大的学习率来加速收敛。
批归一化可以看作带参数的标准化,具体公式为
y
(
k
)
=
γ
(
k
)
x
(
k
)
−
μ
(
k
)
(
σ
(
k
)
)
2
+
ε
+
β
(
k
)
(1.1)
y^{(k)}=\gamma^{(k)} \frac{x^{(k)}-\mu^{(k)}}{\sqrt{\left(\sigma^{(k)}\right)^{2}+\varepsilon}}+\beta^{(k)}\tag{1.1}
y(k)=γ(k)(σ(k))2+εx(k)−μ(k)+β(k)(1.1)
其中,
x
(
k
)
y
(
k
)
x^{(k)}y^{(k)}
x(k)y(k)分别是原始输入数据和批归一化后的输出数据,
μ
(
k
)
\mu^{(k)}
μ(k)和
σ
(
k
)
\sigma^{(k)}
σ(k)分别是输入数据的均值和标准差(在 mini-batch 上),
β
(
k
)
\beta^{(k)}
β(k)和
γ
(
k
)
\gamma^{(k)}
γ(k)分别是可学习的平移参数和缩放参数,上标k表示数据的第k维(批归一化在数据各个维度上是独立进行的),
ε
\varepsilon
ε是为防止分母为 0 的一个小量。可以看到:在批归一化过程中,设置了两个可学习的参数
β
\beta
β和
γ
\gamma
γ,它们有如下作用。
- 保留网络各层在训练过程中的学习成果。如果没有 β \beta β和 γ \gamma γ,批归一化退化为普通的标准化,这样在训练过程中,网络各层的参数虽然在更新,但是它们的输出分布却几乎不变(始终是均值为 0、方差为 1),从而使得网络难以学习到有效的特征表示。通过引入 β \beta β和 γ \gamma γ,可以让网络在标准化后的数据上进行适当的平移和缩放,从而保留各层在训练过程中的学习成果。
- 保证激活单元的非线性表达能力。上面提到,没有 β \beta β和 γ \gamma γ,批归一化的输出分布始终是均值为 0、标准差为 1。此时,如果激活函数采用诸如 Sigmoid、Tanh 等函数,则经过批归一化的数据基本上都落在这些激活函数的近似线性区域,没能利用上它们的非线性区域,这会极大地削弱模型的非线性特征提取能力和整体的表达能力。添加 β \beta β和 γ \gamma γ参数后,批归一化的数据就可以进入激活函数的非线性区域。
使批归一化模块具有自我关闭能力。若 β \beta β和 γ \gamma γ分别取数据的均值和标准差,则可以复原初始的输入值,即关闭批归一化模块。因此,当批归一化导致特征分布被破坏,或者使网络泛化能力减弱时,可以通过这两个参数将其关闭。
至于批归一化在网络中的位置,直觉上看无论是放在激活层之前还是之后都有一定道理。
- 把批归一化放在激活层之前,可以有效避免批归一化破坏非线性特征的分布;另外,批归一化还可以使数据点尽量不落入激活函数的饱和区域,缓解梯度消失问题。
- 由于现在常用的激活函数是 ReLU,它没有 Sigmoid、Tanh 函数的那些问题,因此也可以把批归一化放在激活层之后,避免数据在激活层之前被转化成相似的模式从而使得非线性特征分布趋于同化。
在具体实践中,原始论文是将批归一化放在激活层之前的,但学术界和工业界也有不少人曾表示倾向于将批归一化放在激活层之后(如论文共同作者 Christian Szegedy、Keras 作者 Francois Cholle、知名数据科学平台 Kaggle 的前首席科学家 Jeremy Howard 等人)。从近两年的论文来看,有一大部分是将批归一化放在激活层之后的,如 MobileNet v2、ShuffleNet v2、NASNet - A。批归一化究竟应该放在什么位置,仍是一个存争议的问题。
2. 全连接层
用于分类任务的卷积神经网络,其前面若干层一般是卷积层、池化层等,但网络末端一般是几层全连接层。这是因为一方面卷积层具有局部连接、权值共享的特性,其在不同位置是采用相同的卷积核进行特征提取的。也就是说,卷积层的特征提取过程是局部的(卷积核尺寸一般远小于图片尺寸),且是位置不敏感的。而且,参考文献[22]中的实验表明,即使强迫卷积层学习如何对位置信息进行编码,其效果也不理想。
因此,如果整个网络全部采用卷积层(包括池化层等),网络也许能知道图片中不同位置有哪些元素(高层语义信息),但无法提取这些元素之间的关联关系(包括空间位置上的相关性、语义信息上的相关性)。而对于分类任务,不仅需要考虑一张图像中的各个元素,还需要考虑它们之间的关联关系(全局信息)。举例来说,假设要做人脸检测任务,仅仅找出图片上的眼、鼻、口等人脸元素是不够的,它们之间的相对位置关系也非常重要(如果一张图片中人脸的各个器官被随机打乱,我们显然不会认为这还是一张人脸)。
为了提取不同元素之间的关联关系,我们需要一个全局的、位置敏感的特征提取器,而全连接层就是最方便的选择,其每个输出分量与所有的输入分量都相连,并且连接权重都是不同的。当然,卷积层也不是完全不能对位置信息进行编码,如果使用与输入特征图同样尺寸的卷积核就可以,但这实际上等价于一个全连接层(卷积的输出通道数目对应着全连接层的输出单元个数)。
从另一方面来理解,多个全连接层组合在一起就是经典的分类模型——多层感知机。我们可以把卷积神经网络中前面的卷积层看作是为多层感知机提取深层的、非线性特征。从这个角度讲,最后几层也可以接其他的分类模型,如支持向量机等,但这样就脱离了神经网络体系,处理起来不太方便,不利于模型进行端到端的训练和部署。
最近几年,分类网络在卷积层之后、最后一层之前通常采用全局平均池化,它与全连接层有着相似的效果(可以提取全局信息),并且具有如下优点。
- 参数量和计算量大大降低。假设输入特征图的尺寸为(w\times h),通道数为(c),则全局平均池化的参数量为零,计算量仅为(c\times w\times h);而如果选择接一个输出单元数为(k)的全连接层,则参数量和计算量均为(c\times w\times h\times k)。对于 AlexNet、VGGNet 等这种全连接层单元数动辄 1024 或 4096 的网络,全局平均池化与普通卷积层的计算量能相差千余倍。
- 具有较好的可解释性,比如:我们可以知道特征图上哪些点对最后的分类贡献最大。
3. 瓶颈结构
瓶颈结构是在 GoogLeNet/Inception-v1 中提出的,而后的 ResNet、MobileNet 等很多网络也采用并发展了这个结构。瓶颈结构的初衷是为了降低大卷积层的计算量,即在计算比较大的卷积层之前,先用一个 1×1 卷积来压缩大卷积层输入特征图的通道数目,以减小计算量;在大卷积层完成计算之后,根据实际需要,有时候会再次使用一个 1×1 卷积来将大卷积层输出特征图的通道数目复原。由此,瓶颈结构一般是一个小通道数的 1×1 卷积层,接一个较大卷积层,后面可能还会再跟一个大通道数的 1×1 卷积层(可选)。
瓶颈结构是卷积神经网络中比较基础的模块,它可以用更小的计算代价达到与之前相似甚至更好的效果(因为瓶颈结构会增加网络层数,所以特征提取能力可能也会有相应提升)。瓶颈结构基本上可以用于所有的卷积神经网络中,场景包括物体检测和分割、生成式对抗网络等大方向,以及诸如人脸匹配、再识别、关键点检测等细分领域。
沙漏结构也是卷积神经网络中比较基础的模块,它类似于瓶颈结构,但尺度要更大,涉及的层也更多。沙漏结构一般包括以下两个分支。
- 自底向上(bottom-up)分支:利用卷积、池化等操作将特征图的尺寸逐层压缩(通道数可能增加),类似于自编码器中的编码器(encoder)。
- 自顶向下(top-down)分支:利用反卷积或插值等上采样操作将特征图的尺寸逐层扩大(通道数可能降低),类似于自编码器中的解码器(decoder)。
参考文献[24]用一个具有沙漏结构的网络来解决人体姿态估计任务,其基本单元如图 1.19 所示;整个网络则由多个沙漏结构堆叠而成,如图 1.20 所示。此外,在物体检测任务中,沙漏结构也有着大量应用,如 TDM(Top-Down Modulation)、FPN(Feature Pyramid Network)、RON(Reverse connection with Objectness prior Networks)、DSSD(Deconvolutional Single-Shot Detector)、RefineDet 等模型,它们的网络结构如图 1.21 所示。图中的 RFB(Reverse Fusion Block)是将上采样后的深层特征和浅层特征进行融合的模块。在这些应用中,沙漏结构的作用一般是将多尺度信息进行融合;同时,沙漏结构单元中堆叠的多个卷积层可以提升感受野,增强模型对小尺寸但又依赖上下文的物体(如人体关节点)的感知能力。