论文笔记 - ResNet 残差网络

为梯度开辟了一条高速通道。

ResNet

参考资料

问题

训练几十层的神经网络时,权值用正则初始化,中间层使用BN就能解决梯度的问题。但当网络层数加深时,又会出现退化问题(degradation problem),这个问题不是由于过拟合造成的,加深层数时,在训练集上的准确率饱和甚至下降了。

理论

核心点:通过残差块来解决深度网络的退化问题。

F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化,看到残差网络我第一反应就是差分放大器

假设多层非线性层可以逼近复杂函数,则也可以逼近残差函数。但与其期望多层网络学习到残差函数,倒不如直接让这些层近似成残差函数。

其实解决问题的根本在于,对残差块求导时,每一个导数增加了一个恒等项1,从而让误差仍然能够有效地反向传播。

虽然在实践中恒等映射一般不是最优函数,但如果最优函数接近恒等映射时,残差块能够更容易的学习到。

使用恒等映射(x)而不是仿射变换(Wx,W是方阵)的原因:在实践中证明恒等映射更有效,且更经济。只有在前后维度不同时,才用矩阵W做线性投影来调整维数。

当维度不同时,实现残差块的两种方式

  • 通过zero padding来增加维度,无需额外参数;
  • 乘以W矩阵投影到新的空间,使用1x1卷积实现,这样会增加参数;
  • 对于上述两种方法,步长都是设为2。

瓶颈结构(bottleneck)

  • 前后使用1x1卷积层来对维度进行减小、恢复;
  • 此时shorcut不能再用线性映射,因为会让模型参数翻倍,所以只能用恒等映射;
  • 由于shortcut连接的是高维,所以恒等映射可以让模型变得更有效;
  • 使用的原因:参数减少,时间复杂度近似。

使用bottleneck的原因

  • 对通道数进行升维和降维(跨通道信息整合),实现了多个特征图的线性组合,同时保持了原有的特征图大小;
  • 相比于其他尺寸的卷积核,可以极大地降低运算复杂度;
  • 如果使用两个3x3卷积堆叠,只有一个relu,但使用1x1卷积就会有两个relu,引入了更多的非线性映射;

我们来计算一下1*1卷积的计算量优势:首先看上图右边的bottleneck结构,对于256维的输入特征,参数数目:1x1x256x64+3x3x64x64+1x1x64x256=69632,如果同样的输入输出维度但不使用1x1卷积,而使用两个3x3卷积的话,参数数目为(3x3x256x256)x2=1179648。简单计算下就知道了,使用了1x1卷积的bottleneck将计算量简化为原有的5.9%,收益超高。

训练

数据预处理

  • 224x224 random crop
  • random horizontal flip
  • per-pixel mean subtracted
  • standard color augmentation

超参数

  • batch size 256
  • BN
  • learning rate 0.1, decay factor 10
  • 60x10^4 iterations
  • weight decay 1e-4
  • momentum 0.9
  • do not use dropout(从BN的论文实验中得出)