ResNet - 瓶颈架构
深度网络的计算挑战
随着网络变得更深,每个残差块的计算成本成为一个关键问题。一个包含两个$ 3 \times 3 $卷积的基本块在256通道时的成本为:
$$ \text{FLOPs}_{\text{basic}} = 2 \times (256 \times 256 \times 3 \times 3) \times H \times W = 1{,}179{,}648 \times H \times W $$对于在$ 14 \times 14 $特征图上有16个256通道块的ResNet-50,仅一个阶段就需要大约37亿FLOPs。使用基本块扩展到更深的网络(101、152层)在计算上是不可行的。
瓶颈块通过引入"压缩、处理、扩展"模式解决了这个问题,将计算量减少约8倍,同时保持甚至提高了表示能力。
瓶颈架构
瓶颈块使用三个卷积而不是两个,中间进行通道压缩:
$$ y = F_{\text{bottleneck}}(x) + x $$其中$ F_{\text{bottleneck}} $包含:
层1: $ 1 \times 1 $卷积(压缩)
$$ h_1 = \text{ReLU}(\text{BN}(W_1 \cdot x)) $$将通道从$ C $减少到$ C/4 $。例如,256通道减少到64。
层2: $ 3 \times 3 $卷积(处理)
$$ h_2 = \text{ReLU}(\text{BN}(W_2 * h_1)) $$在减少的通道数下执行空间处理。$ 3 \times 3 $核捕获空间模式,但在$ C/4 $通道而不是$ C $通道下。
层3: $ 1 \times 1 $卷积(扩展)
$$ h_3 = \text{BN}(W_3 \cdot h_2) $$将通道从$ C/4 $扩展回$ C $。注意:此层后没有ReLU(ReLU在加上跳跃连接后应用)。
跳跃连接和激活:
$$ y = \text{ReLU}(h_3 + x) $$瓶颈为何节省计算
关键洞察是昂贵的$ 3 \times 3 $卷积在压缩表示上运行,使用$ C/4 $通道而不是$ C $通道。
基本块FLOPs(两个$ 3 \times 3 $卷积在$ C $通道):
$$ \text{FLOPs}_{\text{basic}} = 2 \times C^2 \times 9 \times H \times W = 18C^2 HW $$瓶颈块FLOPs: • $ 1 \times 1 $压缩($ C \rightarrow C/4 $):$ C \times C/4 \times 1 \times HW = C^2 HW/4 $ • $ 3 \times 3 $处理($ C/4 \rightarrow C/4 $):$ (C/4)^2 \times 9 \times HW = 9C^2 HW/16 $ • $ 1 \times 1 $扩展($ C/4 \rightarrow C $):$ C/4 \times C \times 1 \times HW = C^2 HW/4 $
$$ \text{FLOPs}_{\text{bottleneck}} = C^2 HW \left(\frac{1}{4} + \frac{9}{16} + \frac{1}{4}\right) = C^2 HW \times \frac{17}{16} \approx 1.06 C^2 HW $$比率:
$$ \frac{\text{FLOPs}_{\text{basic}}}{\text{FLOPs}_{\text{bottleneck}}} = \frac{18}{1.06} \approx 17 $$瓶颈块在相同通道数下比基本块大约便宜17倍。这种巨大的节省使得ResNet-50、101和152变得实用。
计算节省的实际例子
考虑阶段3的瓶颈块,$ C = 256 $通道,$ H \times W = 14 \times 14 $:
$ 1 \times 1 $压缩($ 256 \rightarrow 64 $):
$$ 256 \times 64 \times 1 \times 196 = 3{,}211{,}264 \text{ FLOPs} $$$ 3 \times 3 $处理($ 64 \rightarrow 64 $):
$$ 64 \times 64 \times 9 \times 196 = 7{,}225{,}344 \text{ FLOPs} $$$ 1 \times 1 $扩展($ 64 \rightarrow 256 $):
$$ 64 \times 256 \times 1 \times 196 = 3{,}211{,}264 \text{ FLOPs} $$总瓶颈: $ 13{,}647{,}872 $ FLOPs
等效基本块(两个$ 3 \times 3 $在256通道):
$$ 2 \times 256 \times 256 \times 9 \times 196 = 231{,}211{,}008 \text{ FLOPs} $$节省: $ 231M / 13.6M \approx 17\times $
$ 1 \times 1 $卷积
$ 1 \times 1 $卷积(点卷积)是瓶颈设计的关键推动者。理解它至关重要。
$ 1 \times 1 $卷积的作用: 在每个空间位置$ (h, w) $,$ 1 \times 1 $卷积对通道向量应用线性变换:
$$ y_{hw} = W \cdot x_{hw} + b $$其中$ x_{hw} \in \mathbb{R}^{C_{in}} $是位置$ (h, w) $的输入特征向量,$ W \in \mathbb{R}^{C_{out} \times C_{in}} $是权重矩阵,$ y_{hw} \in \mathbb{R}^{C_{out}} $是输出。
它不做什么: • 不查看相邻空间位置(无空间感受野) • 不捕获空间模式(这是$ 3 \times 3 $卷积的工作)
它擅长什么: • 改变通道数(廉价地) • 学习特征通道的线性组合 • 通道混合:每个输出通道是所有输入通道的加权和 • 维度减少:将高维通道向量压缩到低维
Lin等人(2013)在Network-in-Network论文中引入了$ 1 \times 1 $卷积,GoogLeNet/Inception将其推广用于维度减少。ResNet的瓶颈设计使其成为架构的核心。
压缩-扩展模式
瓶颈的"压缩、处理、扩展"模式在整个深度学习中出现:
在ResNet瓶颈块中:
$$ C\xrightarrow{1 \times 1} C/4 \xrightarrow{3 \times 3} C/4 \xrightarrow{1 \times 1} C $$将通道压缩4倍,廉价地进行空间处理,扩展回来。
在MobileNet反向瓶颈中:
$$ C \xrightarrow{1 \times 1} 6C \xrightarrow{3 \times 3\, \text{深度}} 6C \xrightarrow{1 \times 1} C $$相反方向:先扩展,处理,然后压缩。称为"反向"是因为宽的部分在中间。
在Transformer FFN中:
$$ d_{model} \xrightarrow{W_1} 4 \times d_{model} \xrightarrow{\text{ReLU}} 4 \times d_{model} \xrightarrow{W_2} d_{model} $$扩展4倍,应用非线性,压缩回来。
**共同原则:**移动到不同的维度进行处理,然后返回原始维度。“工作维度"可以根据设计目标(计算节省vs.表示丰富度)更大或更小。
瓶颈vs.基本:何时使用哪种
ResNet论文根据模型深度使用两种不同的块类型:
基本块(用于ResNet-18和ResNet-34): • 两个$ 3 \times 3 $卷积 • 更简单的架构 • 总层数较少但每块FLOPs更多 • 适用于计算预算允许的较小模型
瓶颈块(用于ResNet-50、101和152): • 三个卷积($ 1 \times 1 $, $ 3 \times 3 $, $ 1 \times 1 $) • 更多层但每块FLOPs更少 • 适用于计算效率关键的深层模型
交叉点: ResNet-34(基本块):2180万参数,36亿FLOPs ResNet-50(瓶颈块):2560万参数,38亿FLOPs
尽管有50层vs.34层,ResNet-50只有稍微更多的参数和FLOPs。这是因为瓶颈设计效率更高,50个瓶颈层的成本与34个基本层大致相同。
ResNet-50也表现明显更好(ImageNet上76.0% vs. 73.3% top-1准确率),表明瓶颈效率启用的额外深度直接转化为更好的性能。
实际中的通道计数
标准ResNet瓶颈使用4:1压缩比:
阶段1($ 56 \times 56 $): • 输入/输出通道:256 • 瓶颈通道:64 • 压缩:$ 256 \rightarrow 64 \rightarrow 64 \rightarrow 256 $
阶段2($ 28 \times 28 $): • 输入/输出通道:512 • 瓶颈通道:128 • 压缩:$ 512 \rightarrow 128 \rightarrow 128 \rightarrow 512 $
阶段3($ 14 \times 14 $): • 输入/输出通道:1024 • 瓶颈通道:256 • 压缩:$ 1024 \rightarrow 256 \rightarrow 256 \rightarrow 1024 $
阶段4($ 7 \times 7 $): • 输入/输出通道:2048 • 瓶颈通道:512 • 压缩:$ 2048 \rightarrow 512 \rightarrow 512 \rightarrow 2048 $
注意瓶颈块的输入/输出通道是瓶颈通道的4倍。这就是为什么ResNet-50在其最终阶段有2048通道,而ResNet-34(使用基本块)只有512通道。
扩展因子
比率$ C_{out} / C_{bn} $称为扩展因子。在标准ResNet瓶颈中,这个因子是4:
$$ C_{out} = 4 \times C_{bn} $$为什么是4? 这是一个经验选择,提供了良好的权衡: • 太小(例如,扩展=1):没有压缩优势,基本上是一个带额外层的基本块 • 太大(例如,扩展=16):激进的压缩可能在瓶颈中丢失太多信息 • 扩展=4:$ 1 \times 1 $层廉价,$ 3 \times 3 $层可负担,压缩不会显著损害表示能力
后来的架构尝试了不同的扩展因子: • ResNeXt:使用分组卷积增加有效宽度,同时保持FLOPs不变 • EfficientNet:使用可变扩展因子(1到6之间)通过神经架构搜索优化 • RegNet:系统地研究设计空间,发现2-4左右的扩展因子是最优的
通过瓶颈的信息流
信息通过三层时会发生什么?
$ 1 \times 1 $压缩(信息瓶颈): 256维特征向量投影到64维。这是一个有损压缩:网络必须学习256个特征中哪些64个线性组合最有信息量。投影学习保留与任务最相关的特征。
$ 3 \times 3 $处理(空间推理): 在压缩空间中,$ 3 \times 3 $卷积查看相邻空间位置。它可以检测压缩特征空间中的边缘、纹理和模式。因为通道数小(64),这个操作很便宜。
$ 1 \times 1 $扩展(信息恢复): 64维处理特征投影回256维。这种扩展允许网络将处理信息"扩散"到整个通道空间,创建丰富的输出表示。
跳跃连接确保没有丢失: 即使瓶颈的压缩过于激进并丢弃了有用信息,跳跃连接也保留了完整的256维输入。输出$ y = F(x) + x $可以访问原始信息($ x $)和瓶颈的处理贡献($ F(x) $)。
参数数量分析
对于输入/输出通道$ C $和瓶颈通道$ C/4 $的瓶颈块:
$ 1 \times 1 $压缩:
$$ P_1 = C \times C/4 = C^2/4 $$$ 3 \times 3 $处理:
$$ P_2 = C/4 \times C/4 \times 9 = 9C^2/16 $$$ 1 \times 1 $扩展:
$$ P_3 = C/4 \times C = C^2/4 $$总计:
$$ P_{\text{bottleneck}} = C^2/4 + 9C^2/16 + C^2/4 = 17C^2/16 \approx 1.06C^2 $$基本块(两个$ 3 \times 3 $):
$$ P_{\text{basic}} = 2 \times C^2 \times 9 = 18C^2 $$比率:
$$ \frac{P_{\text{basic}}}{P_{\text{bottleneck}}} = \frac{18}{1.06} \approx 17 $$瓶颈比基本块少17倍参数。这与计算节省的比率相同,因为FLOPs和参数都随通道维度和核大小的相同乘积缩放。
ResNet变体中的瓶颈块
瓶颈块的数量在ResNet配置中不同: ResNet-50:3 + 4 + 6 + 3 = 16个瓶颈块 ResNet-101:3 + 4 + 23 + 3 = 33个瓶颈块 ResNet-152:3 + 8 + 36 + 3 = 50个瓶颈块
深度主要在阶段3($ 14 \times 14 $分辨率阶段)增加。这是因为阶段3具有良好的空间分辨率平衡(足以捕获有意义的空间模式)和可管理的计算(空间上不太大,通道不太多)。
超越标准瓶颈
几个重要架构修改了瓶颈设计:
ResNeXt(2017): 用$ G $个并行分组卷积替换单个$ 3 \times 3 $卷积:
$$ F(x) = \sum_{i=1}^{G} W_3^{(i)} \cdot \text{ReLU}(\text{BN}(W_2^{(i)} * \text{ReLU}(\text{BN}(W_1^{(i)} \cdot x)))) $$这增加了"基数”(并行路径数),同时保持FLOPs不变。ResNeXt-50在相同计算预算下优于ResNet-50。
SE-ResNet(Squeeze-and-Excitation,2018): 在瓶颈后添加通道注意力机制:
$$ y = F(x) \cdot \text{SE}(F(x)) + x $$SE模块学习根据重要性重新加权通道,添加很少参数。
EfficientNet(2019): 使用神经架构搜索为网络中的每个块找到最优瓶颈配置(扩展比、核大小、通道数)。
这些扩展都建立在瓶颈的压缩-处理-扩展核心思想上,显示了这个设计模式的基本性和多功能性。
通过瓶颈的梯度流
瓶颈块中的梯度流遵循与基本块相同的残差原则,但在残差分支中有一个额外的层:
前向:
$$ y = h_3 + x = (\text{BN}(W_3 \cdot \text{ReLU}(\text{BN}(W_2 * \text{ReLU}(\text{BN}(W_1 \cdot x)))))) + x $$反向(通过跳跃连接):
$$ \frac{\partial \mathcal{L}}{\partial x} = \frac{\partial \mathcal{L}}{\partial y} \cdot \left(\frac{\partial h_3}{\partial x} + I\right) $$恒等项$ I $提供梯度高速公路,就像在基本块中一样。残差分支的梯度现在通过三层而不是两层,但跳跃连接确保即使这个三层梯度很小,整体梯度仍然健康。
三层梯度路径:
$$ \frac{\partial h_3}{\partial x} = \frac{\partial h_3}{\partial h_2} \cdot \frac{\partial h_2}{\partial h_1} \cdot \frac{\partial h_1}{\partial x} $$每个因子涉及卷积雅可比和ReLU掩码。有三个乘法因子而不是两个(如基本块),通过瓶颈分支的残差梯度可能更小。然而,跳跃连接补偿:恒等梯度独立于分支中的层数。
这正是瓶颈设计工作的原因:跳跃连接的梯度总是1,无论残差分支中堆叠多少层。瓶颈的计算节省不会带来梯度流的任何成本。
批归一化在瓶颈块中的作用
批归一化在每个瓶颈块中出现三次,每次卷积后一次:
$$ h_1 = \text{ReLU}(\text{BN}_1(W_1 \cdot x)) $$$$ h_2 = \text{ReLU}(\text{BN}_2(W_2 * h_1)) $$
$$ h_3 = \text{BN}_3(W_3 \cdot h_2) $$
每个BatchNorm有特定目的: • $ \text{BN}_1 $(在$ 1 \times 1 $压缩后):在ReLU之前归一化压缩表示。没有这个,通道减少的分布偏移可能导致大多数值为负(被ReLU归零),浪费容量。 • $ \text{BN}_2 $(在$ 3 \times 3 $处理后):归一化空间处理特征。$ 3 \times 3 $卷积聚合相邻位置,可能创建具有更大方差的特征。BatchNorm重置尺度。 • $ \text{BN}_3 $(在$ 1 \times 1 $扩展后):在添加到跳跃连接之前归一化扩展表示。这很关键:如果$ h_3 $与$ x $的尺度非常不同,加法$ h_3 + x $将被较大的项主导。BatchNorm确保两个项都有意义地贡献。
关于最终ReLU的说明: 加法后的ReLU($ y = \text{ReLU}(h_3 + x) $)应用于组合输出。这意味着在加法和最终激活之间没有BatchNorm,保持跳跃连接尽可能干净(快捷路径上只有一个非线性)。
为什么更深网络需要瓶颈块
网络深度和块类型之间的关系不是任意的:
浅层网络(18-34层)使用基本块因为: • 块数足够少,较高的每块成本可负担 • 通过仅两层的更简单梯度流 • 没有通道扩展的足够容量($ 4 \times $)
深层网络(50+层)使用瓶颈块因为: • 许多块需要低每块成本以实现可处理性 • 每块$ 17 \times $计算节省在50+层上显著累积 • $ 4 \times $通道扩展提供每参数更多容量 • 当跳跃连接处理梯度流时,三层结构不是劣势
深度-效率权衡: 具有基本块的ResNet-152需要:
$$ \text{FLOPs} \approx 17 \times 11.3\text{B} = 192\text{B FLOPs} $$这将不实用。瓶颈设计使152层网络在仅113亿FLOPs下可行,在每图像墙钟训练时间方面与34层基本网络(36亿FLOPs)相当。