一、背景知识:
1、为什么要构建深层网络?
答:认为神经网络的每一层分别对应于提取不同层次的特征信息,有低层,中层和高层,而网络越深的时候,提取到的不同层次的信息会越多,而不同层次间的层次信息的组合也会越多。
2、ResNets为什么能构建如此深的网络?
答:深度学习对于网络深度遇到的主要问题是梯度消失和梯度爆炸,传统对应的解决方案则是数据的初始化(normlized initializatiton)和(batch normlization)正则化,但是这样虽然解决了梯度的问题,深度加深了,却带来了另外的问题,就是网络性能的退化问题,深度加深了,错误率却上升了,而残差用来设计解决退化问题,其同时也解决了梯度问题,更使得网络的性能也提升了。
普通网络(Plain network),类似VGG,没有残差,凭经验会发现随着网络深度的加深,训练错误会先减少,然后增多(并证明的错误的增加并不是由于过拟合产生,而是由于网络变深导致难以训练)。从理论上分析,网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的增加,训练误差会越来越多,这被描述为网络退化。
残差网络(Residual Networks,ResNets)的提出,可以解决上述问题,即使网络再深,训练的表现仍表现很好。它有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的信息。
二、残差结构示意图
残差网络的设计思想
残差元的主要设计有两个,快捷连接和恒等映射,快捷连接使得残差变得可能,而恒等映射使得网络变深,而恒等映射主要有两个:跳跃连接和激活函数。
实验证明残差块往往需要两层以上,单单一层的残差块并不能起作用。
实际中,考虑计算的成本,对残差块做了计算优化,即将两个3x3的卷积层替换为1x1 + 3x3 + 1x1, 如下图。新结构中的中间3x3的卷积层首先在一个降维1x1卷积层下减少了计算,然后在另一个1x1的卷积层下做了还原,既保持了精度又减少了计算量。
ResNet就是用这种跳跃结构来作为网络的基本结构。
假如本来我们要优化的目标是H(x)=F(x)+ x,但通过这个结构就把优化的目标有H(x)转化成H(x)- x。
为什么经过优化目标转化后就可以解决退化问题呢?
我们之前说到,深层网络在浅层网络的基础上只要上面几层做一个等价映射就可以达到浅层网络同样的效果,但是为什么不行呢?就是因为我们的算法很难将其训练到那个程度,也就是没办法将上面几层训练到一个等价映射,以至于深网络最后达到一个更差的效果。
通过改变结构,把训练目标进行转变,由H(x)转变为H(x)- x,因为这时候就不是吧上面几层训练到一个等价映射,而是将其逼近于0,这样训练的难度比训练一个等价映射应该下降多了。
简单总结上一段的内容:通过在一个浅层网络基础上叠加y=x的层(称identity mappings,恒等映射),可以让网络随着深度增加而不退化。这反映多层非线性网络无法逼近恒等映射网络。
如果已经学习到较饱和的准确率(或者当发现下层的误差变大时),那么接下来的学习目标就转变为恒等映射的学习,也就是使输入x近似于输出H(x),以保持在后面的层次中不会造成精度下降。例如,在一个网络中(假设有5层),如果前面四层已经达到一个最优的函数,那第五层就是没有必要的了,这时我们通过这种跳跃结构,我们的优化目标就从一个等价映射变为逼近0了,逼近其他任何函数都会造成网络退化。通过这种方式就可以解决网络太深难训练的问题。
网络不退化不是我们的最终目的,我们的最终目标是有更好性能的网络。ResNets学习的是残差函数F(x)=H(x)-x,这里如果F(x)=0,那么就是上面提及的恒等映射。但实际上,我们只是逼近恒等映射,而不是使得F(x)=0。因为学习一个F(x)=0,的恒等映射很难。
三、2层残差单元:34层的深度残差结构
为经过“shortcut connections(捷径连接)”后,H(x)=F(x)+x,如果F(x)和x的通道相同,则可直接相加,那么通道不同怎么相加呢。上图中的实线、虚线就是为了区分这两种情况的:
1、实线的Connection部分,表示通道相同,如上图的第一个粉色矩形和第三个粉色矩形,都是3x3x64的特征图,由于通道相同,所以采用计算方式为H(x)=F(x)+x。
2、虚线的的Connection部分,表示通道不同,如上图的第一个绿色矩形和第三个绿色矩形,分别是3x3x64和3x3x128的特征图,通道不同,采用的计算方式为H(x)=F(x)+Wx,其中W是卷积操作,用来调整x维度的。
四、3层的残差学习单元
除了上面提到的两层残差学习单元,还有三层的残差学习单元,如下图所示:
两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),其目的主要就是为了降低参数的数目。左图是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,右图是第一个1x1的卷积把256维通道降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,右图的参数数量比左图减少了16.94倍,因此,右图的主要目的就是为了减少参数量,从而减少计算量。
对于常规的ResNet,可以用于34层或者更少的网络中(左图);对于更深的网络(如101层),则使用右图,其目的是减少计算和参数量。。
参考文章: