目录
- Resnet 1.0
1.1 Resnet1.0原理
1.2 Residual Learning
1.3 Resnet实践细节 - Resnet 2.0
2.1 改进
2.2 Identity Skip Connections
2.3 the Usage of Activation Functions
2.4 Resnet2.0实践细节 - 对Resnet的讨论
3.1 从网络有效路径角度
3.2 从梯度相关性角度
1. Resnet 1.0
Paper- "Deep Residual Learning for Image Recognition"
在paper一开始作者就提出问题
Is learning better networks as easy as stacking more layers?
事情并没有那么简单,作者在多个datadset做实验,验证了一味增加网络层的深度网络无论是训练误差和验证误差都逊于浅层网络。他们指出深度网络训练所面临的挑战:
-
梯度弥散/梯度爆炸(vanishing/exploding gradients)
这个已经基本被normalized initialization和intermeidiate normalization layers解决了。 - 退化问题(degradation)
ResNet的提出就是为了解决这些问题,下文会一一验证。
1.1 Resnet1.0原理
Resnet1.0的核心思想
"A deeper model should produce no higher training error than its shallower counterpart."
在深度网络中,一般来讲,层数越深,效果会越好,因为多层网络可以通过非线性映射拟合任何函数,多出来的深层网络可以拟合输入自身,即深层网络表现至少不会比浅层网络差。
解决办法很简单。假设Figure 2中左边的18层网络已经达到饱和的准确率,右边的34层模型要想达到同样的效果,只需要将多余的层(蓝色方框里的)设置为恒等映射层Identity mapping, (即y = x, 输出等于输入 ),这样就增加了网络的深度,并且起码误差不会增加,也即更深的网络不应该带来训练集上误差的上升。
1.2 Residual Learning
- To the extreme, if an identity mapping were optimal, it would be easier to push the residual to zero than to fit an identity mapping by a stack of nonlinear layers.
- The degradation problem suggests that the solvers might have difficulties in approximating identity mappings by multiple nonlinear layers.
在paper中,不止一次提到,经过多层的非线性运算,神经网络自身很难去拟合identity mapping。所以,他们灵机一动,设置下面的这种带有shortcut的残差网络结构。
设,
期望得到的网络层输出
该层的输入
在这种网络结构下,网络所要学的就是残差residual function(这里假设输入和输出的维度一样)。当时,那么,也就是上面所提到的恒等映射。ResNet相当于将学习目标改变了,将残差结果不断逼近于0,使到随着网络加深,也能保证准确率不下降。
If one hypothesizes that multiple nonlinear layers can asymptotically approximate complicated functions, then it is equivalent to hypothesize that they can asymptotically approximate the residual functions.
关于残差学习的可行性,作者认为既然网络可以拟合那么多复杂的函数,那么同样也可以去拟合这个残差函数。对于网络来说,相较于用一个新的架构去学习目标函数,不如去发现对于恒等映射的扰动是更容易。
通过实验结果Figure 4表明,
残差网络响应值的标准差普遍小于plain network(响应值response, 指的是每一层经过BN层后的3*3卷积层的输出,在激活函数之前),这意味着,整个神经网络在各层的中间输出的数值更稳定,恒等映射提供了一个令人满意的防止网络衰退的预处理。
越深的Resnet残差网络,越多层的响应值标准差处在较低水平,很有可能权重近似于零,这也就是说其所对应的残差结构可能近似于恒等映射,网络的实际有效层数是要比全部层数要少一些的,产生了跳过连接(Skip-connection)的作用。
1.3 Resnet实践细节
1.3.1 Identity vs. Projection Shortcuts
对于短路连接,
当输入和输出维度一致时,可以直接将identity(输入)加到网络层输出上,这里的相加是element-wise的,相对应的channel之间两两相加。
PS. 这里为了简略省去了biases。当维度不一致时,不能直接相加,要对输入做一点处理,有两种策略:
(1)采用zero-padding增加维度
(2)采用新的映射(projection shortcut),一般使用1x1的卷积,这样会增加参数,也会增加计算量。下面的式子中是linear projection。
需要注意的是,resnet没有直接用max-pooling层,所以以上两种操作都需通过stride=2来实现将feature map尺寸缩小的动作。
作者测试了三种方案:
A:进行zero-padding以达到维数统一。
B:仅在几个维数不统一的地方进行projection升维,其他地方还是identity。
C:全部都是projection。
事实上C的效果最好,但是考虑到计算/空间复杂度以及模型的大小,paper后面的测试不使用C方法。
1.3.2 Deeper Bottleneck Architectures
作者考虑到自己GPU的计算能力有限,就把50层及以上的网络均采用bottleneck的设计,其目的主要就是为了降低参数的数目。
假设此时的输入是256-d的feature map
- 用左图的结构,将是两个3x3x256的卷积,
参数数目: (3*3*256)*256*2 = 1179648 - 用Bottleneck Design,是第一个1x1的卷积把256维通道降到64维,然后在最后通过1x1卷积恢复
参数数目: (1*1*256)*64 + (3*3*64)*64 + (1*1*64)*256 = 69632
右图的参数数量比左图减少了16.94倍,因此,右图的主要目的就是为了减少参数量,从而减少计算量。
1.3.3 其他细节
残差网络有这样几个特点:
- 网络较瘦,控制了参数数量;
- 存在明显层级,特征图个数逐层递进,保证输出特征表达能力;
- 使用了较少的池化层,大量使用下采样,提高传播效率;
- 没有使用Dropout,利用BN和全局平均池化进行正则化,加快了训练速度;
- 层数较高时减少了3x3卷积个数,并用1x1卷积控制了3x3卷积的输入输出特征图数量,称这种结构为“瓶颈(bottleneck)”。
2. Resnet 2.0
Paper-"Identity Mappings in Deep Residual Networks"
Resnet1.0已经大幅度解决了网络退化的问题,但还是存在一个bug。
- “The central idea of ResNets is to learn the additive residual function with respect to , with a key choice of using an identity mapping ”
- “...focusing on creating a "direct" path for propagating information - not only within a residual unit, but through the entire network...”
Residual Block(Residual Unit)的输出还要经过ReLU等非线性函数,就没有任何一条shortcut支路直接接通网络输入到网络输出的,也不能通过简单的叠加(additive)残差得到。这违背了Resnet设计的初衷,所以发了这篇paper进行优化。
2.1 改进
在1.0里,是ReLU,是恒等映射。在2.0版本里,也变为恒等映射,把上面两个式子结合,不停迭代,就能得出下面公式:
这个式子两个性质:
- 深层特征可直接由浅层特征与和之间的残差之和表示。
- 与plain network不同,任何一层的网络特征并不是由一系列矩阵向量运算所得,而是由输入简单地叠加上各层残差。
根据这个式子,我们可以得到反向传播公式:
这个反向传播公式有两个特点:
- 的梯度信息只与的梯度值有关系,也就意味着两层之间的梯度信息可以无障碍传递。
- 的值不会轻易抵消因为在一个mini-batch中,很少会遇到为-1的情况,这也是Resnet能解决梯度消失的原因。
2.2 Identity Skip Connections
做了几组对比试验,
反正最后,他们更肯定地认为shortcut这一分支上使用Identity mapping能达到最好的效果。
2.3 the Usage of Activation Functions
接着,他们开始折腾激活函数的位置摆放,对Residual结构开始了各种排列组合...
(a)这个就是Resnet1.0原始版本
(b)这里BN改变了“identity”分支的分布,影响了信息的传递,在训练的时候会阻碍loss的下降;
(c)Residual分支上得到的结果永远非负,向前传播是只能单调递增,影响网络的表达。一个残差函数的输出范围应该是才对。
(d)把ReLU放到前面去,然而我们得到的结果和(a)差不多,原因是什么呢?因为这个ReLU层不与BN层连接使用,因此无法共享BN所带来的好处。
(e)反向信息传播无阻碍,BN层作为pre-activation起到了正则化的作用。
显然,full pre-activation的效果最佳,一般也把这种形式称为Resnet2.0的residual block。
2.4 Resnet2.0实践细节
-
在数据经过第一个单独的卷积层后,即将要进入第一个Residual Unit前,先使用一个激活函数处理后,再往下走,如图:
-
在数据经过最后一个Residual Unit,要进入average pooling层前,再额外使用激活函数进行处理,如图:
对于50层及以上采用Bottleneck Design的深层网络,也要先做pre-activation再做projection。
3. 对Resnet的讨论
3.1 从网络有效路径角度
我们可以把残差网络单元转换成右图的形式,从右图中可以看出,残差网络其实是由多种路径组合的一个网络,从输入到输出之间我们通过选择是否跳过残差块(F(x)=0)来选择不同的映射。直白了说,残差网络其实是很多并行子网络的组合,整个残差网络其实相当于一个多人投票系统(Ensembling)。
3.1.1 删除网络的的一部分
如果把残差网络理解成一个Ensambling系统,那么网络的一部分就相当于少一些投票的人,如果只是删除一个基本的残差单元,对最后的分类结果应该影响很小;而最后的分类错误率应该适合删除的残差单元的个数成正比的,论文里的结论也印证了这个猜测。
3.1.2 ResNet的真面目
ResNet的确可以做到很深,但是从上面的介绍可以看出,网络很深的路径其实很少,大部分的网络路径其实都集中在中间的路径长度上,如下图所示:
从这可以看出其实ResNet是由大多数中度网络和一小部分浅度网络和深度网络组成的,说明虽然表面上ResNet网络很深,但是其实起实际作用的网络层数并没有很深,我们能来进一步阐述这个问题,我们知道网络越深,梯度就越小,如下图所示
而通过各个路径长度上包含的网络数乘以每个路径的梯度值,我们可以得到ResNet真正起作用的网络是什么样的,如下图所示
我们可以看出大多数的梯度其实都集中在中间的路径上,论文里称为effective path。
从这可以看出其实ResNet只是表面上看起来很深,事实上网络却很浅。
所示ResNet真的解决了深度网络的梯度消失的问题了吗?似乎没有,ResNet其实就是一个多人投票系统。
3.2 从梯度相关性角度
在知乎上看到一个回答
Q:到底Resnet在解决一个什么问题呢?
王峰:今年2月份有篇文章,正好跟这个问题一样。
“The Shattered Gradients Problem: If resnets are the answer, then what is the question?”大意是神经网络越来越深的时候,反传回来的梯度之间的相关性会越来越差,最后接近白噪声。因为我们知道图像是具备局部相关性的,那其实可以认为梯度也应该具备类似的相关性,这样更新的梯度才有意义,如果梯度接近白噪声,那梯度更新可能根本就是在做随机扰动。
有了梯度相关性这个指标之后,作者分析了一系列的结构和激活函数,发现resnet在保持梯度相关性方面很优秀(相关性衰减从到了)。这一点其实也很好理解,从梯度流来看,有一路梯度是保持原样不动地往回传,这部分的相关性是非常强的。
Reference
- K. He, X. Zhang, S. Ren, and J. Sun, “Deep Residual Learning for Image Recognition,” vol. 7, no. 3, pp. 171–180, 2015.
- K. He, X. Zhang, S. Ren, and J. Sun, “Identity Mappings in Deep Residual Networks Importance of Identity Skip Connections Usage of Activation Function Analysis of Pre-activation Structure,” no. 1, pp. 1–15, 2016.
- ResNet之Deeper Bottleneck Architectures
- 对ResNet的理解
- Deep Residual Network 深度残差网络
- 详解深度学习之经典网络架构(六):ResNet 两代(ResNet v1和ResNet v2)
- 到底Resnet在解决一个什么问题呢? - 王峰的回答 - 知乎
- 【模型解读】resnet中的残差连接,你确定真的看懂了? - 龙鹏-言有三的文章 - 知乎