真锋
永远保持一颗学习和专注的心
嵌入式视觉笔记

【深度学习】残差网络理解

前言

残差网络 ResNet 是在2015年开始火起来的,之前只是在书上看过它的大名,但是没有深入学习过。最近在参加kaggle竞赛,查资料的过程了解到 ResNet 在图像分类、目标检测等问题中作为 backbone 的效果很不错,所以打算深入学习下。

关于kaggle竞赛流程:Input images -> Pre-processing -> Convolutional Neural Network -> Output Probabilities -> Predictions -> Writing CSV。

ResNet 网络要解决的是什么问题

ResNet 要解决的是深度神经网络的“退化”问题。

2015年之前的 VGGNet 和 GoogLeNet 都显示了网络有足够的深度是模型表现良好的前提,但是在网络达到一定深度之后,简单的网络堆叠反而效果变差了。随着网络层数的增加,深度网络一般会越难训练,有些网络在开始收敛的时候,还可能会出现退化问题,导致准确率很快达到饱和。甚至会出现层次越深,错误率反而越高的现象。

误差升高的原因是网络越深,梯度消失和梯度爆炸的现象就越明显,所以在后向传播的时候,无法有效的把梯度更新到前面的网络层,靠前的网络层参数无法更新,导致训练和测试效果变差。所以 ResNet 面临的问题是怎样在增加网络深度的情况下有可以有效解决梯度消失的问题。

ResNet 中解决深层网络梯度消失的问题的核心结构是残差块结构。残差块(Residual Block)结构、两种不同残差路径的残差块结构以及残差网络架构如下图1所示:

“残差网络”的图片搜索结果
图1:残差网络

ResNet 提出了两种 mapping(映射):一种是 identity mapping,指的就是上图中”弯弯的曲线”,另一种 residual mapping,指的就是除了”弯弯的曲线“那部分,所以最后的输出就是:y = H(x) = F(x) + x。

残差网络增加的 identity mapping(恒等映射),就是把当前输出直接传输给下一层网络(全部是1:1传输,不增加额外的参数),相当于走了一个捷径,跳过了本层运算,这个直接连接命名为 “skip connection”,同时在后向传播过程中,也是将下一层网络的梯度直接传递给上一层网络,这样就解决了深层网络的梯度消失问题。

Residual Block的设计

ResNet(残差网络)为多个 残差块(Residual Block) 的串联,多个相似的残差块串联就构成了 ResNet。 残差块(Residual Block)的结构,如图 2 所示,一个残差块有 2 条路径 F(x) 和 x,F(x) 路径拟合残差H(x)-x,可称为残差路径,x 路径为恒等映射(identity mapping),称其为”shortcut”。图中的 ⊕ 为逐元素相加(element-wise addition),要求参与运算的 F(x) 和 x 的尺寸要相同。因此,随之而来的三个问题是:

1,残差路径如何设计?
2,shortcut路径如何设计?
3,Residual Block之间怎么连接?

图2:Residual Block结构图

1,在ResNet 原论文中,残差路径可以大致分成2种残差路径的设计可以分成 2 种,一种没有 bottleneck 结构,如下图左所示,称之为 “basic block” ,由 2 个 3×3 卷积层构成。另一种有 bottleneck 结构,称之为 “bottleneck block” ,对于每个残差函数 F,使用 3 层堆叠而不是 2 层,3 层是 1×1,3×3 和 1×1 卷积。其中 1×1卷积层负责减小然后增加(恢复)维度,使 3×3 层成为具有较小输入/输出维度的瓶颈。有 bottleneck 结构的残差块可以减少训练时间,因此对于50层以上的残差网络都使用了 bottleneck block 的残差块。

(a)basic block的残差结构           (b)bottleneck block的残差结构
图3:两种不同的残差路径的残差块结构图

2,shortcut 路径大致也分成 2 种,一种是将输入 x 直接输出,另一种则需要经过1×1 卷积来升维或降采样,其是为了将 shortcut 输出与 F(x) 路径的输出保持形状一致,但是其对网络性能的提升并不明显,两种结构如图 3 所示。

图4 两种不同的shortcut路径

3,Residual Block(残差块)之间的衔接,在原论文中,F(x)+x 经过 ReLU 后直接作为下一个 block 的输入 x

ResNet 网络架构

ResNet 简单网络的基准主要受到 VGG 网络的哲学启发。卷积层的设计主要有 3×3 的滤波器,并遵循两个简单的设计规则:

(i)对于相同的输出特征图尺寸,层具有相同数量的滤波器
(ii)如果特征图尺寸减半,则滤波器数量加倍,以便保持每层的时间复杂度。通过步长为2的卷积层直接执行下采样。网络以全局平均池化层和具有softmax的1000维全连接层结束。下图(中间)的加权层总数为34。

ImageNet的网络架构例子。左:作为参考的VGG-19模型40。中:具有34个参数层的简单网络(36亿FLOPs)。右:具有34个参数层的残差网络(36亿FLOPs)。虚线的快捷连接增加了网络维度。

用于 ImageNet 分类的模型可使用不同层数的 ResNet 架构。根据网络层数的不同,ResNet 已经衍生出多种结构形式,有 Resnet-34,Resnet-50, Resnet-101, Resnet-152,其架构参数表如表1所示。

“resnet50”的图片搜索结果
表1:ResNet架构参数表。

以 ResNet18 结构为例分析 ResNet 架构,ResNet18网络具体参数如表 2 所示。

表2:ResNet18网络具体参数表

残差块 block 显示在括号中,以及残差块的堆叠数量。特征图的下采样是通过步长为2的conv3_1, conv4_1和conv5_1执行。

假设图像输入尺寸为 1024×2048,ResNet 共有五个阶段,其中第一阶段为一个7×7 的卷积处理,stride 为 2,然后经过池化层处理,此时特征图的尺寸已成为输入的 1/4,即输出尺寸为 512×1024,接下来是四个阶段,也就是表格中的四个layer:conv2_x、conv3_x、conv4_x、conv5_x,后面三个都会降低特征图尺寸为原来的 1/2,特征图的下采样是通过步长为 2 的 conv3_1, conv4_1 和 conv5_1 执行。最后输出的 feature_map 尺寸为输入尺寸降采样 32 倍。

在工程代码中用 make_layer 函数产生四个 layer,不同层数的 ResNet 输入给每个 layer 的 残差模块(block)数目不同(即 layers 列表不同)以及采用的 block 类型(基础版还是 bottleneck 版)都不同。ResNet18 其 layers 层中的残差模块数量(即units数量)分别为2、2、2和2。

因为 ResNet18 使用的是 basic block(基础版残差模块),即每个残差模块中只包含了 2 层卷积,故残差模块的总层数为 (2+2+2+2)*2=16 , 再加上第一层的卷积和最后一层的分类,总共是 18 层,所以命名为 ResNet18。

残差网络特点

1, 残差网络在模型表征方面并不存在直接的优势,ResNets并不能更好的表征某一方面的特征,但是ResNets允许逐层深入地表征更多的模型;
2,残差网络使得前馈式/反向传播算法非常顺利进行,在极大程度上,残差网络使得优化较深层模型更为简单 ;
3,“shortcut”快捷连接添加既不产生额外的参数,也不会增加计算的复杂度。快捷连接简单的执行身份映射,并将它们的输出添加到叠加层的输出。通过反向传播的SGD,整个网络仍然可以被训练成终端到端的形式。

残差网络的进一步理解请参考这篇文章,有代码和网络结构分析。

参考资料

赞赏

发表评论

textsms
account_circle
email

嵌入式视觉笔记

【深度学习】残差网络理解
前言 残差网络 ResNet 是在2015年开始火起来的,之前只是在书上看过它的大名,但是没有深入学习过。最近在参加kaggle竞赛,查资料的过程了解到 ResNet 在图像分类、目标检测等问题中作…
扫描二维码继续阅读
2018-11-21