ResNet结构与论文理解

ResNet也被称为残差网络,是由何凯明为主的Microsoft Research的4位学者在2015年首次提出,获得了2015年ILSVRC分类任务的第一名,还在ImageNet检测、ImageNet定位、COCO检测和COCO分割的任务中获得了第一名。也可以说是卷积神经网络中最常用的网络之一,并深刻影响了后来的深度神经网络的设计,不仅在计算机视觉领域取得发展,在nlp领域如transformer等模型里也有应用。
原论文地址:Deep Residual Learning for Image Recognition
Code:resnet
在文章开头,作者先给出了下面这张图:
普通网络堆叠的训练效果
这里作者想要表达的是虽然卷积神经网络能以堆叠层的方式提取丰富特征,但当层数多起来时也面临着梯度消失与梯度爆炸的问题,这个问题往往可以通过batch normalization等方法处理,但是作者发现当更深层次的网络能够开始收敛时,另一个退化问题就暴露出来了:随着网络深度的增加,精度趋于饱和,然后迅速退化。出乎意料的是,这种退化不是由过拟合引起的,在适当深度的模型中添加更多的层会导致更高的训练误差。在上图可以看到56层的堆叠网络在训练集测试集上的效果并没有20层的好,精度退化问题就出现了,基于解决这一问题,作者提出了ResNet,先看一下这个网络的结果(左图是普通网络的18层和34层的结果,右边是ResNet18层和34层的结果):
ImageNet上训练的ResNet结果
很明显,ResNet很好的解决了退化问题。下面是对于ResNet的简单介绍。

残差快

ResNet块的输出不同于AlexNet等网络,它还额外加上了原输入的信息,若原输入为x,f为堆叠层的运算,ResNet的输出则是f(x)+x,如下图所示(注意这里的输入与输出shape与channels都是一样的,因为它们要相加):
残差块
上图中从输入到输出额外的一条线作者将它称为Identity short-cut connections,这个是ResNet网络的核心。上图整个被称为残差快,在原论文中一个残差块有两种不同的结构,分别如下:
残差块的两种结构
左图中,输入x分别经过一个3x3卷积、batch normliaztion、relu激活、3x3卷积和batch normliaztion,由于需要与原输入shape与channel数相同,所以每个卷积层的padding都为1,stride多维1,最后加上原输入x得到一个残差快的输出。右图也是一样,不过由于对输入加了一个1x1的卷积核,所以对形状与channels数可以做适当改变,比如像下图就将shape减半,通道数加倍:
在这里插入图片描述

ResNet网络

由于ResNet系列中网络较多,这里只写一下作者在原论文中贴出的layer-34版本的ResNet-34(34层的ResNet),也是最上面那张图里的,其他网络如ResNet-50、ResNet-101等等也大同小异,无非是多了几层,具体差异如下图:
不同ResNet结构
可以把他们中间的层分成4块,像是GoogleNet的stage,分别是conv2_x、conv3_x、conv4_x与conv5_x,如conv2_x中的3x3,64表示经过3x3的卷积层,输出channel数为64;x2、x3表示两个、三个残差快连接在一起。这里列举了ResNet-34与VGG-19和34-layer plain(普通网络)的结构对比图:
ResNet与不同网络对比
最右边就是ResNet-34的网络结构,图中实线的Identity short-cut connections表示上面残差块中的没有1x1卷积核的,而虚线表示有1x1卷积核的。可以通过计算看到每个卷积块的输入与输出的channel数与shape都是一样的,最后接一个全局平均池化得到一个4d张量,flatten之后然后再接一个全连接得到形状为(samples,1000)的最后输出(由于ImageNet类别数是1000)。

总结

ResNet由于残差连接解决了前面提出的问题,以至于能训练出更深的网络,能达到1000层,原因是什么?
首先,若不使用残差连接,假设一层的输出为y=f(x),在反向传播时的梯度就是 ∂ y ∂ w \frac{\partial y}{\partial w} wy,则参数更新的时候就是 w = w − η ∂ y ∂ w w=w-\eta \frac{\partial y}{\partial w} w=wηwy;若再加一层,输出变为 y ′ = g ( f ( x ) ) y^{'}=g(f(x)) y=g(f(x)),则梯度变成 ∂ y ′ ∂ w = ∂ y ′ ∂ y × ∂ y ∂ w \frac{\partial y'}{\partial w}=\frac{\partial y'}{\partial y}\times{\frac{\partial y}{\partial w}} wy=yy×wy ∂ y ∂ w \frac{\partial y}{\partial w} wy不变,但是层数越多 ∂ y ∂ w \frac{\partial y}{\partial w} wy前面的偏导也越多,如果这些偏导都小于1,当层数过大时, ∂ y ∂ w \frac{\partial y}{\partial w} wy就会被缩小很多,导致后面对前层参数做梯度更新时特别慢,造成梯度消失。
若使用ResNet结构,它的输出可以看成 y ′ ′ = g ( f ( x ) ) + f ( x ) y''=g(f(x))+f(x) y=g(f(x))+f(x),即为原输入加上输出,此时的梯度就为 ∂ y ′ ′ ∂ w = ∂ y ′ ∂ w + ∂ y ∂ w \frac{\partial y''}{\partial w}=\frac{\partial y'}{\partial w}+{\frac{\partial y}{\partial w}} wy=wy+wy,这时梯度不同于不使用残差连接时的,乘法变成了加法,增大了梯度,使得梯度更新的时候不会特别小,模型收敛时也会更快。不小的梯度使得在层数变多时也能不带来梯度消失的问题。


具体细节可见作者源代码:https://github.com/KaimingHe/deep-residual-networks
也可参照沐神代码地址:https://zh-v2.d2l.ai/chapter_convolutional-modern/resnet.html


参考资料:李沐—动手学深度学习v2
深度学习笔记 11/20

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值