一、ResNet解决的问题
- 在公共数据集打榜结果可以看出,图像分类问题中,往往是越深的网络取得的成绩越好。在深度重要性的驱动下,一个问题产生了:学习更好的网络就像堆叠更多层一样容易吗?结果显然是NO。
- 深层网络面临最大的问题就是梯度消失或者梯度爆炸问题,二者从一开始就阻碍了收敛,但是这个问题在很大程度上已经通过归一化初始化和中间归一化层来解决。
- 于是分别进行不同深度网络的训练和测试发现更深层的网络更易出现精度饱和后迅速降级的现象,我们称这种现象为——退化,并且发现退化产生的原因不是过度拟合,而是层数变多引起的训练误差更高,随之测试误差也会更高。
- 现存的解决方法是Identity Mapping(恒等映射),这种结构理论上来说深层网络结构相比于浅层网络不会产生更多的误差,但是实验表明并非如此。
- 这个概念出自论文Identity Mapping in Deep Residual Networks这篇论文也主要分析的是resnet中使用identity mapping效果好的原因。
使用skip connect的原因
- 在深度学习中,网络越深表达能力越强,性能越好。但随着网络深度的加深,一些其他的问题也会产生,比如梯度消失,梯度爆炸,解决这些问题也有一些方法,比如BN层,Relu等各种激活函数,这些方法的改善能力有限。
- 如上图所示就是论文中的resnet网络的skip block的示意图。我们可以使用一个非线性变化函数来描述一个网络的输入输出,即输入为X,输出为F(x),F通常包括了卷积,激活等操作。
- 当我们强行将一个输入添加到函数的输出的时候,虽然我们仍然可以用G(x)来描述输入输出的关系,但是这个G(x)却可以明确的拆分为F(x)和X的线性叠加。这就是skip connect的思想,将输出表述为输入和输入的一个非线性变换的线性叠加,没用新的公式,没有新的理论,只是换了一种新的表达。它解决了深层网络的训练问题。
几个关键问题
ResNet的核心思想
上面我们说到深层网络并不是我们想的一定比浅层网络产生更好的效果。下面是ResNet的核心Idea:
假如有一个最完美网络N,那么相比于这个网络,我们所训练的网络一定有一些层是多余(不起作用或者起反作用)的,如果处理好这些冗余的层,我们的网络是不是就可以无限接近N了。
所以ResNet提出了恒等映射的概念,就是将这些冗余层恒等映射,(我理解的)分两步:一步是shortcut,将层输入引入到层输出求和,这样输出H(x) = F(x) + x,第二步将拟合目标等于x这样x = H(x) = F(x) + x ,这样F(w,x) = 0。
这样冗余层都会朝着恒等映射方向去收敛,确保最终的错误率不会因为深度的变大而越来越差。
“残差” 如何理解,为什么会更好的训练?
假设:在引入残差之前,输入x = 6,要拟合的函数H(x) = 6.1,也就是说平原网络找到了一组w’,使得F’(x,w’)—>H(x) = 6.1。引入残差后,输入不变还是x = 6,要拟合的函数H ( x ) = 6.1,变化的是F’(x,w’) + x —>H(x) = 6.1,所以F(x,w)—>0.1
如果需拟合的函数H(x)增大了0.1,那么对平原网络来说F’(x,w’)就是从6.1变成了6.2,增大了1.6%。而对于ResNet来说,F(x,w)从0.1变为0.2,增大了100%。很明显,在残差网络中输出的变化对权重的调整影响更大,也就是说反向传播的梯度值更大,训练就更加容易。
以上两段摘抄自博客https://blog.csdn.net/lairongxuan/article/details/91040698 讲的很好便于理解。
这里就可以看出”残差“是怎么来的了,恒等映射将层内的输出变为了实际要拟合输出和输入的误差值,相当于自动控制原理中的反馈结构!这样就放大了网络对误差的敏感程度!(控制人落泪~~,似曾相识的感觉,果然自控永远的神!)
关于梯度爆炸和消失
- 深度学习依靠误差的链式反向传播来进行参数更新,假如我们有这样一个函数
- f′=f(x,wf)
- g′=g(f′)
- y′=k(g′)
- cost=criterion(y,y′) - 假设f为卷积层,g为激活层,k为分类层,则cost对f的导数为:
- 其存在的问题也很明显了,一旦其中某一个导数很小,多次连乘后梯度可能越来越小,这就是常说的梯度消散,对于深层网络,传到浅层几乎就没了。但是如果使用了残差,每一个导数就加上了一个恒等项目1
此时就算原来的导数df/dx很小,这时候误差仍然能够有效的反向传播,这就是核心思想。
ResNet参数量计算
卷积层
(kernel * kernel) channel_input * channel_output
即(卷积核的大小) * 输入通道 * 输出通道
- 根据公式可以看出卷积层参数量大小与输入的大小没有关系,只与通道数有关。
假设 input_channel = 256
左边残差网络的参数量为:3X3X256X64+3X3X64X64
右边为:1X1X256X64+3X3X64X64+1X1X64X256
深层网络使用右侧残差网络更好,因为参数量少,两个1*1卷积层起到降维和升维的作用。
Shortcuts Connection的两种方式:
(1)shortcuts同等维度映射,F(x)与x相加就是就是逐元素相加
- y=F(x,Wi)+x
- F=W2σ(W1x)
其中 x 和 y 分别表示层的输入和输出。函数 F(x,Wi)代表着学到的残差映射,σ 代表ReLU
这种方式通过shortcuts直接传递输入x,不会引入额外的参数也不会增加模块的计算复杂性,因此可以公平地将残差网络和plain网络作比较。
(2)如果两者维度不同(改变了输入/输出的通道),需要给x执行一个线性映射来匹配维度
- y=F(x,Wi)+Wsx.
- F=W2σ(W1x)
这种方式的目的仅仅是为了保持x与F(x)之间的维度一致,所以通常只在相邻残差块之间通道数改变时使用,绝大多数情况下仅使用第一种方式。
相邻残差块之间通道数改变时输入x和输出y的通道数不同,所以不能直接将输入x直接与相加,需要一个线性映射将x映射到相同维度进行相加。
用卷积层进行残差学习:以上的公式表示为了简化,都是基于全连接层的,实际上当然可以用于卷积层。加法随之变为对应channel间的两个feature map逐元素相加。
Network Architectures—网络架构
Plain网络
卷积层主要为3*3的滤波器,并遵循以下两点要求:(i) 输出特征尺寸相同的层含有相同数量的滤波器;(ii) 如果特征尺寸减半,则滤波器的数量增加一倍来保证每层的时间复杂度相同。我们直接通过stride 为2的卷积层来进行下采样。在网络的最后是一个全局的平均pooling层和一个1000 类的包含softmax的全连接层。加权层的层数为34,如Fig.3(中)所示。
特征尺寸减半:卷积核减小一半或通道数变小一半,相应卷积层层数增加一倍,保证时间复杂度相同,可能是为了对比。
- Table表示自己搭建的Plain网络不同层数的对比,每一列都是相同的残差框架包含conv1——conv3x,但层数增加每个模块内部的层数会增加。(18层的残差网络Flops,34层Flops);网络随层数增加Flops增加,但对比VGG的Flops低很多很多,说明残差结构有效的减少了计算复杂度。
- fc 代表全连接层 fc1000 代表全连接层为1000
Methods
- 图像分别随机被压缩到256到480之间,之后做图像增强
- 输出处理过程:用224 *224随机裁出一个小图,在做水平的镜像来做图像增强(不同尺度维度),10个小图汇总成一个大图(可使用多尺度裁剪和结果融合)。
- 每个卷积层后面或者激活层之前都使用BN
参数: mini-batch为256,学习率为0.1,训练60万的迭代次数,正则化0.0001,动量是0.9。没有使用dropout(BN和dropout不能混合使用,单独使用效果更佳,原因:方差偏移)
Experiments—实验
首先进行的实验是18层和34层的plain网络,实验结果如下表所示,产生了一种退化现象:在训练过程中34层的网络比18层的网络有着更高的训练错误率。
而加入残差结构后的Resnet34层网络与Resnet18层网络相比,在训练集和验证集上均展示了更低的错误率。实现了更深层网络的训练误差优化,这表明了这种设置可以很好的解决退化问题,并且我们可以由增加的深度来提高准确率。(Resnet更深效果显示更优,,34相比18更优2.8%)
- top1-error 10%crop
- 验证了残差结构在极深网络中的有效性
- plainnet的18层误差率与resnet18的误差率接近,但resnet收敛速度更快
上述实验结果都是 增加恒等shortcut 不同维度问题通过padding补零解决条件下完成的
下面对比恒等和映射shortcut
(A) 对增加的维度使用0填充,所有的shortcuts是无参数的(与Table 2 和 Fig.4 (右)相同);
(B) 对增加的维度使用映射shortcuts,其它使用恒等shortcuts
© 所有的都是映射shortcuts。
Table 3表明了三种选项的模型都比对于的plain模型要好。B略好于A,我们认为这是因为A中的0填充并没有进行残差学习。C略好于B,我们把这个归结于更多的(13个)映射shortcuts所引入的参数。在A、B、C三个结果中细小的差距也表明了映射shortcuts对于解决退化问题并不是必需的。所以我们在本文接下来的内容中,为了减少复杂度和模型尺寸,并不使用选项C的模型。恒等shortcuts因其无额外复杂度而对以下介绍的瓶颈结构尤为重要。
B好于A的理解:补零为了维持特征图维度不变,补零区域的原始特征图因为是零所以就没有残差,只与原始输入数据相加。
C好于B的理解:所有的shortcut都通过映射链接,引入了一些参数,正是这些映射参数使性能更优了,(可能是非线性映射等缘故,使收敛更好)但提升也是微乎其微,参数量计算量上去了,因此B是目前最好的选择。
对比了resnet34和resnet18的效果,下面进行更深层网络的设计,引出Deeper Bottleneck Architectures
Deeper Bottleneck Architectures—深度瓶颈结构
50层的残差网络: 将其34层的残差网络的2个卷积层替换成了3个bottleneck残差块,就变成了50层残差网络,下采样使用的是1 * 1 的卷积
【Table 4 单一模型在ImageNet验证集上的错误率(%)(除了 ++ 是在验证集上的结果】
50/101/152层的resnet比34层resnet的准确率要高很多,解决了深层的退化问题。同时即使是152层resnet的计算复杂度仍然比VGG-16和VGG-19要小。
数据集验证
- CIFAR-10 数据集:50w的训练集,10w的测试集,一共10个类别