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

ResNet残差网络的理解

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

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

该思想的起源是训练深度网络中发现的一个问题,即在一定的深度下,深层网络的训练误差可能大于浅层网络的训练误差
ℓ ( F s h a l l o w ( o u t p u t ) , t a r g e t ) < ℓ ( F d e e p ( o u t p u t , t a r g e t ) ) \ell(F_{shallow}(output),target)<\ell(F_{deep}(output,target)) (Fshallow(output),target)<(Fdeep(output,target))

我们一般认为,在一定的范围内,网络深度增加对拟合模型是有积极效应的,但是作者通过实验证明,在同一个问题场景下(基于CIFAR-10数据集),训练的20层和56层的网络在性能上,56层的网络的训练误差和测试误差均大于20层的网络,这说明了并不是网络深度增加带来的过拟合导致的误差提升,那么问题出在哪呢?
ℓ t r a i n ( F 20 ( o u t p u t ) , t a r g e t ) < ℓ t r a i n ( F 56 ( o u t p u t , t a r g e t ) ) \ell_{train}(F_{20}(output),target)<\ell_{train}(F_{56}(output,target)) train(F20(output),target)<train(F56(output,target))
ℓ t e s t ( F 20 ( o u t p u t ) , t a r g e t ) < ℓ t e s t ( F 56 ( o u t p u t , t a r g e t ) ) \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 ) → x F(x) \rightarrow x F(x)x
即输入等于输出

不难理解,问题很可能是因为,在56层的网络结构中,没有很好的实现恒等映射,即网络层很难拟合恒等映射函数 F ( x ) → x F(x)\rightarrow x F(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 ) + x F(x) + x F(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 ) − x H(x) - x H(x)x,即
F ( x ) → H ( x ) − x F(x) \rightarrow H(x) - x F(x)H(x)x
以此为理解的residual block如下图所示:

(pytorch-深度学习系列)ResNet残差网络的理解-学习笔记_第1张图片
在输入激活函数前,将前层网络的输入与当前层网络层的输出进行结合,这样在手动加入恒等映射的同时,还使得网络中的数据可以跨层流动,这样,对于过于deep的网络,就存在了较好的自主变换为浅层网络的可能性。

下图为原始的网络层间输入输出,可见其不同
(pytorch-深度学习系列)ResNet残差网络的理解-学习笔记_第2张图片

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

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

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

4. 为什么ResNet容易优化

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

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

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

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

如果进行求梯度操作:

∂ ℓ ∂ x l = ∂ ℓ ∂ x L ∂ x L ∂ x l = ∂ ℓ ∂ x L ( 1 + ∂ ∂ x l ∑ i = l L − 1 F ( x i , W i ) ) \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项组成:
1 1 1
∂ ∂ x l ∑ i = l L − 1 F ( x i , W i ) \frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i,W_i) xli=lL1F(xi,Wi)
即使网络的梯度为0( ∂ ∂ x l ∑ i = l L − 1 F ( x i , W i ) = 0 \frac{\partial}{\partial x_l}\sum_{i=l}^{L-1}F(x_i,W_i)=0 xli=lL1F(xi,Wi)=0),输出结果也不会差于直接输出 x x x,这就避免了梯度消失的问题。

你可能感兴趣的:(DeepLearning学习,大学学习,网络,机器学习,深度学习,人工智能,神经网络)