resnet解决的是网络的退化问题。在vgg中提出,增加网络深度可以增加模型的表达能力。但是人们发现深度达到一定之后,CNN网络再一味增加层数并不能带来分类性能的提高,甚至会让网络收敛变慢,测试集精度下降。训练集精度下降可以说明这个不是过拟合的原因。因此resnet提出这是网络的“退化问题”。
深度神经网络可以拟合各种表示,按道理说,n+1层的cnn的解空间包含了n层的cnn的解空间,因此n+1层的精度不应该比n差,但是为什么精度反而下降呢?resnet认为网络中的表示方法可能存在问题。
resnet提出了 残差学习 的思想。
若将输入设置为X,将某一有参网络层设为H,那么以X为输入的此层的输出将为H(X)。一般的CNN网络的学习方法是直接学习H的表达,也就是学习X->H(X).
残差学习了输入、输出间的残差,也就是F(X)=H(X)-X,也就是最开始的H(X)=F(X)+X,这么做的原因是假设学习一个残差映射比学习H(X)要更加容易。从极端上来讲,如果某个映射是最优的,那么直接把残差部分置0相比于学习恒等映射更容易。
它有二层,如下表达式,其中σ代表非线性函数ReLU
然后通过一个shortcut,和第2个ReLU,获得输出y
当需要对输入和输出维数进行变化时(如改变通道数目),可以在shortcut时对x做一个线性变换Ws,如下式,然而实验证明x已经足够了,不需要再搞个维度变换,除非需求是某个特定维度的输出,如文章开头的resnet网络结构图中的虚线,是将通道数翻倍。
实验证明,这个残差块往往需要两层以上,单单一层的残差块(y=W1x+x)并不能起到提升作用。
实际中,考虑计算的成本,对残差块做了计算优化,即将两个3x3的卷积层替换为1x1 + 3x3 + 1x1, 如下图。新结构中的中间3x3的卷积层首先在一个降维1x1卷积层下减少了计算,然后在另一个1x1的卷积层下做了还原,既保持了精度又减少了计算量。