Featured image of post ResNet 瓶颈架构

ResNet 瓶颈架构

ResNet的瓶颈架构(来自Tensortonic)

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)相当。

Licensed under CC BY-NC-SA 4.0