《动手学深度学习》关于ResNet的笔记
文章目录
一、文章概览
(一)摘要
提出问题: 更深层次的神经网络更难训练。
主要工作: 提出了一个残差学习框架,以简化比以前使用的网络更深的网络训练。
(二)引言
更深层神经网络带来的问题:
- 退化问题:实践中加深网络结构并不总是能够提高性能,甚至会导致性能下降;
- 梯度消失:若每一层的误差梯度小于1,反向传播时,网络越深,梯度越趋近于0;
- 梯度爆炸:若每一层的误差梯度大于1,反向传播时,网络越深,梯度越来越大;
解决办法:
- 1、在初始化的时候做好一点,就是权重在随机初始化的时候,权重不要特别大也不要特别小。
- 2、在中间加入一些normalization,包括BN(batch normalization)可以使得校验每个层之间的那些输出和他的梯度的均值和方差相对来说比较深的网络是可以训练的,避免有一些层特别大,有一些层特别小。
- 使用了这些技术之后是能够训练(能够收敛),虽然现在能够收敛了,但是当网络变深的时候,性能其实是变差的(精度会变差)
(三)相关工作
- 残差表示
- Shortcut Connections
一篇文章要成为经典,不见得一定要提出原创性的东西,很可能就是把之前的一些东西很巧妙的放在一起,能解决一个现在大家比较关心难的问题
二、模型细节
(一)残差学习
残差块中 x i n p u t x_{input} xinput 直接跳过多层加入到最后的输出 F ( x ) o u t p u t 2 F(x)_{output2} F(x)output2单元当中,解决 F ( x ) o u t p u t 1 F(x)_{output1} F(x)output1可能带来的模型退化问题:
- 传统网络: F ( x ) o u t p u t 1 = x i n p u t F(x)_{output1} = x_{input} F(x)output1=xinput
- 残差网络: F ( x ) o u t p u t 2 = F ( x ) o u t p u t 1 + x i n p u t F(x)_{output2} = F(x)_{output1} + x_{input} F(x)output2=F(x)output1+xinput
如果最优函数更接近恒等映射而不是零映射,那么求解器应该更容易参考恒等映射找到扰动,而不是学习该函数作为新函数。
(二)Identity Mapping by Shortcuts
其中 F ( x ) + x F(x) + x F(x)+x的公式可以通过具有“shortcut connections”的前馈神经网络来实现。
- shortcut connection是跳过一层或多层的连接。
- 在ResNet中,shortcut connection只是执行恒等映射(identity mapping),它们的输出被添加到堆叠层的输出中。这样既不会增加额外的参数,也不会增加计算复杂性。整个网络仍然可以通过 SGD 通过反向传播进行端到端训练,并且可以使用通用库(例如 Caffe)轻松实现,而无需修改求解器。
(三)网络架构
ResNet的整体架构与VGG、GoogLeNet较为类似,只是主体部分替换为残差块,大体的网络架构如下图所示:
- 最左侧为VGG-19 模型(196 亿次 FLOP),主要用于作为参考;
- 中间是具有 34 个参数层的普通网络(36 亿次 FLOP);
- 最右侧为具有 34 个参数层的残差网络(36 亿次 FLOP)。
将普通网络插入Shortcut Connections,即变成了对应的残差版本:
-
当输入和输出具有相同维度时,可以直接使用恒等快捷方式(图3中的实线快捷方式),公式表示为:
y = F ( x , { W i } ) + x y=F(x,\{W_i\})+x y=F(x,{Wi})+x -
当维度增加时(上图中的虚线快捷方式),即当输入的形状和输出的形状是不同的情况时,有两种方案:
- 方案一:在输入和输出上分别添加一些额外的0,使得这两个形状能够对应起来然后可以相加
- 方案二:通过 1×1 卷积完成,这个卷积层的特点是在空间维度上不做任何东西,主要是在通道维度上做改变。所以只要选取一个1*1的卷积使得输出通道是输入通道的两倍,这样就能将残差连接的输入和输出进行对比了。在ResNet中,如果把输出通道数翻了两倍,那么输入的高和宽通常都会被减半,所以在做1*1的卷积的时候,同样也会使步幅为2,这样的话使得高宽和通道上都能够匹配上
y = F ( x , { W i } ) + W s x y=F(x,\{W_i\})+W_sx y=F(x,{Wi})+Wsx
1*1卷积核的作用类似于降维升维,更准确的说是改变输入输出通道数
三、实验
(一)实施细节
-
图像预处理:
- 尺度增强:调整大小,短边在 [256, 480] 中随机采样
- 从图像或其水平翻转中随机采样 224×224 裁剪,并减去每个像素的平均值
- 标准颜色增强
-
在每次卷积之后和激活之前采用批量归一化(BN)
-
初始化权重,并从头开始训练所有普通/残差网络。
-
使用小批量大小为 256 的 SGD。
-
学习率从 0.1 开始,当误差达到稳定状态时除以 10,并且模型的训练次数最多为 60 × 104 次迭代。
-
使用 0.0001 的权重衰减和 0.9 的动量。
-
不使用 dropout
(二)不同层级的ResNet
不同层级的ResNet都是先进入一个7×7的卷积层以及3×3的池化层,接着是若干个残差块,最后通过全局平均池化层以及softmax输出类别。
FLOPs:整个网络要计算多少个浮点数运算。卷积层的浮点运算等价于输入的高乘以宽乘以通道数乘以输出通道数再乘以核的窗口的高和宽
(三)在 ImageNet 上进行训练
1、有无残差连接的实验效果对比
图中比较了18层和34层在有残差连接和没有残差连接的结果,细曲线表示训练误差,粗曲线表示验证误差。左:18 层和 34 层的普通网络。右:18 层和 34 层的 ResNet。在此图中,与普通网络相比,残差网络没有额外的参数。
对比结果:
- 在有残差连接的时候,34比28要好;
- 对于34来说,有残差连接会好很多;
- 有了残差连接以后,收敛速度会快很多。
核心思想是说,在所有的超参数都一定的情况下,有残差的连接收敛会快,而且后期会好
2、输入输出形状不一样的时采用不同残差连接的方案对比
采用的三种方案:
- A:填零
- B:投影
- C:所有的连接都做投影:就算输入输出的形状是一样的,一样可以在连接的时候做个1*1的卷积,但是输入和输出通道数是一样的,做一次投影
对比结果:B和C的表现差不多,但是还是要比A好一点;B和C虽然差不多,但是计算复杂度更高,B对计算量的增加比较少,因此作者最终采用了B。
3、更深层次网络中设计的瓶颈架构
浅层的ResNet网络和深层的ResNet网络分别使用了两种ResNet block结构。如果要做50或者50层以上的,会引入bottleneck design:
- 左图是之前的设计,当通道数是64位的时候,通道数不会发生改变
- 如果要做到比较深的话,可以学到更多的模式,可以把通道数变得更大,右图从64变到了256
- 当通道数变得更大的时候,计算复杂度成平方关系增加,这里通过1个1*1的卷积,将256维投影回到64维,然后再做通道数不变的卷积,然后再投影回256(将输入和输出的通道数进行匹配,便于进行对比)。等价于先对特征维度降一次维,在降一次维的上面再做一个空间上的东西,然后再投影回去
- 虽然通道数是之前的4倍,但是在这种设计之下,二者的算法复杂度是差不多的
(四)在 CIFAR-10上进行训练
CIFAR-10是一个很小的数据集,跑起来相对来说比较容易,32*32,五万个样本,10类的数据集。
在整个残差连接,如果后面新加上的层不能让模型变得更好的时候,因为有残差连接的存在,新加的那些层应该是不会学到任何东西,应该都是靠近0的,这样就等价于就算是训练了1000层的ResNet,但是可能就前100层有用,后面的900层基本上因为没有什么东西可以学的,基本上就不会动了
(五)目标检测数据集的实验
mAP:目标检测上最常见的一个精度,锚框的平均精度,越高越好
四、补充
1. 为什么ResNet训练起来比较快?
梯度上保持的比较好:增加ResNet的好处是在原有的基础上加上了浅层网络的梯度,相对来说梯度还是会比较大的,不会出现梯度消失的问题;
2. 为什么ResNet在CIFAR-10那么小的数据集上他的过拟合不那么明显?
虽然模型很深,参数很多,但是因为模型是这么构造的,所以使得他内在的模型复杂度其实不是很高,也就是说,很有可能加了残差链接之后,使得模型的复杂度降低了,一旦模型的复杂度降低了,其实过拟合就没那么严重了。