ResNet小结

ResNet讲解目录

什么是ResNet(核心思想)
为什么ResNet(精妙之处)

什么是ResNet

ResNet的主要思想是在网络中增加了直连的通道,被称为shortcut或skip-connecting,这条连接使得网络对整个网络输出函数H(x)的拟合变为对整个网络输出和前一个网络输出之间的残差拟合,即F(x)=H(x)-x,这里F(x)为残差函数,H(x)和x分别表示整个网络输出目标和前一个网络的输出,其网络结构如下:
ResNet小结
上图为一个残差学习模块
所以,原来对上一个网络层输出的非线性变换过程,现在允许将其直接输入到后面的网络层,而原来拟合整个网络的输出,现在只需拟合残差函数F(x)即可,当F(x)=0,有H(x)=x,表示前一个网络层信息直接输入到后面的网络层。

为什么ResNet

那么,一定有小伙伴和我一样想过,既然这条直连的通道是为了将前面网络层的输出直接传递到后边的网络层,那么这样信息的直接传递是为啥?如果要直接传递,直接去掉跨过的那些层不就好了吗?下面我们来一一分析ResNet的意义所在。

  1. 首先ResNet的提出主要针对在深度较深的网络中的训练:
  • 网络深度的意义在于: 网络越深,学习到的特征越高级,获取的信息越丰富,有助于提升模型的准确度。

  • 网络深度的局限在于:传统的卷积神经网络或全连接网络的网络越深,梯度消失或梯度爆炸问题越严重,尽管通过正则化输入和中间层的数据(Batch Normalization)可以缓解该问题(这样的话可以训练几十层的网络),但随着网络层数继续增加,在训练集上的准确率却趋于饱和甚至下降,也就是出现了退化问题而非过拟合问题(过拟合问题的表现是训练集效果特别好而测试集效果不好),这时正则化的方法就没那么有用了,退化问题说明深度网络不能被很好地优化。
    其退化效果如下图所示:
    ResNet小结

  1. ResNet的结构可以解决深度网络的退化问题:
  • 思想:如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络,这样就不存在深层网络的退化问题。
  • 假设当网络在某一深度时达到了网络的最优状态,此时网络的错误率最低,若继续加深网络就会出现退化问题(错误率上升),如果直接更新下一层的网络权值,让该层网络去拟合整个网络的输出,也即拟合一个潜在的恒等映射函数H(x) = x(以保持最优网络状态),比较困难,但如果使用ResNet结构,为了使得H(x) = x,只需要将拟合目标变为F(x)=0,此时网络只需要学习输入和输出之间差的那一部分,而非整个网络,很明显,拟合残差更容易。
  • 引入残差后的映射对输出的变化更敏感,残差的思想是去掉相同的主体部分,突出微小的变化部分,就像是一个差分放大器的效果。
  1. 残差学习结构可以通过前向神经网络+shortcut连接实现,如结构图所示,而且shortcut连接相当于简单执行了同等映射,不会产生额外的参数,也不会增加计算复杂度。

因此,ResNet的意义在于使得深度网络能够很好地被拟合,其方式就是直接将输入信息绕道传到输出,保护信息的完整性,将对H(x)的拟合转换为对F(x)的拟合,整个网络只需要学习输入、输出差别的那一部分,简化了学习目标和难度。

网络结构

下图是两种ResNet残差模块,一种是以两个33的卷积网络串接在一起作为一个残差模块,另外一种是11、33、11的3个卷积网络串接在一起作为一个残差模块。
ResNet小结
ResNet有不同的网络层数,比较常用的是50-layer,101-layer,152-layer。他们都是由上述的残差模块堆叠在一起实现的。

维度不匹配时,同等映射有两种可选方案:

  1. 直接通过zero padding 来增加维度(channel)
  2. 通过1x1卷积实现,直接改变1x1卷积的filters数目,这种会增加参数

作者由VGG19设计出了plain 网络和残差网络,如下图中部和右侧网络。然后利用这两种网络进行实验对比。
ResNet小结
对于残差网络,维度匹配的shortcut连接为实线,反之为虚线。最后的实验结果表明,ResNet在上百层都有很好的表现,但是当达到上千层了之后仍然会出现退化现象。但在2016年的Paper中对ResNet的网络结构进行了调整,使得当网络达到上千层的时候仍然具有很好的表现。
当层数达到103的数量级时,仍然会出现退化问题,这是因为当层数达到103的数量级时,退化的原因不再是因为结构优化的问题了,而是因为网络层级太深太强,而数据集太小太弱,不足以应对如此强大的残差结构,导致了过拟合。

参考列表:

[1] ResNet详解—通俗易懂版
[2]残差网络ResNet笔记
[3] ResNet介绍

上一篇:【从零学习PyTorch】 如何残差网络resnet作为pre-model +代码讲解+残差网络resnet是个啥


下一篇:pytorch 修改预训练model