论文笔记:Deep Residual Learning for Image Recognition(ResNet)

2024-01-09 19:20

本文主要是介绍论文笔记:Deep Residual Learning for Image Recognition(ResNet),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基本信息

标题:Deep Residual Learning for Image Recognition
时间:2015
第一作者:Kaiming He
论文领域:深度学习、计算机视觉、CNN
引用格式:He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.

二、研究背景

最近的证据揭示了网络深度是至关重要的,领先结果中对挑战ImageNet数据集都利用“非常深”的模型,深度从16到30。
深度加深带来的问题:

  • 梯度消失和爆炸(vanishing/exploding gradients)

对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。

  • 开始收敛时,退化问题产生,精确度下降(退化并不是过度拟合引起的,在适当深度的模型上增加更多的层会导致更高的训练误差
    本文说道不是过拟合问题:因为可以从图中看出随着深度的增加,训练误差变大(事实上,测试误差也很大),而过拟合指训练误差小,测试误差大
    在这里插入图片描述

有两种解决思路,一种是调整求解方法,比如更好的初始化、更好的梯度下降算法等;另一种是调整模型结构,让模型更易于优化——改变模型结构实际上是改变了error surface的形态。
ResNet的作者从后者入手,探求更好的模型结构。将堆叠的几层layer称之为一个block,对于某个block,其可以拟合的函数为 F ( x ) F(x) F(x),如果期望的潜在映射为 H ( x ) H(x) H(x),与其让 F ( x ) F(x) F(x) 直接学习潜在的映射,不如去学习残差 H ( x ) − x H(x)−x H(x)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,用 F ( x ) + x F(x)+x F(x)+x来拟合 H ( x ) H(x) H(x)。作者认为这样可能更易于优化,因为相比于让 F ( x ) F(x) F(x)学习成恒等映射,让 F ( x ) F(x) F(x)学习成0要更加容易——后者通过L2正则就可以轻松实现。这样,对于冗余的block,只需 F ( x ) → 0 F(x)→0 F(x)0就可以得到恒等映射,性能不减。

退化

按理说,当我们堆叠一个模型时,理所当然的会认为效果会越堆越好。因为,假设一个比较浅的网络已经可以达到不错的效果,那么即使之后堆上去的网络什么也不做,模型的效果也不会变差。
然而事实上,这却是问题所在。“什么都不做”恰好是当前神经网络最难做到的东西之一。
也许赋予神经网络无限可能性的“非线性”让神经网络模型走得太远,却也让它忘记了为什么出发(想想还挺哲学)。这也使得特征随着层层前向传播得到完整保留(什么也不做)的可能性都微乎其微。用学术点的话说,这种神经网络丢失的“不忘初心”/“什么都不做”的品质叫做恒等映射(identity mapping)。因此,可以认为Residual Learning的初衷,其实是让模型的内部结构至少有恒等映射的能力。以保证在堆叠网络的过程中,网络至少不会因为继续堆叠而产生退化!
作者:薰风初入弦
链接:https://www.zhihu.com/question/64494691/answer/786270699
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、创新点

Residual Block结构

F ( x ) + x F(x)+x F(x)+x构成的block称之为Residual Block,即残差块,如下图所示,多个相似的Residual Block串联构成ResNet。
在这里插入图片描述
本文通过引入残差学习(residual learning)来解决退化问题,即⊕上方学习的为 H ( x ) − x H(x) - x H(x)x,这也正是要学习的残差 F ( x ) : = H ( x ) − x F(x) := H(x) - x F(x):=H(x)x,希望通过 H ( x ) = F ( x ) ⊕ x H(x) = F(x)⊕x H(x)=F(x)x拟合 x x x,这里引入了x,把恒等映射作为网络H(x)的一部分。而原本是 H ( x ) H(x) H(x)拟合 x x x
这里有个疑问: F ( x ) + x = H ( x ) − x + x = H ( x ) F(x) + x = H(x) - x + x = H(x) F(x)+x=H(x)x+x=H(x)这从等式角度来说本来就相等,为什么叫做拟合呢? H ( x ) − x + x = H ( x ) H(x) - x + x = H(x) H(x)x+x=H(x),如果考虑上图2层网络拟合右边 H ( x ) H(x) H(x)是原本需要拟合的函数,那么左边的残差学习的是 H ( x ) − x H(x)- x H(x)x,两边学习的容易程度也不一样。个人理解。

参考解释1:
怎么解决退化问题?
深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。
标识快捷连接既不增加额外的参数,也不增加计算复杂度。整个网络仍然可以通过带有反向传播的SGD进行端到端的训练。

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

必须要大于1层,否则没有效果:
y = F ( x , { W i } ) + x = ( W 1 x ) + x = ( W 1 + 1 ) x \mathbf{y}=\mathcal{F}\left(x,\left\{W_{i}\right\}\right)+x=\left(W_{1} x\right)+x=\left(W_{1}+1\right) x y=F(x,{Wi})+x=(W1x)+x=(W1+1)x

纬度问题

The convolutional layers mostly have 3 * 3 filters and follow two simple design rules:
(i) for the same output feature map size, the layers have the same number of filters;
(ii) if the feature map size is halved, the number of filters is doubled so as to preserve the time complexity per layer.

(i)空间纬度

之前提到输入x要与F(x)维度一样,如果不一样则投影到 W s W_s Ws解决空间纬度问题:
y = F ( x , { W i } ) + W s x \mathbf{y}=\mathcal{F}\left(\mathbf{x},\left\{W_{i}\right\}\right)+W_{s} \mathbf{x} y=F(x,{Wi})+Wsx

(ii)深度纬度

When the dimensions increase (dotted line shortcuts in Fig. 3), we consider two options:
(A) The shortcut still performs identity mapping, with extra zero entries padded for increasing dimensions. This option introduces no extra parameter;
(B) The projection shortcut in Eqn.(2) is used to match dimensions (done by 1* 1 convolutions).

(A)就是直接补0,不需要额外参数
(B)就是在跳接过程中加一个1*1的卷积层进行升维,下面右图
在这里插入图片描述

网络结构

在这里插入图片描述
作者对 VGG-19 进行仿制与改造,规则在纬度问题那里提到,得到了一个 34 层的 plain network,然后又在这个 34 层的 plain network 中插入快捷连接,最终形成了一个 34 层的 residual network。

以及下面继续加深网络:
在这里插入图片描述

四、实验结果

在这里插入图片描述
在这里插入图片描述
18层效果还不是很明显,34层以及有很大改进。

作者最后在Cifar-10上尝试了1202层的网络,结果在训练误差上与一个较浅的110层的相近,但是测试误差要比110层大1.5%。作者认为是采用了太深的网络,发生了过拟合。

在这里插入图片描述
在表3中,比较了三个选项:

  • (A)填充零的快捷方式用于增加维度,并且所有的快捷方式都是无参数的(与右表2和图4相同);
  • (B)投影捷径用于增加维度,其他捷径为同一性;
  • ©所有捷径都是投影。
    作者考虑内存和时间,最后使用B

五、结论与思考

作者结论

总结

有了梯度相关性这个指标之后,作者分析了一系列的结构和激活函数,发现resnet在保持梯度相关性方面很优秀(相关性衰减从 1 2 L \frac{1}{2^{L}} 2L1到了 1 L \frac{1}{\sqrt{L}} L 1 )。这一点其实也很好理解,从梯度流来看,有一路梯度是保持原样不动地往回传,这部分的相关性是非常强的。

思考

感觉跳接(shortcut connection)和FCN的跳跃连接很像。那边可以跳多层还能上采样叠加。

参考

ResNet详解与分析
残差网络ResNet笔记

这篇关于论文笔记:Deep Residual Learning for Image Recognition(ResNet)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/588168

相关文章

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓