resnet connectivity¶
残差连接(Residual Connection)
ResNet 的核心设计:引入"捷径"(shortcut),将输入直接跨过若干层连接到输出:
传统网络学的是 \(H(x)\)(隐式映射),ResNet 学的是 \(\mathcal{F}(x)\)(残差映射)。通过 shortcut 将原始输入 \(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 结构,解决深度增加带来的参数量爆炸问题:
三层卷积的设计:
- \(1 \times 1\) 卷积:先降维(channel: \(256 \to 64\)),减少 \(3 \times 3\) 卷积的计算量
- \(3 \times 3\) 卷积:中间特征空间提取特征(channel: \(64\))
- \(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_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 Block 和 Transition 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\))上做平均:
输出:通道数 \(\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。