ResNet-残差网络二

文章目录

  • 残差结构的一般表达形式
  • 残差结构中的信息传播
    • clean path propagation
      • 前向传播
      • 反向传播
    • h(x)为恒等映射的重要性
      • h(x)的实验证明
    • 激活层的位置
  • 和其他网络的对比

上一篇讲了 ResNet 论文中的第一篇:Deep Residual Learning for Image Recognition,主要是介绍了残差网络解决了网络随着深度的增加而带来的退化问题;介绍了残差的概念及两种残差结构;最后通过丰富的实验来证明残差结构对增加网络深度,增强表达能力的准确率有足够的优化作用,而且不会带来网络退化的问题。
这一篇来说说 ResNet 论文的第二篇:Identity Mappings in Deep Residual Networks。这一篇主要描述了在标准的残差公式中,为什么能解决退化问题,其背后的逻辑是什么,而且还说明了为什么要使用恒等映射;最后讨论了一下残差结构中激活层的一些问题。
原文的描述是:In this paper, we analyze the propagation formu- lations behind the residual building blocks, which suggest that the for- ward and backward signals can be directly propagated from one block to any other block。

残差结构的一般表达形式

在上一篇中,提到了残差结构:

在这篇论文中提供了一个更加细化一点的形式:

对这个结构抽象出来一个一般化的描述公式:

y l = h ( x l ) + F ( x l , W l ) y_l=h(x_l) + F(x_l, W_l) yl=h(xl)+F(xl,Wl)

x x + 1 = f ( y l ) x_{x+1}=f(y_l) xx+1=f(yl)

其中:

  • x l x_l xl 为残差结构的输入, x l + 1 x_{l+1} xl+1 为残差结构的输出。
  • F ( x l , W l ) F(x_l, W_l) F(xl,Wl) 为残差部分,根据上一篇文章的分析,也就是卷积层部分。
  • h ( x l ) h(x_l) h(xl) 是 shortcut connection(或者是叫做 direct path,还有就是称作 skip connections,都是一个意思)对输入 x l x_l xl 的映射函数。上一篇的结构中,这个函数就被定义为 identity mapping,也被称为恒等映射。这一篇还会证明说这个是最好的选择。
  • y l y_l yl 就是残差与 shortcut connection mapping 相加。然后映射 f f f 就是对这个输出 y l y_l yl 的激活层处理,在上一篇中使用的函数定义是 ReLU 激活层。当然也可以是其他处理方式,具体使用那种处理方式也是这一篇要讨论的重点,这个建议也是使用恒等映射,后面章节会进行说明。

通过上面的公式和简单的说明,可以了解到这篇文章的主要内容就是解释和说明三个问题:

  • 为什么残差结构可以保证信息在正向和反向传播中保证信息(梯度)的传递,而且要尽量保持这条 skip connection 通路的畅通,文中叫做 clean information path。
  • 为了保证获得 clean information path,论文提出了两个条件,或者说两个建议。第一个就是上面公式中的 h h h 映射要使用恒等映射。
  • 第二个就是上面公式中的 f f f 也要采用恒等映射。通过这样两个手段来保证信息可以自由的传播。
  • F F F 作为残差结构,就是卷积层的设计了。一般来说就是前一篇中提到的两种残差结构之一了。

残差结构中的信息传播

clean path propagation

为了证明函数映射 h h h f f f都是使用恒等映射最好,论文中是采用了反证法。
论文中假设这两个函数都是使用的恒等映射,再证明如果不是恒等映射的话,性能肯定比恒等映射差。
如果两个函数是恒等映射的话,上面的公式就可以简化为:
y l = x l + F ( x l , W l ) y_l=x_l + F(x_l, W_l) yl=xl+F(xl,Wl)

x x + 1 = y l x_{x+1}=y_l xx+1=yl

也就是可以合并为:
x x + 1 = x l + F ( x l , W l ) x_{x+1}=x_l + F(x_l, W_l) xx+1=xl+F(xl,Wl)

前向传播

因为这个残差结构是一个可重叠的模块,那么假设从输入到输出之间总共有 L L L个residual block。那么最后的输出就可以由公式:
x L = x l + ∑ i = l L F ( x i , W i ) x_L=x_l+\sum_{i=l}^LF(x_i,W_i) xL=xl+i=lLF(xi,Wi)

简单的来说,深处网络的输出就是最初的输入加上各个卷积层构造的残差之和。
而如果是plain network的话,如果忽略掉激活层,输出应该是各个卷积层的矩阵的乘积:
x L = ∏ i = l L W i x l x_L=\prod_{i=l}^LW_ix_l xL=i=lLWixl

我的理解,这里的优势在于连乘会导致一些信息丢失,会变得很大或者很小。而连加的连续性和趋势就会好很多。
这样就可以比较方便的进行优化,去掉一些残差结构,增加一些残差结构,只是在残差值上有一些比较缓和的变化。

反向传播

在讨论反向传播时,假设输出层的损失值为 ϵ \epsilon ϵ
那么在梯度反向传播时,通过求导的链式法则:

这个公式可以看成两个部分:

  1. 第一部分是 ∂ ϵ ∂ L \frac{\partial{\epsilon}}{\partial L} Lϵ,这部分梯度的传播之和层数L有关,和卷积层没有关系,所以和正向传播类似,这部分梯度信息可以在层与层之间顺利的传播。
  2. 更重要的,第二部分 ∂ ∂ l ∑ i = l L − 1 F ( x i , W i ) \frac{\partial}{\partial l}\sum_{i=l}^{L-1} F(x_i, W_i) li=lL1F(xi,Wi),这部分不可能对于每个样本都会计算得到-1(如果是-1的话,梯度就等于0了,相当于就是梯度消失的情况),所以再加上前面的 ∂ ϵ ∂ L \frac{\partial{\epsilon}}{\partial L} Lϵ这一部分,就能保证梯度在反向传播的时候顺利的在层与层之间进行传播。

h(x)为恒等映射的重要性

论文接下来的部分就是通过反证法来证明使用恒等映射的必要性。
首先是 h ( x ) h(x) h(x),如果 h ( x ) h(x) h(x)不是恒等映射,而是扩展为一种稍微复杂一点的形式:
h ( x ) = λ x l h(x) = \lambda x_l h(x)=λxl
同时, f ( x ) f(x) f(x)还保持恒等映射。
那么,每个残差结构的映射关系就变成:
x l + 1 = λ x l + F ( x l , W l ) x_{l+1}=\lambda x_l + F(x_l, W_l) xl+1=λxl+F(xl,Wl)

正向传播的公式就会为:
x L = ( ∏ i = l L − 1 λ ) x l + ∑ i = l L F ^ ( x i , W i ) x_L=(\prod_{i=l}^{L-1} \lambda) x_l + \sum_{i=l}^L \hat{F}(x_i,W_i) xL=(i=lL1λ)xl+i=lLF^(xi,Wi)

反向传播的公式就是:

这里出现了一个梯度连乘的部分。这部分影响非常大:

  • 如果 λ > 1 \lambda > 1 λ>1,那么经过多层之后,连乘的效应会将梯度变得很大,这就是梯度爆炸。
  • 如果 λ < 1 \lambda < 1 λ<1,那么经过多层之后,连乘的效应会将梯度变得很小,这就是梯度消失。
  • 论文中还提到,如果 h ( x ) h(x) h(x)是更复杂的函数,那么同样会导致梯度在层与层之间的传播。我的理解就是越复杂,越不可控,越容易出问题,也越难优化。文中是通过实验比对来证明这个结果的,原文为:In the above analysis, the original identity skip connection in Eqn.(3) is replaced with a simple scaling h(xl) = λlxl If the skip connection h(xl) represents more complicated transforms (such as gating and 1×1 convolutions), in Eqn.(8)the first term becomes Q L−1 i=l h0i where h0 is the derivative of h. This product may also impede information propagation and hamper the training procedure as witnessed in the following experiments
  • 所以,恒等映射是最好的选择。

h(x)的实验证明

论文中做了下面几种实验:

  • 使用普通的 λ \lambda λ,也就是Constant scaling,而且这个还做了一下细分
    • λ = 0.5 \lambda = 0.5 λ=0.5,而且在残差部分也乘上了 1 − λ = 0.5 1-\lambda = 0.5 1λ=0.5
    • λ = 0 \lambda = 0 λ=0,而且在残差部分也乘上了 1 − λ = 1 1-\lambda = 1 1λ=1
    • λ = 1 \lambda = 1 λ=1,而且在残差部分也乘上了 1 − λ = 0 1-\lambda = 0 1λ=0

结果如下:

  • h ( x ) h(x) h(x)为一个门网络(另外一片论文中提出的),也就是 h ( x ) = g ( x ) x l h(x)=g(x) x_l h(x)=g(x)xl, g ( x ) g(x) g(x)是一个1 * 1的卷积层。所以文中提到的公式是: 1 1 + e − x ( W g x + b g ) \frac{1}{1+e^{-x}(W_gx+b_g)} 1+ex(Wgx+bg)1这个公式一看就是卷积层加softmax激活层。然后是残差结构这边乘以g(x),skip connection那边是乘以 1 − g ( x ) 1-g(x) 1g(x)

实验结果如下:


图中的 b ( g ) b(g) b(g)是门网络中需要优化的一种初始化方法,不重要。

  • 还有就是只把这个 g ( x ) g(x) g(x)应用到 h ( x ) h(x) h(x)上,残差结构不动,结果如下:

  • 最后是使用1 * 1的卷积层和dropout方法。全部的结果如下:

最后关于1 * 1卷积层的一点是,使用卷积层应该是可以提升网络的表达能力的,但是因为引入卷积层的原因导致了退化问题,这部分退化问题导致的效果把表达能力这部分带来的效果给覆盖掉了。我觉得潜台词就是如果网络比较浅的话,这里可以使用1 * 1的卷积层。

激活层的位置

接下来就就是分析 f ( x ) f(x) f(x),通过这篇论文的分析, f ( x ) f(x) f(x)使用恒等映射更好,而在前一篇里实际上是 f ( x ) = R e L U f(x) = ReLU f(x)=ReLU的。所以作者就琢磨是通过把这个ReLU层给挪个位置来实现这个恒等映射。
总共考虑了5种方式,这5种方式的验证实验室在101(2个3 * 3的那种残差结构)和164(1 * 1 + 3 * 3 + 1 * 1的这种叫做bottlenect的残差结构):

  • BN after addition,把BN层也从残差结构中挪到 f ( x ) f(x) f(x)中来。起到的是反作用。
  • ReLU before addition,把origin中的ReLU挪到了残差结构中,实现了 f ( x ) f(x) f(x)的恒等映射。但是效果也不好。看文中的意思是因为BN层改变了卷积后的分布,导致性能下降。
  • 我理解d和e的区别就是上一层的残差结构的输出是否需要先做BN,或者说先BN再加还是先加再BN。从实验结果来看,还是最后一种的效果要好一些。

然后还测试了一下最后一种效果在各个深度的网络上的结果,效果很好,而且还得到了解决过拟合问题的效果。
从图上看,相对于origin的版本,训练精度稍低,但是测试精度要高一些。

和其他网络的对比

最后,提供了一份综合的对比结果,在ILSVRC 2012验证集上的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/76599.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——反转单链表

反转单链表 题目链接 下面主要介绍两种方法&#xff1a; 方法一&#xff1a; 利用三个指针变量进行反转 具体过程如图所示&#xff1a; 注意&#xff1a;循环的结束的条件为cur NULL而不是next NULL 实现代码&#xff1a; struct ListNode* reverseList(struct ListNode* …

【C++】——内存管理

目录 回忆C语言内存管理C内存管理方式new deleteoperator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)malloc/free和new/delete的区别 回忆C语言内存管理 void Test() {int* p1 (int*)malloc(sizeof(int));free(p1);int* p2 (int*)calloc(4…

解决Linux下PyCharm无法新建文件

一、问题描述 如图&#xff0c;在Ubuntu Linux系统中使用pycharm管理项目时&#xff0c;提示无法新建.py源文件&#xff1a; 二、问题解决 将问题定性为文件夹&#xff08;目录&#xff09;权限问题&#xff0c;在终端中打开项目文件夹的上级目录&#xff0c;将整个项目目录的…

mysql按照日期分组统计数据

目录 前言按天统计按周统计按月统计按年统计date_format参数 前言 mysql的date_format函数想必大家都使用过吧&#xff0c;一般用于日期时间转化 # 例如 select DATE_FORMAT(2023-01-01 08:30:50,%Y-%m-%d %H:%i:%s) # 可以得出 2023-01-01 08:30:50# 或者是 select DATE_FOR…

【vue】vue-image-lazy图片懒加载使用与介绍【超详细+npm包源代码】

简介 当前插件是基于vue3&#xff0c;写的一个图片懒加载&#xff0c;文章最下方是npm包的源码&#xff0c;你可以自己拿去研究和修改&#xff0c;如有更好的想法可以留言&#xff0c;如果对你有帮助&#xff0c;可以点赞收藏和关注&#xff0c;谢谢。 后续会添加图片放大和切…

98. Python基础教程:try...except...finally语句

【目录】 文章目录 1. try...except...finally语法介绍2. try...except...finally执行顺序3. 捕获特定类型的异常4. 捕获所有类型的异常5. 实操练习-打开txt文件并输出文件内容 【正文】 在今天的课程中&#xff0c;我们将学习Python中的异常处理语句try...except...finally。 …

Mock.js的基本使用方法

官网网址&#xff1a;Mock.js (mockjs.com) 当前端工程师需要独立于后端并行开发时&#xff0c;后端接口还没有完成&#xff0c;那么前端怎么获取数据&#xff1f; 这时可以考虑前端搭建web server自己模拟假数据&#xff0c;这里我们选第三方库mockjs用来生成随机数据&#xf…

IDEA偶尔编译的时候不识别lombok

偶尔IDEA启动项目的时候会识别不到lombok,识别不到get()跟set()方法 方案 在settings添加下面代码 -Djps.track.ap.dependenciesfalse

数据安全治理的关键-数据分类分级工具

强大的资产发现能力 多种资产发现方式的组合应用&#xff0c;能够最大程度地提高资产发现能力。 灵活的敏感数据分类分级规则 内置丰富的敏感数据分类分级规则&#xff0c;支持正则表达式、关键词组、非结构化指纹、结构化指纹、机器聚类等多种匹配方式&#xff0c;并且规则…

HDFS的QJM方案

Quorum Journal Manager仲裁日志管理器 介绍主备切换&#xff0c;脑裂问题解决---ZKFailoverController&#xff08;zkfc&#xff09;主备切换&#xff0c;脑裂问题解决-- Fencing&#xff08;隔离&#xff09;机制主备数据状态同步问题解决 HA集群搭建集群基础环境准备HA集群规…

Linux中的firewall-cmd

2023年8月4日&#xff0c;周五上午 目录 打开端口关闭端口查看某个端口是否打开查看当前防火墙设置firewall-cmd中的服务在防火墙中什么是服务&#xff1f;为什么会有服务&#xff1f;打开或关闭服务查看某个服务是否打开firewall-cmd中的 zones查看所有可用的zones&#xff0…

面试之多线程案例(四)

1.单例模式 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时&#xff0c;为了防止频繁地创建对象使得内存飙升&#xff0c;单例模式可以让程序仅在内存中创建一个对象&#xff0c;让所有需要调用的地方都共享这一单例对象。…

python实现自动化检查谁没交作业

作为一个学委总是被查谁没交作业这种事所困扰&#xff0c;python写一个小程序帮我自动化查谁没交作业 用python实现的&#xff0c;因为find函数都可以直接找出文件名中的名字&#xff0c;最后代码量都不到40行 文件名乱七八槽的也可以识别&#xff0c;只要文件名带学生姓名就可…

WAF绕过-漏洞利用篇-sql注入+文件上传-过狗

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…

多赛道出海案例,亚马逊云科技为企业提供全新解决方案实现高速增长

数字化浪潮之下&#xff0c;中国企业的全球化步伐明显提速。从“借帆出海”到“生而全球化”&#xff0c;中国企业实现了从低端制造出口&#xff0c;向技术创新和品牌先导的升级。为助力中国企业业务高效出海&#xff0c;亚马逊云科技于2023年6月9日在深圳大中华喜来登酒店举办…

【JS】实现系统取色器

效果 使用环境说明 根据当前的信息&#xff0c;截至到 2023 年 8 月&#xff0c;以下是一些支持使用 new EyeDropper() 的主要浏览器&#xff08;可能还有其他浏览器也提供了类似的功能&#xff09;&#xff1a; Google Chrome&#xff1a;从 Chrome 94 版本开始引入了 new Ey…

【数据结构|二叉树遍历】递归与非递归实现前序遍历、中序遍历、后序遍历

递归与非递归实现二叉树的前序遍历、中序遍历、后序遍历。 二叉树图 定义 前序遍历&#xff08;Preorder Traversal&#xff09;&#xff1a; 前序遍历的顺序是先访问根节点&#xff0c;然后按照先左后右的顺序访问子节点。对于上面的二叉树&#xff0c;前序遍历的结果是&…

Java三大特征之继承【超详细】

文章目录 一、继承概念二、继承的语法三、父类成员访问3.1子类中访问父类的成员变量3.2子类和父类成员变量同名3.3子类中访问父类的成员方法 四、super关键字五、子类构造方法六、super和this七、再谈初始化八、protected 关键字九、继承方式十、final 关键字十一、继承与组合 …

npm install报错 -> npm ERR! Unexpected token ‘.‘ 报错解决办法

问题原因&#xff1a; 用nvm1.1.7的版本安装了16.x以上的node, 然后再下载依赖的时候就报错了&#xff1b;总结一下就是nvm版本太低了&#xff0c;他的里面没有集成高版本node导致的。 解决办法&#xff1a; 把nvm切换到新版本就行了。 1. 卸载掉当前所有的node nvm unins…

06 HTTP(下)

06 HTTP&#xff08;下&#xff09; 介绍服务器如何响应请求报文&#xff0c;并将该报文发送给浏览器端。介绍一些基础API&#xff0c;然后结合流程图和代码对服务器响应请求报文进行详解。 基础API部分&#xff0c;介绍stat、mmap、iovec、writev。 流程图部分&#xff0c;描…