【论文泛读】 ResNet:深度残差网络

【论文泛读】 ResNet:深度残差网络

文章目录

  • 【论文泛读】 ResNet:深度残差网络
    • 摘要 Abstract
    • 介绍 Introduction
    • 残差结构的提出
    • 残差结构的一些问题
    • 深度残差网络
    • 实验结果
    • ResNet 的探究
    • 与先进的模型比较
    • 在CIFAR-10进行探究
    • 在PASCAL和MS COCO上的目标检测
    • 总结

论文链接:[ 1512.03385] Deep Residual Learning for Image Recognition (arxiv.org)

当大家还在惊叹 GoogLeNet 的 inception 结构的时候,微软亚洲研究院的研究员已经在设计更深但结构更加简单的网络 ResNet,并且凭借这个网络子在 2015 年 ImageNet 比赛上大获全胜,除此之外,在那时的五个比赛都拿了第一名

接下来我们仔细阅读以下这篇论文

摘要 Abstract

更深的神经网络更难训练。我们提出了一个残差学习框架,以简化比以前使用的网络更深的网络的训练。我们明确地将层重新表述为参考层输入学习残差函数,而不是学习未引用的函数。我们提供了全面的经验证据,表明这些残差网络更容易优化,并且可以从显着增加的深度中获得准确性。在 ImageNet 数据集上,我们评估了深度高达 152 层的残差网络——比 VGG 网络深 8 倍 ,但仍然具有较低的复杂性。这些残差网络的集合在 ImageNet 测试集上实现了 3.57% 的错误率。该结果在 ILSVRC 2015 分类任务中获得第一名。我们还对具有 100 层和 1000 层的 CIFAR-10 进行了分析。 表示的深度对于许多视觉识别任务至关重要。仅由于我们极深的表示,我们在 COCO 对象检测数据集上获得了 28% 的相对改进。深度残差网络是我们向 ILSVRC & COCO 2015 竞赛提交的基础,我们还在 ImageNet 检测、ImageNet 定位、COCO 检测和 COCO 分割任务中获得了第一名。

介绍 Introduction

在前期的深度学习的发展中,网络深度至关重要,并且出现的VGG和GoogLeNet等深度模型更是说明了very deep的重要性

那这样理解的话,作者就提出一个问题,那是否说明我们可以靠堆叠简单的神经网络可以达到很高的准确率呢,但是事实并非如此,作者做了一个实验,依据CIFAR-10数据集,用了一个堆叠的20-layer神经网络和56-layer神经网络,结果非常amazing

img

从实验结果我们可以看出来,更深的网络并不能给我们带来更优的模型,反而20-layer的模型更优一点,这出现了什么问题呢

其实,更好的网络不是靠堆叠更多的层就可以实现的

堆叠网络的缺点:

  • 网络难以收敛,梯度消失/爆炸在一开始就阻碍网络的收敛。

    传统解决办法:
    通过适当权重初始化+Batch Normalization 就可以很大程度上解决,这使得数十层的网络能通过具有反向传播的随机梯度下降(SGD)开始收敛。

  • 出现退化问题(degradation problem):随着网络深度的增加,准确率达到饱和(这可能并不奇怪)然后迅速下降。意外的是,这种下降不是由过拟合引起的,并且在适当的深度模型上添加更多的层会导致更高的训练误差

由于这个退化问题,作者就进行了一个思考:假设我们训练了一个浅层网络,那么在其后面直接添加多层恒等映射层(本身)而构成的一个深层网络,那这个深层网络最起码也不能比浅层网络差。我们这样做了以后,起码我们加深模型至少不会使得模型变得更差,这样我们就可以加深我们的深度。

残差结构的提出

为了解决我们的退化问题,我们提出了一个残差结构

在过去的网络结构中,我们会去拟合我们的期望的底层映射 H ( x ) H(x) H(x),但是对于我们的是拟合我们的残差 F ( x ) = H ( x ) − x F(x)=H(x)-x F(x)=H(x)x

这样我们最后得到的映射是 F ( x ) + x F(x)+x F(x)+x,我们假设残差的映射比原来的更容易优化。**在极端情况下,如果一个恒等映射是最优的,那么将残差置为零比通过一堆非线性层来拟合恒等映射更容易。**并且对于我们来说,我们多加一个捷径连接(shortcut connections),在下面这种情况下,我们是用恒等映射就是自己本身,这样既不增加额外的参数也不增加计算复杂度。(默认加法不会影响太大的复杂度)这样我们的网络还是可以用带有反向传播的SGD进行我们的训练

img

这里有一个点是很重要的,对于我们的第二个layer,它是没有relu激活函数的,他需要与x相加最后再进行激活函数relu

作者对ImageNet进行测试,对于我们残差网络来说,总结以下几个优点

  1. 易于优化
  2. 解决退化问题
  3. 我们可以用很深的网络,并且准确率大大提升

最后作者试着利用残差网络在CIFAR-10数据集中搭建了超过1000层的神经网络,很好的解决了梯度消失和退化问题,并且利用残差网络ResNet-152,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。

残差结构的一些问题

首先我们用残差结构这种方法,我们一定要保证 F ( x ) F(x) F(x) x x x有相同的维度,简单来说,因为如此我们才可以相加,所以我们的维度必须要保持一致
y = F ( x , { W i } ) + x y=F(x,\{W_i\})+x y=F(x,{Wi})+x
然后对于我们来说,我们的 F F F之中至少要有两层,因为如果我们只有一层的话,我们的输出类似于线性函数 y = W 1 x + x y=W_1x+x y=W1x+x​,这就还是线性模型,如此便没有任何的优势,所以对于我们的特征映射来说,我们至少是需要两层的。

深度残差网络

从VGG的启发出发,我们构建一个简单的卷积神经网络,之后用一下两个设计规则设计出我们的残差网络:

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

请添加图片描述

其中一个网络我们会插入捷径连接(shortcuts connection),这里面会出现一个问题,因为我们需要我们的输入和输入都有相同的维度,但是对于我们经过池化下采样的操作之后,我们的维度变了,在这里面的残差模块就有一些不同了,作者给出两种选择

  • 快捷连接仍然执行恒等映射,额外填充零输入以增加维度。此选项不会引入额外的参数
  • 用1x1的卷积核进行降维

对于这两种做法,都有一个相同点,步长都为2

在实现的时候

  • 对数据集进行了数据增强等方法,比如随机裁剪,尺度增强等
  • 用Batch Normalization(注意:dropout 和 BN不能同时使用)在每一个卷积核后,激活函数前。
  • 最终结果用多尺度裁剪和融合,去多尺度的平均值

实验结果

模型构建好后进行实验,在plain上观测到明显的退化现象,而且ResNet上不仅没有退化,34层网络的效果反而比18层的更好,而且不仅如此,ResNet的收敛速度比plain的要快得多。

img

img

对于普通的模型中,我们发现,更深的模型的训练误差结果更大,作者经过判定,这不是由于梯度消失的问题,他大胆做了一个推测,随着普通模型的加深,模型的收敛会指数级降低,这个问题也是一个很好的问题。

对于我们的残差网络来说,我们是用第一个选择,也就是用0padding填充的,所以几乎没有额外参数,根据实验结果,我们可以得出结论:带残差的深度模型收敛的更快

ResNet 的探究

考虑到我们能承受的模型的训练时间,我们将原来的residual结构改为了瓶颈结构。对于每个残差函数F,我们使用3层堆叠而不是2层

这是在 Network In Network 和 GoogLeNet (Inception-v1)中提出的一种技术。结果表明,1× 1conv 可以减少网络的连接数(参数) ,同时不会大大降低网络的性能。三层是1×1,3×3和1×1卷积,其中1×1层负责减小然后增加(恢复)维度,使3×3层成为具有较小输入/输出维度的瓶颈。

其中,这种bottleneck模型,我们会在深层残差网络会用到,比如ResNet-50/101/152中

img

这是在ImageNet数据集中更深的残差网络的模型

img

  • ResNet-50:我们用3层瓶颈块替换34层网络中的每一个2层块,得到了一个50层ResNe。我们使用1x1卷积核来增加维度。该模型有38亿FLOP
  • ResNet-101/152:我们通过使用更多的3层瓶颈块来构建101层和152层ResNets。值得注意的是,尽管深度显著增加,但152层ResNet(113亿FLOP)仍然比VGG-16/19网络(153/196亿FLOP)具有更低的复杂度。

与先进的模型比较

对于我们的ResNet来说,与先进的方法比较,ResNet几乎超过了所有过去模型的结果,通过将网络深度增加到152层,获得了5.71% 的 top-5错误率,比 VGG-16、 GoogLeNet (Inception-v1)和 PReLU-Net 都要好得多,用六种模型集合最后在2015年ILSVRC中荣获了第一名。

img

在CIFAR-10进行探究

在CIFAR-10数据集上探究是因为,我们想研究对更深的网络上会有什么样的效果。

因为CIFAR-10图片为32x32x3,在探究的过程发现了一个很有趣的现象,当我们运用1202层的模型去训练时,我们并没有优化困难,并且我们的模型也能达到收敛,但是最后这个1202层网络的测试结果比我们的110层网络的测试结果更差,虽然两者都具有类似的训练误差。

原因分析:
我们认为这是因为过拟合。对于这种小型数据集,1202层网络可能是不必要的大(19.4M)。在这个数据集应用强大的正则化,如maxout或者dropout来获得最佳结果

这是我们在CIFAR-10上的结果

img

模型配置

  • 我们使用的权重衰减为0.0001和动量为0.9,并采用BN中的权重初始化,但没有使用丢弃Dropout。
  • 这些模型在两个GPU上进行训练,批处理大小为128。
  • 我们开始使用的学习率为0.1,在32k次和48k次迭代后学习率除以10,并在64k次迭代后终止训练,这是由45k/5k的训练/验证集分割决定的。
  • 我们用简单数据增强进行训练:每边填充4个像素,并从填充图像或其水平翻转图像中随机采样32×32的裁剪图像。

在PASCAL和MS COCO上的目标检测

我们通过将 ResNet-101引入到更快的 R-CNN 中,可以获得比 VGG-16更好的性能。而 ResNet 最终在 ImageNet 检测、定位、 COCO 检测和 COCO 分割中获得第一名! ! !

img

img

具体更多的实现细节都在论文的附录

总结

在ResNet网络中有如下几个亮点:

(1)提出residual结构(残差结构),并搭建超深的网络结构(突破1000层)

(2)使用Batch Normalization加速训练(丢弃dropout)

在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题。

(1)梯度消失或梯度爆炸。

(2)退化问题(degradation problem)。

在ResNet论文中说通过数据的预处理以及在网络中使用BN(Batch Normalization)层能够解决梯度消失或者梯度爆炸问题,residual结构(残差结构)来减轻退化问题。此时拟合目标就变为F(x),F(x)就是残差。

热门文章

暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法,在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较,从而确定目标数是在中间数的左边还是右边,将查…
暂无图片
编程学习 ·

GMX 命令分类列表

建模和计算操作命令: 1.1 . 创建拓扑与坐标文件 gmx editconf - 编辑模拟盒子以及写入子组(subgroups) gmx protonate - 结构质子化 gmx x2top - 根据坐标生成原始拓扑文件 gmx solvate - 体系溶剂化 gmx insert-molecules - 将分子插入已有空位 gmx genconf - 增加…
暂无图片
编程学习 ·

一文高效回顾研究生课程《数值分析》重点

数值分析这门课的本质就是用离散的已知点去估计整体,就是由黑盒子产生的结果去估计这个黑盒子。在数学里这个黑盒子就是一个函数嘛,这门课会介绍许多方法去利用离散点最大化地逼近这个函数,甚至它的导数、积分,甚至微分方程的解。…
暂无图片
编程学习 ·

在职阿里5年,一个28岁女软测工程师的心声

简单的先说一下,坐标杭州,14届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少) ​ 编辑切换为居中…
暂无图片
编程学习 ·

字符串左旋c语言

目录 题目: 解题思路: 第一步: 第二步: 第三步: 总代码: 题目: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符…
暂无图片
编程学习 ·

设计模式--观察者模式笔记

模式的定义与特点 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式&#xf…
暂无图片
编程学习 ·

睡觉突然身体动不了,什么是睡眠痽痪症

很多朋友可能有这样的体验,睡觉过程中突然意识清醒,身体却动弹不了。这时候感觉非常恐怖,希望旁边有一个人推自己一下。阳光以前也经常会碰到这样的情况,一年有一百多次,那时候很害怕晚上到来,睡觉了就会出…
暂无图片
编程学习 ·

深入理解C++智能指针——浅析MSVC源码

文章目录unique_ptrshared_ptr 与 weak_ptrstd::bad_weak_ptr 异常std::enable_shared_from_thisunique_ptr unique_ptr 是一个只移型别(move-only type,只移型别还有std::mutex等)。 结合一下工厂模式,看看其基本用法&#xff…
暂无图片
编程学习 ·

@TableField(exist = false)

TableField(exist false) //申明此字段不在数据库存在,但代码中需要用到它,通知Mybatis-plus在做写库操作是忽略它。,.
暂无图片
编程学习 ·

Java Web day15

第十二章文件上传和下载 一、如何实现文件上传 要实现Web开发中的文件上传功能,通常需要完成两步操作:一.是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。 需要使用一个Apache组织提供一个…
暂无图片
编程学习 ·

【51nod 2478】【单调栈】【前缀和】小b接水

小b接水题目解题思路Code51nod 2478 小b接水 题目 输入样例 12 0 1 0 2 1 0 1 3 2 1 2 1输出样例 6解题思路 可以发现最后能拦住水的都是向两边递减高度(?) 不管两个高积木之间的的积木是怎样乱七八糟的高度,最后能用来装水的…
暂无图片
编程学习 ·

花了大半天写了一个UVC扩展单元调试工具

基于DIRECTSHOW 实现的,用的是MFC VS2019. 详见:http://www.usbzh.com/article/detail-761.html 获取方法 加QQ群:952873936,然后在群文件\USB调试工具&测试软件\UVCXU-V1.0(UVC扩展单元调试工具-USB中文网官方版).exe USB中文网 USB中文…
暂无图片
编程学习 ·

贪心(一):区间问题、Huffman树

区间问题 例题一:区间选点 给定 N 个闭区间 [ai,bi]请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N,表示区间数。 接下来 …
暂无图片
编程学习 ·

C语言练习实例——费氏数列

目录 题目 解法 输出结果 题目 Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子…
暂无图片
编程学习 ·

Android开发(2): Android 资源

个人笔记整理 Android 资源 Android中的资源,一般分为两类: 系统内置资源:Android SDK中所提供的已经定义好的资源,用户可以直接拿来使用。 用户自定义资源:用户自己定义或引入的,只适用于当前应用的资源…
暂无图片
编程学习 ·

零基础如何在短时间内拿到算法offer

​算法工程师是利用算法处理事物的职业 算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 如果一个算法有缺陷,或不适合于某个问题,执…
暂无图片
编程学习 ·

人工智能:知识图谱实战总结

人工智能python,NLP,知识图谱,机器学习,深度学习人工智能:知识图谱实战前言一、实体建模工具Protegepython,NLP,知识图谱,机器学习,深度学习 人工智能:知识图…
暂无图片
编程学习 ·

【无标题】

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…