ResNet-V2
Introduction
分析了在残差单元间的传播后,我们可以知道当我们用了恒等映射作为skip connection以及在addition之后做激活,信号在网络间的前向和后向传播可以直接从一个节点到另一个节点。
在残差神经网络的传播过程中,节点间的信息传递也十分重要,V2就在skip-connection以及activation在残差单元的位置做了全面的比较,并且提出了一个新的改进模型。
y
l
=
h
(
x
l
)
+
F
(
x
l
,
ω
l
)
y_l = h(x_l) + F(x_l, \omega_l)
yl=h(xl)+F(xl,ωl)
x
l
+
1
=
f
(
y
l
)
x_{l+1} = f(y_l)
xl+1=f(yl)
h(x) 是identity mapping, f是ReLu 函数。
如果h(x) 和 f(x)都是恒等映射,那么信号的传递会直接从一个节点到下一个节点,包括前向传递和后向传递。
恒等映射实现了最快的误差下降以及最低的训练误差。
放缩,gating,以及1*1的卷积做shortcut connection都会使训练误差上升。
在ResNet-V2中,提出了一个新的概念, pre-activation,也就是把激活函数(Relu以及BN)放在weight layer 之前,相比于传统的post-activation的概念来说,这样的概念创造了一个新的残差单元,这个设计提升了很多ResNet的性能。
Original Residual unit是:
y
l
=
h
(
x
l
)
+
F
(
x
l
,
ω
l
)
y_l = h(x_l) + F(x_l, \omega_l)
yl=h(xl)+F(xl,ωl)
x
l
+
1
=
f
(
y
l
)
x_{l+1} = f(y_l)
xl+1=f(yl)
F是两个3*3的卷积层,f是Relu
假设我们把f 同样设置为恒等映射,也就是 x l + 1 ≡ y l x_{l+1}≡y_l xl+1≡yl, 这样我们就能将上述两个方程合并成
x l + 1 = x l + F ( x l , ω l ) x_{l+1} = x_l + F(x_l, \omega_l) xl+1=xl+F(xl,ωl)
那么我们递推下去之后,可以得到:
X
L
=
x
l
+
∑
i
=
l
L
−
1
F
(
x
i
,
ω
i
)
X_L = x_l + \sum^{L-1}_{i=l}F(x_i, \omega_i)
XL=xl+∑i=lL−1F(xi,ωi)
任意深度的一层L都可以通过比他浅层的l层来加上他们之间累加的残差层得到。
这个递推式也可以让我们得到一个良好的后向传播的性质。我们把loss记做ε,根据链式法则,我们可以得到
∂
ϵ
∂
x
l
=
∂
ϵ
∂
x
L
∂
x
L
∂
x
l
=
∂
ϵ
∂
x
L
(
1
+
∂
ϵ
∂
x
l
∑
L
−
1
i
=
l
F
(
x
i
,
ω
i
)
)
\frac{\partial\epsilon}{\partial x_l} = \frac{\partial\epsilon}{\partial x_L}\frac{\partial x_L}{\partial x_l} = \frac{\partial\epsilon}{\partial x_L}(1+\frac{\partial\epsilon}{\partial x_l}\sum^{L-1}{i=l}F(x_i, \omega_i))
∂xl∂ϵ=∂xL∂ϵ∂xl∂xL=∂xL∂ϵ(1+∂xl∂ϵ∑L−1i=lF(xi,ωi))
也就是说 ∂ ϵ ∂ x l \frac{\partial\epsilon}{\partial x_l} ∂xl∂ϵ可以通过分解得到两个相加式,一个是 ∂ ϵ ∂ x L \frac{\partial\epsilon}{\partial x_L} ∂xL∂ϵ, 直接信息传递,不考虑其他任何中间层的权重,另一个是 ∂ ϵ ∂ x L ( ∂ ϵ ∂ x l ∑ L − 1 i = l F ( x i , ω i ) ) \frac{\partial\epsilon}{\partial x_L}(\frac{\partial\epsilon}{\partial x_l}\sum^{L-1}{i=l}F(x_i, \omega_i)) ∂xL∂ϵ(∂xl∂ϵ∑L−1i=lF(xi,ωi)), 这个是通过所有中间层的传播的。
第一个式子保证了信息可以反向传播至任意浅层l,也就是梯度在经过mini-batch之后,不会发生消失的问题,因为在整个mini-batch中的所有sample里 ∂ ϵ ∂ x l ∑ L − 1 i = l F ( x i , ω i ) \frac{\partial\epsilon}{\partial x_l}\sum^{L-1}{i=l}F(x_i, \omega_i) ∂xl∂ϵ∑L−1i=lF(xi,ωi)不会全部恰巧为-1。也就是说,就算权重都很小,梯度也不会消失。
综上所述,上述方程证明了信息可以在任意两个节点之间传播。上述方程是建立在h(x) 以及f(x)都是恒等映射的条件下的。
ResNet-V2的改动主要体现在两个方面:
- skip fucntion的选择
- activation function的选择
skip function的选择
接下来讨论其他 skip connection 的函数:
第一种考虑:
h
(
x
l
)
=
λ
l
x
l
h(x_l) = \lambda_l x_l
h(xl)=λlxl
x
l
+
1
=
λ
l
x
l
+
F
(
x
l
,
ω
l
)
x_{l+1} = \lambda_l x_l + F(x_l, \omega_l)
xl+1=λlxl+F(xl,ωl)
这里
λ
l
\lambda_l
λl是一个放缩变量,我们可以通过递推得到新的表达式:
x
L
=
(
∏
i
=
l
L
−
1
λ
i
)
+
∂
ϵ
∂
x
l
∑
i
=
l
L
−
1
F
^
(
x
i
,
ω
i
)
x_L = (\prod \limits^{L-1}_{i=l} \lambda_i) + \frac{\partial\epsilon}{\partial x_l}\sum\limits^{L-1}_{i=l}\hat{F}(x_i, \omega_i)
xL=(i=l∏L−1λi)+∂xl∂ϵi=l∑L−1F^(xi,ωi)
F
^
=
∏
j
=
i
+
1
L
−
1
λ
j
F
\hat{F} = \prod\limits^{L-1}_{j=i+1}\lambda_jF
F^=j=i+1∏L−1λjF
当我们对这个表达式做偏导,获取梯度。可以得到
∂
ϵ
∂
x
l
=
∂
ϵ
∂
x
L
(
(
∏
i
=
l
L
−
1
λ
i
)
+
∂
ϵ
∂
x
l
∑
L
−
1
i
=
l
F
(
x
i
,
ω
i
)
)
\frac{\partial\epsilon}{\partial x_l} = \frac{\partial\epsilon}{\partial x_L}((\prod\limits^{L-1}_{i=l}\lambda_i) + \frac{\partial\epsilon}{\partial x_l}\sum\limits^{L-1}{i=l}F(x_i, \omega_i))
∂xl∂ϵ=∂xL∂ϵ((i=l∏L−1λi)+∂xl∂ϵ∑L−1i=lF(xi,ωi))
也就是说第一个式子多了一个系数 ∏ i = l L − 1 λ i \prod\limits^{L-1}_{i=l}\lambda_i i=l∏L−1λi, 对于一个非常深的网络来说,如果 λ i \lambda_i λi>1,那么之后系数会指数级爆炸。如果λ_i<1的情况,那么这个系数会变得十分小,甚至消失,这样的话,shortcut 就不太能传递信息,迫使所有的信息流从weight layer走了。
所以我们可以看出,如果我们改变h(xl)为gating或者1*1的卷积,都会使h(x)递推为 ∏ i = l L − 1 h i \prod\limits^{L-1}_{i=l}h_i i=l∏L−1hi, 可能会阻挡信息的传递,甚至损害训练的过程。
文中提出了六种shortcut connection 的模型
在六个模型都进行实验之后,我们得到效果最好的是identity mapping。这里省略了BN层,都是在权重层之后的。
下面是实验数据
虽然在分析中,将f作为identity mapping 处理,更为简便。
但在实验中,我们将其作为ReLu来做,因为这样是根据ResNet原先的实验设置来做的。
实验结果如下表:
常量放缩:
我们设置
λ
\lambda
λ=0.5,同时讨论两种F的放缩,第一种是F没有放缩,第二种是被 1-λ=0.5的放缩,与highway gating 相似,但是为frozen gating。
前者F不放缩的情况下,不能很好的收敛。而第二种放缩F之后,我们得到的test error为12.35%,比原先ResNet110的模型误差高很多。同时训练误差也高很多。
所以说,优化在常量放缩了shortcut 之后,会高很多。
Exclusive gating (排他门):
根据highway networks的模型,设计了门机制,在原先的模型里,一个门函数是
g
(
x
)
=
σ
(
W
g
x
+
b
g
)
g(x) = \sigma(W_g x + b_g)
g(x)=σ(Wgx+bg),这里做一个线性变换之后再通过一层sigmoid函数
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x) = \frac{1}{1+e^{-x}}
σ(x)=1+e−x1, 在卷积神经网络里,g(x)就是一个1*1的卷积层。
在其他的论文模型中, exclusive gating的用法是, F是被g(x)放缩,而shortcut path是被1-g(x)放缩的,在这个模型之下,biases 的选择就比较重要了。通过超参数搜索,在biases从0到-10的一个步长为-1的交叉验证。最后得到结果是bias = -6 的情况下,表现最优,但也会得到8.7%的测试误差,这比ResNet110的基本模型表现都差很多。 Exclusive gating在bias初始化不合适的时候,甚至都不会收敛到一个好的结果。
Exclusive gating 的缺点在于two-fold, 当1-g(x)趋近于1的时候,加了门的shortcut 就会趋向于恒等映射,但这种情况下,g(x)会趋向于0,这样会将残差方程的流基本变为0。
Shortcut only gate:
在这种情况下,残差方程的路径不加以放缩,只有shortcut 被1-g(x)放缩,在这种情况下,bias 仍旧非常重要,如果初始的bias是0的话,那么1-g(x)的数学期望就是0.5。网络的表现很差, 有12.86%的误差。
当bias取负数,比如说-6的时候,1-g(x)的值趋向于1,而这样也非常接近恒等映射,结果与baseline model也就近似了。
1*1 convolutional shortcut:
用1*1的卷积层替代恒等映射层,这个结果在ResNet34表现良好,但是在更深的残差神经网络上,他的表现就差强人意了。
Dropout shortcut:
在使用ratio = 0.5 的dropout 之后,也很难收敛到一个好的结果。类似于λ=0.5的常量放缩,它同样也阻止了一部分信号的传播。
所以我们可以看出,shortcut connections 是最直接的传播信息的通道。其他做乘运算的操作(缩放,门运算和卷积以及dropout)都会阻碍信息的传播,影响网络的优化。
但是门运算和卷积的shortcut会有更多的参数,有比恒等映射更好的特征表现能力,但是会有更高的训练误差,也就是说,退化问题是由于优化问题导致的而不是表现能力导致的。
Activation function的选择
在原先的残差单元里,BN是跟在权重层后面的,ReLu是跟在BN层后面的,在最后做addition之后,还会加一个ReLu层。
但是在ResNet-V2中提出了一个新的模型概念,pre-activation。
首先尝试几个模型:
BN after addition:
我们把BN层从addition之前拿到addition之后,这样也会导致信息的传播在shortcut path上会被阻挡。
ReLU before addition:
如果我们将ReLu放在addition 之前的话,会导致残差流过来的时候输出的结果是非负的,但实际上我们需要残差的输出是在(-∞,+∞)的。也就是说,对于正向传播来说,这样的处理会让输出单调上升,这样会影响网络的表现能力。而且结果表现也不太好。
Post-activation Or pre-activation?
y
l
=
h
(
x
l
)
+
F
(
x
l
,
ω
l
)
y_l = h(x_l) + F(x_l, \omega_l)
yl=h(xl)+F(xl,ωl)
x
l
+
1
=
f
(
y
l
)
x_{l+1}=f(y_l)
xl+1=f(yl)
原先的激活函数影响了两个通道
y
l
=
f
(
x
l
)
+
F
(
f
(
x
l
)
,
ω
l
)
y_l = f(x_l) + F(f(x_l), \omega_l)
yl=f(xl)+F(f(xl),ωl)
之后又提出了一个非对称模型,也就是激活函数只影响残差通道。也就是
y
l
+
1
=
y
l
+
F
(
f
^
(
y
l
)
,
ω
l
+
1
)
y_{l+1}=y_l+F(\hat{f}(y_l), \omega_{l+1})
yl+1=yl+F(f^(yl),ωl+1)
x
l
+
1
=
x
l
+
F
(
f
^
(
x
l
)
,
ω
l
)
x_{l+1}=x_l+F(\hat{f}(x_l), \omega_{l})
xl+1=xl+F(f^(xl),ωl)
对于一个普通的前向神经网络来说,他的BN和ReLu是 pre-activation还是post-activation都不是很重要,但是如果对于有分支的神经网络来说,激活层的位置就比较重要了。
V2的版本提出了两种pre-activation的概念,一个是将ReLu层提前,但是BN层仍旧放在post位置。
第二个是将BN层和ReLu层都放在pre位置。
第一种relu-only pre-activation的效果跟baseline差不多,这种情况下,ReLu层不能享受到BN层的好处。
第二种,当两个激活层都提前的时候,效果出人意料的好。原因有两方面:第一方面是优化的简略性,另一方面就是可以降低过拟合。
优化的过程被简单化了,因为f变成了恒等映射。其次,BN作为pre-activation提高了模型的正则化度。
如果在原先的设计中,f = ReLu的话,会将负信号给屏蔽掉,如果有很多残差单元的情况下,这个影响就会变得很大。当f是恒等映射的时候,神经网络就可以很快的去做误差下降。在层数比较低的时候,f=ReLu表现良好,因为权重层会调整到使yl尽可能大于0,这样就不会被relu给过滤掉。
在原先的模型里,虽然被BN层正则化了,但是马上添加了shortcut层,然后合并的信号是非正则化的,这个非正则化的信号马上又作为下一个残差单元的输入,所以效果没这么好。而新proposed model就可以解决这个问题,所有输入在权重层之前都被正则化过了。
原paper链接:
https://arxiv.org/abs/1603.05027