无处不在的残差网络 (Residual Nets Family)

Date: 2020/02/28

Author: CW

前言:

残差网络(ResNet)绝对算得上是深度学习模型中的网红,哦不,应该是名流了,自从2015年它在ImageNet比赛的分类任务中拿下冠军后便一炮而红,而且至今“久盛不衰”,几乎各类视觉任务都能见到它的身影。

这时候大伙就难免有疑问了——这货凭啥这么红这么火啊?真有那么6吗?

CW刚开始也有这样的疑问,于是下功夫研究了一番,发现这货的残差结构确实简单好使,解决了深度学习历程中的一个重大难题(若这个问题没解决,可能深度学习就不能那么深了),而且还方便集成的各种其它网络模型中,同时没有额外增加多少参数量。

由于这货好使,因此很抢手,许多炼丹者们对它进行了五花八门的改造,玩出各种花样,小有名气的有使用分组卷积(Group Convolution)的 ResNeXt 以及加入了空间注意力(Channel Attention)机制的 SE-ResNet 和 SE-ResNeXt,另外还有加入混合注意力(Spacial & Channel Attention)机制的 Residual Attention Net 等一批想混出名堂的年轻人,CW也都“查了它们的身份证”,对它们进行了学习,为了加深印象,基于pytorch框架对这些模型都手撸了一遍,并且测试能跑通,也进行了训练,感兴趣的朋友们可以私聊我分享一波。

注意到本文标题没?带了个'family',意义很明确,即本文接下来介绍的这批网络模型和 ResNet 都是一个家族的,它们都对原生的残差网络进行了改造,以针对性更好地解决不同类型的任务。当然,文章首先会对大咖  ResNet 进行介绍,其中若有不妥之处欢迎各路高手反馈与指点,感恩!

2020/05/05 更新:

Residual Nets Family 新增一位王者——ResNeSt!被誉为目前最强的 ResNet 改进版,有兴趣了解的朋友们可阅读 CW 的这篇文:你的 ResNet 是时候更新了 —— ResNeSt 来也!


Outline

i). 残差家族的宗师 —— ResNet

ii). 进化 —— ResNetv2

iii). 分工合作 —— ResNeXt

iv). 做事需有“轻重之分” —— SE-ResNet & SE-ResNeXt

v). 更强大、更细致、更专一 —— Residual Attention Net


残差家族的宗师 —— ResNet

Paper: Deep Residual Learning for Image Recognition

谈到深度学习,这个“深”可是很有代表性意义的,更深的网络通常能学习到更丰富的特征,深度神经网络在许多图像任务上取得了一系列的突破,这些现象都表明了网络深度的重要性。

这么说来,更深的网络应该比浅的网络表现好,但实验发现,网络加深了,准确率却下降了,或许大家都下意识地认为可能是梯度消失/爆炸或过拟合造成的,然而并非这样。

浅层网络 vs 深层网络

由上图可以知道,深层网络在训练集上的表现并不如浅层网络,因此这不是过拟合造成的。那么看来是梯度消失/爆炸咯?对不起,让你失望了,也不是!这个小case早已通过各种权重初始化(最常用的有 XavierKaming 初始化)和 中间层归一化(如 Batch Normalization,想要更多的了解可以看看CW的这篇文 来,让你get到 Batch Normalization 的精髓!)方法很大程度上解决了,不然几十层的网络在反向传播时早就玩不下去了(无法收敛)。

那到底是为啥呢?其实说来也有点“玄”。网络更深,层数更多,需要训练的东西也就更多,各层的参数和数据在训练过程中需要相互协同,即各层参数会基于输入数据产生输出,通过反向传播计算误差进行更新,输入输出分布在经过各层处理后分布可能改变,而各层的输入是前一轮的输出,这意味着下一轮前向反馈过程中各层的输入数据分布可能改变,于是这一轮拟合好的参数在下一轮反向传播时更新的“方向”(这一轮叫你去北极,下一轮却改口叫你去南极...)可能发生改变,训练难度更大,因此一昧地加深网络反而导致了退化。

这就成了一个优化问题,既然网络加深了,那么至少也得不差于浅层网络吧,不然多尴尬呀,于是ResNet 拿出了它的大招——残差学习,构造一个表现至少与对应的浅层模型相当的深层模型来进行学习,具体说来,是这样:

假如浅层的输出是x,经过深层后,输出为H(x),通常来说其它网络模型的做法是训练拟合H(x),但是 ResNet 比较有个性,它把H(x)看作两部分,即H(x) = x + F(x),然后再训练拟合这两部分。你可能会说,这不是多此一举吗,搞毛线?你别看这操作简单,但在优化层面上可是有实质性不同的,假如x已是最优,那么f(x)在训练过程中将被push趋近于0,这样,继续加深网络的话,网络也一直处于最优状态而不输于浅层网络了。在这里,F(x) = H(x) - x 被称为“残差映射”(residual mapping),而 x 则称为 恒等映射(identity mapping)。

残差学习模块

上图中的曲线连接称作 shortcut connections(捷径连接),简称shortcut,通常仅执行恒等映射,这种情况下,既没有额外参数,也不增加计算的复杂性;另一种情况就是x经过中间各层后产生的F(x)的通道数与x不一致,此时的shortcut通常会包含卷积层将x的通道数映射到与F(x)一致,使得两者可进行加和(当然,它们的尺度也得一致)。

ResNet 中的残差学习模块有两种形式,如下左图的形式称作 buliding block,用于层数较少的模型,右图的形式称作bottleneck,降低参数数目(想一探究竟的朋友们可以自行了解下1x1卷积降低参数的原因),减少计算量,使得模型能进一步加深。

residual learning modle: building block & bottleneck

一起来看看使用了不同层数的 ResNet 结构,如下图,其中 ResNet18 和 ResNet34 用的是building block,而ResNet50、ResNet101和ResNet152用的是 bottleneck,这些家伙里面“最爱抛头露面”的是 ResNet50 和 ResNet101。

最后提一点,这里ResNet的名称比如ResNet101并不是指其有101层,101指的仅仅是卷积层和全连接层的数目,诸如池化层、归一化层和激活层等这些家伙(内心独白:我们就不配拥有地位吗!?)并没有算进去,计算一下便可知:101 = 1 + (3 + 4 + 23 + 3) x 3 + 1,首尾的两个1分别对应开头的 conv1 和末尾的 fc,中间是 conv2_x,conv3_x,conv4_x 和 conv5_x 总共的卷积层数目。

ResNet的各种结构

进化 —— ResNetv2 vs ResNet

Paper: Identity Mappings in Deep Residual Networks

ResNet 是一个很有个性的家伙,2015年成名后,它进行了一年的修炼,对自己最为得意的残差结构进行了各种魔改,然后进行实验,根据实验结果选取最优秀的那个,最终于2016年进化成ResNetv2。

ResNet “修炼过程全纪录”

在学习过程中,相比结果,过程才是最重要的,这才是成长的时刻。因此先抛开结果不谈,一起来看看上图中的各种残差模块,你知道哪个是 ResNet 最开始用的么,你认为各种结构的合理/不合理性哪里?

一眼看去,貌似中间的(3)很合理,残差中使用的是 weight(也就是卷积Conv)->BN->ReLU,属于我们的常规操作,但是你仔细想想,由于最后是ReLU,这样残差中出来的结果就是非负的,经过多次的前向反馈后x_{l+1} 可能会单调递增,影响网络的表征能力,因此我们希望残差出来后的结果分布均匀

OK,明白了,那试着把(3)中残差里最后的 BN+ReLU 移到恒等映射和残差加和之后像(2)一样呢?这样的话其实相当于抵消残差学习的作用了,把 H(x) = x + F(x) 变成了 H(x) = G(x + F(x)),实质上就是拟合一个 G(x') 了,和 H(x) 本质无异。

更具体地来说明下,在 ResNet 里,x_{l+1} = x_{l} + F(x_{l} ),通过递归计算,对于深层的第L(L > l)层,x_{L} = x_{l} + \sum_{i=l}^{L-1}F(x_{i} )   ,相应地,反向传播为:

\frac{\vartheta loss}{\vartheta x_{l} } = \frac{\vartheta loss}{\vartheta x_{ L} } \cdot \frac{{\vartheta x_{ L } } }{{\vartheta x_{l} } } = \frac{\vartheta loss}{\vartheta x_{ L} } (1 + \frac{\vartheta \sum_{i=l}^{L-1} F(x_{i} )}{\vartheta  x_{l} })

以上这个式子揭示了重要信息:

1). 深层x_{L} 的梯度得以传递回浅层x_{l}

2). x_{l} 的梯度不会轻易消失,由以上化简结果可知,括号内右边通常不会持续输出-1

因此,要达到以上效果,我们得尽量保持x_{l} 为恒等映射以及不要改变 addition 之后的分布

这么一来,就剩下(1)、(4)和(5)了。

先看(1),addition 之后是 ReLU,没有参数,反向传播推导出来与上式一样,残差中是 Conv + BN + ReLU,常规操作,并且最后没有ReLU,没毛病,ResNet中用到的就是它。

(4)和(5)呢?貌似看不出所以然,光看无用,要用实践证明。ResNet 在修炼过程中通过实验发现,(4)和(1)效果差不多,而(5)表现最好,可能是把 BN 放在残差的最开始起到了正则化的作用。(5)这种结构也称作 Pre-Activation,意思是激活层放在卷积层前面,如 BN -> ReLU -> Conv,相对地,常规操作是 Conv -> BN -> ReLU,称作 Post-Activation

最终,ResNet 采用了(5)这种新型残差模块,进化为ResNetv2。

ResNetv1 vs ResNetv2

分组合作 —— ResNeXt

Paper: Aggregated Residual Transformations for Deep Neural Networks

ResNet 的结构是堆叠式的,即一层层模块串行堆叠,借鉴了VGG的做法,而 GoogleNet 和 Inception 等流派通过实验证明,在设计网络时使用 split->transform->merge 的策略能取得很好的效果,于是 ResNeXt 将两者的思想融合到一起,作为“集大成者”于2017年出道。

ResNet vs ResNeXt

ResNeXt 提到一个概念——Cardinality(简写C),称为自由度,paper原文的解释是变换集的数目(the size of the set of transformations),ResNeXt 的名称也源于此,'X' 指的是 neXt dimension。

如上图右边是 ResNeXt 的 block,其中C=32,将原输入分成(split)32个分支进行卷积变换(transform)后合成(merge)到一起,最后再加上shortcut构成残差模块。注意这32个分支的结构是一样的,这样就不需要对每个分支都设计对应的深度以及卷积核的超参,从而避免网络加深时超参迅速膨胀。另外,每个分支先把输入通道数(上图是256d)压缩到 xd(上图是4d),经transform后在merge前再恢复至原来的通道数,使用类似上图右边这样形式的 block 的 ResNeXt 称作 ResNext32x4d,即将输入分成32组,每组通道数压缩至4。

为了保持与ResNet相当的参数量(而不额外增加),可以利用如下公式计算C和d,拿上图举例:

 C\cdot (256\cdot d + 3\cdot 3\cdot d\cdot d + d\cdot 256) = 256\cdot 64 + 3\cdot 3\cdot 64\cdot 64 + 64\cdot 256

之所以说 ResNeXt 是集大成者,原因在于其不仅局限于上图这一种形式,它利用堆叠和split-transform-merge的思想可产生许多变形结构,可玩性很高。

ResNeXt 的各种block

(a)是 ResNeXt 使用的原始形式,(b)是 类似于GoogleNet 和 Inception-ResNet 的等效形式,(c)是使用了分组卷积(Group Convolution)的等价形式,通过实验证明,(c)性能最好(速度最快),而且结构最为简单,相比于 ResNet 几乎不需做太多改造,主要是将bottleneck 中间那一层3x3卷积层改为使用分组卷积,通常 ResNeXt 多使用的是(c)。


做事需有“轻重之分” —— SE-ResNet & SE-ResNeXt

Paper: Squeeze-and-Excitation Networks (此处是 SENet 的paper)

自从2017-2018年期间不知哪位在业界喊了声“注意力大法好”之后,深度学习领域的许多工作都转向基于注意力(Attention)机制去研究,SE-ResNet 和 SE-ResNeXt 就是把 SENet(Squeeze-And-Exitation Networks)那套给搬过来。另外,这里的注意力指的是通道注意力(Channel-Wise Attention),即每个通道的 feature map 都分配不同的权重,但同一个通道的各像素权重是相同的。

Squeeze & Exitation

简单说下这里通道注意力是怎么生成的,如其名,主要分为两部分:

1). Squeeze:把 feature map 的 空间维度(H x W)压缩至 1 x 1,可通过全局(平均/最大)池化完成;

2). Exitation:通过一系列 FC(Fully Connected Layer)和 ReLU 并最终通过 Sigmoid 学到每个通道的注意力因子(系数),可理解为权重系数,通常第一个 FC 会将通道数压缩,以减少计算量。

Exitation

最终将各通道的注意力系数与对应通道的 feature map 相乘便万事大吉。

在 SE-ResNet 与 SE-ResNeXt 中,SE block 用在 残差分支后,其中 SE-ResNet 的如下所示。

SE-ResNet Module

更强大、更细致、更专一 —— Residual Attention Net

Paper: Residual Attention Network for Image Classification

上一节谈到的 SE-ResNet 和 SE-ResNeXt 可能会让你觉得并无创新点,那么本节介绍的这家伙—— Residual Attention Net (后文简称 Res-Atn-Net 吧,名字太长了...)就比较有意思了,它的结构主要分为两部分,包括 主干(Trunk)软掩膜分支(Soft Mask Branch),主干是残差操作,软掩膜用于生成注意力因子,然后与主干的输出相乘,接着,采用了残差学习的思想把主干的输出与结合了注意力的结果相加(相当于这里把主干的输出看作是恒等映射x,而软掩膜输出与主干输出相乘的结果看作是残差映射F(x)),最终构成这样的一个个注意力模块,堆叠起来。记主干的输出为T(x),软掩膜分支的输出为M(x),那么整个注意力模块的输出为:

T(x) + T(x)\cdot M(x) = (1 + M(x))\cdot T(x)

Res-Atn-Net 结构

1、Trunk(主干)

Res-Atn-Net 采用 Pre-Activation 形式的 ResNeXt 的 bottleneck,把它们堆叠起来构成 Trunk。

2、Soft Mask(软掩膜)

Soft Mask 包含 快速前馈扫描(fast feed-forward sweep)自上而下反馈(top-down feedback)步骤。前者用作快速收集图像的全局信息,后者用于将全局信息与原始特征图相结合。具体来说,类似于 FCN(Fully-Convolutional Network)的操作,先对输入执行几次池化以快速增加感受野,达到最低分辨率后,通过一个对称的网络结构使用插值将特征放大回去,然后接2个1×1卷积层,最后通过sigmoid层将输出归一化到 [0, 1] 区间 。

另外,在下采样和上采样之间还添加了跳跃连接(skip connections),以融合不同比例 feature map 的特征信息。

3、Mix Attention (空间注意力 + 通道注意力)

这里的注意力“更细致、更专一”,不像上一节的 SE-ResNet 和 SE-ResNeXt 只使用通道注意力,而是把空间注意力也结合上了,即不仅仅每个通道的 feature map 的注意力系数不同,而且同一通道内每个像素的注意力系数也都不同。作者通过实验发现,与单纯地使用空间注意力和通道注意力相比,这种混合注意力机制的效果最好,操作起来也简单,直接对每个位置的像素点使用 Sigmoid:

f(x_{i,c} ) = \frac{1}{1 + {exp}^{-x_{i,c} } }

4、Attention Residual Learning (注意力残差学习)

通过实验发现,单纯地叠加注意力模块会导致模型性能的下降,原因主要是 Soft Mask 的输出在 [0, 1] 区间,与 Trunk 输出相乘后会使得输出响应变弱,多层叠加的话容易使得最终输出的特征图每一点的值都变得很小。另外,Soft Mask 也有可能破坏 Trunk 中学到好的特征。于是,Res-Atn-Net 再次用上残差大法,将得到的注意力特征图与主干特征图进行 element-wised add:

其中,M_{i,c} (x) 为 Soft Mask 的输出,T_{i,c} (x)为 Trunk 的输出,前者可作为选择器,使主干输出特征图中的有效特征增强,而噪声被抑制。同时,如果选择器的选择不好,那么相乘的部分可以被push趋向至0,保留主干输出的结果,使得主干不至于被破坏。于是,不断地叠加这样的注意力模块便可以逐渐提升网络的表达能力,也就更“强大”。

另外,Soft Mask 在反向传播中还可起到梯度过滤的作用

结合注意力后反向传播中主干参数的更新

其中 θ 是 Soft Mask Branch 的参数,φ 是 Trunk 的参数,由于 Soft Mask 的输出与 Trunk 的梯度相乘,因此可以减弱由于噪声标签而产生的错误梯度更新 Trunk 参数的程度,使得网络对噪声标签更具鲁棒性

这货的亮点主要包含以上4部分,最后附上 Res-Atn-Net 的整体结构:

Res-Atn-Net 结构图示
Res-Atn-Net 结构

#最后

我觉得世界真的很有意思,许多道理在各个领域都是通用的,像残差学习就告诉了我们不要遗忘历史,要把以往学到的东西保留下来,从历史中汲取经验,看到其不足的同时,去其糟粕而取其精华,这样才能有所创新。


参考:

https://cloud.tencent.com/developer/article/1405301

https://blog.csdn.net/lanran2/article/details/79057994

https://blog.csdn.net/lanran2/article/details/80247515

https://blog.csdn.net/c_chuxin/article/details/82948733

https://www.cnblogs.com/Matrix_Yao/p/9563063.html#resnet-v2-2016-jul

禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容