(pytorch-深度学习系列)ResNet残差网络的理解-学习笔记

ResNet残差网络的理解

ResNet伴随文章 Deep Residual Learning for Image Recognition 诞生,该文章是MSRA何凯明团队在2015年ImageNet上使用的网络,在当年的classification、detection等比赛中,ResNet均获了第一名,这也导致了ResNet声名鹊起。

1. 提出ResNet的背景:出了什么问题

该思想的起源是训练深度网络中发现的一个问题,即在一定的深度下,深层网络的训练误差可能大于浅层网络的训练误差
ℓ(Fshallow(output),target)<ℓ(Fdeep(output,target))\ell(F_{shallow}(output),target)<\ell(F_{deep}(output,target))(Fshallow(output),target)<(Fdeep(output,target))

我们一般认为,在一定的范围内,网络深度增加对拟合模型是有积极效应的,但是作者通过实验证明,在同一个问题场景下(基于CIFAR-10数据集),训练的20层和56层的网络在性能上,56层的网络的训练误差和测试误差均大于20层的网络,这说明了并不是网络深度增加带来的过拟合导致的误差提升,那么问题出在哪呢?
ℓtrain(F20(output),target)<ℓtrain(F56(output,target))\ell_{train}(F_{20}(output),target)<\ell_{train}(F_{56}(output,target))train(F20(output),target)<train(F56(output,target))
ℓtest(F20(output),target)<ℓtest(F56(output,target))\ell_{test}(F_{20}(output),target)<\ell_{test}(F_{56}(output,target))test(F20(output),target)<test(F56(output,target))
如果假设20层的网络结构在这个数据集上是最佳的网络层数,那么理论上来说增加了网络层数不会提升性能,但至少不会导致性能下降,哪怕该网络前20层网络实现与20层的网络结构相同的输出,后面36层网络都只进行恒等映射也是可以达到与20层的网络模型相同的拟合效果的(当然这种情况只是一个便于理解的假设)。

恒等映射就是:对于映射F(x)F(x)F(x):
F(x)→xF(x) \rightarrow xF(x)x
即输入等于输出

不难理解,问题很可能是因为,在56层的网络结构中,没有很好的实现恒等映射,即网络层很难拟合恒等映射函数F(x)→xF(x)\rightarrow xF(x)x

2. 什么是残差网络

假设F(x)F(x)F(x)代表包含几层网络的映射,该网络试图将该映射拟合到一个目标映射H(x)H(x)H(x),即使得F(x)F(x)F(x)逼近H(x)H(x)H(x)
F(x)→H(x)F(x) \rightarrow H(x)F(x)H(x)
前面说到,问题可能是由于网络层不能很好的拟合恒等映射,但是如果我们将思路转变为F(x)+xF(x) + xF(x)+x逼近H(x)H(x)H(x),即
F(x)+x→H(x)F(x) + x \rightarrow H(x)F(x)+xH(x)
那么就相当于手动将恒等映射作为网络的一部分,也就相当于使得F(x)F(x)F(x)逼近H(x)−xH(x) - xH(x)x,即
F(x)→H(x)−xF(x) \rightarrow H(x) - xF(x)H(x)x
以此为理解的residual block如下图所示:

在这里插入图片描述
在输入激活函数前,将前层网络的输入与当前层网络层的输出进行结合,这样在手动加入恒等映射的同时,还使得网络中的数据可以跨层流动,这样,对于过于deep的网络,就存在了较好的自主变换为浅层网络的可能性。

下图为原始的网络层间输入输出,可见其不同
在这里插入图片描述

3. 如何理解残差网络解决问题的方式

让我们思考一下一般的情况,在一般情况下,网络层数增加是会给网络模型的性能带来积极的影响。但是实验又证明深层网络可能会带来负作用,那很可能意味着,我们要得到一个最佳的、适应性最强的网络结构,就无法避免多余的网络层带来的影响

残差结构手动引入了恒等映射,那么当网络结构是深的时,恒等映射部分就可以将一些网络层引向F(x)→0F(x) \rightarrow 0F(x)0的方向,即F(x)+x→xF(x) + x \rightarrow xF(x)+xx

4. 为什么ResNet容易优化

ResNet就是通过残差恒等映射,只学习输入与输出之间的残差与输入间的关系,构建了一个更容易优化的模型
假设当前层数的网络已经达到了最优的网络状态,如果此时加深网络,模型的效果反而会变差,如果只是学习residual mapping,那么就可能会将这条通路变为0,而另一条路径identity mapping就会变成直连的,模型就仍是最优状态。
而对于非残差的结构,则需要在几个堆叠的非线性层学习出一个近似恒等映射,来保证模型性能不变,这必然是低效的。
简单来说,学习残差模块变为直连这个过程是相对简单的(对比于拟合恒等映射)

5. 为什么ResNet不容易出现梯度问题

网络越深,梯度就越容易出问题,shotcut的方式一定程度上缩短了损失的反向传播路径,减小了梯度风险
对于残差块:
xL=xl+∑i=lL−1F(xi,Wi)x_L = x_l + \sum_{i=l}^{L-1}F(x_i, W_i)xL=xl+i=lL1F(xi,Wi)

输入为xxxF(x)F(x)F(x)是正向传播的映射

如果进行求梯度操作:

∂ℓ∂xl=∂ℓ∂xL∂xL∂xl=∂ℓ∂xL(1+∂∂xl∑i=lL−1F(xi,Wi))\frac{\partial \ell}{\partial x_l} = \frac{\partial \ell}{\partial x_L}\frac{\partial x_L}{\partial x_l}= \frac{\partial \ell}{\partial x_L}\left(1+\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i,W_i)\right)xl=xLxlxL=xL(1+xli=lL1F(xi,Wi))
反向传播的梯度由2项组成:
111
∂∂xl∑i=lL−1F(xi,Wi)\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i,W_i)xli=lL1F(xi,Wi)
即使网络的梯度为0(∂∂xl∑i=lL−1F(xi,Wi)=0\frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i,W_i)=0xli=lL1F(xi,Wi)=0),输出结果也不会差于直接输出xxx,这就避免了梯度消失的问题。

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

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

相关文章

(pytorch-深度学习系列)pytorch构造深度学习模型-学习笔记

pytorch构造深度学习模型 1. 通过继承module类的方式来构造模型 Module类是nn模块里提供的一个模型构造类&#xff0c;是所有神经网络模块的基类。 可以继承基类并重构 __init()__函数和forward()forward()forward()函数的方式来构造模型。 以下是一个构造一个模型的例子&am…

(pytorch-深度学习系列)模型参数的初始化与访问操作-学习笔记

模型参数的初始化与访问操作 学习 如何初始化以及访问模型参数&#xff0c;以及如何在多层之间共享模型参数 首先定义一个含有单个隐藏层的多层感知机&#xff0c;使用默认方式初始化该模型的参数&#xff0c;并且进行一次前向计算&#xff1a; import torch from torch impo…

(pytorch-深度学习系列)pytorch实现自定义网络层,并自设定前向传播路径-学习笔记

pytorch实现自定义网络层&#xff0c;并自设定前向传播路径-学习笔记 1. 不包含模型参数的自定义网络层 首先我们自定义一个网络层&#xff0c; 定义一个网络层&#xff0c;使其不包含模型参数&#xff0c;并在forward()函数中进行运算&#xff1a; import torch from torc…

(pytorch-深度学习系列)读取和存储数据-学习笔记

读取和存储数据 我们可以使用pt文件存储Tensor数据&#xff1a; import torch from torch import nnx torch.ones(3) torch.save(x, x.pt)这样我们就将数据存储在名为x.pt的文件中了 我们可以从文件中将该数据读入内存&#xff1a; x2 torch.load(x.pt) print(x2)还可以存…

(pytorch-深度学习系列)pytorch使用GPU计算-学习笔记

pytorch使用GPU计算 在之前的blog中早已经讲过如何配置pytorch的GPU加速环境 查看GPU加速是否可用&#xff1a; import torch from torch import nnprint(torch.cuda.is_available()) # true 查看GPU是否可用print(torch.cuda.device_count()) #GPU数量&#xff0c; 1torch.…

(pytorch-深度学习系列)CNN二维卷积层-学习笔记

二维卷积层 在二维互相关运算中&#xff0c;卷积窗口从输入数组的最左上方开始&#xff0c;按从左往右、从上往下的顺序&#xff0c;依次在输入数组上滑动。当卷积窗口滑动到某一位置时&#xff0c;窗口中的输入子数组与核数组按元素相乘并求和&#xff0c;得到输出数组中相应…

(pytorch-深度学习系列)卷积神经网络中的填充(padding)和步幅(stride)

卷积神经网络中的填充(padding)和步幅(stride) 之前写过一篇blog&#xff0c;描述CNN网络层的输入和输入尺寸的计算关系&#xff0c;但是并没有描述的很全面&#xff0c;这里全面描述了影响输出尺寸的两个超参数padding和stride&#xff0c;查阅了相关资料&#xff0c;编码理解…

(pytorch-深度学习系列)CNN的多输入通道和多输出通道

CNN的多输入通道和多输出通道 之前的输入都视为二维数组&#xff0c;但是真实数据往往具有更高的维度&#xff0c;彩色图像有RGB三个颜色通道&#xff0c;那么这个图像&#xff08;高为h&#xff0c;宽为w&#xff09;可以表示为3∗h∗w3*h*w3∗h∗w的多维数组&#xff0c;一般…

(pytorch-深度学习系列)CNN中的池化层-学习笔记

CNN中的池化层 首先&#xff0c;池化&#xff08;pooling&#xff09;层的提出是为了缓解卷积层对位置的过度敏感性。 什么意思&#xff1f; 比如在图像边缘检测问题中&#xff0c;实际图像里&#xff0c;我们的目标物体不会总出现在固定位置&#xff0c;即使我们连续拍摄同…

(pytorch-深度学习系列)卷积神经网络LeNet-学习笔记

卷积神经网络LeNet 先上图&#xff1a;LeNet的网络结构 卷积(6个5∗5的核)→降采样(池化)(2∗2的核&#xff0c;步长2)→卷积(16个5∗5的核)→降采样(池化)(2∗2的核&#xff0c;步长2)→全连接16∗5∗5→120→全连接120→84→全连接84→10\begin{matrix}卷积 \\ (6个5*5的核…

(pytorch-深度学习系列)深度卷积神经网络AlexNet

深度卷积神经网络AlexNet 文字过多&#xff0c;但是重点已经标出来了 背景 在LeNet提出后的将近20年里&#xff0c;神经网络一度被其他机器学习方法超越&#xff0c;如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩&#xff0c;但是在更大的真实数据集上的表现并…

(pytorch-深度学习系列)使用重复元素的网络(VGG)

使用重复元素的网络&#xff08;VGG&#xff09; VGG的名字来源于论文作者所在的实验室Visual Geometry Group&#xff0c;VGG提出了可以通过重复使用简单的基础块来构建深度模型的思路。 VGG Block(VGG 块) VGG块的组成规律是&#xff1a;连续使用数个相同的填充为1、窗口形…

(pytorch-深度学习系列)网络中的网络(NiN)

网络中的网络&#xff08;NiN&#xff09; LeNet、AlexNet和VGG在设计上的共同之处是&#xff1a;先以由卷积层构成的模块充分抽取空间特征&#xff0c;再以由全连接层构成的模块来输出分类结果。其中&#xff0c;AlexNet和VGG对LeNet的改进主要在于如何对这两个模块加宽&…

(pytorch-深度学习)包含并行连结的网络(GoogLeNet)

包含并行连结的网络&#xff08;GoogLeNet&#xff09; 在2014年的ImageNet图像识别挑战赛中&#xff0c;一个名叫GoogLeNet的网络结构大放异彩。它虽然在名字上向LeNet致敬&#xff0c;但在网络结构上已经很难看到LeNet的影子。GoogLeNet吸收了NiN中网络串联网络的思想&#…

(pytorch-深度学习)批量归一化

批量归一化 批量归一化&#xff08;batch normalization&#xff09;层能让较深的神经网络的训练变得更加容易 通常来说&#xff0c;数据标准化预处理对于浅层模型就足够有效了。随着模型训练的进行&#xff0c;当每层中参数更新时&#xff0c;靠近输出层的输出较难出现剧烈变…

(pytorch-深度学习)实现残差网络(ResNet)

实现残差网络(ResNet) 我们一般认为&#xff0c;增加神经网络模型的层数&#xff0c;充分训练后的模型理论上能更有效地降低训练误差。理论上&#xff0c;原模型解的空间只是新模型解的空间的子空间。也就是说&#xff0c;如果我们能将新添加的层训练成恒等映射f(x)xf(x) xf(…

(pytorch-深度学习)实现稠密连接网络(DenseNet)

稠密连接网络&#xff08;DenseNet&#xff09; ResNet中的跨层连接设计引申出了数个后续工作。稠密连接网络&#xff08;DenseNet&#xff09;与ResNet的主要区别在于在跨层连接上的主要区别&#xff1a; ResNet使用相加DenseNet使用连结 ResNet&#xff08;左&#xff09;…

(pytorch-深度学习)语言模型-学习笔记

语言模型 自然语言处理中最常见的数据是文本数据。我们可以把一段自然语言文本看作一段离散的时间序列。 假设一段长度为TTT的文本中的词依次为w1,w2,…,wTw_1, w_2, \ldots, w_Tw1​,w2​,…,wT​&#xff0c;那么在离散的时间序列中&#xff1a; wtw_twt​&#xff08;1≤t…

(pytorch-深度学习)循环神经网络

循环神经网络 在nnn元语法中&#xff0c;时间步ttt的词wtw_twt​基于前面所有词的条件概率只考虑了最近时间步的n−1n-1n−1个词。如果要考虑比t−(n−1)t-(n-1)t−(n−1)更早时间步的词对wtw_twt​的可能影响&#xff0c;需要增大nnn。 这样模型参数的数量将随之呈指数级增长…

配置jupyter-pytorch深度学习环境

配置jupyter-pytorch深度学习环境 安装anaconda3新建环境&#xff0c;命名为pytorch在虚拟环境里安装jupyter activate pytorch pip install jupyter安装可视化插件&#xff0c;ipywidgets&#xff0c;并且关联 pip install ipywidgets jupyter nbextension enable --py wid…