文章目录

  • 0. 前言
  • 1. ResNet V1
  • 2. ResNet V2
  • 3. Wide ResNet
  • 4. ResNext
  • 5. Res2Net
  • 6. iResNet
  • 7. ResNeSt


0. 前言

  • 目标:总结残差网络系列论文,老忘记,就记录一下每篇论文的创新点。
  • 论文列表:
  1. ResNet v1: Deep Residual Learning for Image Recognition
  • 第一次提出ResNet结构。
  1. ResNet v2: Identity Mappings in Deep Residual Networks
  • 对原始ResNet结构进行一些测试,找到更合适的结构,主要就是 conv-bn-relu的顺序以及relu的位置
  1. Wide ResNet: Wide Residual Networks
  • 之前的ResNet太“瘦”了,并实验证明“胖”一点的结构也能用
  1. ResNext: Aggregated Residual Transformations for Deep Neural Networks
  • 将Inception的思路引入ResNet,主要就是分组卷积
  1. Res2Net: A New Multi-scale Backbone Architecture
  • 设计用于处理多尺度问题,不仅是分组卷积,前面几组的结果还会作为后续组别的输入。
  1. iResNet: Improved Residual Networks for Image and Video Recognition
  • 改进ResNet的基本结构,即bottleneck结构、shortcut结构。
  1. ResNeSt: Split-Attention Networks

1. ResNet V1

  • ResNet 刚被提出来的时候,主要要解决的就是“深层神经网络训练困难”的问题。
  • 从理论上看,深层网络模型效果不会低于浅层网络。例如,假设深层网络前面的结构与浅层网络完全相同,深层网络后面的结果使用Identity Mapping,则可以保证深层网络效果等价于浅层网络。
  • 但实际训练中,如果直接使用一些普通的深层网络,效果却比浅层网络差,这就意味着不是模型本身有问题,而是深层模型训练比浅层困难。
  • 所谓“训练困难”,主要就是梯度消散。
  • 没有ResNet结构的深层网络效果较差的原因不是过拟合(因为训练误差也随着深度增加而增加了)。
  • 用了什么方法解决?
  • 提出了ResNet,即残差网络结构。其基本结构如下图
  • ResNet有效的一种解释是:由于梯度消散导致训练困难,则通过残差结构保留梯度。
  • BotteleNet 结构,即上图中右边的结构。
  • BottleNet应该可以翻译为“瓶颈”结构。
  • 所谓瓶颈,主要指的是channel的数量的变化(先大后小再增大)。以上面右图为例,输入与输出的channel都是256,但前两层的channel是64,这就会减少参数数量。
  • 该结构的目标是减少参数与运算量。
  • 如果输入与输出需要变化channel数量,那就需要对shotcut通道也进行处理。
  • 设计的网络结构如下:
  • 效果如何?
  • 好得一笔。
  • ResNet50应该是现在最基本的backbone,用在几乎所有CV相关的任务中。
  • 后来设计网络有很多很多都借鉴了这个结构。
  • 还存在什么问题?
  • 而且这种结构一般都比较玄学,一般靠各种完备的实验来证明信结构的优越性,但不能完整解释为什么work。
  • Wide ResNet论文中提到
  • ResNet比Inception的泛化能力差一点。
  • shortcut结构虽然能够保留梯度,但也存在一些问题:
  • 由于使用了shortcut结构,所以block的非shortcut子路其实可以不传递梯度,也就是说,换句话说,每个block能够学习到的东西很少。
  • 从上面可以看出,可能只有一些block能够学到有用的内容,其他很多block其实对最终结果没有什么作用。
  • 上面所说的这个问题在论文 Highway networks 被称为 diminishing feature resue。

2. ResNet V2

  • 本质是在 ResNet V1 的基础上进行一些修改,主要思想还是 ResNetV1。
  • 个人感觉是在ResNetV1的基础上又做了一系列实验,寻找更合适的结构。
  • 用了什么方法解决?
  • 改进残差单元,如下图
  • 主要改进方案有两个:将激活层放到旁路,将旁路结构从conv-bn-relu改为bn-relu-conv。
  • 还试验了很多其他结构,最终选择的反正就是最后一个,没花头。
  • 对于上面那张图,在这篇文章中有一些解释:
  • 效果如何?
  • 做了很多实验,证明新的结构比旧的好。
  • 还存在什么问题?
  • 这篇论文感觉比较水,就是一系列实验找了个更好的模型结构。
  • 不可解释,都是实验的结果,但又不知道为什么这样修改比较好。
  • 但我看了PyTorch的ResNet实现,好像都没用这里的东西……

3. Wide ResNet

  • 之前的ResNet可以通过增加深度来提高模型精度。但随着深度的增加,提高的精度越来越少,且训练难度越来越大。
  • 当时的ResNet相关研究主要聚焦于增加网络的“深度”,而不怎么关注“宽度”。
  • 所谓“宽度”,指的是特征图的深度;所谓“深度”,指的是叠加的卷基层/BN层等的数量。
  • 基本上用到的网络都是很“瘦长”的。
  • 与Inception系列比,ResNet系列的泛化性(generalization)较差,即特征用于迁移学习时效率更低。
  • 由于使用了shortcut结构,所以block的非shortcut子路其实可以不传递梯度,也就是说,换句话说,每个block能够学习到的东西很少。
  • 从上面可以看出,可能只有一些block能够学到有用的内容,其他很多block其实对最终结果没有什么作用。
  • 上面所说的这个问题在论文 Highway networks 被称为 diminishing feature resue。
  • 从上面这些问题就引出了本文的目标:如何使用wide deep residual networks来处理深度网络存在的训练问题。
  • 用了什么方法解决?
  • 提出了一个新的block结构:
  • 如图所示,新提出的结构的宽度增加(即前两张图片的卷基层宽度较小,后两张较大)。
  • 基于新的block结构提出了Wide ResNet
  • 在每个block的卷基层之间使用了Dropout。
  • 在设置窟宽度、深度的时候,一般是考虑参数数量。
  • 效果如何?
  • 仅使用16层网络,在多个数据集(CIFAR/SVHN/COCO/ImageNet)上达到最优。
  • 还存在什么问题?
  • Wide ResNet 现在好像不太常用。
  • 在卷基层中间加上Dropout好像也不常用。
  • PyTorch的Torchvision中有Wide ResNet的实现,不过也与论文中不完全相同,仅仅是修改了每个block中特征图的深度。

4. ResNext

  • 提到当时视觉识别问题(visual recognition)已经从特征工程(feature engineering)转换为网络设计(network engineering)。
  • 当时的研究还集中在网络结构的设计上,想要同时结合VGG和ResNet的特点。
  • VGG网络的设计提出了一种新的设计方案:
  • 叠加同样的block从而得到结果。
  • 作者认为这种设计比较好,不会导致在某个数据集上性能好,放到其他数据集上性能不好。
  • Inception系列模型提出了 split-transformation-merge 策略,注重性能。
  • 当时的网络设计,在增加计算量/参数量的基础上提高性能比较多,很少有参数量/计算量不变但性能提高的。
  • 用了什么方法解决?
  • 设计了一种新的block结构,其中心思想是引入了 cardinality 的概念,我的理解其实就是做分组卷积。
  • 普通ResNet是做三次卷积,channel变化分别是256 -> 64 -> 64 -> 256。
  • ResNext的做法是将做32组操作(即cardinality参数),每组channel变化是 256 -> 4 -> 4 -> 256,最后将32组的所有结果累加。
  • 在具体实现时,有一些可以修改的地方(从而提高性能)
  • 下图中,b/c就与a完全相同,但性能更好。
  • 提出的ResNext网络结构如下图:
  • 效果如何?
  • 还存在什么问题?
  • 感觉整体idea也没啥,就是加了个分组卷积,效果还不错。

5. Res2Net

  • 主要解决多尺度(multi-scales)的问题。
  • multi-scale 问题是什么?
  • 在一张图片中,可能出现不同尺寸的多个物体。
  • 一个物体周边的其他物体可能比物体本身蕴含更多信息。
  • 获取不同尺度物体的信息对于一些任务(如语义分隔、颗粒度分类)有很大作用。
  • 之前处理 multi-scale 主要通过 layer-wise representation 来表示。还有通过处理不同尺度的特征图来处理。
  • 用了什么方法解决?
  • 提出了Res2Net Module,结构如下图所示。
  • 该结构为模型超参数多了一个选项,scale dimension,下图为4,即将卷基层分为多少个组。
  • 这种方法 at a more granular level(不知道怎么翻译,更细微的层面)上处理multi-scale问题。
  • 如何理解 res2net module 能够处理 multi-scale 问题?可以从receptive field上理解,上图中分组从左到右的receptive field依次增加。
  • 与其他模型整合,如整合ResNext与SE。整体结构如下图
  • SE模块如下图
  • 与ResNext整合的意思就是其中的group=1的普通卷积转换为group=c的分组卷积。
  • 效果如何?
  • 替代ResNet后普遍涨点,下面这结果还是带了运行时间的,可以有
  • Grad-Cam效果都更好了
  • 在关键点识别、目标检测、语义分割中都得到了较好的结果,已经作为mmdetection的backbone。
  • 还存在什么问题?
  • 这种分组卷积都有一个问题,虽然GFLOPs差不多,但实际运行速度肯定有一定下降。

6. iResNet

  • ResNet是现在常用的backbone,主要就是用于抑制退化问题(随着神经网络层数增加,训练结果变差了)。
  • ResNet虽然抑制了退化问题,但也存在上升空间。
  • 用了什么方法解决?
  • iResNet,是 improved residual network 的缩写。
  • 改进ResNet Block的基本结构,如下图:
  • (a) 是ResNet v1的结构,注意relu的位置,这种结构不利于将信息保留下来。
  • (b) 是ResNet V2的结构,为了解决上面所说的relu不利于保留信息,所以改变了conv-bn-relu的顺序,且改变了relu的结构,但这样做保留信息的方式太直接了,相当于从一个极端走向另一个极端。
  • 文章总结了之前结构存在的两个问题:
  • 在stage后的数据都没有经过relu,所以随着block数量增加,总体信号变得越来越 unnormalized,这导致训练难度增加。
  • 由于会降低特征图尺寸,每次降低时都会用到 11 卷积来做 projection,四个11连接,但没有任何非线性处理,这会导致训练难度增加。
  • 为了改进上面所说的问题,提出了下图©结构。
  • 改进shortcut结构
  • shortcut就是在block的输入与输出尺寸有变化时使用。
  • 文章认为 1*1 stride 2 卷积操作会损失75%的特征图信息,而且选择的25%并没有什么依据。
  • 新结构设计的依据有三个:减少信息损失、增加了translation invariance、看作是soft/hard downsampling 的结合
  • 改进 block 的结构
  • 以前用的 bottleneck 结构,是为了减少计算量。
  • 本文引入了分组卷积,在增加channel的保持FLOPs基本上不增加。
  • 效果如何?
  • 有一些与resnet v1比较的结果就不看了……怎么可能比resnet v1差。
  • 下图比较了 resnext,看起来并没有什么优势(参数虽然少了,但FLOPs多了)
  • 还存在什么问题?
  • FLOPs不增加不代表inference time不增加。
  • 其实我感觉这篇论文结果选择的baseline有点弱了……要比也是跟Res2Net、ResNeXt比吧……比了好像也没有太大优势。