ResNet笔记整理

目录

  1. Resnet 1.0
    1.1 Resnet1.0原理
    1.2 Residual Learning
    1.3 Resnet实践细节
  2. Resnet 2.0
    2.1 改进
    2.2 Identity Skip Connections
    2.3 the Usage of Activation Functions
    2.4 Resnet2.0实践细节
  3. 对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?

Figure 1. 56-layer vs 20-layer

事情并没有那么简单,作者在多个datadset做实验,验证了一味增加网络层的深度网络无论是训练误差和验证误差都逊于浅层网络。他们指出深度网络训练所面临的挑战:

  1. 梯度弥散/梯度爆炸(vanishing/exploding gradients)
    这个已经基本被normalized initialization和intermeidiate normalization layers解决了。
  2. 退化问题(degradation)

ResNet的提出就是为了解决这些问题,下文会一一验证。

1.1 Resnet1.0原理

Resnet1.0的核心思想
"A deeper model should produce no higher training error than its shallower counterpart."
在深度网络中,一般来讲,层数越深,效果会越好,因为多层网络可以通过非线性映射拟合任何函数,多出来的深层网络可以拟合输入自身,即深层网络表现至少不会比浅层网络差。

Figure 2

解决办法很简单。假设Figure 2中左边的18层网络已经达到饱和的准确率,右边的34层模型要想达到同样的效果,只需要将多余的层(蓝色方框里的)设置为恒等映射层Identity mapping, (即y = x, 输出等于输入 ),这样就增加了网络的深度,并且起码误差不会增加,也即更深的网络不应该带来训练集上误差的上升。

1.2 Residual Learning

  1. 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.
  2. The degradation problem suggests that the solvers might have difficulties in approximating identity mappings by multiple nonlinear layers.

在paper中,不止一次提到,经过多层的非线性运算,神经网络自身很难去拟合identity mapping。所以,他们灵机一动,设置下面的这种带有shortcut的残差网络结构。

Figure 3. Residual learning: a building block.

设,
\mathcal{H}(x) \leftarrow期望得到的网络层输出
x \leftarrow该层的输入
在这种网络结构下,网络所要学的就是残差residual function\mathcal{F}(x) := \mathcal{H}(x)-x(这里假设输入和输出的维度一样)。当\mathcal{F}(x)=0时,那么\mathcal{H}(x)=x,也就是上面所提到的恒等映射。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.在Cifar-10数据集上网络各层响应的方差分布 上图:按照原网络层数排列;下图:按照方差大小排列

通过实验结果Figure 4表明,

  1. 残差网络响应值的标准差普遍小于plain network(响应值response, 指的是每一层经过BN层后的3*3卷积层的输出,在激活函数之前),这意味着,整个神经网络在各层的中间输出的数值更稳定,恒等映射提供了一个令人满意的防止网络衰退的预处理。

  2. 越深的Resnet残差网络,越多层的响应值标准差处在较低水平,很有可能权重近似于零,这也就是说其所对应的残差结构可能近似于恒等映射,网络的实际有效层数是要比全部层数要少一些的,产生了跳过连接(Skip-connection)的作用。

1.3 Resnet实践细节

1.3.1 Identity vs. Projection Shortcuts

对于短路连接,

  1. 输入和输出维度一致时,可以直接将identity(输入)加到网络层输出上,这里的相加是element-wise的,相对应的channel之间两两相加。
    y = \mathcal{F}(x,\{ W_i \} )+x
    PS. 这里为了简略省去了biases。

  2. 维度不一致时,不能直接相加,要对输入做一点处理,有两种策略:
    (1)采用zero-padding增加维度
    (2)采用新的映射(projection shortcut),一般使用1x1的卷积,这样会增加参数,也会增加计算量。下面的式子中W_s是linear projection。

y = \mathcal{F}(x,\{W_i\}) + W_s x

需要注意的是,resnet没有直接用max-pooling层,所以以上两种操作都需通过stride=2来实现将feature map尺寸缩小的动作。

Figure 5.Identity vs. Projection Shortcuts.

作者测试了三种方案:
A:进行zero-padding以达到维数统一。
B:仅在几个维数不统一的地方进行projection升维,其他地方还是identity。
C:全部都是projection。

事实上C的效果最好,但是考虑到计算/空间复杂度以及模型的大小,paper后面的测试不使用C方法。

1.3.2 Deeper Bottleneck Architectures

Figure 6. 左边为普通的残差结构,右边为Bottleneck Design

作者考虑到自己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 其他细节

残差网络有这样几个特点:

  1. 网络较瘦,控制了参数数量;
  2. 存在明显层级,特征图个数逐层递进,保证输出特征表达能力;
  3. 使用了较少的池化层,大量使用下采样,提高传播效率;
  4. 没有使用Dropout,利用BN和全局平均池化进行正则化,加快了训练速度;
  5. 层数较高时减少了3x3卷积个数,并用1x1卷积控制了3x3卷积的输入输出特征图数量,称这种结构为“瓶颈(bottleneck)”。

2. Resnet 2.0

Paper-"Identity Mappings in Deep Residual Networks"

Resnet1.0已经大幅度解决了网络退化的问题,但还是存在一个bug。

  1. “The central idea of ResNets is to learn the additive residual function \mathcal{F} with respect to h(x_l), with a key choice of using an identity mapping h(x_l) = x_l
  2. “...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)残差\mathcal{F}得到\mathcal{H}。这违背了Resnet设计的初衷,所以发了这篇paper进行优化。

2.1 改进

y_l = h(x_l) + \mathcal{F}(x_l, \mathcal{W}_l) x_{l+1} = f(y_l)
在1.0里,f是ReLU,h是恒等映射。在2.0版本里,f也变为恒等映射,把上面两个式子结合,不停迭代,就能得出下面公式:
x_L = x_l + \sum_{i=l}^{L-1}\mathcal{F}(x_i, \mathcal{W}_i) L \leftarrow \text{深层的序号}, l\leftarrow \text{浅层的序号}
这个式子两个性质:

  1. 深层特征x_L可直接由浅层特征x_lLl之间的残差\sum_{i=1}^{L-1}\mathcal{F}之和表示。
  2. 与plain network不同,任何一层的网络特征x_L并不是由一系列矩阵向量运算所得,而是由输入简单地叠加上各层残差。

根据这个式子,我们可以得到反向传播公式:
\frac{\partial{\mathcal{E}}}{\partial{x_l}}=\frac{\partial{\mathcal{E}}}{\partial{x_L}}\frac{\partial{x_L}}{\partial{x_l}}=\frac{\partial{\mathcal{E}}}{\partial{x_L}}(1 + \frac{\partial{}}{\partial{x_l}}\sum_{i=l}^{L-1}\mathcal{F}(x_i,\mathcal{W}_i))
这个反向传播公式有两个特点:

  1. x_l的梯度信息只与x_L的梯度值有关系,也就意味着两层之间的梯度信息可以无障碍传递。
  2. \frac{\partial\mathcal{E}}{\partial{x_l}}的值不会轻易抵消因为在一个mini-batch中,很少会遇到\frac{\partial{}}{\partial{x_l}}\sum_{i=l}^{L-1}\mathcal{F}(x_i,\mathcal{W}_i)为-1的情况,这也是Resnet能解决梯度消失的原因。

2.2 Identity Skip Connections

做了几组对比试验,


Figure 7. Shortcut各种变体

Figure 8.Shortcut变体的错误率对比表

反正最后,他们更肯定地认为shortcut这一分支上使用Identity mapping能达到最好的效果。

2.3 the Usage of Activation Functions

接着,他们开始折腾激活函数的位置摆放,对Residual结构开始了各种排列组合...

Figure 9. Residual Block结构变体

(a)这个就是Resnet1.0原始版本
(b)这里BN改变了“identity”分支的分布,影响了信息的传递,在训练的时候会阻碍loss的下降;
(c)Residual分支上得到的结果永远非负,向前传播是只能单调递增,影响网络的表达。一个残差函数的输出范围应该是才对。
(d)把ReLU放到前面去,然而我们得到的结果和(a)差不多,原因是什么呢?因为这个ReLU层不与BN层连接使用,因此无法共享BN所带来的好处。
(e)反向信息传播无阻碍,BN层作为pre-activation起到了正则化的作用。
Figure 10. 各种Residual Block结构对比表

显然,full pre-activation的效果最佳,一般也把这种形式称为Resnet2.0的residual block。

2.4 Resnet2.0实践细节

  1. 在数据经过第一个单独的卷积层后,即将要进入第一个Residual Unit前,先使用一个激活函数处理后,再往下走,如图:

    Figure 11.

  2. 在数据经过最后一个Residual Unit,要进入average pooling层前,再额外使用激活函数进行处理,如图:

    Figure 12.

  3. 对于50层及以上采用Bottleneck Design的深层网络,也要先做pre-activation再做projection。


3. 对Resnet的讨论

3.1 从网络有效路径角度

Figure 13.

我们可以把残差网络单元转换成右图的形式,从右图中可以看出,残差网络其实是由多种路径组合的一个网络,从输入到输出之间我们通过选择是否跳过残差块(F(x)=0)来选择不同的映射。直白了说,残差网络其实是很多并行子网络的组合,整个残差网络其实相当于一个多人投票系统(Ensembling)。

3.1.1 删除网络的的一部分

如果把残差网络理解成一个Ensambling系统,那么网络的一部分就相当于少一些投票的人,如果只是删除一个基本的残差单元,对最后的分类结果应该影响很小;而最后的分类错误率应该适合删除的残差单元的个数成正比的,论文里的结论也印证了这个猜测。


Figure 14.VGG和ResNet分别删除一层网络的分类错误率变化

Figure 15.ResNet分类错误率和删除的基本残差网络单元个数的关系

3.1.2 ResNet的真面目

ResNet的确可以做到很深,但是从上面的介绍可以看出,网络很深的路径其实很少,大部分的网络路径其实都集中在中间的路径长度上,如下图所示:


Figure 16.

从这可以看出其实ResNet是由大多数中度网络和一小部分浅度网络和深度网络组成的,说明虽然表面上ResNet网络很深,但是其实起实际作用的网络层数并没有很深,我们能来进一步阐述这个问题,我们知道网络越深,梯度就越小,如下图所示


Figure 17.

而通过各个路径长度上包含的网络数乘以每个路径的梯度值,我们可以得到ResNet真正起作用的网络是什么样的,如下图所示


Figure 18.

我们可以看出大多数的梯度其实都集中在中间的路径上,论文里称为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在保持梯度相关性方面很优秀(相关性衰减从\frac{1}{2^L}到了\frac{1}{\sqrt{L}})。这一点其实也很好理解,从梯度流来看,有一路梯度是保持原样不动地往回传,这部分的相关性是非常强的。


Reference

  1. K. He, X. Zhang, S. Ren, and J. Sun, “Deep Residual Learning for Image Recognition,” vol. 7, no. 3, pp. 171–180, 2015.
  2. 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.
  3. ResNet之Deeper Bottleneck Architectures
  4. 对ResNet的理解
  5. Deep Residual Network 深度残差网络
  6. 详解深度学习之经典网络架构(六):ResNet 两代(ResNet v1和ResNet v2)
  7. 到底Resnet在解决一个什么问题呢? - 王峰的回答 - 知乎
  8. 【模型解读】resnet中的残差连接,你确定真的看懂了? - 龙鹏-言有三的文章 - 知乎
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268