ResNet-残差网络二

news2024/11/19 1:38:08

文章目录

  • 残差结构的一般表达形式
  • 残差结构中的信息传播
    • 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.coloradmin.cn/o/836791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+django+mysql项目实践二(前端及数据库)

python项目实践 环境说明&#xff1a; Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 前端模板 添加模板 在templates下创建 views文件中添加 创建数据库 连接数据库 在setting文件中进行配置 创建表

mybatisplus之setSql动态更新语句

一、概念 这是mybatis-plus官方文档介绍 二、具体实现 1.我们定义这样一个接口 PostMapping ("update")public boolean update(Integer id,boolean demo){return studentservice.update(id,demo);} 2.impl public boolean update(Integer id,boolean demo) {retu…

Redis 安装以及配置隧道连接

目录 1.CentOS 1. 安装Redis 2. Redis 启动和停⽌ 3. 操作Redis 2.Ubuntu 1. 安装Redis 2. Redis 启动/停⽌ 3. 操作 Redis 3.开启隧道 3.1 Xshell 配置隧道 3.2 windTerm 配置隧道 3.3 FinalShell配置隧道 4.可视化客户端连接 Another Redis Desktop Manager 1.Cen…

【C++】数据结构与算法:常用排序算法

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍常用排序算法。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#x1…

【如何提高在浏览器时的专注力!去广告和新闻!】如何使用浏览器时看不到任何新闻以及广告【浏览器去除广告和新闻】

如何使用浏览器时看不到任何新闻以及广告 1. 使用chrome浏览器或者其他浏览器都可以2. 使用bing搜索3. 去广告 1. 使用chrome浏览器或者其他浏览器都可以 2. 使用bing搜索 bing 3. 去广告

“RISC-V成长日记” blog发布,第一个运行在RISC-V服务器上的blog?

尽管推特、公众号、微博、抖音等社交平台风靡一时&#xff0c;但blog&#xff08;博客&#xff09;在全世界依然经久不衰&#xff0c;尤其是在技术领域。对于博主而言&#xff0c;博客是他们独立创作的天地&#xff0c;可以随时更新内容和故事&#xff0c;确保素材的时效性。此…

突破传统监测模式:业务状态监控HM的新思路 | 京东云技术团队

一、传统监控系统的盲区&#xff0c;如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性&#xff0c;关于一致性的补偿&#xff0c;已经由算法部的大佬总结过就不再赘述。这里主要讲如何去补偿&#xff1f;补偿的方案哪些&#xff1f;这就…

利用OpenCV实现图像拼接

一、介绍 图像拼接. 二、分步实现 要实现图像拼接&#xff0c;简单来说有以下几步&#xff1a; 对每幅图进行特征点提取对对特征点进行匹配进行图像配准把图像拷贝到另一幅图像的特定位置对重叠边界进行特殊处理 PS&#xff1a;需要使用低版本的opencv&#xff0c;否则无法使…

模拟电路基础知识笔记(106条精心总结),收藏这些就够了!

大家总说模电学不会&#xff0c;IC修真院为大家整理了106个模拟电路基础小常识&#xff0c;看看你掌握了多少&#xff0c;文末可以获取全部哦。 文末可领全部文档 1、 纯净的单晶半导体又称本征半导体&#xff0c;其内部载流子自由电子空穴的数量相等的。 2、 射极输出器属…

RPC原理与Go RPC详解

文章目录 RPC原理与Go RPC什么是RPC本地调用RPC调用HTTP调用RESTful API net/rpc基础RPC示例基于TCP协议的RPC使用JSON协议的RPCPython调用RPC RPC原理 RPC原理与Go RPC 什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;即远程过程调用。它允许像调用…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十六天 46/50【扑克牌思维题】【队列】【贪心】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

银河麒麟v10 vnc环境配置

方法一、启用自带远程桌面 银河麒麟默认已经自带远程桌面&#xff0c;如下图。此时即可用Realvnc Viewer访问该终端&#xff0c;仔细查看后自带的远程桌面是开源组件gnome-remote-desktopGNOME / gnome-remote-desktop GitLabhttps://gitlab.gnome.org/GNOME/gnome-remote-de…

war包方式安装linux和windows的geoserver

注意&#xff1a; 从Java 9开始&#xff0c;Oracle已经不再单独提供JRE&#xff08;Java Runtime Environment&#xff09;了&#xff0c;而是直接将JRE集成在JDK&#xff08;Java Development Kit&#xff09;中。这是因为JRE包含了运行Java程序所需的环境&#xff0c;而JDK除…

SpringBoot第30讲:SpringBoot集成MySQL - MyBatis-Plus基于字段隔离的多租户

SpringBoot第30讲&#xff1a;SpringBoot集成MySQL - MyBatis-Plus基于字段隔离的多租户 本文是SpringBoot第30讲&#xff0c;主要介绍 MyBatis-Plus的基于字段隔离的多租户实现&#xff0c;以及MyBatis-Plus的基于字段的隔离方式实践和原理。 文章目录 SpringBoot第30讲&#…

实例详解如何选择滤波算法

在机器视觉中,图像滤波器无处不在。例如,它们用于减少图像噪声,改善对比度或检测边缘。本文将向您介绍MVTec HALCON中一些最常用的滤波器,它们是如何工作的以及可以用于什么。 mean_image:均值滤波器 首先,我们读取具有背景纹理的示例图像。我们的目标是在不改变实际信…

OpenLayers实战,OpenLayers获取移动端精确定位,OpenLayers适配App混合H5方式调用手机定位位置并定位到指定点

专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解OpenLayers如何获取移动端精确定位位置。不使用任何native本地方法,只使用纯js实现。 本篇文章适用于App混合H5方式调用手机精确定位,打包时需要选择GPS位置权限,手机获取定位过程中会弹出是否允许定位的权限提示。 …

健身计划:用思维导图记录你的健身目标、锻炼项目、时间安排等

现在&#xff0c;大家越来越在乎自己的身体健康&#xff0c;健身也成了大家工作之外非常重要的一件事。一个好的健身计划的制定可以让我们的健身计划事半功倍。 思维导图作为一种高效的可视化思维工具&#xff0c;在健身计划制定的过程中&#xff0c;可以让我们的各项任务与时间…

人类机器人编程的心理机制(二)

\qquad 本文是关于“人类机器人编程的心理机制”讨论的第二部分&#xff0c;内容包括&#xff1a; 程序员内化和无意识记忆海量记忆存储宿主编程Self-状态(s)与宿主的接口恐惧条件反射下的无意识记忆恐惧条件反射是T.B.M.C的工作基础 \qquad 注释&#xff1a;本文基本内容主要…

Java稀疏数组

稀疏的概述 当一个数组中大部分元素为0&#xff0c;或者为同一值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方式是&#xff1a; 记录数组一共有几行几列&#xff0c;有多少个不同值 把具有不同值的元素和行列及值记录在一个小规模的数组中&#xff0c…

docker 部署mysql 5.6集群

docker搭建mysql的集群&#xff08;一主双从&#xff09; 1.拉取镜像 docker pull mysql:5.6 2.启动master容器 docker run -it -d --name mysql_master -p 3306:3306 --ip 192.168.162.100 \ -v /data/mysql_master/mysql:/var/lib/mysql \ -v /data/mysql_master/conf.d…