(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-深度学习系列)卷积神经网络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-深度学习)包含并行连结的网络(GoogLeNet)

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

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

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

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

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

(pytorch-深度学习)使用pytorch框架nn.RNN实现循环神经网络

使用pytorch框架nn.RNN实现循环神经网络 首先&#xff0c;读取周杰伦专辑歌词数据集。 import time import math import numpy as np import torch from torch import nn, optim import torch.nn.functional as Fimport sys sys.path.append("..") device torch.d…

(pytorch-深度学习)通过时间反向传播

通过时间反向传播 介绍循环神经网络中梯度的计算和存储方法&#xff0c;即通过时间反向传播&#xff08;back-propagation through time&#xff09;。 正向传播和反向传播相互依赖。正向传播在循环神经网络中比较直观&#xff0c;而通过时间反向传播其实是反向传播在循环神经…

(pytorch-深度学习)门控循环单元(GRU)

门控循环单元&#xff08;GRU&#xff09; 循环神经网络中的梯度计算 当时间步数较大或者时间步较小时&#xff0c;循环神经网络的梯度较容易出现衰减或爆炸。虽然裁剪梯度可以应对梯度爆炸&#xff0c;但无法解决梯度衰减的问题。通常由于这个原因&#xff0c;循环神经网络在…

(pytorch-深度学习)长短期记忆(LSTM)

长短期记忆&#xff08;LSTM&#xff09; LSTM 中引入了3个门&#xff0c;即 输入门&#xff08;input gate&#xff09;遗忘门&#xff08;forget gate&#xff09;输出门&#xff08;output gate&#xff09;以及与隐藏状态形状相同的记忆细胞&#xff08;某些文献把记忆细…

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

深度循环神经网络 循环神经网络只有一个单向的隐藏层&#xff0c;在深度学习应用里&#xff0c;我们通常会用到含有多个隐藏层的循环神经网络&#xff0c;也称作深度循环神经网络。 下图演示了一个有LLL个隐藏层的深度循环神经网络&#xff0c;每个隐藏状态不断传递至当前层的…

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

双向循环神经网络 一般&#xff0c;我们认为循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的&#xff0c;因此它们都将信息通过隐藏状态从前往后传递。 有时候&#xff0c;当前时间步也可能由后面时间步决定。 例如&#xff0c;当我们写下一个句子时&…

pytorch实现梯度下降、随机梯度下降-图像直观展示

深度学习与优化算法原理 优化函数与深度学习 在一个深度学习问题中&#xff0c;通常需要预先定义一个损失函数。有了损失函数以后&#xff0c;使用优化算法试图将其最小化。 在优化中&#xff0c;这样的损失函数通常被称作优化问题的目标函数&#xff08;objective function…

小批量随机梯度下降

小批量随机梯度下降 在每一次迭代中&#xff0c;梯度下降使用整个训练数据集来计算梯度&#xff0c;因此它有时也被称为批量梯度下降&#xff08;batch gradient descent&#xff09;。 随机梯度下降在每次迭代中只随机采样一个样本来计算梯度。可以在每轮迭代中随机均匀采样…

动量法解决梯度下降的一些问题

动量法 目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向&#xff0c;因此&#xff0c;梯度下降也叫作最陡下降&#xff08;steepest descent&#xff09;。在每次迭代中&#xff0c;梯度下降根据自变量当前位置&#xff0c;沿着当前位置的梯度更新自变…

深度学习AdaGrad算法

AdaGrad算法 在一般的优化算法中&#xff0c;目标函数自变量的每一个元素在相同时间步都使用同一个学习率来自我迭代。 例如&#xff0c;假设目标函数为fff&#xff0c;自变量为一个二维向量[x1,x2]⊤[x_1, x_2]^\top[x1​,x2​]⊤&#xff0c;该向量中每一个元素在迭代时都使…

深度学习优化算法:RMSProp算法

RMSProp算法 在AdaGrad算法中&#xff0c;因为调整学习率时分母上的变量st\boldsymbol{s}_tst​一直在累加按元素平方的小批量随机梯度&#xff0c;所以目标函数自变量每个元素的学习率在迭代过程中一直在降低&#xff08;或不变&#xff09;。因此&#xff0c;当学习率在迭代…

深度学习优化算法-AdaDelta算法

AdaDelta算法 除了RMSProp算法以外&#xff0c;另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进 [1]。 不一样的是&#xff0c;AdaDelta算法没有学习率这个超参数。 它通过使用有关自变量更新量平方的指数加权移动平均的项来替代…

深度学习优化算法-Adam算法

Adam算法 Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。Adam算法可以看做是RMSProp算法与动量法的结合。 算法内容 Adam算法使用了动量变量vt\boldsymbol{v}_tvt​和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量st\boldsymbol{s}_…

深度学习-计算机视觉--图像增广

图像增广 大规模数据集是成功应用深度神经网络的前提。图像增广&#xff08;image augmentation&#xff09;技术通过对训练图像做一系列随机改变&#xff0c;来产生相似但又不同的训练样本&#xff0c;从而扩大训练数据集的规模。 图像增广的另一种解释是&#xff0c;随机改…

pytorch深度学习-微调(fine tuning)

微调&#xff08;fine tuning&#xff09; 首先举一个例子&#xff0c;假设我们想从图像中识别出不同种类的椅子&#xff0c;然后将购买链接推荐给用户。一种可能的方法是先找出100种常见的椅子&#xff0c;为每种椅子拍摄1,000张不同角度的图像&#xff0c;然后在收集到的图像…