彻底弄懂残差网络Residual Network


Introduction

层数过深的深度网络会出现退化问题,这是在训练集上精度变差的情况,因此是不同于过拟合的一种现象,分析可能是优化器对于深度网络难以学习到最优解。 解决办法就是找到一种恒等映射,一个深层网络,如果后面的一大堆层都是恒等映射,那么这个深度网络其实就退化成了一个浅层网络。那么我们现在就希望可以找到一个恒等映射函数 \( H(x) = x \)但是直接拟合出这个函数是有困难的,不然深层网络也不会出现退化现象了。于是我们把网络设计成 \[ F(x) = H(x) - x \] 我们通过学习\( F(x) \) ,并且令其等于0,就可以求出 \( H(x) \) ,\( F(x) \)就是残差函数,这就是残差的操作。接下来我们来定义残差网络。

网络结构如下图1所示:

用数学公式表达就是:
Eq1.
\[ y_l = h(x_l) + F(x_l,w_l) \]
Eq2.
\[ x_{l+1} = f(y_l) \] 其中\( x_l \)是第l层的输入,\(F(x_l,w_l) \)是一个residual operation,\( h(x_l) \)是恒等映射,\( f(y_l) \)是Relu函数

那么你也许会有疑惑,那就是为什么要构建恒等映射?为什么恒等映射有这样神奇的效果?

Why identity mapping

我们把图1右侧的identity x称为skip connection,也叫做shortcut,为了更简洁的表达,我们在下面的介绍中暂时忽略掉最后的relu函数,即Eq2变为:

Eq3.
\[ x_{l+1} = y_l \] 那么首先我们开看看如果\( h(x_l) \)是恒等映射会有什么样的事情发生,如果它是恒等映射的话,那么 \( h(x_l) = x_l \),结合Eq3和Eq1可以得到:

Eq4.
\[ x_{l+1} = x_l + F(x_l,w_l) \] 那么已知\( x_{l+1} \),\( x_{l+2} \)如何表达呢?可以通过简单的递归表现成下面的样子: \[ x_{l+2} = x_{l+1} + F(x_{l+1},w_{l+1}) = x_l + F(x_l,w_l)+ F(x_{l+1},w_{l+1}) \] 由上式的启发,我们对于任意深的单元\( L \)和任意浅的单元\( l \)都可以像上面那样表达出来:

Eq5.
\[ x_L = x_l + \sum_{i=l}^{L-1}F(x_i,w_i) \] 而这个式子就体现出了一些良好的特性:

  1. 对于任意深的单元\( L \)的特征\( x_L \)可以表达为浅层单元\( l \)的特征\( x_l \)加上一个形如\( \sum_{i=l}^{L-1} F \)的残差函数,这表明了任意单元\( L \)和\( l \)之间都具有残差特性

  2. 对于任意深的单元\( L \), 他的特征\( x_L = x_0 + \sum_{i=0}^{L-1}F(x_i,w_i)
    \),即为之前所有残差函数的输出和加上\( x_0 \)。但是普通网络的特征\( x_L \)是一系列矩阵向量的乘积,也就是\( \prod_{i=0}^{L-1}W_ix_0 \)(忽略了BN和RELU),这意味着残差网络在前向传播的过程中,把乘法变成了加法,这其中的好处自不用多说。

那么在反向传播的过程中表现如何呢?我们都知道,在神经网络的反向传播中用到了链式法则,我们假设损失函数是\( E \),那么根据链式法则就可以得到:

Eq6.
\[ \frac{\partial E}{\partial x_l} = \frac{\partial E}{\partial x_L} \frac{\partial x_L}{\partial x_l} = \frac{\partial E}{\partial x_L}(1+ \frac{\partial \sum_{i=l}^{L-1}F(x_i,w_i)}{\partial x_l}) \]

这表明了梯度可以被分为:第一部分,其中\( \frac{\partial E}{\partial x_L} \)直接传递信息而不干涉任何权重层,而另一部分\( \frac{\partial E}{\partial x_L}( \frac{\partial \sum_{i=l}^{L-1}F(x_i,w_i)}{\partial x_l}) \)表示通过权重层的传递。前一部分保证了信息能够直接传递回任意浅层\( L \)。又因为\( \frac{\partial \sum_{i=l}^{L-1}F}{\partial x_l} \)对于一个mini-batch来说不可能每一个样本都是-1,因此不存在梯度消失的情况了,多么令人兴奋!

看完了\( h(x_l) \)是恒等映射的情况,那么我们再来看看非恒等映射的情况下会发生什么,我们可以对\( h(x_l) = x \)做一个简单的变换——\( h(x_l) = \lambda _l x_l \)。那么原来的\( x_{l+1} \)变成了下面的样子:

Eq7.
\[ x_{l+1} = \lambda _l x_l + F(x_l,w_l) \] 前面前向传递的Eq4.就变成了下面的样子:

Eq8.
\[ x_L =( \prod_{i=l}^{L-1} \lambda _i)x_l + \sum_{i=l}^{L-1}F(x_i,w_i) \] 这个时候也许你已经能意识到一些不对劲了,没错,引入了一个连乘的参数。别急,我们再来看看反向传递的过程,原本的Eq6.会变成:

Eq9.
\[ \frac{\partial E}{\partial x_l} = \frac{\partial E}{\partial x_L} \frac{\partial x_L}{\partial x_l} = \frac{\partial E}{\partial x_L}(( \prod_{i=l}^{L-1} \lambda _i)x_l+ \frac{\partial \sum_{i=l}^{L-1}F(x_i,w_i)}{\partial x_l}) \]

不像Eq6,Eq9中的第一项由因子\( \prod_{i=l}^{L-1} \lambda _i \)进行调节,如果对于所有的\( i \)都有\( \lambda _i >1 \),那么这个因子将会指数型放大,引起类似梯度爆炸的效果,反之会导致这个因子指数型缩小,产生类似于梯度消失的问题。前者会导致来自权重层的信息被忽略,后者会导致信号全部流向权重层,这会对优化造成困难。因此我们需要一个纯净的shortcut通道,那就是恒等映射!

这下子读者应该明白为什么我们需要寻找一个恒等映射了吧啊:D

A New Residual Network

在残差网络提出之后的一年,有人对其做了大量的研究并提出了一种经过优化后的残差网络,如下图2(b)所示:

这个其实就是作者通过大量的试验,去调整了Batch Normalization和激活函数的位置,最后提出的不要对先前addition之后的结果再激活了,而是放到神经网络层之间去处理。很多先进的框架都使用了这种结构,比如在QANet中。公式就变成了: \[ x_{l+1} = x_l + F(x_l,w_l) \] 激活函数都涵盖在F中了。

Reference

  1. 《Identity Mappings in Deep Residual Networks》
  2. 《Deep Residual Learning for Image Recognition》
  3. https://blog.csdn.net/ qq_29184757/article/details/77983824
  4. https://www.jianshu.com/p/e58437f39f65
  5. https://www.zhihu.com/question/53224378/answer/159102095
  6. https://zhuanlan.zhihu.com/p/22447440
  7. https://blog.csdn.net/wspba/article/details/60750007

分享博文


评论博文


Last one :   彻底弄懂QANet

Next article :   Win10安装TensorFlow1.9-GPU版本