VGG等网络显示了增加深度的优势。这带来了一个新的难题:如何在不显著增加计算成本和参数数量的情况下,提高网络能力(包括深度和宽度)。简单地堆叠更多相同层是一种方法。然而,另一种观点则对每层内部操作的单一性提出了疑问。如果一个层能够同时执行多种不同的变换,并让网络自己学习哪些是最有用的,那会怎么样呢?这便引出了网络中的网络(NIN)和Inception架构背后的思想。网络中的网络 (NIN) 理念在研究著名的Inception模块之前,了解林等人于2013年提出的相关网络中的网络(NIN)思想会有帮助。传统的卷积层使用线性滤波器,然后是非线性激活函数(如ReLU)。NIN论文认为,这些线性滤波器可能不足以捕获局部感受野内复杂、抽象的特征。他们提出的解决方案是用每个卷积层内的“微网络”取代简单的线性滤波器。这个微网络通过多层感知机(MLP)实现。在CNN的背景下,一个在局部感受野内跨通道操作的MLP可以通过$1 \times 1$卷积高效地实现。请记住,$1 \times 1$卷积在单个空间位置($1 \times 1$窗口)上操作,但会处理所有输入通道。如果您有$C_{in}$个输入通道,并应用$C_{out}$个大小为$1 \times 1 \times C_{in}$的滤波器,则该空间位置的输出将有$C_{out}$个通道。每个输出通道的值都是该特定位置上所有输入通道的加权和(后接激活)。这本质上是一个在每个空间位置独立应用的完全连接层,作用于通道维度。NIN使用这些$1 \times 1$卷积(有时堆叠)在主要空间聚合之前创建通道之间更复杂的关系。NIN的第二个重要贡献是将最终的、通常参数量大的全连接层替换为全局平均池化(GAP)。GAP不是将最终的特征图展平并输入到大型密集层中,而是计算每个特征图通道在其整个空间维度($H \times W$)上的平均值。这会产生一个向量,长度等于最终卷积层中的通道数。这个向量通常直接输入到softmax层进行分类。GAP显著减少了参数数量,作为一种结构正则化器防止过拟合,并促使特征图与类别之间建立更紧密的联系。Inception 模块:多尺度处理GoogLeNet架构由Szegedy等人于2014年提出(ILSVRC 2014的获胜者),使得Inception模块备受关注。Inception背后的核心思想是允许网络在一个层中同时捕获多个空间尺度的特征。Inception模块不是为卷积层选择单一的滤波器尺寸(例如$3 \times 3$或$5 \times 5$),而是在同一输入特征图上并行执行多个不同滤波器尺寸($1 \times 1$、$3 \times 3$、$5 \times 5$)的卷积。它通常也包含一个并行的最大池化操作。这些并行分支的所有输出随后沿通道维度进行拼接,构成Inception模块的输出。digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#a5d8ff", fontname="helvetica"]; edge [fontname="helvetica"]; subgraph cluster_0 { label = "Inception 模块 (简化版)"; style=filled; color="#dee2e6"; bgcolor="#e9ecef"; fontname="helvetica"; Input [label="输入\n特征图", shape=invhouse, fillcolor="#ffec99"]; subgraph cluster_1x1 { label = "1x1 卷积分支"; style=dotted; Conv1x1 [label="1x1 卷积"]; } subgraph cluster_3x3 { label = "3x3 卷积分支"; style=dotted; Bottle3x3 [label="1x1 卷积\n(瓶颈层)"]; Conv3x3 [label="3x3 卷积"]; Bottle3x3 -> Conv3x3; } subgraph cluster_5x5 { label = "5x5 卷积分支"; style=dotted; Bottle5x5 [label="1x1 卷积\n(瓶颈层)"]; Conv5x5 [label="5x5 卷积"]; Bottle5x5 -> Conv5x5; } subgraph cluster_pool { label = "池化分支"; style=dotted; MaxPool [label="3x3 最大池化", fillcolor="#ffc9c9"]; PoolProj [label="1x1 卷积\n(投影)"]; MaxPool -> PoolProj; } Concat [label="拼接\n(按深度)", shape=rectangle, style=rounded, fillcolor="#b2f2bb"]; Input -> Conv1x1 [lhead=cluster_1x1]; Input -> Bottle3x3 [lhead=cluster_3x3]; Input -> Bottle5x5 [lhead=cluster_5x5]; Input -> MaxPool [lhead=cluster_pool]; Conv1x1 -> Concat; Conv3x3 -> Concat; Conv5x5 -> Concat; PoolProj -> Concat; Concat -> Output [label="输出\n特征图", shape=house, fillcolor="#ffec99"]; } }原始Inception模块(GoogLeNet v1)的简化表示。它具有不同滤波器尺寸和池化的并行分支。请注意,在$3 \times 3$和$5 \times 5$卷积之前以及池化层之后,都使用了$1 \times 1$卷积作为瓶颈层。瓶颈层:提高Inception效率Inception模块的一个朴素实现,即多个大滤波器卷积并行运行,在计算上会非常昂贵。例如,直接对具有许多通道(例如256个)的输入应用$5 \times 5$卷积会导致大量的操作。效率上的重要改进,部分受NIN中思想的启发,是在昂贵的$3 \times 3$和$5 \times 5$卷积之前使用**$1 \times 1$卷积作为瓶颈层**。假设Inception模块的输入特征图有256个通道。在应用$3 \times 3$卷积(可能输出128个通道)之前,首先应用一个$1 \times 1$卷积以显著降低输入通道维度(例如,降至64个通道)。然后$3 \times 3$卷积在这个小得多的特征图上操作。操作顺序如下:输入 (256通道)$1 \times 1$ 卷积 (输出: 64通道) - 瓶颈层$3 \times 3$ 卷积 (输出: 128通道)与直接对256通道输入应用$3 \times 3$卷积相比,这显著减少了所需的乘法次数。在$5 \times 5$卷积之前也使用了类似的瓶颈。最大池化层之后通常也会应用一个$1 \times 1$卷积,以便在拼接之前调整其通道维度。联系与优势NIN和Inception都大量使用$1 \times 1$卷积,尽管主要原因略有不同:NIN: 主要使用$1 \times 1$卷积在卷积层内部实现类似MLP的结构,以提升特征提取能力。Inception: 主要使用$1 \times 1$卷积作为降维瓶颈,以使多尺度处理在计算上可行。然而,它们的好处有重叠之处。Inception中的$1 \times 1$瓶颈也充当通道特征池化器并增加了非线性(通过其激活函数),有助于生成更丰富的特征表示,这与NIN的思想相似。Inception模块设计的主要优点包括:多尺度特征提取: 并行分支使网络能够同时捕获不同分辨率的信息。计算效率: 战略性地使用$1 \times 1$瓶颈显著降低了计算成本,相比于简单加宽或加深的网络。性能提升: GoogLeNet及其后续版本(Inception v2、v3、v4、Inception-ResNet)通过堆叠这些模块取得了先进的结果,展现了它们的有效性。Inception架构代表了一种趋势,即设计更复杂、更精巧的网络结构,以优化准确性和计算资源之间的平衡。ResNet侧重于通过跳跃连接实现更大的深度,而Inception则侧重于通过并行、多尺度处理(由瓶颈层提升效率)来增加层内部的表示能力。理解这些不同的设计思想十分必要,因为我们将考察现代架构如何经常结合这两种方法中的元素。