ResNet

论文

2015年提出的ResNet
2016年改进后的ResNet

博客

残差结构解析

2015年论文的残差结构的主要段落翻译

残差结构
论文原文
译文:
在本文中,我们通过提出一个深度残差学习框架来解决退化问题。与其希望每个堆叠层直接拟合一个需要的潜在映射,我们明确地让这些堆叠层拟合残差映射
形式上,将所需的潜在映射表示为 H ( x ) H(x) H(x),我们让堆叠的非线性层拟合 F ( x ) F(x) F(x)的另一个映射 H ( x ) − x H(x)-x H(x)x原映射重构为 F ( x ) + x F(x)+x F(x)+x
我们假设去优化残差映射比优化原始映射容易。考虑极端的情况,如果恒等映射是最佳的,那么将残差优化到0比通过一个堆叠的非线性层去拟合一个恒等映射要容易。
在这里插入图片描述
译文:
公式 F ( x ) + x F(x)+x F(x)+x能够被带有“捷径连接”的前馈神经网络实现。捷径连接是跳过一层或多层的连接。
在我们的案例中,捷径连接仅仅表现为恒等映射,并且其输出被添加到堆叠层的输出中。
恒等捷径连接既不会增加额外的参数也不会增加计算复杂性。整个网络仍可以通过SGD(随机梯度下降)进行反向传播,并且可使用通用库(例如Caffe)轻松实现,无需修改求解器(Caffe中的Solver:Solver负责生成训练网络和测试网络并按照算法对网络进行参数优化)。

在这里插入图片描述
译文:
让我们将 H ( x ) H(x) H(x)看作一个由一些堆叠层(不一定是整个网络)拟合的潜在映射,其中x表示这些堆叠层的第一层的输入。
如果有假设:多个非线性层能够渐近地逼近复杂的函数,那么这个假设等价于假设:多个非线性层能够渐近的逼近残差函数: H ( x ) − x H(x)-x H(x)x(假设输入和输出的维度相同)。
所以与其期望堆叠层逼近 H ( x ) H(x) H(x),我们明确地让这些堆叠层逼近残差函数 F ( x ) : = H ( x ) − x F(x):=H(x)-x F(x):=H(x)x
原始函数因此变成 F ( x ) + x F(x)+x F(x)+x。尽管两种形式都应能渐近地逼近所需函数(如假设那样),但学习的难易程度不同。
在这里插入图片描述
在这里插入图片描述

译文:
通过捷径方式实现恒等映射
我们对每一个堆叠层都采用残差学习。一个构建块如图2所示(上方的残差结构图)。在本文中,我们正式地考虑一个构建块,定义为:
y = F ( x , { W i } ) + x y=F(x,\{W_i\})+x y=F(x,{Wi})+x
这里 x x x y y y是所考虑的各层的输入和输出向量。函数 F ( x , { W i } ) F(x,\{Wi\}) F(x,{Wi})表示要学习的残差映射,对于图2中具有两层的示例,在 F = W 2 σ ( W 1 x ) F=W_2\sigma(W_1x) F=W2σ(W1x)公式中, σ \sigma σ表示 R e l u Relu Relu,并且为了简化符号省略了偏置。
操作 F + x F+x F+x通过一个捷径连接和逐元素加法执行。加法执行后我们次啊用了第二次非线性 σ ( y ) \sigma(y) σ(y)(即使用了 R e l u Relu Relu
公式 y = F ( x , { W i } ) + x y=F(x,\{W_i\})+x y=F(x,{Wi})+x中的捷径连接既没有引入额外的参数,也没有引入计算复杂性。这不仅在实践中具有吸引力而且在我们比较普通网络和残差网络也很重要。
我们可以公平地比较同时拥有相同参数数量、深度、宽度和计算成本(除了可以忽略的逐元素加法)的普通网络或残差网络
在这里插入图片描述
残差结构的其中一个块结构

译文:
x x x F F F的维度在公式 y = F ( x , { W i } ) + x y=F(x,\{W_i\})+x y=F(x,{Wi})+x中必须相等。如果表示这种情况(例如,在修改输入/输出通道数时),我们可以通过捷径连接执行线性投影 W s W_s Ws以匹配维度(如上图的捷径连接,使用1x1x64的卷积核,卷积核数为128,对输入56x56x64进行线性投影 W s W_s Ws得到28x28x128)
y = F ( x , { W i } ) + W s x y=F(x,\{W_i\})+W_sx y=F(x,{Wi})+Wsx
我们还可以在公式 y = F ( x , { W i } ) + x y=F(x,\{W_i\})+x y=F(x,{Wi})+x中使用一个平方矩阵 W s W_s Ws。但是我们将通过实验证明恒等映射足以解决退化问题并且很经济,因此 W s W_s Ws仅在匹配维度时使用。(参考ResNet的整个网络结构可知,虚线的捷径连接即需要 W s W_s Ws来匹配维度的捷径连接)
残差函数 F F F的形式灵活。本文的实验涉及一个具有两层或3层的函数 F F F,然而也可能有更多层。但是如果 F F F仅有一层,那么公式 y = F ( x , { W i } ) + x y=F(x,\{W_i\})+x y=F(x,{Wi})+x类似于一个线性层: y = W 1 + x y=W_1+x y=W1+x,对此我们没有观察到优势。
我们还注意到,尽管为了简化起见,上述符号是关于全连接层的,但是这些符号适用于卷积层。
函数 F ( x , { W i } ) F(x,\{W_i\}) F(x,{Wi})可以表示多个卷积层。在两个特征图上逐个通道地执行逐元素加法。

2015年残差网络的结构基本翻译完毕

2016年残差网络结构的翻译

看了一遍,相比2015年更多的是改进,翻译待更。

残差结构的理解

恒等映射

恒等映射亦称恒等函数,对任何元素,象于原象相同的映射。对于映射 f f f,若它的定义域A和值域B相等,并对所有的 a ∈ A a \in A aA均有 f ( a ) = a f(a)=a f(a)=a时,则称 f f f为恒等映射

在阅读了何凯明2016年ResNet的论文后,发现恒等捷径连接恒等映射-加法后的激活对信息传播的流畅度至关重要。目前本文讨论的都是简单结构的恒等映射,预激活模型的残差结构实际能得到更好的训练结果,文中解决了以往网络过大过拟合的问题,通过对恒等捷径连接结构的实验,以及残差结构中激活后结构和预激活结构实验结果比较得出预激活结果不容易过拟合,并且恒等捷径连接中,越“干净”信息传播越流畅。

2016论文关于残差结构的实验

在这里插入图片描述
在这里插入图片描述

  1. BN after addition: BN层改变了经过捷径的信号,阻碍了信息的传播,反映在训练开始时很难减少训练损失(图6左图)
  2. ReLU before addition: 这种残差结构中的 F F F里面的最后一步经过Relu之后是非负的,直观地说,残差函数的值应该是 ( − ∞ , + ∞ ) (-\infty,+\infty) (+)内。这样的结果导致正向传播的信号是单调递增的,可能会影响表征能力。

在这里插入图片描述
在这里插入图片描述
减少过度拟合。使用建议的预激活单元的另一个影响是正规化,如图6(右)所示。预激活版本在收敛时训练损失略高,但测试误差较低。在CIF AR-10和100的ResNet-110、ResNet-110(1层)和ResNet-164上都可以观察到这种现象。这大概是BN的正则化效应[8]引起的。在原始残差单元(图4(a))中,尽管BN对信号进行归一化处理,但这很快被添加到捷径中,因此合并后的信号没有归一化。这个未归一化的信号然后被用作下一个权值层的输入。相反,在我们的预激活版本中,所有权值层的输入都已被规范化。

经过实验得到最好结果的残差结构为:
在这里插入图片描述

捷径连接的实验部分

何凯明除了上述对残差块的设计进行了实验,也对捷径连接的结构进行了实验
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 1×1 convolutional shortcut: 这个结构在34层的ResNet(16个残差单元)进行了研究,并显示了良好的结果,但发现在残差单元比较多的时候,情况就不一样了,比如这里对110层的ResNet效果较差,(ResNet110的残差单元为54),后面作者的讨论指出,门控制和1X1卷积的捷径连接引入了更多的参数,并且应该比恒等捷径连接具有更强的表示能力,作者也证明了仅限门的捷径和1X1的卷积捷径连接覆盖了恒等捷径连接的解空间(即,它可以被优化为恒等捷径连接)。但是它们的训练误差要高于恒等捷径连接,这说明这些模型的退化问题是由优化问题引起的,而不是表征能力。(这里提到优化问题,优化问题通常指:如何初始化参数、预处理数据、如何避免陷入局部最优?(学习率衰减+梯度方向优化))
  2. Dropout shortcut: 最后我们实验了dropout(以0.5的比率),这是我们在恒等捷径连接的输出上采用的(图2(f))。这个网络不能收敛到一个好的解。Dropout统计上在捷径上强加了一个λ的尺度,期望为0.5,并且类似于常数缩放0.5,它阻碍了信号传播。

其他结构的讨论个人觉得不是特别关注,有兴趣请看论文

残差结构的比较

在这里插入图片描述
上图左边部分为原始卷积堆叠结构,右边部分为残差结构。
首先分析原始卷积堆叠结构:

我们要将要求解的堆叠层参数抽象为 H ( x ) = F ( x ) H(x)=F(x) H(x)=F(x)函数,假设网络结构达到某一个深度时,网络达到最优状态,堆叠层的参数已经达到最优,即 H ( x ) = F ( x ) H(x)=F(x) H(x)=F(x)达到最优,这时再加深网络会导致退化问题。这是因为如果我们加深网络,要更新网络中各层的权值时需要让各层的网络都达到最优状态才行,各层的网络之间会相互牵制,个人理解是,一层网络的优化目标可能是为了下一层参数的优化,而缺少考虑全局网络的参数,致使网络难以训练。

当我们引入残差结构之后。
分析残差结构:

假设在残差结构下网络在某一深度训练达到了最优状态,如果增加我们网络的深度,为了保证下一层的网络参数仍然最优,那么下一层的优化目标是 H ( x ) = F ( x ) + x − > x H(x)=F(x)+x->x H(x)=F(x)+x>x,即优化下一层的堆叠层 F ( x ) − > 0 F(x)->0 F(x)>0
举个例子比喻:假设 h 1 h_1 h1深度的残差网络的堆叠层 F ( x ) F(x) F(x)当前训练到最佳0.5,现在加深网络深度至 h 2 h_2 h2,残差网络的下一个堆叠层 F ‘ ( x ) F^`(x) F(x)的训练目标是在尽量保持上一层堆叠层最优的同时,尽量优化最终解, F ( x ) − > 0 F(x)->0 F(x)>0尽可能保持上一层最优,同时也以微微逼近0的数值提高下一层的解

更深入的理解(基于2015ResNet及2016ResNet):

F是求和前网络映射,H是从输入到求和后的网络映射。比如把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的输入时X,而不是X/2或是其他形式。kaiming大神的另一篇文章[2]中探讨了这个问题,对以下6种结构的残差结构进行实验比较,shortcut是X/2的就是第二种,结果发现还是第一种效果好啊(摊手)
在这里插入图片描述
这种残差学习结构可以通过前向神经网络+shortcut连接实现,如结构图所示。而且shortcut连接相当于简单执行了同等映射,不会产生额外的参数,也不会增加计算复杂度。 而且,整个网络可以依旧通过端到端的反向传播训练。

上面关于残差结构的分析也算是何凯明团队实验对层响应分析的研究的一个依据,ResNet的响应通常比普通响应小,即残差函数通常可能比非残差函数更接近于零,更深的ResNet具有较小的响应范围(详情移步2015ResNet论文的层响应分析实验)
注意:这里的响应范围小,不是说有的参数不需要得到更新,而是在优化过程中响应范围小,更容易拟合最优解,更容易训练网络,权重参数的更新次数少了。
这里参考自:残差网络ResNet笔记

ResNet解决的问题

深度卷积网络逐层整合不同层级的特征,伴随着模型前向推演,模型获得了更加抽象、更多层级、更加丰富的图像特征,进而获得了更好的模型性能,因此我们会倾向于使用更深层次的网络结构

低层级特征拥有更多的细节信息,高层级特征更加抽象,能够更好的表达图像局部或者整体的意义。

论文作者经过实验证明,很深的网络一般有两个问题:

  1. 在很深的网络层,参数初始化一般更接近0,这样在训练过程中通过反向传播更新浅层网络的参数时,很容易随着网络的深入而导致梯度小时,浅层的参数无法更新。(由反向传播递推式可知,小数的累乘次数会越来越多)
  2. 当网络达到一定深度后,模型性能会暂时陷入一个瓶颈很难增加,当网络继续加深,模型在测试集的性能会下降,这就是网络退化。

在这里插入图片描述
造成上图这种现象的原因有: (1) 过拟合(2)梯度消失/梯度爆炸 (3)网络退化

论文作者分析(1)和(2)都不可能
过拟合是过多的拟合了训练集,因此在训练集上效果好,而在测试集上效果差,但是通过实验发现,无论是训练误差还是测试误差都下降了,只是下降幅度不一样。这说明不是过拟合的问题,而是更深的网络没有被训练好,其原因是后面的多层非线性网络无法通过训练去逼近恒等映射网络。(参考何凯明在2016年发表了Identity Mappings in Deep Residual Networks,深度残差网络中的恒等映射)

论文作者说普通网络的梯度消失/梯度爆炸现象在经过Batch Normalization(BN)解决了。莫烦-什么是批标准化 (Batch Normalization)

引入ResNet结构后,前向传播的抽象映射变成了 y = F ( x ) + x y=F(x)+x y=F(x)+x

在引入ResNet之前,如果我们想要使得深度网络不出现退化问题,核心是要让较深的网络学习到的参数满足 y = x y=x y=x,但是实验发现,想要让神经网络学习满足 y = x y=x y=x这一类恒等映射时比较困难

因此,ResNet想到避免去学习参数满足恒等映射,转而将前向传播修改成 y = f(x) + x 。我们发现,想让当前神经网络层学习到恒等映射,只需要让残差函数f(x) = 0,而学习f(x) = 0 比直接学习 y = x 要简单多。至于为何简单,如下解释。

网络退化的解决

假设该层是冗余的,在引入ResNet之前,我们想让该层学习到的参数能够满足h(x)=x,即输入是x,经过该冗余层后,输出仍然为x。但是可以看见,要想学习h(x)=x恒等映射时的这层参数时比较困难的。ResNet想到避免去学习该层恒等映射的参数,使用了如上图的结构,让h(x)=F(x)+x;这里的F(x)我们称作残差项,我们发现,要想让该冗余层能够恒等映射,我们只需要学习F(x)=0。学习F(x)=0比学习h(x)=x要简单,因为一般每层网络中的参数初始化偏向于0,这样在相比于更新该网络层的参数来学习h(x)=x,该冗余层学习F(x)=0的更新参数能够更快收敛,如图所示:

在这里插入图片描述

假设该曾网络只经过线性变换,没有bias也没有激活函数。我们发现因为随机初始化权重一般偏向于0,那么经过该网络的输出值为[0.6 0.6],很明显会更接近与[0 0],而不是[2 1],相比与学习h(x)=x,模型要更快到学习F(x)=0。
并且ReLU能够将负数激活为0,过滤了负数的线性变化,也能够更快的使得F(x)=0。这样当网络自己决定哪些网络层为冗余层时,使用ResNet的网络很大程度上解决了学习恒等映射的问题,用学习残差F(x)=0更新该冗余层的参数来代替学习h(x)=x更新冗余层的参数。
这样当网络自行决定了哪些层为冗余层后,通过学习残差F(x)=0来让该层网络恒等映射上一层的输入,使得有了这些冗余层的网络效果与没有这些冗余层的网络效果相同,这样很大程度上解决了网络的退化问题。

梯度消失或梯度爆炸问题的解决

该节引用自十分钟一起学会ResNet残差网络

我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新。在这里插入图片描述
可以看到,假设现在需要更新b1,w2,w3,w4参数因为随机初始化偏向于0,通过链式求导我们会发现,w1w2w3相乘会得到更加接近于0的数,那么所求的这个b1的梯度就接近于0,也就产生了梯度消失的现象。

ResNet最终更新某一个节点的参数时,由于h(x)=F(x)+x,由于链式求导后的结果如下图所示,不管括号内右边部分的求导参数有多小,因为左边的1的存在,并且将原来的链式求导中的连乘变成了连加状态(正确?),都能保证该节点参数更新不会发生梯度消失或梯度爆炸现象。

其实本质上,我这么看,那个连加式并不太能体现权值连乘减少带来的优化,实际上,是由于引入了shortcut这个结构导致残差F的值不会太大(博文中间有解释),所以导致F的偏导不会太大,结合连加梯度式,这个很大可能是导致梯度不会爆炸的原因。

在这里插入图片描述

2015ResNet还存在的问题

何凯明在ResNet1202层网络训练时的效果比ResNet101的效果还差,作者认为这是由于过度拟合训练集,数据集对于1202层网络可能来说太小了,应用强正则化(例如maxout,dropout)在此数据集上可以获得最佳的效果。但在2015的ResNet论文只是通过设计深度和精简架构强加正则化,而不会分散对优化困难的关注力。但是结合更强的正则化可能会改善结果。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐