经典CNN模型-ResNet手写笔记

  |  

摘要: 2018 年左右 ResNet 学习笔记

【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:潮汐朝夕
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


ResNet 是计算机视觉中非常重要的一个 CNN 模型,2015 年被提出,后来陆陆续续出了很多变种,并且广泛应用在了产业中。计算机视觉发展到现在,大多数论文还是以 ResNet 为主干网络。

本文是 2018 年的一个手写笔记,以后想复习的时候可以参考。

ResNet 论文


简介与文献

网络深度的重要性

深度 CNN 网络可以整合 low/mid/high level 的特征,参考 2014 年文章《Visualizing and Understanding Convolutional Neural Network》。

网络的深度是很重要的,参考以下几篇文章:

首先是 2015 年的两篇文章《Very Deep Convolution Networks for Large Scale Image Recognition》和《Going Deeper with Convolutions》。

进而有提出 prulu 的《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》,以及提出 BN 的《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》,这两篇文章也是 2015 年的。

增加网络深度的问题

但是增加网络的深度,在训练时会遇到两个问题:

问题1:梯度消失/爆炸 (Vanishing/Exploding gradients)

参考 2010 年文章《Understanding the Difficulty of Training Deep Feedforward NN》。

针对此问题还是有一些办法的,比如增加 BN 可以使得 10 层网络的 SGD 有可能收敛。

问题2: 退化问题 (Degradation)

随着深度增加,准确率会饱和,之后迅速下降。

这个问题并不是过拟合,继续加深会使得 Train Error 继续增加。

参考这两篇文章《Convolutional Neural Network at Constrained Time Cost》和《Highway Network》。

如果有一个浅层网络,然后在此浅层网络基础上添加一些层,形成1个深度网络,那这个深度网络的训练误差应该不高于浅层的那一部分,因为如果添加的层是 Identity Mapping 的话,就可以使得深度网络与浅层网络的输出相等。但实验证明,目前的模型并没有达到这个效果。

本文的方法

本文针对退化问题提出的解法是:深度残差学习框架。

相关工作

残差表示

参考以下两篇文章:

2012 年提出 VLAD 的《A Representation that Encodes by the Residual Vectors with Respect to a Dictionary》;

以及提出 Fisher Vector 的《Fisher Kernels on Visual Vocabularies for Image Categorization》。

Shortcut Connection

ShortCut Connection 的理论和实践很早,在 MLP 时期就有了。参考以下几篇文章:

提出 Inception Layer 的《Going Deeper with Convolutions》;

以及《Highway Network》和《Training Very Deep Netword》。


残差学习 (Residual Learning)

将堆叠的非线性层拟合另一个映射:

于是 $H(x) := F(x) + x$,其中 $F(x) + x$ 可以通过 Shortcut Connection 实现,也就是保存输入 x 然后和输出 F(x) 相加得到 F(x) + x。Identity Shortcut Connection 不引入额外参数。

F(x) 和 x 的维数必须是相等的,否则就需要在shortcut connections中对x进行1个线性投影(linear projection)以匹配维度。

F 的选择是自由的,文章中用了两种:

浅层(18, 34)用的是 Building Block;深层(50, 101, 152)用的是 Bottleneck。

网络结构

根据 VGG Net 的理论,卷积层基本都用 $3 \times 3$ 的 filter,以及两条规则:

  1. 输出 feature map 的 size 不变,则 layer 中用相同个数 filter。
  2. 输出 feature map 的 size 减半,则 layer 中用的 filter 加倍

在 Plain Network 的基础上,插入 Shortcut Connection,形成残差版本的网络。

在插入 Shortcut Connection 时会遇到维度变化,有两种方法;(1)对增加的维度补零;(2)通过线性投影匹配维度。

Architecture for ImageNet

output size 为 18、34、50、101、152 的 ResNet 中间各个层的细节,以及 2-layer Block、3-layer Bottlenect,参考文中的表格。一些规律如下:

  • 受 VGG 启发,主要用 3 * 3
  • 对于相同的输出特征大小的层(即统一 stage),有相同数量的 3 * 3
  • 若特征大小减半,filter 数量加倍
  • 每个 stage 由 stride=2 的 conv 执行下采样,此下采样只在每个 stage 的第一个 conv 完成
  • 卷积之后接 GAP,最早出自 NiN,工程上常用自适应 GAP(AGAP)

实现

参考 2015 年的《Very Deep Conv Networks for Large Scale Image Recognition》,resize 短边随机取 [256, 480] 用于 Scale Augmentation。

参考 2012 年的《Imagenet Classification with Deep CNN》,随机取 $224 \times 224$ 的 crop。

参考 《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》,在 conv 和 activation 中间加 BN,没有用 Dropout。

初始化参考《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》。

SGD、Batch size 为 256。

学习率 0.1,Loss 平坦的时候除以 10。

迭代 6e5 轮。

Weight Decay 为 1e-4。

Momentum 为 0.9。

ResNet 解决问题的思路总结

20 层是 56 层的子集,将 56 层的最后 36 层全部短连接,56 层理应等效于 20 层,则 56 层的效果至少不应该比 20 层差。

但层数从 20 变成 56 之后,难以训练,训练不充分的网络不但不提高性能,反而降低性能。

从 ResNet50 开始,用 Bottleneck,主要引入 $1 \times 1$ 卷积,作用如下:

(1) 对 channel 数升/降维,实现多特征图线性组合同时保持原有特征图大小。
(2) 相比其它尺寸核,运算量大降。
(3) 2 个 $3 \times 3$ 堆叠有一个 Relu,用 $1 \times 1$ 就有两个 Relu。

ResNet 常见后续改进

DownSample 部分,减少信息流失

每个 stage 的第一个 conv ($1 \times 1$)都有下采样步骤。

ResNet-B: 将下采样放到 $3 \times 3$ 中。

ResNet-D: 在 ResNet-B 的基础上将 Identity 部分的下采样放到 avgpool 做,避免 $1 \times 1$ 和 s=2 同时出现。

ResNet-C: 将输入部分的 $7 \times 7$ 换成 3 个 $3 \times 3$,最早出现在 Inception-V2。

ResNet-V2

调整组件顺序

理解 ResNet 有效性

  • 模型集成角度

参考《Residual Network Behave Like Ensumble of Relatively Shallow Network》,删除 ResNet 部分结点,不影响整个网络性能。而在 VGG 上做同样的事,网络立刻崩溃。

  • 反向传播角度,缓解梯度消失


Share