深度学习(一) 损失函数、输出单元、激活函数、反向传播

深度学习(一) 损失函数、输出单元、激活函数、反向传播

深度前馈网络

  1. 概述

    • 线性模型无论是凸优化还是闭式解都可以高效可靠地拟合,而它的缺陷是拟合能力局限于线性函数里,无法理解特征之间的相互作用。
    • 深度学习通过学习特征来优化模型,提高模型的性能。
    • 与线性模型的凸优化从任意初始解都能收敛到最优点不同的是,深度学习的代价函数往往是非凸的,使用梯度来进行模型的优化。这种非凸迭代优化对模型的初值敏感,使用不同的初始值会收敛到不同的点。
  2. 损失函数
    神经网络使用最大似然来进行训练:

    (1) J ( θ ) = E x , y p ^ d a t a l o g p m o d e l ( y | x )

    损失函数必须足够的大、足够的足有代表性,饱和函数的梯度非常的小,不适合作为损失函数
    常用损失函数:交叉熵、l2

  3. 输出单元
    • 线性单元
      (2) y ^ = W T h + b

      不易饱和,适合各种优化算法
    • sigmoid 二分类
      (3) y ^ = σ ( w T h + b )
    • softmax 多分类
      (4) z = W T h + b

      (5) s o f t m a x ( z ) i = e z i k e z k
  4. 隐藏单元

    • sigmoid/tanh
      (6) g ( z ) = σ ( z )

      (7) g ( z ) = t a n h ( z ) = 2 σ ( 2 z ) 1

      (8) σ ( x ) = e x 1 + e x = 1 1 + e x

      (9) σ ( x ) = σ ( x ) ( 1 σ ( x ) )

      (10) 1 σ ( x ) = σ ( x )

      缺点
      a. sigmoid系函数两端扁平,十分易于饱和,simoid求导之梯度值在[0,1/4],易于产生梯度消失。
      b. sigmoid函数的输出不是0均值的,这会导致下一层二等输入信号为非0均值,如果输入神经元是数据是正的,那么计算的梯度全为正数或负数,导致梯度下降锯齿形(之字形)晃动,导致收敛速度缓慢。若梯度是批数据累加的则权值的更新准确一些。
      c. tanh函数的输出是0均值的,在实际应用中比sigmoid好
      d. 非0均值会导致下一层的bias shift。bias shift是指输出的均值比输入的均值大的多。
    • ReLU
      (11) g ( z ) = m a x ( 0 , z )

      ReLU单侧抑制,左侧不能学习(Dying ReLU再也没有机会学习),它的优化与线性函数类似。
      什么叫Dying ReLU?
      假设ReL的输入为 z n = i = 0 k w i a i n ,经过ReLU后, R e L U = m a x ( 0 , z n ) ,假设一个简单的误差函数 e r r o r = R e L U y ,反向传播传回的梯度:
      (12) e r r o r z n = ζ n = { 1 , z n 0 0 , z n < 0

      权值更新:
      (13) e r r o r w j = e r r o r z n z n w j = ζ n a j n = { a j n , z n 0 0 , z n < 0

      当梯度为0,权值则不再更新,可以注意到若所有的输入都位于左侧,返回的梯度为0,该神经元就死了,权值将不再被更新。
      该问题的产生是由于在某个batch更新时,使得权值变得过于小,对于任何输入都有 z n < 0 ,权值不再被更新。
      过大的学习率将会放大这一问题。
    • Leaky ReLU
      (14) g ( z ) = m a x ( α i z , z )

      Leaky ReLU的左侧也能进行学习,将 α i 固定为一个较小的常值,可以解决Dying ReLU问题
    • PReLU
      (15) g ( z ) = m a x ( α i z , z )

      与 Leaky ReLU不同的是,PReLU的 α i 并不是一个常值,它也是一个参数,学习出来的,在较小的数据集中容易过拟合
    • ELU
      (16) g ( z ) = m a x ( α ( e z 1 ) , z )

      a. ReLU有bias shift问题,他的输出全为正值,没有负值。当激活值均值非0时,会对下一层造成一个bias,若激活值之间不能相互抵消,会对一下层的激活单元造成bias shift,如此叠加,单元越多,bias shift就越大。
      b. Leaky ReLU、 PReLU、 ELU可以取到负值,让激活单元可以更接近0,类似BN的效果,但降低了复杂度。
      c.相对 Leaky ReLU、 PReLU,ELU对于输入值较小具有软包和(最左则梯度近似0)性质,提升了对噪声的鲁棒性。
    • maxout
      (17) g ( z ) = m a x j G z j

      maxout可以以任意精度逼近任意凸函数 学习激活函数本身,缺点是k倍增加了参数
      maxout以分段函数的形式去逼近凸函数,两端分段函数可以近似ReLU
  5. 初始化
      从正则化的角度,我们希望网络的权值小一点,降低过拟合的风险,而从优化的角度,我们希望初始化的大一点,权值大能够传递更多的信息。
      目比较流行初始化方法是Xavier初始化,采用启发式想法,将权值以 w i , j U ( 6 n i n + n o u t , 6 n i n + n o u t ) ,它的方差为 2 n i n + n o u t ,使得信号在经过多层神经网络后还能保持在合理范围。(不至于太大或太小)

  6. 反向传播
    l = y T log s o f t m a x ( W x ) = y T log s o f t m a x ( a )

    softmax是元素级别的函数,返回的是向量
    基础公式:
    元素级别的函数求导 d f ( x ) = f ( x ) d x
    y T 1 = 1 1 T ( u v ) = u T v
    推导:
    s o f t m a x ( a ) = e a 1 T e a

    l = y T l o g e a 1 T e a = y T a + y T 1 l o g ( 1 T e a ) l = y T a + l o g ( 1 T e a ) d l = y T d a + 1 T d e a 1 T e a = y T d a + 1 T ( e a d a ) 1 T e a = y T d a + ( e a ) T d a 1 T + e a = t r ( y T d a + ( e a ) T d a 1 T e a ) = t r ( ( s o f t m a x ( a ) y ) T d a )

    故:
    l a = s o r f t m a x ( a ) y

    d l = t r ( l a T d a ) = t r ( l a T d W x ) = t r ( x l a T d W )

    l w = l a x T = ( s o r f t m a x ( W x ) y ) x T

    以两层神经网络推导为例:
    l = y T log s o f t m a x ( W 2 σ ( W 1 x ) )

    其中,令:
    a 1 = W 1 x

    h 1 = σ ( a 1 )

    a 2 = W 2 h 1

    由之上的推导,可得
    l a 2 = s o f t m a x ( a 2 ) y

    W 2
    d l = t r ( l a 2 T d a 2 ) = t r ( l a 2 T d W 2 h 1 ) + t r ( l a 2 T W 2 d h 1 )

    l W 2 = l a 2 h 1 T

    l h 1 = W 2 T l a 2

    W 1
    t r ( l h 1 T d h 1 ) = t r ( l h 1 T ( σ ( a 1 ) d a 1 ) ) = t r ( ( l h 1 σ ( a 1 ) ) T d a 1 )

    l a 1 = l h 1 σ ( a 1 )

    t r ( l a 1 T d a 1 ) = t r ( l a 1 T d W 1 x ) = t r ( x l a 1 T d W 1 )

    l W 1 = l a 1 x T

    多层神经网络推导:
    记号:
    l o s s = C ( y , a n )

    a l = a c t ( w L a l 1 + b l ) = a c t ( z l )

    推导最后一层的偏导
    t r ( c a n T d a n ) = t r ( c a n T ( a c t ( z n ) d z n ) ) = t r ( ( c a n a c t ( z n ) ) T d z n ) )

    固:
    g r a d n = c z n = c a n a c t ( z n )

    展开全微分
    t r ( c z n T d z n ) = t r ( c z n T d ( w n a n 1 + b n ) ) = t r ( c z n T d w n a n 1 ) + t r ( c z n T w n d a n 1 ) + t r ( c z n T d b n )

    上面三项分别对应着:
    c w n = c z n ( a n 1 ) T = g r a d n ( a n 1 ) T

    c b n = c z n = g r a d n

    c a n 1 = ( w n ) T c z n = ( w n ) T g r a d n

    向下一层传回梯度:
    t r ( c a n 1 T d a n 1 ) = t r ( c a n 1 T ( a c t ( z n 1 ) d z n 1 ) ) = t r ( ( c a n 1 a c t ( z n 1 ) ) T d z n 1 ) )

    g r a d n 1 = c z n 1 = c a n 1 a c t ( z n 1 ) = ( ( w n ) T g r a d n ) a c t ( z n 1 )

猜你喜欢

转载自blog.csdn.net/dynomite/article/details/80848748
今日推荐