一直以来,经常在各种复杂的结构中使用或者听说过Resnet的名字,但是一直也没有学习过这篇文章,现在趁着有时间,学习一下Resnet——何凯明等人于2015年年底发表的《Deep Residual Learning for Image Recognition》。
一、Resnet的背景
深度神经网络(DCNN)结构是很难训练的,这里我们提出一种叫做“residual learning”的框架,使得神经网络可以更deep,更好训练。
我们显式地将层(layer)重新组织(reformulate)为学习残差函数,而不是学习未引用的函数(unreferenced functions)。
通过提供全面的经验证据(Comprehensive empirical evidence),表明此方法是容易优化且准确性随着深度的增加而增加(showing that these residual networks are easier to optimize, and can gain accuracy from considerably increased depth)。
在ImageNet比赛中,我们采用了比VGG大8倍的网络结构(152层),但是复杂度还是低于VGG的,测试集的错误率达到3.57%,赢得了ILSVRC 2015分类任务的第一名。
对于很多的visual recognition任务,the depth of representation(或者说网络的深度)是最重要的(增加描述能力)。
二、Resnet的解决的问题
根据之前的研究成果( K. Simonyan and A. Zisserman. Very deep convolutional networks for large-scale image recognition. In ICLR, 2015. ,C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov, D. Erhan, V. Vanhoucke, and A. Rabinovich.Going deeper with convolutions. In CVPR, 2015.),学术界普遍认为CNN结构的层数越多,表述能力越强(对特征的描述能力也就越强),效果也就越好。
但是实际上,由于层数的增加,常规的网络(plain network)在网络很深的时候,效果反而不如之前的浅层网络了(shallower network)。这种现象称之为退化现象(degradation problem) ,跟预想相反的是,这种退化行为(上图1中层数深的网络比层数低的网络train loss和test loss都要大。)不是由于overfitting造成的。这表明不是所有的系统(神经网络结构)都是容易收敛和优化的。;除此之外,由于层数很深,也不可避免的出现梯度消失/爆炸的问题(vanishing/exploding gradient)。
因此,Resnet解决的问题就是提出一种新型的方法,来解决随着网络层数加深而导致的退化问题(degradation problem)和相应的梯度消失问题。
三、Resnet的解决思路
提到Resnet,就离不开两方面的内容:① Residual Representation ② Shortcut Connections。下面我们结合实际的过程引入这两块内容,避免直接叙述带来的困扰和不解。
① Residual Representation
上面是Plain Net和Residual Net的结构,这里我们将H(x)H(x)视为一部分堆叠的网络的输出结果,xx为这一小部分结构的输入。我们希望通过2层权重能够拟合残差函数F(x)=H(x)−x" role="presentation" >F(x)=H(x)−x(这里假设H(x)H(x)和xx的维度一致)——用论文的原话说是:“如果假设多重非线性层可以渐近地逼近复杂的函数,那么就相当于假设它们可以渐近地近似残差函数(residual function)”
引用参考资料2里面的一段分析:
如果深层网络的后面那些层是恒等映射(identity mapping),那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。
但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。
映射H" role="presentation" >H的计算复杂,而FF的计算相对简单,所以加深网络层数是可行的。这里:F" role="presentation" >F是求和前网络映射,HH是从输入到求和后的网络映射。
下面引用自知乎
比如把5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化,看到残差网络我第一反应就是差分放大器。
② Shortcut Connections
如上图结构,我们对每几层的堆叠结构(stacked layers)都采用残差学习,其构造过程就是一个building block的过程:
y=F(x,Wi)+x" role="presentation" >y=F(x,Wi)+x
这里
xx和
yy为上面layers的输入和输出向量。函数
F(x,Wi)F(x,Wi)表示要学习的残差,以上图为例,二层结构有
F=W2σ(W1x)F=W2σ(W1x),这里
σσ表示激活函数ReLu(为简化描述,省略bias unit)。
F+xF+x的操作是通过shortcut connection和element-wise的加法来执行的。
值得注意的是,这里的shortcut connection机制既没有增加额外的参数,也没有使得计算复杂度增加。这一点是非常重要的,因为我们可以同时比较plain net和residual net(拥有同样的参数个数、网络深度和计算代价)。
这里又涉及到一个难点:如何保证输入输出的维度相同?
1)快捷连接(shortcut connection)仍然使用自身映射(identity mapping),对于维度的增加用零来填补空缺(padding),此策略不会引入额外的参数。
2)可以在shortcut connection时对x做一个线性变换方阵WsWs,相当于加入了1x1卷积层,即
y=F(x,Wi)+Wsxy=F(x,Wi)+Wsx
但通过实验证明,恒等映射对于解决退化问题已经足够了,因此只有在匹配维度时才需要使用WsWs。
残差函数FF的形式是灵活的。本文的实验涉及到的函数F" role="presentation" >F,它有两个或三个层,当然更多的层也是可以的。但是,如果FF只有一个层,那么y=F(x,Wi)+x" role="presentation" >y=F(x,Wi)+x就变成了y=W1x+xy=W1x+x,就失去了非线性的表述能力了,我们认为这是不可取的。
③ Network Architectures
我们测试了各种各样的普通/残差网网络,并观察到一致的现象。为了提供讨论的实例,我们将讨论在ImageNet使用的两个模型。
- 普通网络(Plain Network)
普通网络的基准模型(上图中间)主要受VGG网络(上图左)的启发。卷积层主要有3×3的过滤器,并遵循两个简单的设计规则:①对输出特征图的尺寸相同的各层,都有相同数量的过滤器; ②如果特征图的大小减半,那么过滤器的数量就增加一倍,以保证每一层的时间复杂度相同。
值得注意的是,我们的模型比VGG网络(上图左)更少的过滤器和更低的复杂性。我们的具有34层的baseline有36亿 FLOPs,只是VGG-19(19.6亿FLOPs)的18%。
- 残差网络(Residual Network)
基于上面的普通网络,我们插入了快捷连接(shortcut connection),将网络转换为对应的残差版本(上图右)。
当输入和输出是相同的维度时,恒等shortcut(identity mapping)可以直接使用。当维度增加(上图右虚线),我们提供两个选择:
-
1)快捷连接(shortcut connection)仍然使用自身映射(identity mapping),对于维度的增加用零来填补空缺(padding),此策略不会引入额外的参数。
2)可以在shortcut connection时对xx做一个线性变换方阵Ws" role="presentation" >Ws,相当于加入了1x1卷积层,即
y=F(x,Wi)+Wsxy=F(x,Wi)+Wsx
对于这两个选项,当shortcut融合大小不同的特征图时,它们的执行时的步长取2。
这里我们对这两种不同的building block的方式做一个梳理:
下图摘自参考资料3
在Resnet中,有两种Building block的方式: 第一类Building block(BB1)如上图中实线部分的building block所示,特点为输入输出的维度一致,特征图个数也一致;
第二类Building block(BB2)如上图虚线部分的building block所示,特点为输出是输入维度的1/2,输出特征图个数是输入特征图个数的2倍(即执行了/2操作)。
对于BB2,作者提供了两种选择:(A)如BB1的处理一样,padding技术,只是要填充好多0啊,这也是为什么得到实验4.1中的ResidualNetworks部分的“B is slightly better than A. We argue that this is because the zero-padded dimensions in A indeed have no residual learning.”的结论。(B)采用projection shortcut,让WsWs与输入做步长为2的1×1的卷积操作,这样,输入和输出就具有相同的维数,接下来在进行相加操作就OK啦!过程如下图所示:
ps:关于实验的情况这里不贴了,有意者请查看论文
四、总结
① 网络设计:
- 全部采用3×3的卷积核(或者大部分采用)
- Spatial size /2 -> filter×2 (保证时间复杂度一致)
- 没有Dropout层
② 实验结果表明,ResNet能够在没有任何困难的情况下得到训练,并且实现更深的网络结构使其达到更低的训练误差和测试误差。
③ 作者分析了深度学习模型存在的问题和本文提出的对策:
- 表征能力:ResNet在表征能力上不存在明显优势(只是重复的参数化),但是,能够使加深模型变得切实可行;
- 优化容易:能够使前向/反向传播算法更加平稳(加入BN),极大程度简化/减轻(DBA)优化深度模型;
- 泛化(Generalization)能力:ResNet未直接考虑泛化,但是更深+更薄是一种很好的一般化手段。
以上对ResNet做了简要总结,了解到ResNet在加深网络模型,提高学习任务准确率等方面都有很大的优势。
下图取自参考资料4,蒋竺波同学在知乎的文章
其实也就是说,可以通过将论文里面展示的layer为2的building block换为3,4等自己想要的数(必须要大于1,原因前面说了),从而保留想要的长程信息。
参考资料
1.Deep Residual Learning for Image Recognition
2. 残差网络Resnet——AlanMa
3. ResNet学习——Xxy_Fighting
4.CNN入门讲解:什么是残差网络Resnet(视频)——
蒋竺波