bottleneckresnet⽹络_ResNet详解与分析
ResNets要解决的是深度神经⽹络的“退化”问题。
什么是“退化”?
我们知道,对浅层⽹络逐渐叠加layers,模型在训练集和测试集上的性能会变好,因为模型复杂度更⾼了,表达能⼒更强了,可以对潜在的映射关系拟合得更好。⽽ “退化”指的是,给⽹络叠加更多的层后,性能却快速下降的情况。
训练集上的性能下降,可以排除过拟合,BN层的引⼊也基本解决了plain net的梯度消失和梯度爆炸问题。如果不是过拟合以及梯度消失导致的,那原因是什么?
按道理,给⽹络叠加更多层,浅层⽹络的解空间是包含在深层⽹络的解空间中的,深层⽹络的解空间⾄少存在不差于浅层⽹络的解,因为只需将增加的层变成恒等映射,其他层的权重原封不动copy浅层⽹络,就可以获得与浅层⽹络同样的性能。 更好的解明明存在,为什么找不到?找到的反⽽是更差的解?
显然,这是个优化问题,反映出结构相似的模型,其优化难度是不⼀样的,且难度的增长并不是线性的,越深的模型越难以优化。
有两种解决思路, ⼀种是调整求解⽅法,⽐如更好的初始化、更好的梯度下降算法等;另⼀种是调整模型结构,让模型更易于优化——改变模型结构实际上是改变了error surface的形态。
ResNet的作者从后者⼊⼿,探求更好的模型结构。将堆叠的⼏层layer称之为⼀个block,对于某个block,其可以拟合的函数为F(x)F(x),如果期望的潜在映射为H(x)H(x), 与其让F(x)F(x) 直接学习潜在的映射,不如去学习残差H(x)−xH(x)−x,即
F(x):=H(x)−xF(x):=H(x)−x,这样原本的前向路径上就变成了F(x)+xF(x)+x,⽤F(x)+xF(x)+x来拟合H(x)H(x)。 作者认为这样可能更易于优化,因为 相⽐于让F(x)F(x)学习成恒等映射,让F(x)F(x)学习成0要更加容易——后者通过L2正则就可以轻松实现。 这样,对于冗余的block,只需F(x)→0F(x)→0就可以得到恒等映射,性能不减。
Instead of hoping each few stacked layers directly fit a desired underlying mapping, we explicitly let the layers fit a residual mapping . Formally, denoting the desired underlying mapping as H(x)H(x), we let the stacked nonlinear layers fit another mapping of F(x):=H(x)−xF(x):=H(x)−x. The original mapping is recast into F(x)+xF(x)+x. We hypothesize that it is easier to optimize the residual mapping than to optimize the original, unreferenced mapping. 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.
—— from Deep Residual Learning for Image Recognition
下⾯的问题就变成了F(x)+xF(x)+x 该怎么设计了。
Residual Block的设计
F(x)+xF(x)+x构成的block称之为 Residual Block ,即 残差块 ,如下图所⽰,多个相似的Residual Block串联构成ResNet。
3uUio4.png
⼀个残差块有2条路径F(x)F(x)和xx,F(x)F(x)路径拟合残差,不妨称之为残差路径,xx路径为identity mapping恒等映射,称之
为”shortcut”。 图中的⊕⊕为element-wi addition,要求参与运算的F(x)F(x)和xx的尺⼨要相同 。所以,随之⽽来的问题是,
残差路径如何设计?
shortcut路径如何设计?
Residual Block之间怎么连接?
在原论⽂中,残差路径可以⼤致分成2种,⼀种有 bottleneck 结构,即下图右中的1×11×1 卷积层,⽤于先降维再升维,主要出于 降低计算复杂度的现实考虑 ,称之为“ bottleneck block ”,另⼀种没有bottleneck结构,如下图左所⽰,称之为“ basic block ”。basic block由2个3×33×3卷积层构成,bottleneck block由1×11×1
3K34c8.png
shortcut路径⼤致也可以分成2种,取决于残差路径是否改变了feature map数量和尺⼨,⼀种是将输⼊xx原封不动地输出, 另⼀种则需要经过1×11×1卷积来升维 or/and 降采样 ,主要作⽤是 将输出与F(x)F(x)路径的输出保持shape⼀致 ,对⽹络性能的提升并不明显,两种结构如下图所⽰,
⾄于Residual Block之间的衔接,在原论⽂中,F(x)+xF(x)+x经过ReLUReLU后直接作为下⼀个block的输⼊xx。
对于F(x)F(x)路径、shortcut路径以及block之间的衔接,在论⽂ Identity Mappings in Deep Residual Networks 中有更进⼀步的研究,具体在⽂章后⾯讨论。
ResNet ⽹络结构
ResNet为多个Residual Block的串联,下⾯直观看⼀下ResNet-34与34-layer plain net和VGG的对⽐,以及堆叠不同数量Residual Block得到的不同ResNet。
ResNet的设计有如下特点:
与plain net相⽐,ResNet多了很多“旁路”,即shortcut路径,其⾸尾圈出的layers构成⼀个Residual Block;
ResNet中,所有的Residual Block都没有pooling层, 降采样是通过conv的stride实现的 ;
分别在conv3_1、conv4_1和conv5_1 Residual Block,降采样1倍,同时feature map数量增加1倍,如图中虚线划定的block;
通过Average Pooling得到最终的特征 ,⽽不是通过全连接层;
每个卷积层之后都紧接着BatchNorm layer,为了简化,图中并没有标出;
ResNet结构⾮常容易修改和扩展,通过调整block内的channel数量以及堆叠的block数量,就可以很容易地调整⽹络的宽度和深度,来得到不同表达能⼒的⽹络,⽽不⽤过多地担⼼⽹络的“退化”问题,只要训练数据⾜够,逐步加深⽹络,就可以获得更好的性能表现。
下⾯为⽹络的性能对⽐,
38EfB9.png
error surface对⽐
上⾯的实验说明,不断地增加ResNet的深度,甚⾄增加到1000层以上,也没有发⽣“退化”,可见Residual Block的有效性。ResNet的动机在于 认为拟合残差⽐直接拟合潜在映射更容易优化 ,下⾯通过绘制error surface直观感受⼀下shortcut路径的作⽤,图⽚截⾃ Loss Visualization 。
可以发现:
ResNet-20(no short)浅层plain net的error surface还没有很复杂,优化也会很困难,但是增加到56层后复杂程度极度上升。 对于plain net,随着深度增加,error surface 迅速“恶化” ;
引⼊shortcut后, error suface变得平滑很多,梯度的可预测性变得更好,显然更容易优化 ;
Residual Block的分析与改进
论⽂ Identity Mappings in Deep Residual Networks 进⼀步研究ResNet,通过ResNet反向传播的理论分析以及调整Residual Block的结构,得到了新的结构,如下
注意,这⾥的视⾓与之前不同,这⾥将shortcut路径视为主⼲路径,将残差路径视为旁路。
新提出的Residual Block结构,具有更强的泛化能⼒,能更好地避免“退化”,堆叠⼤于1000层后,性能仍在变好。具体的变化在于
通过保持shortcut路径的“纯净”,可以让信息在前向传播和反向传播中平滑传递,这点⼗分重要。 为此,如⽆必要,不引⼊1×11×1卷积等操作,同时将上图灰⾊路径上的ReLU移到了F(x)F(x)路径上。
在残差路径上, 将BN和ReLU统⼀放在weight前作为pre-activation ,获得了“Ea of optimization”以及“Reducing
overfitting”的效果。
下⾯具体解释⼀下。
令h(xl)h(xl)为shortcut路径上的变换,ff为addition之后的变换,原Residual Block中f=ReLUf=ReLU, 当hh和ff均为恒等映射时,可以得到任意两层xLxL和xlxl之间的关系,此时信息可以在xlxl和xLxL间⽆损直达,如下前向传播中的xlxl以及反向传播中的11。
反向传播中的这个11具有⼀个很好的性质, 任意两层间的反向传播,这⼀项都是11,可以有效地避免梯度消失和梯度爆炸。 如果hh和ff 不是恒等映射,就会让这⼀项变得复杂,若是令其为⼀个⼤于或⼩于1的scale因⼦,反向传播连乘后就可能导致梯度爆炸或消失,层数越多越明显,这也是ResNet⽐hi
ghway network性能好的原因。 需要注意的是,BN层解决了plain net的梯度消失和爆炸,这⾥的1可以避免short cut 路径上的梯度消失和爆炸。
shortcut路径将反向传播由连乘形式变为加法形式,让⽹络最终的损失在反向传播时可以⽆损直达每⼀个block,也意味着每个block的权重更新都部分地直接作⽤在最终的损失上。看上⾯前向传播的公式,可以看到某种 enmble 形式,信息虽然可以在任意两层之间直达,但这种直达其实是隐含的,对某个block⽽⾔,它只能看到加法的结果,⽽不知道加法中每个加数是多数, 从信息通路上讲尚不彻底——由此也诞⽣了DenNet 。
对于残差路径的改进,作者进⾏了不同的对⽐实验,最终得到了 将BN和ReLU统⼀放在weight前的full pre-activation结构 。
⼩结
ResNet的动机在于解决“退化”问题,残差块的设计让学习恒等映射变得容易,即使堆叠了过量的block,ResNet可以让冗余的block学习成恒等映射,性能也不会下降。所以,⽹络的“实际深度”是在训练过程中决定的,即ResNet具有某种 深度⾃适应 的能⼒。
深度⾃适应能解释不会“退化”,但为什么可以更好?
通过可视化error surface,我们看到了shortcut的平滑作⽤,但这只是结果,背后的根由是什么?
也许彻底搞懂ResNet还需要进⼀步地研究,但已有很多不同的理解⾓度,