论文标题
《Deep Residual Learning for Image Recognition》
- 撑起CV界半边天的论文
- Residual :主要思想,残差。
作者
何恺明,超级大佬。微软亚研院属实是人才辈出的地方。
初读
摘要
-
提问题:
更深层次的神经网络更难训练。
-
提方案:
提出了残差网络解决深层网络训练的问题。这也就是本文的主题。
用 reference 的残差函数替代了 unreferenced 的函数。
-
概况主要内容:
通过实验证明残差的有效性。甚至在 CIFAR-10 上试到了 1000 层。
-
秀成果:
- 低复杂度:比 VGG 深 8 倍但复杂度更低。
- 高精度:
- 在 ImageNet 测试集上实现了 3.57% 的误差
- 在 COCO 目标检测数据集上获得了 28% 的相对改进
结论
这篇文章比较别致,没有写结论。主要是受限于 CVPR 对论文篇幅的限制,把最后一段给了目标检测而没有写结论。为啥不再单写一篇目标检测的文章。
再读
Section 1 Introduction
-
第一段主题:深度卷积好
深度卷积神经网络好,好就好在能很深
-
第二段主题:质疑“深就是好?”
稍微深点就遇到了梯度消失/爆炸的问题,这个问题通过初始化正则和中间正则解决
-
第三段主题:深反倒不好
网络深了精度反而会下降,深度深了之后训练误差和测试误差都上升了,说明变差还不是过拟合的锅。
-
第四段主题:深带来的问题
新添加的层是恒等映射(identity mapping)[TODO],按理说不应该更差,但是现实就是优化不动。
-
第五段主题:引入残差学习框架
让残差块拟合 F ( X ) = H ( x ) − x F(X)=H(x)-x F(X)=H(x)−x,而不是 H ( x ) H(x) H(x),最终再进行 F ( x ) + x F(x)+x F(x)+x 。假设残差映射优于原始映射。
-
第六段主题:残差学习的实现不会使模型复杂化
上述的 F ( x ) + x F(x)+x F(x)+x 操作通过有捷径连接的前馈型神经网络实现。不会增加参数量和模型复杂度,仍可以由 SGD 进行优化。
-
第七段主题:实验验证
经过全面的实验显示:
- 残差网络更容易优化。
- 残差网络可以从深度中获得精度增益。
-
第八段主题:超深层数探索
在比较简单的 CIFAR-10 数据集上实验了超千层的模型。
-
第九段主题:再次展示成果
- 有史以来最深。
- 比 VGG 深,但是复杂度更低。
- 在 ImageNet 测试集上实现了 3.57% 的误差
- 在 COCO 目标检测数据集上获得了 28% 的相对改进
- 认为残差这一思想是通用的,在其他视觉或非视觉问题都应该能够应用。
Section 2 Related Work
简单讲了和本文工作相关的方法。
-
残差表示(Residual Representations)
对于矢量量化,编码残差矢量比编码原始矢量更有效。良好的重构或预处理可以简化优化过程。
-
捷径连接(Shortcut Connections)
MLPs中对捷径连接的早期实践是添加从网络输入连接到输出的线性层。或使一些中间层直接连接到辅助分类器,以解决梯度消失/爆炸。
此外,不同于 highway networks 中有时会关闭的门控函数,本文模型没什么门。总是学习残差函数,标识快捷键永远不会关闭,所有信息始终都会被传递,还需要学习其他残余函数。
Section 3 Deep Residual Learning
Residual Learning
残差学习
-
第一段:残差映射
不是像传统的那样让堆叠的层逼近 H(x),而是明确让这些层逼近残差函数 F(x):= H(x)-x。根据万能近似定理来说,两种形式都应能够渐近地逼近所需的函数,但学习的难易程度有所不同。
-
第二、三段:残差的好处
退化现象表明求解器在用多个非线性层逼近恒等映射时可能存在困难。通过残差学习的重构,如果恒等映射是最佳的,残差模块只需要拟合零映射。
即使恒等映射不是最佳的,后面的网络也只需要拟合前面网络的输出与期望函数的残差,这比起恒等映射要容易。
Identity Mapping by Shortcuts
通过快捷方式进行恒等映射
-
第一段:残差块结构
描述了图2,实际就是再描述一遍残差,车轱辘话来回说,还是拟合 H(x)-x,最后再加回 x,用一下 Relu。
-
第二段:残差不增加复杂度
残差没有引入额外的参数和计算复杂度,深度宽度都一样,这一点也提供了和不使用残差模型对比的条件(控制变量)。
-
第三段:恒等映射就足够了
实验表明,后面用恒等映射效果是最好的,引入参数还会增加额外的复杂度。只有需要匹配维度的时候才会给恒等映射加上权重。
-
第四段:残差层数
两层或者三层残差就足够了,但是不能只有一层,只有一层就和线性层很像了,效果不好。
-
第五段:残差适用于卷积
上面为了方便而使用的全连接表示,实际上可以表示卷积层,在两个特征映射上逐个通道执行逐元素加法。
Network Architectures
网络体系结构
对比了带残差的和不带残差的
- 无残差网络:
- 类似VGG网络:
- 用 3 × 3 3\times 3 3×3 卷积
- 每个块里卷积层数一致
- 大小减半时通道加倍
- 通过步长为2的卷积层执行下采样
- 以全局平均池化层和带有softmax的1000路全连接层结束
- 用了残差之后甚至参数量比VGG还要少,VGG好臃肿。
- 类似VGG网络:
- 残差网络:
- 其余的一模一样,只是带上了残差。
- 当维度增加时,下采样有两种方案:
- 不够的用0填充,此方案不必引入新的参数
- 做 1 × 1 1\times 1 1×1 的卷积层卷积,
Implementation
实施
具体试验方案:
- 调整图像大小,随机采样其较短的一面以进行比例增强
- 从图像或其水平翻转中随机采样224×224作物,本文主要进行标准的10种裁剪测试方法
- 并减去每像素均值,本文采用了多尺度裁剪和特征融合
- 使用标准色彩增强
- 在每次卷积之后和激活之前采用批归一化,而不使用 dropout
- 使用最小批量为256的SGD
- 学习率从0.1开始,当误差平稳时除以10
Section 4 Experiments
ImageNet Classification
ImageNet分类
本节主要讲了实验结果
介绍数据集ImageNet
- 包含1000个类。在128万张训练图像上训练模型,并在50k验证图像上进行评估。
- 在测试服务器报告的10万张测试图像上获得最终结果,评估了top-1和top-5的错误率
普通网络和残差网络对比
-
普通网络:
-
较深的34层普通网络比较浅的18层普通网络具有更高的验证误差
- 18-layer 错误率是 27.94%
- 34-layer 错误率是 28.54%
-
出现了退化现象:
即使18层普通网络的解空间是34层普通网络的子空间,在整个训练过程中34层普通网络具有较高的训练误差。
-
不是梯度问题导致的
普通网络也使用了BN,有非零方差。数据不会挤在一起。前向传播反向传播也都正常。更多轮次的迭代也不能解决,钉死这是退化而不是别的事儿。
-
猜测:
我们推测深层的普通网络的收敛速度可能呈指数级降低,这会影响到减少训练误差。将来将研究这种优化困难的原因。
-
残差网络:
- 再次强调已经控制变量了,除了加了残差,在参数量之类别的方面都一样
- 34 层 ResNet 表现出较低的训练误差,验证了残差学习在极深系统上的有效性。
- 18-layer 错误率是 27.88%
- 34-layer 错误率是 25.04%
- 此外,带残差的网络收敛更快。
恒等映射和投影短链接对比
- 三个方案:
- A)零填充短链接用于增加维度,并且所有短链接都是无参数的(与表2和右图4相同);
- B)投影短链接用于增加维度,其他短链接是恒等的。
- C)所有短链接都是投影。
- 结果:
- B比A稍好。作者认为是因为A中的零填充维度没有残差学习。
- C比B好一点,作者认为是由于投影快捷方式引入的额外参数。
- 结论:
- A/B/C之间的细微差异表明,投影捷径对于解决退化问题并不是必不可少的。
- 为了那一点精度增加参数量可能得不偿失,因此本文的其余部分中不会使用选项C来减少内存/时间的复杂性和模型大小。
Deeper Bottleneck Architectures
本小节主要是介绍引入Bottleneck 结构使网络更深。
-
思想:先降维后升维
-
使用恒等映射
- 因为短链接连接到两个高维端。如果用投影参数和复杂度会翻倍
-
更深的残差网络
- 50层ResNet
- 替换了具有3层瓶颈块的34层网,形成了50层ResNet
- 使用选项B来增加尺寸。该模型具有38亿个FLOP。
- 101层和152层ResNet:
- 通过使用更多的3层块来构建101层和152层ResNet(表1)。
- 值得注意的是,尽管深度显着增加,但152层ResNet(113亿个FLOP)的复杂度仍低于VGG-16/19网(153.96亿个FLOP)。
- 50层ResNet
-
引入残差之后,更深确实更好
- 50/101/152层ResNet比34层ResNet准确度高。
- 没有观察到退化问题,因此深度的增加大大提高了精度。所有评估指标都证明了深度的好处
CIFAR-10 and Analysis
本节主要是在更简单的CIFAR-10数据集上测试,把深度拉到了恐怖的1202层。
- 使用简单架构:不为刷榜,只为极致的深
- 网络输入为32×32图像,仍然是每像素减去均值。
- 分别在大小为{32,16,8}的特征图上使用具有3×3卷积的6n层堆栈,每个特征图尺寸为2n层
- 卷积核的数量分别为{16,32,64}
- 通过步幅为2的卷积执行二次采样
- 仍然以全局平均池,10路全连接层和softmax结尾
- shortcut用A方案,这样最简单
- 结果:
- 依然是普通网络会退化
- 引入残差则会越深越好
- 110层残差网络的特殊处理
- 先使用0.01的学习率来预热训练,直到训练误差低于80%(约400次迭代),返回0.1的学习率继续训练
三读
未完待续。
个人感想
- 本文的实验设计非常透彻
- 通过观察各个细节,先是排除了是过拟合的影响,再排除了梯度爆炸/消失的影响,从而确定了深层网络的问题在于模型退化。
- 再通过严格的控制变量的比较有无残差的模型,360度无死角的验证了残差就是能解决退化问题,值得学习。
- 数据和模型都是有上限的
- 数据本身决定了问题上限,这个数据的最优结果就在那里摆着,模型只是在不断逼近这个上限。
- 模型结构决定了模型的上限,调参也就是再不断逼近这个上限。不加残差的模型就算调参调的再好也会撞上退化这堵墙,引入残差才是真正的提高了模型的上限。
- 感觉这篇论文的参考文献就像论文阅读指南,都是值得一读的精品论文。