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
谈到深度学习,这个“深”可是很有代表性意义的,更深的网络通常能学习到更丰富的特征,深度神经网络在许多图像任务上取得了一系列的突破,这些现象都表明了网络深度的重要性。
这么说来,更深的网络应该比浅的网络表现好,但实验发现,网络加深了,准确率却下降了,或许大家都下意识地认为可能是梯度消失/爆炸或过拟合造成的,然而并非这样。
由上图可以知道,深层网络在训练集上的表现并不如浅层网络,因此这不是过拟合造成的。那么看来是梯度消失/爆炸咯?对不起,让你失望了,也不是!这个小case早已通过各种权重初始化(最常用的有 Xavier 和 Kaming 初始化)和 中间层归一化(如 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卷积降低参数的原因),减少计算量,使得模型能进一步加深。
一起来看看使用了不同层数的 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 总共的卷积层数目。
进化 —— ResNetv2 vs ResNet
Paper: Identity Mappings in Deep Residual Networks
ResNet 是一个很有个性的家伙,2015年成名后,它进行了一年的修炼,对自己最为得意的残差结构进行了各种魔改,然后进行实验,根据实验结果选取最优秀的那个,最终于2016年进化成ResNetv2。
在学习过程中,相比结果,过程才是最重要的,这才是成长的时刻。因此先抛开结果不谈,一起来看看上图中的各种残差模块,你知道哪个是 ResNet 最开始用的么,你认为各种结构的合理/不合理性哪里?
一眼看去,貌似中间的(3)很合理,残差中使用的是 weight(也就是卷积Conv)->BN->ReLU,属于我们的常规操作,但是你仔细想想,由于最后是ReLU,这样残差中出来的结果就是非负的,经过多次的前向反馈后可能会单调递增,影响网络的表征能力,因此我们希望残差出来后的结果分布均匀。
OK,明白了,那试着把(3)中残差里最后的 BN+ReLU 移到恒等映射和残差加和之后像(2)一样呢?这样的话其实相当于抵消残差学习的作用了,把 H(x) = x + F(x) 变成了 H(x) = G(x + F(x)),实质上就是拟合一个 G(x') 了,和 H(x) 本质无异。
更具体地来说明下,在 ResNet 里,,通过递归计算,对于深层的第L(L > l)层,,相应地,反向传播为:
以上这个式子揭示了重要信息:
1). 深层的梯度得以传递回浅层;
2). 的梯度不会轻易消失,由以上化简结果可知,括号内右边通常不会持续输出-1
因此,要达到以上效果,我们得尽量保持为恒等映射以及不要改变 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。
分组合作 —— ResNeXt
Paper: Aggregated Residual Transformations for Deep Neural Networks
ResNet 的结构是堆叠式的,即一层层模块串行堆叠,借鉴了VGG的做法,而 GoogleNet 和 Inception 等流派通过实验证明,在设计网络时使用 split->transform->merge 的策略能取得很好的效果,于是 ResNeXt 将两者的思想融合到一起,作为“集大成者”于2017年出道。
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,拿上图举例:
之所以说 ResNeXt 是集大成者,原因在于其不仅局限于上图这一种形式,它利用堆叠和split-transform-merge的思想可产生许多变形结构,可玩性很高。
(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 都分配不同的权重,但同一个通道的各像素权重是相同的。
简单说下这里通道注意力是怎么生成的,如其名,主要分为两部分:
1). Squeeze:把 feature map 的 空间维度(H x W)压缩至 1 x 1,可通过全局(平均/最大)池化完成;
2). Exitation:通过一系列 FC(Fully Connected Layer)和 ReLU 并最终通过 Sigmoid 学到每个通道的注意力因子(系数),可理解为权重系数,通常第一个 FC 会将通道数压缩,以减少计算量。
最终将各通道的注意力系数与对应通道的 feature map 相乘便万事大吉。
在 SE-ResNet 与 SE-ResNeXt 中,SE block 用在 残差分支后,其中 SE-ResNet 的如下所示。
更强大、更细致、更专一 —— 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)M(x) = (1 + M(x))T(x)
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:
4、Attention Residual Learning (注意力残差学习)
通过实验发现,单纯地叠加注意力模块会导致模型性能的下降,原因主要是 Soft Mask 的输出在 [0, 1] 区间,与 Trunk 输出相乘后会使得输出响应变弱,多层叠加的话容易使得最终输出的特征图每一点的值都变得很小。另外,Soft Mask 也有可能破坏 Trunk 中学到好的特征。于是,Res-Atn-Net 再次用上残差大法,将得到的注意力特征图与主干特征图进行 element-wised add:
其中, 为 Soft Mask 的输出,为 Trunk 的输出,前者可作为选择器,使主干输出特征图中的有效特征增强,而噪声被抑制。同时,如果选择器的选择不好,那么相乘的部分可以被push趋向至0,保留主干输出的结果,使得主干不至于被破坏。于是,不断地叠加这样的注意力模块便可以逐渐提升网络的表达能力,也就更“强大”。
另外,Soft Mask 在反向传播中还可起到梯度过滤的作用:
其中 θ 是 Soft Mask Branch 的参数,φ 是 Trunk 的参数,由于 Soft Mask 的输出与 Trunk 的梯度相乘,因此可以减弱由于噪声标签而产生的错误梯度更新 Trunk 参数的程度,使得网络对噪声标签更具鲁棒性。
这货的亮点主要包含以上4部分,最后附上 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