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)+x→H(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如下图所示:
在输入激活函数前,将前层网络的输入与当前层网络层的输出进行结合,这样在手动加入恒等映射的同时,还使得网络中的数据可以跨层流动,这样,对于过于deep的网络,就存在了较好的自主变换为浅层网络的可能性。
下图为原始的网络层间输入输出,可见其不同
3. 如何理解残差网络解决问题的方式
让我们思考一下一般的情况,在一般情况下,网络层数增加是会给网络模型的性能带来积极的影响。但是实验又证明深层网络可能会带来负作用,那很可能意味着,我们要得到一个最佳的、适应性最强的网络结构,就无法避免多余的网络层带来的影响。
残差结构手动引入了恒等映射,那么当网络结构是深的时,恒等映射部分就可以将一些网络层引向 F ( x ) → 0 F(x) \rightarrow 0 F(x)→0的方向,即 F ( x ) + x → x F(x) + x \rightarrow x F(x)+x→x
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=l∑L−1F(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∂ℓ=∂xL∂ℓ∂xl∂xL=∂xL∂ℓ(1+∂xl∂i=l∑L−1F(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)
∂xl∂i=l∑L−1F(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
∂xl∂∑i=lL−1F(xi,Wi)=0),输出结果也不会差于直接输出
x
x
x,这就避免了梯度消失的问题。