热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Resnet学习和理解

一直以来,经常在各种复杂的结构中使用或者听说过Resnet的名字,但是一直也没有学习过这篇文章,现在趁着有时间,学习一下Re

一直以来,经常在各种复杂的结构中使用或者听说过Resnet的名字,但是一直也没有学习过这篇文章,现在趁着有时间,学习一下Resnet——何凯明等人于2015年年底发表的《Deep Residual Learning for Image Recognition》。


一、Resnet的背景

深度神经网络(DCNN)结构是很难训练的,这里我们提出一种叫做“residual learning”的框架,使得神经网络可以更deep,更好训练。

我们显式地将层(layer)重新组织(reformulate)为学习残差函数,而不是学习未引用的函数(unreferenced functions)。

通过提供全面的经验证据(Comprehensive empirical evidence),表明此方法是容易优化且准确性随着深度的增加而增加(showing that these residual networks are easier to optimize, and can gain accuracy from considerably increased depth)。

在ImageNet比赛中,我们采用了比VGG大8倍的网络结构(152层),但是复杂度还是低于VGG的,测试集的错误率达到3.57%,赢得了ILSVRC 2015分类任务的第一名。

对于很多的visual recognition任务,the depth of representation(或者说网络的深度)是最重要的(增加描述能力)。

二、Resnet的解决的问题

根据之前的研究成果( K. Simonyan and A. Zisserman. Very deep convolutional networks for large-scale image recognition. In ICLR, 2015. ,C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov, D. Erhan, V. Vanhoucke, and A. Rabinovich.Going deeper with convolutions. In CVPR, 2015.),学术界普遍认为CNN结构的层数越多,表述能力越强(对特征的描述能力也就越强),效果也就越好。
这里写图片描述
但是实际上,由于层数的增加,常规的网络(plain network)在网络很深的时候,效果反而不如之前的浅层网络了(shallower network)。这种现象称之为退化现象(degradation problem) ,跟预想相反的是,这种退化行为(上图1中层数深的网络比层数低的网络train loss和test loss都要大。)不是由于overfitting造成的。这表明不是所有的系统(神经网络结构)都是容易收敛和优化的。;除此之外,由于层数很深,也不可避免的出现梯度消失/爆炸的问题(vanishing/exploding gradient)。

因此,Resnet解决的问题就是提出一种新型的方法,来解决随着网络层数加深而导致的退化问题(degradation problem)和相应的梯度消失问题。

三、Resnet的解决思路

提到Resnet,就离不开两方面的内容:① Residual Representation ② Shortcut Connections。下面我们结合实际的过程引入这两块内容,避免直接叙述带来的困扰和不解。

这里写图片描述

① Residual Representation

上面是Plain Net和Residual Net的结构,这里我们将H(x)H(x)视为一部分堆叠的网络的输出结果,xx为这一小部分结构的输入。我们希望通过2层权重能够拟合残差函数F(x)=H(x)−x" role="presentation" >F(x)=H(x)x(这里假设H(x)H(x)xx的维度一致)——用论文的原话说是:“如果假设多重非线性层可以渐近地逼近复杂的函数,那么就相当于假设它们可以渐近地近似残差函数(residual function)”

引用参考资料2里面的一段分析:

如果深层网络的后面那些层是恒等映射(identity mapping),那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。

但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。

这里写图片描述

映射H" role="presentation" >H的计算复杂,而FF的计算相对简单,所以加深网络层数是可行的。这里:F" role="presentation" >F是求和前网络映射,HH是从输入到求和后的网络映射。

下面引用自知乎

比如把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%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化,看到残差网络我第一反应就是差分放大器

② Shortcut Connections

如上图结构,我们对每几层的堆叠结构(stacked layers)都采用残差学习,其构造过程就是一个building block的过程:

y=F(x,Wi)+x" role="presentation" >y=F(x,Wi)+x

这里xxyy为上面layers的输入和输出向量。函数F(x,Wi)F(x,Wi)表示要学习的残差,以上图为例,二层结构有F=W2σ(W1x)F=W2σ(W1x),这里σσ表示激活函数ReLu(为简化描述,省略bias unit)。F+xF+x的操作是通过shortcut connection和element-wise的加法来执行的。

值得注意的是,这里的shortcut connection机制既没有增加额外的参数,也没有使得计算复杂度增加。这一点是非常重要的,因为我们可以同时比较plain net和residual net(拥有同样的参数个数、网络深度和计算代价)。

这里又涉及到一个难点:如何保证输入输出的维度相同?

  • 1)快捷连接(shortcut connection)仍然使用自身映射(identity mapping),对于维度的增加用零来填补空缺(padding),此策略不会引入额外的参数。

  • 2)可以在shortcut connection时对x做一个线性变换方阵WsWs,相当于加入了1x1卷积层,即

    y=F(x,Wi)+Wsxy=F(x,Wi)+Wsx

这里写图片描述

但通过实验证明,恒等映射对于解决退化问题已经足够了,因此只有在匹配维度时才需要使用WsWs

残差函数FF的形式是灵活的。本文的实验涉及到的函数F" role="presentation" >F,它有两个或三个层,当然更多的层也是可以的。但是,如果FF只有一个层,那么y=F(x,Wi)+x" role="presentation" >y=F(x,Wi)+x就变成了y=W1x+xy=W1x+x,就失去了非线性的表述能力了,我们认为这是不可取的。

③ Network Architectures

我们测试了各种各样的普通/残差网网络,并观察到一致的现象。为了提供讨论的实例,我们将讨论在ImageNet使用的两个模型。

这里写图片描述

  • 普通网络(Plain Network)

普通网络的基准模型(上图中间)主要受VGG网络(上图左)的启发。卷积层主要有3×3的过滤器,并遵循两个简单的设计规则:①对输出特征图的尺寸相同的各层,都有相同数量的过滤器; ②如果特征图的大小减半,那么过滤器的数量就增加一倍,以保证每一层的时间复杂度相同。

值得注意的是,我们的模型比VGG网络(上图左)更少的过滤器和更低的复杂性。我们的具有34层的baseline有36亿 FLOPs,只是VGG-19(19.6亿FLOPs)的18%。

  • 残差网络(Residual Network)

基于上面的普通网络,我们插入了快捷连接(shortcut connection),将网络转换为对应的残差版本(上图右)。

当输入和输出是相同的维度时,恒等shortcut(identity mapping)可以直接使用。当维度增加(上图右虚线),我们提供两个选择:


    • 1)快捷连接(shortcut connection)仍然使用自身映射(identity mapping),对于维度的增加用零来填补空缺(padding),此策略不会引入额外的参数。

    • 2)可以在shortcut connection时对xx做一个线性变换方阵Ws" role="presentation" >Ws,相当于加入了1x1卷积层,即

      y=F(x,Wi)+Wsxy=F(x,Wi)+Wsx

对于这两个选项,当shortcut融合大小不同的特征图时,它们的执行时的步长取2。

这里我们对这两种不同的building block的方式做一个梳理:

下图摘自参考资料3

这里写图片描述

在Resnet中,有两种Building block的方式: 第一类Building block(BB1)如上图中实线部分的building block所示,特点为输入输出的维度一致,特征图个数也一致;
这里写图片描述

第二类Building block(BB2)如上图虚线部分的building block所示,特点为输出是输入维度的1/2,输出特征图个数是输入特征图个数的2倍(即执行了/2操作)。

对于BB2,作者提供了两种选择:(A)如BB1的处理一样,padding技术,只是要填充好多0啊,这也是为什么得到实验4.1中的ResidualNetworks部分的“B is slightly better than A. We argue that this is because the zero-padded dimensions in A indeed have no residual learning.”的结论。(B)采用projection shortcut,让WsWs与输入做步长为2的1×1的卷积操作,这样,输入和输出就具有相同的维数,接下来在进行相加操作就OK啦!过程如下图所示:
这里写图片描述

ps:关于实验的情况这里不贴了,有意者请查看论文

四、总结

① 网络设计:

  • 全部采用3×3的卷积核(或者大部分采用)
  • Spatial size /2 -> filter×2 (保证时间复杂度一致)
  • 没有Dropout层

② 实验结果表明,ResNet能够在没有任何困难的情况下得到训练,并且实现更深的网络结构使其达到更低的训练误差和测试误差。

③ 作者分析了深度学习模型存在的问题和本文提出的对策:

  • 表征能力:ResNet在表征能力上不存在明显优势(只是重复的参数化),但是,能够使加深模型变得切实可行;
  • 优化容易:能够使前向/反向传播算法更加平稳(加入BN),极大程度简化/减轻(DBA)优化深度模型;
  • 泛化(Generalization)能力:ResNet未直接考虑泛化,但是更深+更薄是一种很好的一般化手段。

以上对ResNet做了简要总结,了解到ResNet在加深网络模型,提高学习任务准确率等方面都有很大的优势。

下图取自参考资料4,蒋竺波同学在知乎的文章

这里写图片描述
其实也就是说,可以通过将论文里面展示的layer为2的building block换为3,4等自己想要的数(必须要大于1,原因前面说了),从而保留想要的长程信息。



参考资料

1.Deep Residual Learning for Image Recognition
2. 残差网络Resnet——AlanMa
3. ResNet学习——Xxy_Fighting
4.CNN入门讲解:什么是残差网络Resnet(视频)——
蒋竺波


推荐阅读
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文介绍了如何在AX2012中通过自定义查询在数据网格视图中显示所有记录的方法。 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
author-avatar
欧毅儒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有