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)+x→H(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)+x→x
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=l∑L−1F(xi,Wi)
输入为xxx,F(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∂ℓ=∂xL∂ℓ∂xl∂xL=∂xL∂ℓ(1+∂xl∂i=l∑L−1F(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)∂xl∂i=l∑L−1F(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)=0∂xl∂∑i=lL−1F(xi,Wi)=0),输出结果也不会差于直接输出xxx,这就避免了梯度消失的问题。