1.网络解决的问题
当更深的网络能够开始收敛时,一个退化问题就暴露出来了。随着网络深度的增加,精度达到饱和,然后开始退化。出乎意料的是,这种退化不是由过拟合引起的,向适当深度的模型中添加更多的层会导致更高的训练误差。经典网络的缺陷用以下图来解释:
![图1.不同深度的网络训练与测试错误率对比](https://img-blog.csdnimg.cn/20210111142048680.png#pic_center)
由上图不难看出,此模型56层的训练错误率和测试错误率都要高于20层的模型。由此可见,当模型的深度达到一定程度时会出现退化问题,即深模型的效果比浅模型的效果变差。
ResNet网络就是来解决网络退化的问题,通过在网络架构多加入一条恒等映射,经过一次卷积,如果效果变差,则保持权重参数不变,相当于并没有做此次卷积。这样的话,就保证了神经网络不会随着网络层数的增加反而效果变差,也就阻止了模型退化的问题。对不同深度的深度残差网络的效果比较如下图所示:
![图2不同深度.ResNet与普通网络对比](https://img-blog.csdnimg.cn/20210111142207833.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMDcxMjA5,size_16,color_FFFFFF,t_70#pic_center)
上图为不同深度的ResNet网络和普通网络的训练效果的对比图,图中细曲线代表训练误差,粗曲线代表验证误差,由上图可知,对于普通的网络来说存在着较浅网络的训练效果比较深网络好的情况,但对于ResNet网络来说,不存在这一情况。问题由此解决。
2.ResNet内部原理
本论文提出了深度残差网络这一模型,深度残差网络使用了一种连接方式叫做“shortcut connection”,顾名思义,shortcut就是“抄近道”的意思,下面是这个ResNet的网络结构:
![图3.残差块](https://img-blog.csdnimg.cn/20210111142225246.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMDcxMjA5,size_16,color_FFFFFF,t_70#pic_center)
上图就是ResNet内部的一个残差块,深度残差网络由多个残差块构成,此残差块和一般的卷积神经网络模块相比多了X的恒等映射,加入此恒等映射的目的是为了比较加入两个卷积层之后的训练效果与加入卷积层之前的训练效果。也就是说如果模型在加入卷积层之前的训练效果已经足够好了,而加入卷积层后反而使模型的效果变差,那么我们便会使用原模型的输出结果作为整个模型的输出结果。
真正使用的ResNet残差块并不是单一的,下面就是两种ResNet中最常用的残差块:
![图5.ResNet不同的残差块](https://img-blog.csdnimg.cn/20210111142250430.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMDcxMjA5,size_16,color_FFFFFF,t_70#pic_center)
上图的ResNet结构分别对应于34层的ResNet网络与50/101/152层的ResNet网络。左边的残差块结构比较简单,右边的残差块首先会对输入利用1x1卷积进行降维,然后再利用1x1的卷积进行升维。随着网络层数的增加,参数的数量会随之增加,为了考虑计算成本,较高层数的ResNet使用右边的残差块来对模型进行优化。我们可以算一下上图中的两个残差块引入参数的数量。当我们使用右边残差块时,引入的参数数量为:1x1x64x256+3x3x64x64+1x1x256x64=69632应注意到左右残差块输入特征图的个数不同,当左边输入特征图为256维时,当我们应用左边残差块引入参数的数量为:3x3x256x256+3x3x256x256=1179648,由此可见右边残差快可以极大的减少模型中参数的数量,因此拥有较高深度的ResNet模型都是使用右边残差块结构。