摘要
残差网络更容易优化,并且可以从显著增加的深度中获得准确性。在ImageNet数据集上,我们对剩余的网进行评估,其深度为152层,比VGG网41层更深,但仍可以保证有较低的复杂度。
解决问题:
1)网络深度加深,会产生梯度消失和爆炸。利用规范化的初始化和Batch Normalization解决,使得具有数十层的网络通过随机梯度下降(SGD)方法可以开始收敛。
2)会产生网络退化的现象,不是由于过拟合导致,训练误差也会越大。
ResNet到底在解决一个什么问题!
ResNet学习的是残差函数F(x) = H(x) – x。这个感觉和梯度提升树很像,学习的是差值。
其实当batch normalization出现之后,梯度消失和爆炸的问题已经基本上被解决了,但是网络层数加深之后还是会出现效果差的情况,其实ResNet主要解决的是网络的退化问题,关于网络的退化,有以下几种解释感觉说的过去。
第一种解释:当网络越深的时候,反传回来的梯度相关性越来越差,最后接近白噪声。我们认为,图像具有局部相关性,因此梯度应该也具有类似的相关性,这样的更新才有意义,如果接近白噪声,那其实就可以认为做随机扰动。自然效果就越来越差了。
第二种解释:引入残差之后对参数的变化更加的敏感。原本的网络只是学习一个从输入到输出的映射,现在学习的是输入和输出之间的差值。
普通的映射 F(x)= H(x)
H(5)= 5.1 和 H(5)= 5.2 ,这里的变化只有2%。
残差之后的映射 H(x)= F(x)+ x;
F(x) = H(x)- x;
F(5)= 0.1 和 F(5)= 0.2;这里的变化有100%,这种变化是很大的。
第三种解释:(也是原文中的解释)现在我们要训练一个深层的网络,它可能过深,假设存在一个性能最强的完美网络N,与它相比我们的网络中必定有一些层是多余的,那么这些多余的层的训练目标是恒等变换,只有达到这个目标我们的网络性能才能跟N一样。
对于这些需要实现恒等变换的多余的层,要拟合的目标就成了H(x)=x,在传统网络中,网络的输出目标是F(x)=x,这比较困难,而在残差网络中,拟合的目标成了x-x=0,网络的输出目标为F(x)=0,这比前者要容易得多。
原文中的解释:
In thispaper, we address the degradationproblem(退化问题) by introducing a deep residuallearning framework. Instead of hoping each few stacked layers directly fit a desiredunderlying mapping, we explicitly let these layers fit a residual mapping.Formally, denoting the desired underlying mapping as H(x)(我们需要学习的映射), we let the stackednonlinear layers(堆叠的分线性层)fit another mapping of F(x) := H(x)− x. The original mapping isrecast into F(x) + x. We hypothesize that it is easier to optimize the residual mapping than tooptimize the original, unreferenced mapping. To the extreme, if an identity mapping were optimal(恒等映射是最优的), it would be easier to push theresidual to zero than to fit an identity mapping by a stack of nonlinearlayers.
第四种解释:也是我自己一直以来理解的一种,就是类似LSTM的思想,加入一个carry gate,让数据能够传到后面去,不至于由于网络越来越深,到了后面学习不到有效的特征了。所以加入一个shortcut,让数据一直往下传,让每一层都能读到有效的特征。
ResNet正向传播的两种结构!
1)输入输出维度相同,可以直接相加。
2)特征图维度输出是输入的1/2,特征图通道数输出是输入的两倍。
a、 直接用0来做pading,效果可能不是太好,0填充的维度确实没有残差学习
b、加入一个1*1的卷积Ws, 让Ws和输入做stride=2卷积操作。其实相当于让feature map降2倍分辨率,同时1*1的卷积还可以将通道数映射为需要的大小,使得最后的结果能够直接相加。(反正就是通过一个1*1的卷积,使得两条路的结果保持一致,最后能够加在一起)(作者最后选用的是b)
c、所有都采用投影。
分析得到虽然c的效果最好,但为了减少内存/时间复杂度和模型大小,不使用c。
ResNet减少参数的数量!
左边:两个3x3x256的卷积,参数数目:3x3x256x256x2 = 1179648。(这里感觉左边的图应该画256-d的,这样两边才是等价的)。
右边:第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 +1x1x64x256 = 69632。
差了16.94倍。
Resnet为什么要用x而不用 x/2!
第一种解释:
第二种解释: