【网络结构】Deep Residual Learning for Image Recognition(ResNet) 论文解析
@
0. 论文链接
1. 概述
从AlexNet出现后,后面的模型包括VGG,GoogLe-Net等都是想办法让网络边更宽更深,因为大量的实验证明网络更深更宽它的性能会更好。比较容易想到的是一味的增加深度会使得梯度爆炸/消失,但这问题在很大程度上使用标准化初始赋值跟中间层(BN)解决。但经过实验发现,如果一味的堆叠层数,性能反而会更差(无论在训练集还是测试集上)。
在上述背景下,作者提出了一种残差网络,即当前layer不只从上一层获取输入,也从前面某一层获取输入,这种“捷径”不会增加额外的参数或者计算量,同时可以现有的库进行构建而不用做改进。如下图:

作者在ImageNet使用了152层的残差网络,最终获得了 3.57%的top-5 error,然后获得了各种第一。之前的工作也有与“Residual Representation” 与 “Shortcut Connections”相关的,他们的研究也证明了在不同尺度上进行残差学习有助于模型的收敛与性能, Shortcut Connections有助于防止梯度消失/爆炸(Google-Net直接连接辅助分类器)
2. 残差学习
读了好一会才理解文章中构建残差块的动机与想法是什么,主要还是读的文章少了,对了“underlying mapping”,“identity mapping”等的理解产生了奇异,导致久久不能理解文中的表达的意思。下面详细的说一下残差学习这方面。
首先,按照正常的想法, 在一个浅层模型加一些其他的layer他的训练错误率最高不能高过原来的浅层网络,因为如果浅层网络已经是最优的了, 那么我完全可以后面添加的layer自身映射(identity mapping),前面的layer相当于直接从最优浅层网络复制过来,这样即使是深层网络其实相当于原来的浅层网络,中间某些层来学习前面网络的某一层,学习的输入feature map本身,可是经过大量实验发现网络层增加后错误率会高不少,如下图:

恺明大神从这种反常的线性中得到了启发,是不是对于通过几层非线性layer去学习“自身映射”有一定的困难,因此他提出了一种残差学习的方式:
假设通过几个非线性层可以拟合任意复杂函数(这也是神经网络一直讨论与争议的一个点,不过好像今年的ICML有一篇文章证明了在网络足够宽的情况下,确实可以拟合任意复杂函数),用\(H(X)\)表示一些堆叠网络层要拟合的最优映射,\(X\)表示这几层layer中第一层的输入,那么假设那一些堆叠网络层可以拟合\(H(X)\)的话,当然也可以拟合残差函数\(F(X) := H(X)-X\)(假设输入与输出的维数相同),因此原来要拟合函数也就是\(F(X) + X\),极端一点,如果自身映射是最优的,那么相对用几个堆叠的非线性网络去拟合一个identity mapping,把残差(\(F(X)\))逼近于0更容易一点。
3. Identity Mapping by shortcuts
可以把一个残差块表示成如下所示:
\[
y = F(x, \{W_i\}) + W_sx
\]
其中x跟y是残差块中间堆叠layer的输入与输出, \(F(x, \{W_i\})\)代表要学习的残差函数。因为这里必须保证x与 \(F(x, \{W_i\})\)输出的维度相同,因此如果维度不同可以通过\(W_s\)来调节相同的维度,残差块通常包含2,3或者更多的layers,一层相当于一个线性映射,效果不好。对于卷积层,其实就是将对应的两个feature map相加,channel by channel。
4. Network Architectures
对于网络结构,文章中的结构图十分清晰:

网络参数图:

“bottleneck” building block:

使用这种block速度更快,减少运算量,两个1x1卷积用来先减少维度让3x3计算再恢复原来的维度,这样可以减少计算。
普通网络
遵循两个设计规则:(关于第二条看不太懂)
- 对于相同的尺寸的输出feature map,每层必须含有相同数量的过滤器。
- 如果feature map的尺寸减半,则过滤器的数量必须翻倍,以保持每层的时间复杂度。
通过观察可以看到,网络直接通过卷积层(stride=2)进行下采样,网络末端以全局的均值池化层结束,有1000路的全连接层(Softmax激活)。含有权重的网络层的总计为34层
另外,当输入输出尺寸发生增加时(图3中的虚线的快捷连接),我们考虑两个策略:
(a)快捷连接仍然使用自身映射,对于维度的增加用零来填补空缺。此策略不会引入额外的参数;
(b)\(W_s\)(之前公式介绍过的)被用来匹配尺寸(靠1×1的卷积完成)。
对于这两种选项,当快捷连接在两个不同大小的特征图谱上出现时,用stride=2来处理。
5. 训练细节
ImageNet中我们的实现遵循[21,40]的实践。调整图像大小,其较短的边在[256,480]之间进行随机采样,用于尺度增强[40]。224×224裁剪是从图像或其水平翻转中随机采样,并逐像素减去均值[21]。使用了[21]中的标准颜色增强。在每个卷积之后和激活之前,我们采用批量归一化(BN)[16]。我们按照[12]的方法初始化权重,从零开始训练所有的简单/残差网络。我们使用批大小为256的SGD方法。学习速度从0.1开始,当误差稳定时学习率除以10,并且模型训练高达\(60×10^4\)次迭代。我们使用的权重衰减为0.0001,动量为0.9。根据[16]的实践,我们不使用丢弃[13]。
在测试阶段,为了比较学习我们采用标准的10-crop测试[21]。对于最好的结果,我们采用如[40, 12]中的全卷积形式,并在多尺度上对分数进行平均(图像归一化,短边位于\(\{224, 256, 384, 480, 640\}\)中)。
PS: 因为要复现Resnet,所以这一段直接找了网上的翻译
6. 实验
具体可以看论文这里主要可以看几个数据,首先解释一下集中shortcut:
A 零填充捷径用来增加维度,所有的捷径都是没有参数的自身捷径
B 投影捷径用来增加维度,其他的捷径都是没有参数的自身捷径。
C 所有的捷径都是投影捷径
实验如下:

可以发现,C比BA要好很多,但是实验中大多用的是B,特别是在深度ResNet中,因为用C维度太大,时间计算量都太大。
另外比较plain Net的实验如下,可以发现没有ResNet网络更深性能反而不好:

【网络结构】Deep Residual Learning for Image Recognition(ResNet) 论文解析的更多相关文章
- Deep Residual Learning for Image Recognition (ResNet)
目录 主要内容 代码 He K, Zhang X, Ren S, et al. Deep Residual Learning for Image Recognition[C]. computer vi ...
- [论文阅读] Deep Residual Learning for Image Recognition(ResNet)
ResNet网络,本文获得2016 CVPR best paper,获得了ILSVRC2015的分类任务第一名. 本篇文章解决了深度神经网络中产生的退化问题(degradation problem). ...
- 论文笔记——Deep Residual Learning for Image Recognition
论文地址:Deep Residual Learning for Image Recognition ResNet--MSRA何凯明团队的Residual Networks,在2015年ImageNet ...
- [论文理解]Deep Residual Learning for Image Recognition
Deep Residual Learning for Image Recognition 简介 这是何大佬的一篇非常经典的神经网络的论文,也就是大名鼎鼎的ResNet残差网络,论文主要通过构建了一种新 ...
- Deep Residual Learning for Image Recognition这篇文章
作者:何凯明等,来自微软亚洲研究院: 这篇文章为CVPR的最佳论文奖:(conference on computer vision and pattern recognition) 在神经网络中,常遇 ...
- Deep Residual Learning for Image Recognition
Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun Microsoft Research {kahe, v-xiangz, v-sh ...
- Deep Residual Learning for Image Recognition论文笔记
Abstract We present a residual learning framework to ease the training of networks that are substant ...
- Deep Residual Learning for Image Recognition(残差网络)
深度在神经网络中有及其重要的作用,但越深的网络越难训练. 随着深度的增加,从训练一开始,梯度消失或梯度爆炸就会阻止收敛,normalized initialization和intermediate n ...
- ResNet——Deep Residual Learning for Image Recognition
1. 摘要 更深的神经网络通常更难训练,作者提出了一个残差学习的框架,使得比过去深许多的的网络训连起来也很容易. 在 ImageNet 数据集上,作者设计的网络达到了 152 层,是 VGG-19 的 ...
随机推荐
- [已解决]ubuntu下chrome和firefox输入框内无法快捷键全选
问题现象: 在chrome或firefox浏览器(其他地方没试)的输入框中使用ctr + a进行全选失效,在google中找到了这个已经解决的http://askubuntu.com/question ...
- 算法大神之路——排序
从今天开始,给自己立下一个目标,每天晚上写一篇算法与数据结构的博客,用来给自己以后的算法工程师的目标铺路! 今天晚上就以算法里面的排序,作为自己的第一章节吧. 排序,就是讲一组数据,按照特定的规则去调 ...
- Myeclipse下配置struts2和hibernate
最近维护一个项目,是用struts2做的,所以特意学了下struts的入门,否则代码都看不懂啊.下面记录下过程.Myeclipse 版本为2014.struts2,hibernate为4.1. 1.既 ...
- ntopng基础
当你在本地网络监控网络流量,根据流量大小.监控平台/接口.数据库类型等等,可以有许多不同的选择.ntopng是一套开源(遵循GPLv3协议)网络流量分析解决方案,提供基于web界面的实时网络流量监控. ...
- Amr and Chemistry---cf558C(暴力,加技巧)
题目链接:http://codeforces.com/problemset/problem/558/C 题意:有n个数,每个数都可以进行两个操作 *2 或者 /2,求最小的操作次数和,使得所有的数都相 ...
- rabbitMQ 安装,集群搭建, 编码
RabbitMQ 一.背景 命令行工具: http://www.rabbitmq.com/man/rabbitmqctl.1.man.html 介绍入门文章: http://blog.csdn.net ...
- 对Numpy数组按axis运算的理解
Python的Numpy数组运算中,有时会出现按axis进行运算的情况,如 >>> x = np.array([[1, 1], [2, 2]]) >>> x arr ...
- Pycharm建立web2py项目并简单连接MySQL数据库
引言 web2py是一种免费的,开源的web开发框架,用于敏捷地开发安全的,数据库驱动的web应用:web2p采用Python语言编写,并且可以使用Python编程.web2py是一个完整的堆栈框架, ...
- Upsource——对已签入的代码进行分享、讨论和审查代码
Upsource 一.Upsource简介 Upsource ,这是一个专门为软件开发团队所设计的源代码协作工具.Upsource能够与多种版本控制工具进行集成,包括Git.Mercurial.Sub ...
- 微信js-sdk使用
<?php $appid=""; $secret=""; class JSSDK { private $appId; private $appSecret ...