跳转至

resnet connectivity

残差连接(Residual Connection)

ResNet 的核心设计:引入"捷径"(shortcut),将输入直接跨过若干层连接到输出:

\[\mathcal{F}(x) := H(x) - x\]

传统网络学的是 \(H(x)\)(隐式映射),ResNet 学的是 \(\mathcal{F}(x)\)(残差映射)。通过 shortcut 将原始输入 \(x\) 直接加到输出:

\[y = \mathcal{F}(x) + x = H(x)\]

其中 \(\mathcal{F}(x) = W_2 \sigma(W_1 x)\)\(+\) 操作通过逐通道逐元素加法实现。

为什么残差连接有效

  • 梯度流:反向传播时,梯度可以从 shortcut 直接流向更浅层,有效缓解梯度消失
  • 特征复用:浅层特征无需被每层重新学习,直接传递给深层
  • 退化问题:当网络已经足够深时,\(\mathcal{F}(x)\) 可以被优化为 \(0\),使 identity mapping 更容易实现
退化问题(Degradation Problem)

传统认为网络越深效果越好,但实验发现:当网络深度增加到一定程度后,训练误差和测试误差反而上升。这不是过拟合(训练集上也下降),而是优化困难导致的。

ResNet 的残差连接让网络在"什么都不做"(\(\mathcal{F}(x) = 0\))和"学习新特征"之间有了选择权,降低了优化难度。

ResNet 的结构

  • 每个残差块:两层卷积 + 跨层 shortcut
  • 当输入输出通道数不同时,需要 projection shortcut(用 \(1 \times 1\) 卷积调整维度)
  • 等通道数时,直接 identity shortcut
网络版本 通道数 层数
ResNet-18 64 → 128 → 256 → 512 2, 2, 2, 2
ResNet-34 64 → 128 → 256 → 512 3, 4, 6, 3
ResNet-50 64 → 128 → 256 → 512 3, 4, 6, 3
ResNet-101 64 → 128 → 256 → 512 3, 4, 23, 3

bottleneck

Bottleneck 模块设计

ResNet-50 及更深网络采用 bottleneck 结构,解决深度增加带来的参数量爆炸问题:

\[ \text{Bottleneck}(x) = W_3 \sigma\left(W_2 \sigma\left(W_1 x\right)\right) \]

三层卷积的设计:

  1. \(1 \times 1\) 卷积:先降维(channel: \(256 \to 64\)),减少 \(3 \times 3\) 卷积的计算量
  2. \(3 \times 3\) 卷积:中间特征空间提取特征(channel: \(64\)
  3. \(1 \times 1\) 卷积:再升维(channel: \(64 \to 256\)),恢复通道数

为什么叫 Bottleneck

  • 输入通道先压缩(bottleneck 压缩的是通道维度,不是空间维度)
  • \(1 \times 1\) 卷积让 \(3 \times 3\) 卷积在压缩后的低维空间运算
  • 参数量从 \(256 \times 256 \times 3 \times 3 \approx 590\text{k}\) 降到 \(256 \times 64 \times 1 \times 1 + 64 \times 64 \times 3 \times 3 + 64 \times 256 \times 1 \times 1 \approx 70\text{k}\)

对比:Basic Block vs Bottleneck

  • Basic Block(ResNet-34 等浅层网络):两个 \(3 \times 3\) 卷积
  • Bottleneck(ResNet-50 及更深网络):\(1 \times 1 \to 3 \times 3 \to 1 \times 1\)

两者效果相近,但 bottleneck 在深度增加时参数更少,更高效。


dense connectivity

DenseNet 的核心思想

与 ResNet 的逐层加法不同,DenseNet 将每层与所有后续层直接连接( concatenation 而非加法):

\[x_\ell = H_\ell\left(\left[x_0, x_1, \ldots, x_{\ell-1}\right]\right)\]

其中 \([x_0, x_1, \ldots]\) 表示沿通道维度的拼接(concatenation)。

DenseNet vs ResNet

ResNet DenseNet
特征融合方式 逐元素加法 \(y = \mathcal{F}(x) + x\) 沿通道拼接 \(y = [x, \mathcal{F}(x)]\)
特征复用 通过残差间接传递 每层直接接收所有前面层的特征
参数量 相对较大 较小(因为每层通道数不需要太多)
显存占用 较小 较大(所有前面层特征都保留)

Dense Block 结构

一个 Dense Block 内: - 每层输出通道数称为 growth rate \(k\) - 第 \(\ell\) 层输入通道数:\(k_0 + \ell \times k\)\(k_0\) 是输入通道数) - 常用 \(k = 12\)\(k = 32\)

DenseNet 由多个 Dense BlockTransition Layer 组成: - Transition Layer\(1 \times 1\) 卷积 + \(2 \times 2\) 平均池化,用于降维和下采样 - 不同 Dense Block 之间用 Transition Layer 连接

为什么叫 Dense

网络任意两层之间都有直接连接:第 0 层输出直接连到第 1, 2, 3... 层;第 1 层输出直接连到第 2, 3, 4... 层。这种"全连接"的模式类似 Dense Block,故名 DenseNet。


Global Average Pooling

GAP 的定义

对每个特征通道,在整个空间维度(\(H \times W\))上做平均:

\[\text{GAP}(x) = \frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W} x_{c, i, j}\]

输出:通道数 \(\times 1 \times 1\) 的张量,直接展平即为分类向量。

为什么用 GAP 替代 FC

全连接层(FC) 全局平均池化(GAP)
参数量 \(H \times W \times C \times N\)(巨大) 0
过拟合风险 极低
空间信息 忽略(展平后无位置关系) 保留(对每个通道独立平均)
对输入尺寸要求 固定 任意
可解释性 高(直接对应类别响应图)

GAP 的额外优点

  • CAM(Class Activation Mapping):GAP 使得可以直接可视化网络关注图片的哪些区域来分类
  • 位置编码:GAP 在保留空间信息方面比 Max Pooling 更好(Max Pooling 只保留最强响应)
  • 特征聚合:相比直接展平 + FC,GAP 先聚合再分类,强迫网络学习对分类有意义的特征图

实践中注意

GAP 本身没有参数,但需要配合足够多的特征通道(ResNet-50 有 2048 维)才能有效表达分类信息。当通道数较少时(如 ResNet-18 的 512 维),GAP 的效果可能不如展平 + FC。