【深度学习】入门理解ResNet和他的小姨子们(一)—ResNet

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

2015年由He KaiMing 大神 提出的ResNet现在是一种经典模型。在这之前,虽然VGG的深度已经高达19层了,但是152层的ResNet真的让我们目瞪口呆。

ResNet这篇文章则是CVPR2016的best paper。
论文链接:https://arxiv.org/abs/1512.03385
code:https://github.com/KaimingHe/deep-residual-networks

首先,我们要问一个问题:
Is learning better networks as easy as stacking more layers?

很显然不是,原因有二。
一,vanishing/exploding gradients;深度会带来恶名昭著的梯度弥散/爆炸,导致系统不能收敛。然而梯度弥散/爆炸在很大程度上被normalized initialization and intermediate normalization layers处理了。
二、degradation;当深度开始增加的时候,accuracy经常会达到饱和,然后开始下降,但这并不是由于过拟合引起的。可见figure1,56-layer的error大于20-layer的error。

with the network depth increasing, accuracy gets saturated (which might be unsurprising) and then degrades rapidly

这里写图片描述
这里写图片描述

但要是就这么完了,那这篇文章就结束了。如果深度不能带来accuracy的提升,那么也就没有这篇文章什么事情了。
He kaiMing大神认为靠堆layers竟然会导致degradation,那肯定是我们堆的方式不对。因此他提出了一种基于残差块的identity mapping,通过学习残差的方式,而非直接去学习直接的映射关系。

事实证明,靠堆积残差块能够带来很好效果提升。而不断堆积plain layer却会带来很高的训练误差
残差块的两个优点:

  1. Our extremely deep residual nets are easy to optimize, but the counterpart “plain” nets (that simply stack layers) exhibit higher training error when the depth increases; 2) Our deep residual nets can easily enjoy accuracy gains from greatly increased depth, producing results substantially better than previous networks.

对比实验

这里写图片描述

Plain Network, 思想主要来自于VGG,由于小卷积核要比大卷积核更加高效,因此在plain network中一般选择3×3的filters,在设计plain Network的时候有两个设计细节:1)为了输出相同大小的特征map,在每层中将拥有相同的filters。2)为了保证每层的计算时间复杂度相同,如果特征map被缩水1/2后,我们将增加2倍的filters

Residual Network, 该网络是在Plain Network上进行添加identity shortcut。但是identity shortcut要求输入和输出feature map的相加,这也就意味着输入输出的维度要相同。但是在PlainNetwork中根据pooling一共划分了5个res区域,这跨区域连接的时候,作者给了两种想法:1)继续直接使用shortcut,对不足的特征维数直接进行补零。2)利用1×1卷积核进行升降维。

这里写图片描述
这里写图片描述


左侧是plain_Net的训练误差,右侧是ResNet的训练误差,可以看到ResNet在加大深度的同时并没有出现类似于Plain_Net的degradation.

Identity vs. Projection Shortcuts.

事实上如果输入输出的维数不统一的话,identity是会出现问题的,因为没法直接将feature map进行直接相加。在上文提到两种方法:1)对不足的特征维数直接进行补零。2)利用1×1卷积核进行升降维。

这里写图片描述

作者把维数不同的shortcuts称之为projection shortcuts

这里写图片描述

作者测试了三种方案,第一种:进行补零以达到维数统一。第二种:仅在几个维数不统一的地方进行projection升维,其他地方还是identity。第三种,全部都是projection;

上图A,B,C分别对应着1,2,3种方法。事实上C的效果要好,然而为了计算复杂度的考虑,本文不使用C方法。

Deeper Bottleneck Architectures.

这里写图片描述


先用1×1降维,3×3进行卷积,再用1×1进行升维。
事实上,deeper左边这种结构也能获得很好的效果。那么为什么要用右边这种结构呢?
主要是源自于practical,因为左边这种结构在训练时间上要比右边结构长的多。

deeper non-bottleneck ResNets (e.g., Fig. 5 left) also gain accuracy from increased depth (as shown on CIFAR-10), but are not as economical as the bottleneck ResNets. So the usage of bottleneck designs is mainly due to practical considerations.

当换成上图右边这种Bottleneck 结构的时候,可以发现152层的ResNet竟然比VGG16/19 都要少的复杂度

这里写图片描述

Cifar10 实验.

上图左边指的是Plain Net, 然而deeper的时候,会出现明显的degradation。当深度达到100+的时候,plain Net的错误率达到了60%以上。
上图中间这是ResNet,可以看到当deeper的时候,错误率也在降低,并没有出现所谓的degradation。
然而右边则显示1202layers的ResNet的错误率比101layers的错误率高,作者认为这不是degradation导致,而是由于这么大的参数量在cifar10这个小数据集上过拟合导致。

后记
ResNet整篇文章骨架清晰,而且idea很work,这个工作在深度学习上应该是一个里程碑的模型。
好了,ResNet介绍完了,敬请期待他的小姨子们。

系列文章:
【深度学习】入门理解ResNet和他的小姨子们(一)—ResNet
http://blog.csdn.net/shwan_ma/article/details/78163921
【深度学习】入门理解ResNet和他的小姨子们(二)—DenseNet
http://blog.csdn.net/shwan_ma/article/details/78165966
【深度学习】入门理解ResNet和他的小姨子们(三)—ResNeXt
http://blog.csdn.net/shwan_ma/article/details/78203020
【深度学习】入门理解ResNet和他的小姨子们(四)—WideResNet
http://blog.csdn.net/shwan_ma/article/details/78168629
【深度学习】入门理解ResNet和他的小姨子们(五)—ResNet增强版
http://blog.csdn.net/shwan_ma/article/details/78595937

点这里可以跳转到人工智能网站