参考链接

一、 梯度消失/梯度爆炸问题:

  • 首先我们对如下的前向神经网络,我们讨论一下其BP算法

    残差网络:Deep Residual Learning for Image Recognition

  • BP算法在求每层参数whjw_{hj}vihv_{ih}的梯度前都是先求解每层神经元输入βjβ_jαhα_h的梯度,即:σεσwhj=σεσβjσβjσwhj=bhσεσβj=bhδj2\frac{σε}{σw_{hj}}=\frac{σε}{σβ_j}\frac{σβ_j}{σw_{hj}} =b_h \frac{σε}{σβ_j}=b_h δ_j^2 σεσvih=σεσαhσαhσvih=xiσεσαh=xiδh1 \frac{σε}{σv_{ih}}=\frac{σε}{σα_h }\frac{σα_h}{σv_{ih}}=x_i \frac{σε}{σα_h}=x_i δ_h^1

  • 其中δlδ^l表示第ll层神经元输入的梯度,也是该层的误差项。δl+1δ^{l+1}δlδ^l是相关的,比如:σεσαh=σεσbhσbhσαh=(jlσεσβjσβjσbh)f(αh)\frac{σε}{σα_h}=\frac{σε}{σb_h}\frac{ σb_h}{σα_h}=(∑_j^l\frac{σε}{σβ_j} \frac{σβ_j}{σb_h })f'(α_h)δh1=(jlwhjδj2)f(αh)=jl(f(αh)whj)δj2δ_h^1=(∑_j^l w_{hj} δ_j^2 )f'(α_h )=∑_j^l(f' (α_h )*w_{hj} )δ_j^2 其中ff为神经元**函数。由上面表达式可以看出第2层的误差项δj2δ_j^2以比例f(αh)whjf'(α_h )*w_{hj}传递到第1层的误差项δh1δ_h^1

  • 如果在很深的神经网络中, 如果每层传输比例f(αh)whjf'(α_h )*w_{hj}都小于1,则较深的LL层的误差项δLδ^L传递到较底层时可能已经被放缩成了0,这就出现了梯度消失。如果每层传输比例f(αh)whjf'(α_h )*w_{hj}都大于1,则较深的LL层的误差项δLδ^L传递到较底层时可能已经被放缩成了非常大的一个量,这就出现了梯度爆炸

  • 上面讨论的是特殊的前向神经网络,现在我们讨论一下一般的神经网络:

    • 令第l层的净输入为z(l)z^{(l)}输出为a(l)a^{(l)},则一层神经外科可以表示为:z(l)=H(a(l1))a(l)=g(z(l))z^{(l)}=H(a^{(l-1)}) \\a^{(l)}=g(z^{(l)})H()H(*)为该层的内部运算,依照网络类型有所不同,一般都是线性运算;g()g(*)是第l层的输出**函数,是非线性运算.
    • ll层的某参数更新需要计算损失ϵϵ对其的梯度,该梯度依赖于该层的误差项:δ(l)=ϵz(l)δ^{(l)}=\frac{∂ϵ}{∂z^{(l)} } 根据链式法则,δ(l)δ^{(l)} 又依赖于后一层的误差项δ(l+1)δ^{(l+1)} :δ(l)=z(l+1)z(l)δ(l+1)=γ(l)δ(l+1)δ^{(l)}=\frac{∂z^{(l+1)}}{∂z^{(l)}} δ^{(l+1)}=γ^{(l)} δ^{(l+1)}γ(l)<1γ^{(l)}<1时,第ll层的误差项较后一层减小,如果很多层的情况都是如此,就会导致反向传播中,梯度逐渐消失,底层的参数不能有效更新,这也就是梯度消失
      γ(l)<1γ^{(l)}<1时,则会使得梯度以指数级速度增大,造成系统不稳定,也就是梯度爆炸问题
  • 梯度爆炸/消失问题可以通过Batch Normalization等技术避免

二、 网络退化问题:

  • 网络退化问题:在神经网络可以收敛的前提下,随着网络层数的增加,训练集loss先逐渐下降,然后达到一个最小值,当到达该最小值后再继续增加网络深度的话,训练集loss反而会增大,注意这并不是过拟合,因为在过拟合中训练loss是一直减小的。这个现象被称为:退化(degradation)现象。如下图所示:

    残差网络:Deep Residual Learning for Image Recognition
    从上图可以看出在模型训练过程中,同样的训练轮次下,退化的网络也比稍浅层的网络的训练错误更高,所以可知网络退化问题不是过拟合导致的

  • 网络退化情况下,相同结构的KK层网络fKf_K会比K+LK+L层网络fK+Lf_{K+L}取得更优的结果,这与我们常理是不合:因为如果我们将fKf_K的所有参数都复制到fK+Lf_{K+L}的前KK层,而将fK+Lf_{K+L}的后LL层学习为恒等映射。那么fK+Lf_{K+L}就可以取得和fKf_K一样的效果。按照这个逻辑如果KK还不是所谓“最佳层数”,那么更深的网络就可以取得更好的结果。总而言之,与浅层网络相比,更深的网络的表现不应该更差。

  • 所以一个合理的猜测就是,对神经网络来说,恒等映射并不容易拟合。即fK+Lf_{K+L}的后LL层很难学习到一个恒等映射,才会使得fKf_K效果比fK+Lf_{K+L}效果好。为了解决这个问题我们可以在神经网络中直接引入直接映射,这就形成了残差网络

三、 残差网络的形式:

  • 既然神经网络不容易拟合一个恒等映射,那么一种思路就是直接向网络中加入恒等映射。假设神经网络每层的输入和输出维度一致,可以将神经网络每层要拟合的函数H(x)H(x)拆分成两个部分,即:xl+1=H(xl)=xl+F(xl)x_{l+1}=H(x_l)=x_l+F(x_l)其中x_l就是恒等映射,而F(xl)=H(xl)xlF(x_l)=H(x_l)-x_l为目标与输入的差,即残差,所有F(xl)F(x_l)叫残差函数。当F(xl)0F(x_l)→0时该层就学习到了一个恒等映射。

  • 残差快图:

    残差网络:Deep Residual Learning for Image Recognition

  • 残差块分成两部分:直接映射部分和残差部分

    • 直接映射:对应上图的左边的直线。用h(xl)h(x_l)
    • 残差部分: 对应上图的右边的部分,一般由两个或者三个卷积操作和Batch_Normalization构成,用F(xl,Wl)F(x_l,W_l)表示。
    • 图中的Weight是指卷积操作
    • addition是指单位加操作
    • BN是Batch_Normalization
  • 为了使得两条路径的输出能进行addition需要统一Feature Map的数量,所以在直接映射中加一个1×1卷积进行升维或者降维.所以最终表达式为:xl+1=f(h(xl)+F(xl,Wl))x_{l+1}=f(h(x_l )+F(x_l,W_l ))

  • 残差网络很好地解决了深度神经网络的退化问题,并在ImageNet和CIFAR-10等图像任务上取得了非常好的结果,同等层数的前提下残差网络也收敛得更快。这使得前馈神经网络可以采用更深的设计。除此之外,去除个别神经网络层,可以应用到各中网络中去。

四、 残差网络的原理:

  • 残差块一个更通用的表示方式是:xl+1=f(h(xl)+F(xl,Wl))x_{l+1}=f(h(x_l )+F(x_l,W_l ))

  • 两个假设:

    • h(xl)h(x_l )是直接映射,即先不考虑升维或者降维的情况
    • f()f()也是直接映射,上图表示的ff为ReLU。
  • 那么这时候残差块可以表示为:xl+1=xl+F(xl,Wl)x_{l+1}=x_l+F(x_l,W_l )

  • 现在从ll使用上式一直递推到更深的LL层可以得到:xL=xl+i=lL1F(xi,Wi)x_L=x_l+∑_{i=l}^{L-1}F(x_i,W_i ) 由此可知LL层可以表示为任意一个比它浅的ll层和他们之间的残差部分之和

  • 可以从第0成开始地推:xL=x0+i=0L1F(xi,Wi)x_L=x_0+∑_{i=0}^{L-1}F(x_i,W_i ) LL层可以表示为各个残差块特征的累加。

  • 损失函数ϵϵ关于xlx_l的梯度可以表示为:ϵxl=ϵxLxLxl=ϵxL(1+(i=0L1F(xi,Wi)xl)=ϵxL+ϵxLi=0L1F(xi,Wi)xl\frac{∂ϵ}{∂x_l}=\frac{∂ϵ}{∂x_L} \frac{∂x_L}{∂x_l}=\frac{∂ϵ}{∂x_L} (1+(∂∑_{i=0}^{L-1} \frac{F(x_i,W_i ) }{∂x_l })\\=\frac{∂ϵ}{∂x_L}+\frac{∂ϵ}{∂x_L} \frac{∂∑_{i=0}^{L-1}F(x_i,W_i ) }{∂x_l}

  • 在整个训练过程中i=0L1F(xi,Wi)xl\frac{∂∑_{i=0}^{L-1}F(x_i,W_i ) }{∂x_l}不可能一直为-1,这样ϵxl\frac{∂ϵ}{∂x_l}不可能一直为0,也就是说不会出现梯度消失的问题

  • ϵxl\frac{∂ϵ}{∂x_l}表示LL层的梯度可以直接传递到任何一个比它浅的ll

  • 通过上面分析分析,我们发现,当残差块满足上面两个假设时,信息可以非常畅通的在高层和低层之间相互传导,说明这两个假设是让残差网络可以训练深度模型的充分条件。

  • 现在说明直接映射是最好的选择:

    • 我们采用反证法,假设h(xl)=λlxlh(x_l )=λ_l x_l,则残差块的表示的为:xl+1=λlxl+F(xl,Wl)x_{l+1}=λ_l x_l+F(x_l,W_l )
    • 对于更深的LL层:xL=(i=lL1λi)xl+i=lL1((i=l+1L1λi)F(xi,Wi))x_L=(∏_{i=l}^{L-1} λ_i )x_l+∑_{i=l}^{L-1}((∏_{i=l+1}^{L-1}λ_i )F(x_i,W_i ))
    • 对于i=lL1λi∏_{i=l}^{L-1}λ_i 部分有:
      • λ>1λ>1 时,很有可能发生梯度爆炸
      • λ<1λ<1 时,很有可能发生梯度消失
    • 所以λλ必须等1
    • 对于其它不影响梯度的h()h(*),例如LSTM中的门机制(下图c和d)、Dropout(下图f)以及用于降维的1×1卷积(下图e)试验效果图如下:
      残差网络:Deep Residual Learning for Image Recognition
      试验的结果为:
      残差网络:Deep Residual Learning for Image Recognition
      在所有的变异模型中,依旧是直接映射的效果最好
    • Exclusive Gating:在LSTM的门机制中,绝大多数门的值为0或者1,几乎很难落到0.5附近。当g(x)→0时,残差块变成只有直接映射组成,阻碍卷积部分特征的传播;当g(x)→1时,直接映射失效,退化为普通的卷积网络;
    • Short-cut only gating:g(x)→0时,此时网络便是直接映射的残差网络;g(x)→0 时,退化为普通卷积网络;
    • Dropout:类似于将直接映射乘以1-p,所以会影响梯度的反向传播;
    • 1×1 conv:1×1卷积比直接映射拥有更强的表示能力,但是实验效果却不如直接映射,说明该问题更可能是优化问题而非模型容量问题。
  • **函数的位置试验

    • 试验图:
      残差网络:Deep Residual Learning for Image Recognition
      试验结果:
      残差网络:Deep Residual Learning for Image Recognition
      实验结果也表明将**函数移动到残差部分可以提高模型的精度

相关文章: