[论文理解]关于ResNet的进一步理解

[论文理解]关于ResNet的理解

这两天回忆起resnet,感觉残差结构还是不怎么理解(可能当时理解了,时间长了忘了吧),重新梳理一下两点,关于resnet结构的思考。

要解决什么问题

论文的一大贡献就是,证明了即使是深度网络,也可以通过训练达到很好的效果,这跟以往的经验不同,以往由于网络层数的加深,会出现梯度消失的现象。这是因为,在梯度反传的时候,由于层数太深,传递过程又是乘法传递,所以梯度值会越乘越小,梯度消失在所难免。那么怎么才能解决这个问题呢?resnet提供了很好的思路。

怎么解决

从梯度角度

这里一个block的输出变为了常规层的卷积池化加上输入,然后在激活,那么这个结构为什么可以保证深度网络能够收敛呢?

只由这么一个block其实很难看出来,只有在多个block下,才能看出他的优势。看下面的公式。

\[
对于非残差结构:\y_1 = G(F(x,w_1)) \y_1最为下一层的输入带入有y_2 = G(F(y_1,w_2))\那么我们在对w1求梯度的时候呢,根据链式法则\\frac{dy_2}{dw_1}=\frac{dy_2}{dF}*\frac{dF}{dy_1}*\frac{dy_1}{dF}*\frac{dF}{dw_1}\全是乘法,所以层数过多就很容易越乘越小。\再看看残差结构:\y_1= G(x+F(x,w_1))\y_2 = G(y_1+F(y_1,w_2))\链式求导则得到\frac{dy_2}{dw_1} =\frac{dy_2}{dy_1}*\frac{dy_1}{dF}*\frac{dF}{d_w1} + \frac{dy_2}{dF}*\frac{dF}{dy_1}*\frac{dy_1}{dF}*\frac{dF}{dw_1}\可以看到,残差网络的梯度在原来的基础上加上了当前输入项的梯度\这样梯度的贡献就由两部分组成,一部分是可以直接回传,\另一部分先经过常规操作回传,梯度变为求和项,这样由于在离出层比较近的地方梯度比较大\求和之后可以避免深度乘法对梯度的影响,即尽管后面越乘越小,对总梯度的影响也不大。
\]

从映射角度

从映射角度上来讲,resnet残差结构有助于学习恒等映射,就论文中所说,多层非线性网络是很难逼近恒等映射的,所以网络在学习过程中学习的实际上是残差函数F(x) - x,而当F(x)趋近于0时,那么就可以逼近恒等映射,完成一个skip connection,通俗地讲,就是resnet提供了两种选择,在需要的时候,可以直接跳过一些多余的卷积池化等操作,直接向后传递信息,这就是恒等映射,也可以两路传达信息,传达上一层的原始信息和加工过的信息。

所以我认为,resnet的结构使得网络有了逼近恒等映射的能力,解决了网络传播过程中信息丢失的问题,因此可以表现的这么好。

原文地址:https://www.cnblogs.com/aoru45/p/10798027.html

时间: 2024-11-09 20:14:05

[论文理解]关于ResNet的进一步理解的相关文章

seach tree的deletion的实现——对树的指针的进一步理解

一颗binary search tree,我们要在其中删除node1.而node1对应的key是,比如说,key1.删除的基本想法是什么呢? 1.找到key1对应的那个node在哪里.这个用一个迭代就可以完成了. 2.删掉这个node (1)如果这个node没有左右子树,那么直接删掉就好了. (2)如果这个node只有左子树或者右子树,那么直接让左右子树缩进上来就好了. (3)如果既有左子树又有右子树,那么就从左子树里面找出最大的node,用这个node来替换掉需要删除的那个节点. 举个栗子:有

堆排序的进一步理解

堆-顾名思义,上面小,下面大,或者上面大,下面小. 在堆排序过程中,首先应该建堆.如何将数组中的元素建立成一个规范的堆行结构. 二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆. 假设根结点的下标为1,则第 i 个结点的父结点下标为

C#中委托的进一步理解

文章介绍了委托的基本知识,接下来就进一步研究一下委托. 委托类型 其实,刚开始觉得委托类型是一个比较难理解的概念,怎么也不觉得下面的"AssembleIphoneHandler"是一个类型. 代码如下: public delegate void AssembleIphoneHandler(); 按照正常的情况,如果我们要创建一个委托类型应该是: 代码如下: public class AssembleIphoneHandler : System.MulticastDelegate { }

Java内存管理的进一步理解-模拟过程图解

Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区      方法区存放装载的类数据信息包括:      (1):基本信息:      1)每个类的全限定名       2)每个类的直接超类的全限定名(可约束类型转换)      3)该类是类还是接口      4)该类型的访问修饰符      5)直接超接口的全限定名的有序列表      (2):每个已装载类的详细信息:      1)运行时常量池:

javascript深入理解js闭包(个人理解,大神勿喷)

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

通过一个WPF实例进一步理解委托和事件

在前写过"浅谈C#中的委托"和"浅谈C#中的事件"两篇博客,内容有些抽象,似乎难以说明委托和事件的关系. 今天通过一个小程序来进一步说明二者的使用及联系. 首先新建一个WPF应用程序,取名TestDelegateAndEvent. 在.xmal中加入四个按钮,并添加Window_Loaded事件. 代码如下: <Window x:Class="TestDelegateAndEvent.MainWindow" xmlns="http

进一步理解委托

前面一篇文章介绍了委托的基本知识,接下来就进一步研究一下委托. 委托类型 其实,刚开始觉得委托类型是一个比较难理解的概念,怎么也不觉得下面的"AssembleIphoneHandler"是一个类型. public delegate void AssembleIphoneHandler(); 按照正常的情况,如果我们要创建一个委托类型应该是: public class AssembleIphoneHandler : System.MulticastDelegate { } 但是,这种写法

『cs231n』卷积神经网络的可视化与进一步理解

cs231n的第18课理解起来很吃力,听后又查了一些资料才算是勉强弄懂,所以这里贴一篇博文(根据自己理解有所修改)和原论文的翻译加深加深理解. 可视化理解卷积神经网络 原文地址 一.相关理论 本篇博文主要讲解2014年ECCV上的一篇经典文献:<Visualizing and Understanding Convolutional Networks>,可以说是CNN领域可视化理解的开山之作,这篇文献告诉我们CNN的每一层到底学习到了什么特征,然后作者通过可视化进行调整网络,提高了精度.最近两年

AutoResetEvent waitone set进一步理解补充

AutoResetEvent 的定义 //定义两个信号锁 AutoResetEvent ReadTxt = new AutoResetEvent(false); AutoResetEvent UploadTxt = new AutoResetEvent(false); 默认是false 也就是关闭状态了.这里要 理解信号 锁,实际就像某大神说的,把waitone()想象成地铁的刷卡进站,就是那个刷卡器,你用set()卡刷一次,waitone()由关闭状态进入打开状态.运行完waitone下边剩下