详解深度学习之经典网络架构(六):ResNet 两代(ResNet v1和ResNet v2)

目录网络

1、ResNet v1app

2、ResNet v2ide


1、ResNet v1

一提及“深度学习”,天然就联想到它很是显著的特色“深、深、深”(重要的事说三遍),经过很深层次的网络实现准确率很是高的图像识别、语音识别等能力。所以,咱们天然很容易就想到:深的网络通常会比浅的网络效果好,若是要进一步地提高模型的准确率,最直接的方法就是把网络设计得越深越好,这样模型的准确率也就会愈来愈准确。函数

那现实是这样吗?
先看几个经典的图像识别深度学习模型:学习

这几个模型都是在世界顶级比赛中获奖的著名模型,然而,一看这些模型的网络层次数量,彷佛让人很失望,少则5层,多的也就22层而已,这些世界级模型的网络层级也没有那么深啊,这种也算深度学习吗?为何不把网络层次加到成百上千层呢?测试

带着这个问题,咱们先来看一个实验,对常规的网络(plain network,也称平原网络)直接堆叠不少层次,经对图像识别结果进行检验,训练集、测试集的偏差结果以下图:设计

从上面两个图能够看出,在网络很深的时候(56层相比20层),模型效果却愈来愈差了(偏差率越高),并非网络越深越好。
经过实验能够发现:随着网络层级的不断增长,模型精度不断获得提高,而当网络层级增长到必定的数目之后,训练精度和测试精度迅速降低,这说明当网络变得很深之后,深度网络就变得更加难以训练了。3d

【问题来了】为何随着网络层级越深,模型效果却变差了呢?code

下图是一个简单神经网络图,由输入层、隐含层、输出层构成:orm

回想一下神经网络反向传播的原理,先经过正向传播计算出结果output,而后与样本比较得出偏差值Etotal

根据偏差结果,利用著名的“链式法则”求偏导,使结果偏差反向传播从而得出权重w调整的梯度。下图是输出结果到隐含层的反向传播过程(隐含层到输入层的反向传播过程也是相似):

经过不断迭代,对参数矩阵进行不断调整后,使得输出结果的偏差值更小,使输出结果与事实更加接近。

从上面的过程能够看出,神经网络在反向传播过程当中要不断地传播梯度,而当网络层数加深时,梯度在传播过程当中会逐渐消失(假如采用Sigmoid函数,对于幅度为1的信号,每向后传递一层,梯度就衰减为原来的0.25,层数越多,衰减越厉害),致使没法对前面网络层的权重进行有效的调整。

那么,如何又能加深网络层数、又能解决梯度消失问题、又能提高模型精度呢?

 

【主角登场】深度残差网络(Deep Residual Network,简称DRN)

前面描述了一个实验结果现象,在不断加神经网络的深度时,模型准确率会先上升而后达到饱和,再持续增长深度时则会致使准确率降低,示意图以下:

那么咱们做这样一个假设:假设现有一个比较浅的网络(Shallow Net)已达到了饱和的准确率,这时在它后面再加上几个恒等映射层(Identity mapping,也即y=x,输出等于输入),这样就增长了网络的深度,而且起码偏差不会增长,也即更深的网络不该该带来训练集上偏差的上升。而这里提到的使用恒等映射直接将前一层输出传到后面的思想,即是著名深度残差网络ResNet的灵感来源。

ResNet引入了残差网络结构(residual network),经过这种残差网络结构,能够把网络层弄的很深(听说目前能够达到1000多层),而且最终的分类效果也很是好,残差网络的基本结构以下图所示,很明显,该图是带有跳跃结构的:

残差网络借鉴了高速网络(Highway Network)的跨层连接思想,但对其进行改进(残差项本来是带权值的,但ResNet用恒等映射代替之)。

假定某段神经网络的输入是x,指望输出是H(x),即H(x)是指望的复杂潜在映射,若是是要学习这样的模型,则训练难度会比较大;

回想前面的假设,若是已经学习到较饱和的准确率(或者当发现下层的偏差变大时),那么接下来的学习目标就转变为恒等映射的学习,也就是使输入x近似于输出H(x),以保持在后面的层次中不会形成精度降低。
在上图的残差网络结构图中,经过“shortcut connections(捷径链接)”的方式,直接把输入x传到输出做为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x,也就是上面所提到的恒等映射。因而,ResNet至关于将学习目标改变了,再也不是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,所以,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不降低。

这种残差跳跃式的结构,打破了传统的神经网络n-1层的输出只能给n层做为输入的惯例,使某一层的输出能够直接跨过几层做为后面某一层的输入,其意义在于为叠加多层网络而使得整个学习模型的错误率不降反升的难题提供了新的方向。
至此,神经网络的层数能够超越以前的约束,达到几十层、上百层甚至千层,为高级语义特征提取和分类提供了可行性。

下面感觉一下34层的深度残差网络的结构图,是否是很壮观:

从图能够看出,怎么有一些“shortcut connections(捷径链接)”是实线,有一些是虚线,有什么区别呢?
 

由于通过“shortcut connections(捷径链接)”后,H(x)=F(x)+x,若是F(x)和x的通道相同,则可直接相加,那么通道不一样怎么相加呢。上图中的实线、虚线就是为了区分这两种状况的:

  • 实线的Connection部分,表示通道相同,如上图的第一个粉色矩形和第三个粉色矩形,都是3x3x64的特征图,因为通道相同,因此采用计算方式为H(x)=F(x)+x
  • 虚线的的Connection部分,表示通道不一样,如上图的第一个绿色矩形和第三个绿色矩形,分别是3x3x64和3x3x128的特征图,通道不一样,采用的计算方式为H(x)=F(x)+Wx,其中W是卷积操做,用来调整x维度的。

除了上面提到的两层残差学习单元,还有三层的残差学习单元,以下图所示:

 

两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),其目的主要就是为了下降参数的数目。左图是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,右图是第一个1x1的卷积把256维通道降到64维,而后在最后经过1x1卷积恢复,总体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,右图的参数数量比左图减小了16.94倍,所以,右图的主要目的就是为了减小参数量,从而减小计算量。
对于常规的ResNet,能够用于34层或者更少的网络中(左图);对于更深的网络(如101层),则使用右图,其目的是减小计算和参数量。

经检验,深度残差网络的确解决了退化问题,以下图所示,左图为平原网络(plain network)网络层次越深(34层)比网络层次浅的(18层)的偏差率更高;右图为残差网络ResNet的网络层次越深(34层)比网络层次浅的(18层)的偏差率更低。

 结语

ResNet在ILSVRC2015竞赛中惊艳亮相,一会儿将网络深度提高到152层,将错误率降到了3.57,在图像识别错误率和网络深度方面,比往届比赛有了很是大的提高,ResNet毫无悬念地夺得了ILSVRC2015的第一名。以下图所示:

在ResNet的做者的第二篇相关论文《Identity Mappings in Deep Residual Networks》中,提出了ResNet V2。ResNet V2 和 ResNet V1 的主要区别在于,做者经过研究 ResNet 残差学习单元的传播公式,发现前馈和反馈信号能够直接传输,所以“shortcut connection”(捷径链接)的非线性激活函数(如ReLU)替换为 Identity Mappings。同时,ResNet V2 在每一层中都使用了 Batch Normalization。这样处理后,新的残差学习单元比之前更容易训练且泛化性更强。

 

2、ResNet v2

ResNet残差网络,想必你们必定很熟悉了,那么先考考你们,下面(1)-(5)的结构哪一个是咱们经常使用的ResNet结构?

其中weight指conv层,BN指Batch Normalization层,ReLU指激活层,addition指相加;

根据ResNet的描述,彷佛以上五组都符合,那么2016年ResNet原文是哪个结构呢?以及其余四组结构也都work么?咱们不由有了这两个疑问,伴随着疑问咱们一一揭开谜题;

针对第一个问题,ResNet原文中使用的结构是(1),(1)的特色有两个:

1)BN和ReLU在weight的后面;

2)最后的ReLU在addition的后面;

对于特色1),属于常规范畴,咱们平时也都这个顺序:Conv->BN->ReLU;对于特色2),为何ReLU放在addition后面呢?按照常规,不是应该是图(3)这种么,那么咱们接下来引出的问题就是:

图(3)的结构work么? 

对于每一个图右侧部分咱们称做“residual”分支,左侧部分咱们称做“identity”分支,若是ReLU做为“residual”分支的结尾,咱们不难发现“residual”分支的结果永远非负,这样前向的时候输入会单调递增,从而会影响特征的表达能力,因此咱们但愿“residual”分支的结果应该在(-∞, +∞);这点也是咱们之后设计网络时所要注意的

对于图(3)不OK的状况,那若是把BN也挪到addition后面呢?如图(2),同时也保证了“residual”分支的取值范围;

这里BN改变了“identity”分支的分布,影响了信息的传递,在训练的时候会阻碍loss的降低;这里你们确定又有个问题:

为何“identity”分支发生变化,会影响信息传递,从而影响训练呢?

这里简单回顾ResNet的公式:

y_l=h(x_l)+F(x_l, W_l)

简化以上公式,令全部“identity”分支都是h(x_l) = x_l以及x_{l+1} = y_l,那么获得:

x_{l+1} = x_l + F(x_l, W_l)

咱们递归的计算:

x_{l+2} = x_{l+1} + F(x_{l+1}, W_{l+1})=x_l + F(x_l, W_l) + F(x_{l+1}, W_{l+1})

x_L = x_l + \sum_{i=l}^{L-1}F(x_i, W_i)

公式(1),表达了任何第L层(深层)与第l层(浅层)之间关系;假设损失函数为loss,那么反向传播公式为:

\frac{\partial loss}{\partial x_l} = \frac{\partial loss}{\partial x_L} \frac{\partial x_L}{\partial x_l} = \frac{\partial loss}{\partial x_L} (1 + \frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i, W_i))

这个反向传播公式有几个特色:

(1)关于xl的梯度信息与两部分值有关:x_L的梯度值,也就是说两层之间梯度信息无障碍传递了,以及\frac{\partial loss}{\partial x_L} \frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i, W_i));

(2)\frac{\partial loss}{\partial x_l}的值不会轻易抵消由于在一个mini-batch中,\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i, W_i))不会一直为-1;

(3)有效的防止了当权重很小时,梯度消失的问题。
以上优秀的特色只有在假设h(x_l) = x_l以及x_{l+1} = y_l成立时才有效,因此ResNet要尽可能保证两点:1)不轻易改变”identity“分支的值,也就是输入与输出一致;2)addition以后再也不接改变信息分布的层;

 

到此也就完全回答了图(2)的结构为什么会阻碍反向传播时的信息。

在分析图(4)和图(5)以前,咱们引出一个概念:”Post-activation”和”Pre-activation”,其中Post和Pre的概念是相对于weight(conv)层来讲的,那么咱们不难发现,图(1), (2), (3)都是”Post-activation”,图(4), (5)都是”Pre-activation”,那么两种模式哪个更好呢?这里咱们就用实验结果说话。

 上图是5种结构在Cifar10上的实验结果,一共实验了两种网络ResNet110和ResNet164(注:这里直接摘抄了原文的图片,本人并无真实的试验过);
从实验结果上,咱们能够发现图(4)的结构与ResNet原结构伯仲之间,稍稍逊色,然而图(5)的结构却好于ResNet原结构。图5的结构好的缘由在于两点:1)反向传播基本符合假设,信息传递无阻碍;2)BN层做为pre-activation,起到了正则化的做用;

最后咱们一般把图5的结构称做ResNetV2,这里咱们把ResNetV1和ResNetV2结构再次show: