ResNet 笔记

ResNet笔记

ResNet在2015年被Kaiming He等人提出,在ImageNet比赛classification任务上获得第一名,因为它“简单与实用”并存,之后很多方法都建立在ResNet50或者ResNet101的基础上完成的,检测,分割,识别等领域都纷纷使用ResNet。下面我们从实用的角度去看看ResNet。

该ResNet是针对随着网络深度的加深,出现的 “degradation problem”(网络退化问题)而提出的。

随着网络的加深,首先出现的问题就是梯度消失问题,但随之被 batch normalization 解决。那加了BN层之后再加深,网络性能是不是就更高了呢?错!作者在论文中说:通过试验证明,当随着网络的加深,正确率达到一定程度之后,不增反降。这时就出现了“网络退化问题”。
ResNet 笔记_第1张图片

作者做了这样的试验,先训练一个浅层网络A,然后在已经训练过的A的后面添加若干个identity mapping,得到深层网络B。那么,理论情况下,B的训练误差应该小于等于网络A的,但是实际上,B的训练误差高于A的训练误差。(其实这里我有个拿不准的问题,论文中说的identity mapping指的是什么?我的理解:identity mapping 就是没有卷积操作只有激活函数)
结论:这种下降即不是梯度消失引起的也不是overfit造成的,而是由于网络过于复杂,不是所有的网络都容易优化。以至于光靠不加约束的放养式的训练很难达到理想的错误率。degradation problem不是网络结构本身的问题,而是现有的训练方式不够理想造成的。当前广泛使用的训练方法,无论是SGD,还是AdaGrad,还是RMSProp,都无法在网络深度变大后达到理论上最优的收敛结果。

那么,残差网络是如何进行学习的呢
ResNet 笔记_第2张图片
残差网络中,残差块的具体形式如上图所示。右侧多出来的连接称之为:Identity shortcut connection。假定在原始形式的两层卷积是为了学习H(x)函数,那么现在残差块中,H(x) = F(x) + x,残差块的目的是为了学习F(x)。
残差块的计算形式:
当输入feature mapping与残差块输出的feature的宽高一样时:output = relu(F(x) + x) ,
当输入feature mapping与残差块输出的feature的宽高不同时:output = relu(F(x) + Wx)
其中F(x) = bn( conv( layer1(x) ) ) , layer1(x) = relu( bn( conv(x) ) )
第二种情况,identity mapping 对输入 feature mapping 做了卷积操作,为了缩小feature mapping 大小。

那么为什么将传统卷积改编成残差块,网络加深,不会出现网络退化问题呢?
就像之前所说的小实验,在浅层网络中增加 identity mapping,并没有降低网络的训练误差,反而增大,即出现了网络衰退的现象。那么“网络衰退现象”也就表明了网路很难通过multiple nonlinear layers 去近似拟合一个identity mapping。

你可能感兴趣的:(CNN)