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

动手学深度学习V2.0(Pytorch)——29.2ResNet为什么能训练出1000层的模型

文章目录29.21.ResNet为什么能训练出1000层的模型1.1Resnet是如何处理梯度消失,使得其可以训练1000层的模型1.2弹幕里的一些说法29.22.Q

文章目录

  • 29.2 1. ResNet为什么能训练出1000层的模型
    • 1.1 Resnet是如何处理梯度消失,使得其可以训练1000层的模型
    • 1.2 弹幕里的一些说法
  • 29.2 2. Q&A
    • 2.1 学习率可不可以让靠近输出的小一些,让靠近输入的大一些,这样会不会就可以缓解梯度消失的问题?(layerwise)


29.2 1. ResNet为什么能训练出1000层的模型

https://www.bilibili.com/video/BV1554y157E3

这部分没有PPT,所以简单做一些记录和自己绘图



1.1 Resnet是如何处理梯度消失,使得其可以训练1000层的模型

之前说到避免梯度消失的方式有几种,

  • 有一种避免梯度消失的办法是 乘法变加法,ResNet就是这么做的,特别是Residual Connection

接下来主要讨论 Residual是如何处理梯度消失的:

在这里插入图片描述

如上图所示,

  • 假设已经有一个网络,用y=f(x)y=f(x)y=f(x)表示,xxx是输入,yyy是输出。fff就是函数映射,比如是10个卷积层之类的。
  • 那么如果这个fff中比如有个参数www(可能不止一个值,是一个Tensor), 则损失函数对www求导就可以表示为:∂y∂w\frac{\partial y}{\partial w}wy
    • 这里暂时不考虑那么详细的损失函数了,反正损失函数里肯定有yyy,无非就是再多点东西
    • 另外假设这里的www就是靠近底层的一个参数,就这样表示计算梯度了
  • 需要保证∂y∂w\frac{\partial y}{\partial w}wy求导出的结果/梯度,不会特别小。因为在梯度更新时,会根据w=w−η∂y∂ww=w-\eta \frac{\partial y}{\partial w}w=wηwy来更新参数www,如果梯度很小,那么调节学习率也不好调,数值稳定性会发生一些问题(比如梯度消失,那网络其实就死了,权重不会更新了)。所以我们希望计算出来的梯度不要太小


在这里插入图片描述

接下来,假设在这个网络上面再加一些层,也就是对fff进行扩充,把这个函数变得更复杂,加东西。

  • 图像中紫色笔写的,假设加了一个g(x)g(x)g(x),那么加之后就变成y′=g(f(x))y'=g(f(x))y=g(f(x)),y′y'y只是个记号表示,不是一阶导数。比如就是在f(x)f(x)f(x)这10个卷积层上面,再加了10个卷积层(g(x)g(x)g(x))
  • 那么还是去看f(x)f(x)f(x)里的www(靠近底层/数据端的那个参数),根据复合函数求导的链式法则,它的求导就变成了:
    ∂y′∂w=∂y′∂y∂y∂w=∂g(y)∂y∂y∂w\begin{aligned} \frac{\partial y'}{\partial w}&=\frac{\partial y'}{\partial y}\frac{\partial y}{\partial w}\\ &=\frac{\partial g(y)}{\partial y}\frac{\partial y}{\partial w} \end{aligned}wy=yywy=yg(y)wy
  • 从结果中可以看到,梯度的右半部分,和之前是一样的;问题出现在左半部分,相当于新加的那部分层对yyy进行求导,也就是g(y)g(y)g(y)这个网络对它的输入yyy求导。
  • 如果用的是拟合能力特别强的网络,比如AlexNet,靠近输出层的部分是三个超大的FC层,那么左半部分的这个∂g(y)∂y\frac{\partial g(y)}{\partial y}yg(y)很快变得特别小,
    • 解释一下,g(y)g(y)g(y)y=f(x)y=f(x)y=f(x)上面的层,相对来说,是高层/靠近输出端的层,所以在求梯度的时候,高层参数的导数会更大,也就是参数更新会快。参数更新快,那么损失函数就在减小(和yyy一样,这里也把$y′y'y粗略的作为损失函数),那么∂g(y)∂y\frac{\partial g(y)}{\partial y}yg(y)就会很快变小。
    • 带来的问题就是,底层的梯度,更小!(一个很小的数,乘以 加层之前的梯度,那么之前底层的梯度,也就会更小)
  • 当梯度很小的时候,要么增大学习率,
    • 但是增大也不一定特别有用,因为不能增的太大,
    • g(y)g(y)g(y)里的www合适的学习率 ≠ f(x)f(x)f(x)里的www的合适的学习率,如果增的太大,那么g(y)g(y)g(y)里的www就很可能梯度爆炸,整个就不稳定了
  • 当网络越深,那么越靠近数据层/底层,梯度就会越小,越容易出问题!(所以网络变深的时候就非常容易梯度消失)
    • 这是由于层之间是函数嵌套的关系,所以求导的时候都是乘法
    • 考虑将乘法变成加法,也就是把网络中层的嵌套,变成网络中层的并行!


现在看一下resnet是怎么解决梯度消失的问题的,绿色笔
在这里插入图片描述
假设resnet这个网络,输出用y′′y''y表示(不是yyy的二阶表示,虽然这个表示真的很有歧义),那么可以表示为:y′′=f(x)+g(f(x))y''=f(x)+g(f(x))y=f(x)+g(f(x))
其实就是那个残差链接干的事情,就是residual block的公式,g(x)=x+f(x)g(x)=x+f(x)g(x)=x+f(x),只是residual block的这个公式里的xxx,本身也是下面一个子网络的输出。
y′′=f(x)+g(f(x))g(x)=x+f(x)\begin{aligned} y''=&f(x)+g(f(x))\\ g(x)=&x+f(x) \end{aligned}y=g(x)=f(x)+g(f(x))x+f(x)对照一下这两个公式,则第二行的xxx就相当于第一行的f(x)f(x)f(x),第二行的f()f()f()就相当于第一行的g()g()g()。其实是一样的
另外,化简一下:
y′′=f(x)+g(f(x))=y+y′y''=f(x)+g(f(x))=y+y'y=f(x)+g(f(x))=y+y
那么此时求导结果其实就是:
∂y′′∂w=∂y∂w+∂y′∂w\frac{\partial y''}{\partial w}=\frac{\partial y}{\partial w}+\frac{\partial y'}{\partial w}wy=wy+wy

  • 加法的左项就是最原始的底层求导结果,右项是加了层之后的结果
  • 左边一直是那么大,右边就算乘上了高层的导数导致∂y′∂w\frac{\partial y'}{\partial w}wy整体比较小,也没关系啊,我原始的左边的导数一直存在! (右边那个乘积大小我都不care了,再小我左边还有个大的顶着呢,天塌下来高个子顶着🤓)
  • 大数+++小数还是等于大数,但是大数×\times×小数就有可能变成小数了


总结

  • 这就是这个residual connection起到的作用,这个跳转连接保证了底层的梯度,不会比加新层(梯度乘积)之前小,不一定会变大,但是一定不会变得更小。
    • 沐神的评论:resnet后面出了很多论文来分析residual connection。上周视频是从函数嵌套,这次是补了之前讲梯度时埋的一个坑。当然还有很多别的角度解释,原始论文走的是residual这一条
    • 确实看起来很像,RNN中越靠后的时间步,对前面的信息记住的越少,都是因为乘法导致的逐渐遗忘,小数越来越小(梯度消失),大数越来越大(梯度爆炸)
  • skip connection(在resnet中,叫做residual connection )。直观上来看,

在这里插入图片描述

  • 黑色线,每一个矩形+右侧的连线都是一个residual block(里面有两层卷积),
  • 最下面是输入的数据层,最上面是输出层
  • 靠近数据段的参数是比较难训练的,因为梯度消失的问题
  • 但是加入residual connection之后,靠近数据层的权重,相当于有了一条新的从yyy直接到data的高速公路(不经过卷积层这些,图中红色的线),原来的路(经过卷积层)梯度可以很小,但是有了这个跳转连接之后,有了梯度的加法,那么靠近数据层的梯度就不会很小。

这是从梯度方面对residual connection的作用进行了一个解释,之前是从函数解空间的角度



1.2 弹幕里的一些说法

1. resnet文章中说不是由于梯度消失引起的退化问题

  • 我也记得,之前都说BN是解决梯度消失的,控制每层的分布尽量一致,保证数值稳定性。
  • 参考教材文档的小结:
    • 学习嵌套函数(nested function)是训练神经网络的理想情况。在深层神经网络中,学习另一层作为恒等映射(identity function)较容易(尽管这是一个极端情况)。
    • 残差映射可以更容易地学习同一函数,例如将权重层中的参数近似为零。
    • 利用残差块(residual blocks)可以训练出一个有效的深层神经网络:输入可以通过层间的残余连接更快地向前传播。
    • 残差网络(ResNet)对随后的深层神经网络设计产生了深远影响。
  • 按照一般的说法,resnet最大的贡献就是那个梯度高速通道(借助残差块直接从上一stage输出连接到下一stage输入,即高速通道)

29.2 2. Q&A

https://www.bilibili.com/video/BV1554y157E3?p=2

2.1 学习率可不可以让靠近输出的小一些,让靠近输入的大一些,这样会不会就可以缓解梯度消失的问题?(layerwise)


  • 这个问题其实就是表达:能不能让每层的梯度都不一样(这样其实非常直接,与其间接修改为加法避免梯度减小,直接把每层的lr变得不一样,越靠近底层,lr越大,不是更直接吗?)
  • 有很多layerwise的方法,但是不好调(实用性不佳),相当于为了调节每层的学习率,要加入一个新的Hyperparameter,比如:靠近输入的要调大,调多大呢?靠近输出要调小,调多小呢?? 超参这种东西,不确定性很大,试验代价很高;
  • 相比于结构性(加一个residual block,调整网络结构)这种确定的东西,后者更加可控的一点,所以大家宁可去选择这种可控的结构tricks,也没有去选择调节超参这种吃力还不讨好的活。
  • 另外,通过调节学习率来调节参数更新是有局限性的,比如梯度算下来是个很小的数字,那如果lr调节超过float32位,那么就会出现一些数值表示的问题。(计算机的数值表示,这就是操作系统和底层指令集的问题了,不是算法工程师可以解决的了)如果使用的是float16,那问题就会更明显。

layer wise相关的资料

  • 知乎话题:Layer-Wise Training和Backpropagation有何本质区别?
  • 简书文章:栈式自编码器的无监督逐层贪婪预训练(greedy layer-wise pre training)
  • CSDN文章:深度学习: greedy layer-wise pre-training (逐层贪婪预训练)
  • 出自论文:Yoshua Bengio(AI三巨头之一)——Greedy Layer-Wise Training of Deep Networks

弹幕里一句话

rmsprop可以,我记得adagrad的learning rate就是单调递减的


推荐阅读
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 3年半巨亏242亿!商汤高估了深度学习,下错了棋?
    转自:新智元三年半研发开支近70亿,累计亏损242亿。AI这门生意好像越来越不好做了。近日,商汤科技已向港交所递交IPO申请。招股书显示& ... [详细]
  • ICRA2019最佳论文  Making Sense of Vision and Touch: SelfSupervised Learning of Multimodal Representatio
    文章目录摘要模型架构模态编码器自监督预测控制器设计策略学习控制器设计实验结论和展望会议:ICRA2019标题:《MakingSenseofVision ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
author-avatar
N个小灰流_701
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有