为什么要使用残差?
众所周知,更深的网络会遇到退化问题,即在网络的层数达到最大值后,随着网络深度的增加,准确性会降低。并且这种准确性的降低不是由于训练集的过度拟合;因为训练误差开始增加。然而,可以证明(并且作者确实证明了)如果较浅的网络以一定的精度执行,那么任何较深的网络至少可以与较浅的网络一样好。额外的层可以只是恒等映射(什么也不做),并给出与浅层网络相同的结果。但是实验中并不是这样的。这表明优化器难以通过多个非线性层学习恒等映射。
残差的本质是将恒等映射变成了残差拟合;
深度学习网络在层数加深的过程中,会发生退化。所谓的退化,就是在训练集上和测试集上的误差都比较大,不能很好地映射输入到输出,这并非是过拟合造成的;
原本我们待拟合的映射是:
y
=
H
(
x
)
y=H(x)
y=H(x)
残差映射是:
y
=
F
(
x
)
+
x
y=F(x)+x
y=F(x)+x
则:
F
(
x
)
=
y
−
x
F(x)=y-x
F(x)=y−x
待拟合的映射是输入和输出的差;
先说结论:
对于深度网络而言,拟合残差映射比恒等映射更容易;
为什么拟合残差映射比恒等映射更容易?
我们先说恒等映射,其实就是什么都不做,但是什么都不做对于网络而言是非常困难的;
当前w=1以及偏置=0的时候,输出是等于输入的,但是网络中有很多激活层,比如relu,它会丢掉所有小于0的值,对于非线性映射,输入要跟输出相等是很困难的;
但是对于残差映射而言,参数为0、偏置为0就可以做到残差映射了;
比如我们有一个如下的网络:
我们将其增加两层:
后面的层权重和偏置为0,就可以完成参数映射了;
此外,也可以从另外一个角度理解残差映射,网络深度越深,表达能力越强,也就是我们搜索的映射输入到输出的拟合函数的解空间越大,当解空间太大的时候,难以在如此大量的参数空间找寻到拟合的函数,所以通过短接可以直接跳过某层,减小搜索的解空间,让网络更快收敛到最优解;