天天看點

深層神經網絡前饋 && 反向傳播

學習深度學習,深層神經網絡是一個繞不過的話題,包括其前向以及反向的計算過程是很有必要搞清楚,這樣對于之後的調參,以及梯度消失 & 爆炸的處理會很有幫助;

是以立足于此,盡可能詳細的闡述其前向 & 後向的計算過程:

1.為什麼使用深層神經網絡

2.深層神經網絡的 前向 & 反向 計算過程詳解

1.為什麼使用深層神經網絡

1.1 神經網絡

神經網絡,顧名思義就是模拟大腦皮層,從感覺資訊,傳遞,再到激活然後輸出的一個個神經元構成的網絡模型,在此過程中,低階神經網絡構成低階網絡層,中階神經元構成的中階網絡層,一次類推,一層一層網絡層前向傳遞,知道輸出預測值;同時從輸出開始,反向微分一步步調節網絡;

神經網絡由 輸入層 ,隐藏層,輸出層組成

  • 輸入層: 就是訓練資料的入口
  • 隐藏層: 一級一級抽象特征的網絡層
  • 輸出層: 網絡預測值的輸出口

使用深層神經網絡的目的

在實際的應用中,我們會使用多層的神經網絡(主要指多個隐藏層)來進行模型訓練,這樣做的目的就是捕捉細粒度的特征

用一個大家比較熟悉的例子:一張人臉圖檔做卷積(conv代表卷積層(也是隐藏層),這裡以卷積神經網絡來闡述):

  • conv1:進行邊緣抽象,如圓角,直線等基礎抽象
  • conv2:基于conv1進行連接配接,抽象出鼻子,眼鏡,嘴巴等基礎五官
  • conv3:基于conv2進行組合,抽象出人臉

到此為止我們可以認為,人臉識别模型建構完畢,的确,基于上面的簡單例子可以看出,隐藏層的作用就是對特征進行低階—>高階的抽象過程,網絡層越多,抽象的粒度也就越細,這就是使用深層神經網絡的目的

2.深層神經網絡的 前向 & 反向計算過程

神經網絡訓練模型分為前向和反向傳播的過程:

  • 前向傳遞:可以認為就是求解預測值的過程,這樣便可以在疊代訓練過程中求出成本函數
  • 反向傳播:其實要比前向傳遞耗時許多,根據前向傳遞的出成本函數,然後梯度下降來更新每一層的參數,這是訓練模型的關鍵

這裡我盜用Andrew Ng的一張圖來進行求解過程:

深層神經網絡前饋 && 反向傳播

這裡我們來規定幾個定義,友善一會兒計算的過程:

  • 資料為橫向堆疊矩陣,即每一列是單個特征向量, e g eg eg:輸入就是{ x 1 , x 2 , . . . x m x_1,x_2,...x_m x1​,x2​,...xm​}
  • l l l代表層數, n [ l ] n^{[l]} n[l]代表每一層的節點數
  • 每一層的激活函數我們用 g g g來表示,則有這樣的計算過程: Z [ l ] = W [ l ] A [ l − 1 ] + b [ l ]      Z^{[l]}=W^{[l]}A^{[l-1]} + b^{[l]}\;\; Z[l]=W[l]A[l−1]+b[l] A [ l ] = g ( Z [ l ] )      A^{[l]} = g(Z^{[l]})\;\; A[l]=g(Z[l])
  • n l n^{l} nl是每一層的節點數, W [ l ] W^{[l]} W[l]是每一層的參數, b [ l ] b^{[l]} b[l]是每一層的偏移量, m m m是批量中的個數
  • 我們規定 輸入層是第0層,節點數為 n [ 0 ] n^{[0]} n[0],其輸入資料為 A [ 0 ] A^{[0]} A[0];以此類推… n [ 1 ] , n [ 2 ] , . . . n^{[1]},n^{[2]},... n[1],n[2],...

2.1 前向過程(依照上圖來計算,計算4層)

計算第一個隐藏層

Z [ 1 ] = W [ 1 ] A [ 0 ] + b [ 1 ]          A [ 1 ] = g ( Z [ 1 ] ) Z^{[1]} = W^{[1]}A^{[0]} + b^{[1]} \;\;\;\; A^{[1]} = g(Z^{[1]}) Z[1]=W[1]A[0]+b[1]A[1]=g(Z[1])

A [ 0 ] A^{[0]} A[0]就是輸入的資料集,即m個{ x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1​,x2​,x3​,x4​}的橫向堆疊,是以:

  • W [ 1 ] − ( n [ 1 ] , n [ 0 ] )        A [ 0 ] − ( n [ 0 ] , m )        b [ 1 ] − ( n [ 1 ] , 1 ) W^{[1]}-(n^{[1]},n^{[0]})\;\;\;A^{[0]} -(n^{[0]},m)\;\;\;b^{[1]}-(n^{[1]},1) W[1]−(n[1],n[0])A[0]−(n[0],m)b[1]−(n[1],1)這裡b由于python的廣播機制,在做+運算時候會自動擴充為m個b向量,這裡我們可以認為b的次元是 ( n [ 1 ] , m ) (n^{[1]},m) (n[1],m)
  • 計算之後 Z [ 1 ] − ( n [ 1 ] , m )        A [ 1 ] − ( n [ 1 ] , m ) Z^{[1]}-(n^{[1]},m)\;\;\;A^{[1]}-(n^{[1]},m) Z[1]−(n[1],m)A[1]−(n[1],m)

計算第二個隐藏層

Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ]          A [ 2 ] = g ( Z [ 2 ] ) Z^{[2]} = W^{[2]}A^{[1]} + b^{[2]} \;\;\;\; A^{[2]} = g(Z^{[2]}) Z[2]=W[2]A[1]+b[2]A[2]=g(Z[2])

  • W [ 2 ] − ( n [ 2 ] , n [ 1 ] )        A [ 1 ] − ( n [ 1 ] , m )        b [ 2 ] − ( n [ 2 ] , 1 ) W^{[2]}-(n^{[2]},n^{[1]})\;\;\;A^{[1]} -(n^{[1]},m)\;\;\;b^{[2]}-(n^{[2]},1) W[2]−(n[2],n[1])A[1]−(n[1],m)b[2]−(n[2],1)
  • 計算之後 Z [ 2 ] − ( n [ 2 ] , m )        A [ 2 ] − ( n [ 2 ] , m ) Z^{[2]}-(n^{[2]},m)\;\;\;A^{[2]}-(n^{[2]},m) Z[2]−(n[2],m)A[2]−(n[2],m)

計算第三個隐藏層

Z [ 3 ] = W [ 3 ] A [ 2 ] + b [ 3 ]          A [ 3 ] = g ( Z [ 3 ] ) Z^{[3]} = W^{[3]}A^{[2]} + b^{[3]} \;\;\;\; A^{[3]} = g(Z^{[3]}) Z[3]=W[3]A[2]+b[3]A[3]=g(Z[3])

  • W [ 3 ] − ( n [ 3 ] , n [ 2 ] )        A [ 2 ] − ( n [ 2 ] , m )        b [ 3 ] − ( n [ 3 ] , 1 ) W^{[3]}-(n^{[3]},n^{[2]})\;\;\;A^{[2]} -(n^{[2]},m)\;\;\;b^{[3]}-(n^{[3]},1) W[3]−(n[3],n[2])A[2]−(n[2],m)b[3]−(n[3],1)
  • 計算之後 Z [ 3 ] − ( n [ 3 ] , m )        A [ 3 ] − ( n [ 3 ] , m ) Z^{[3]}-(n^{[3]},m)\;\;\;A^{[3]}-(n^{[3]},m) Z[3]−(n[3],m)A[3]−(n[3],m)

輸出層

Z [ 4 ] = W [ 4 ] A [ 3 ] + b [ 4 ]          A [ 4 ] = g ( Z [ 4 ] ) Z^{[4]} = W^{[4]}A^{[3]} + b^{[4]} \;\;\;\; A^{[4]} = g(Z^{[4]}) Z[4]=W[4]A[3]+b[4]A[4]=g(Z[4])

  • W [ 4 ] − ( n [ 4 ] , n [ 3 ] )        A [ 3 ] − ( n [ 3 ] , m )        b [ 4 ] − ( n [ 4 ] , 1 ) W^{[4]}-(n^{[4]},n^{[3]})\;\;\;A^{[3]} -(n^{[3]},m)\;\;\;b^{[4]}-(n^{[4]},1) W[4]−(n[4],n[3])A[3]−(n[3],m)b[4]−(n[4],1)
  • 計算之後 Z [ 4 ] − ( n [ 4 ] , m )        A [ 4 ] − ( n [ 4 ] , m ) Z^{[4]}-(n^{[4]},m)\;\;\;A^{[4]}-(n^{[4]},m) Z[4]−(n[4],m)A[4]−(n[4],m)

從上面的前饋過程使用歸納法可以得到對應參數的矩陣規律,以便在編寫網絡時候核對矩陣次元:

W [ l ] − ( n [ l ] , n [ l − 1 ] ) W^{[l]} -(n^{[l]},n^{[l-1]}) W[l]−(n[l],n[l−1])

b [ l ] − ( n [ l ] , 1 ) b^{[l]} -(n^{[l]},1) b[l]−(n[l],1)

A [ l ] − ( n [ l ] , m ) A^{[l]} -(n^{[l]},m) A[l]−(n[l],m)

Z [ l ] − ( n [ l ] , m ) Z^{[l]} -(n^{[l]},m) Z[l]−(n[l],m)

2.2 反向傳播

反向傳播是對成本函數反向微分的過程,是以耗時會遠大于前饋過程,這個過程中前饋的輸入輸出會反過來,為了便于了解對比,接下來使用與前饋一緻的符号規定

這裡為了直覺我們将上述的網絡結構抽象成一個流程圖:

深層神經網絡前饋 && 反向傳播

輸出層

d A [ 4 ] = ∂ l o s s ∂ A [ 4 ] dA^{[4]} = \frac{\partial loss}{\partial A^{[4]}} dA[4]=∂A[4]∂loss​

d Z [ 4 ] = d A [ 4 ]      ∂ A ∂ Z [ 4 ] = d A [ 4 ] ∗ g ′ ( Z [ 4 ] ) dZ^{[4]} =dA^{[4]}\;\; \frac{\partial A}{\partial Z^{[4]}} = dA^{[4]} * g^{'}(Z^{[4]}) dZ[4]=dA[4]∂Z[4]∂A​=dA[4]∗g′(Z[4])

d W [ 4 ] = 1 m d Z [ 4 ]      ∂ Z [ 4 ] ∂ W [ 4 ] = 1 m d Z [ 4 ]    A [ 3 ] T dW^{[4]} =\frac{1}{m} dZ^{[4]} \;\; \frac{\partial Z^{[4]}}{\partial W^{[4]}} = \frac{1}{m} dZ^{[4]} \;A^{[3]T} dW[4]=m1​dZ[4]∂W[4]∂Z[4]​=m1​dZ[4]A[3]T

d b [ 4 ] = 1 m d Z [ 4 ]      ∂ Z [ 4 ] ∂ b [ 4 ] = 1 m d Z [ 4 ] db^{[4]} =\frac{1}{m} dZ^{[4]} \;\; \frac{\partial Z^{[4]}}{\partial b^{[4]}} = \frac{1}{m} dZ^{[4]} db[4]=m1​dZ[4]∂b[4]∂Z[4]​=m1​dZ[4]

第3個隐藏層

d A [ 3 ] = d Z [ 4 ] ∂ Z [ 4 ] ∂ A [ 3 ] = W [ 4 ] T d Z [ 4 ] dA^{[3]} = dZ^{[4]}\frac{\partial Z^{[4]}}{\partial A^{[3]}} = W^{[4]T}dZ^{[4]} dA[3]=dZ[4]∂A[3]∂Z[4]​=W[4]TdZ[4]

d Z [ 3 ] = d A [ 3 ]      ∂ A [ 3 ] ∂ Z [ 3 ] = W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) dZ^{[3]} =dA^{[3]}\;\; \frac{\partial A^{[3]} }{\partial Z^{[3]}} = W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) dZ[3]=dA[3]∂Z[3]∂A[3]​=W[4]TdZ[4]∗g′(Z[3])

d W [ 3 ] = 1 m d Z [ 3 ]      ∂ Z [ 3 ] ∂ W [ 3 ] = 1 m W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] )    A [ 2 ] T dW^{[3]} =\frac{1}{m} dZ^{[3]} \;\; \frac{\partial Z^{[3]}}{\partial W^{[3]}} = \frac{1}{m}W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})\;A^{[2]T} dW[3]=m1​dZ[3]∂W[3]∂Z[3]​=m1​W[4]TdZ[4]∗g′(Z[3])A[2]T

d b [ 3 ] = 1 m d Z [ 3 ]      ∂ Z [ 3 ] ∂ b [ 3 ] = 1 m W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) db^{[3]} =\frac{1}{m} dZ^{[3]} \;\; \frac{\partial Z^{[3]}}{\partial b^{[3]}} = \frac{1}{m} W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) db[3]=m1​dZ[3]∂b[3]∂Z[3]​=m1​W[4]TdZ[4]∗g′(Z[3])

第2個隐藏層

d A [ 2 ] = d Z [ 3 ] ∂ Z [ 3 ] ∂ A [ 2 ] = W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) dA^{[2]} = dZ^{[3]}\frac{\partial Z^{[3]}}{\partial A^{[2]}} = W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})) dA[2]=dZ[3]∂A[2]∂Z[3]​=W[3]T(W[4]TdZ[4]∗g′(Z[3]))

d Z [ 2 ] = d A [ 2 ]      ∂ A [ 2 ] ∂ Z [ 2 ] = W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) dZ^{[2]} =dA^{[2]}\;\; \frac{\partial A^{[2]} }{\partial Z^{[2]}} = W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]}) dZ[2]=dA[2]∂Z[2]∂A[2]​=W[3]T(W[4]TdZ[4]∗g′(Z[3]))∗g′(Z[2])

d W [ 2 ] = 1 m d Z [ 2 ]      ∂ Z [ 2 ] ∂ W [ 2 ] = 1 m W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) )    A [ 1 ] T dW^{[2]} =\frac{1}{m} dZ^{[2]} \;\; \frac{\partial Z^{[2]}}{\partial W^{[2]}} = \frac{1}{m}W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})) * g^{'}(Z^{[2]}))\;A^{[1]T} dW[2]=m1​dZ[2]∂W[2]∂Z[2]​=m1​W[3]T(W[4]TdZ[4]∗g′(Z[3]))∗g′(Z[2]))A[1]T

d b [ 2 ] = 1 m d Z [ 2 ]      ∂ Z [ 4 ] ∂ b [ 4 ] = 1 m W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ∗ g ′ ( Z [ 2 ] ) ) db^{[2]} =\frac{1}{m} dZ^{[2]} \;\; \frac{\partial Z^{[4]}}{\partial b^{[4]}} = \frac{1}{m} W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) * g^{'}(Z^{[2]})) db[2]=m1​dZ[2]∂b[4]∂Z[4]​=m1​W[3]T(W[4]TdZ[4]∗g′(Z[3])∗g′(Z[2]))

第1個隐藏層

d A [ 1 ] = d Z [ 2 ] ∂ Z [ 2 ] ∂ A [ 1 ] = W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) dA^{[1]} = dZ^{[2]}\frac{\partial Z^{[2]}}{\partial A^{[1]}} = W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) dA[1]=dZ[2]∂A[1]∂Z[2]​=W[2]T(W[3]T(W[4]TdZ[4]∗g′(Z[3]))∗g′(Z[2]))

d Z [ 1 ] = d A [ 1 ]      ∂ A [ 1 ] ∂ Z [ 1 ] = W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) ∗ g ′ ( Z [ 1 ] ) dZ^{[1]} =dA^{[1]}\;\; \frac{\partial A^{[1]} }{\partial Z^{[1]}} = W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) * g^{'}(Z^{[1]}) dZ[1]=dA[1]∂Z[1]∂A[1]​=W[2]T(W[3]T(W[4]TdZ[4]∗g′(Z[3]))∗g′(Z[2]))∗g′(Z[1])

d W [ 1 ] = 1 m d Z [ 1 ]      ∂ Z [ 1 ] ∂ W [ 1 ] = 1 m W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) ∗ g ′ ( Z [ 1 ] )    A [ 0 ] T dW^{[1]} =\frac{1}{m} dZ^{[1]} \;\; \frac{\partial Z^{[1]}}{\partial W^{[1]}} = \frac{1}{m}W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) * g^{'}(Z^{[1]})\;A^{[0]T} dW[1]=m1​dZ[1]∂W[1]∂Z[1]​=m1​W[2]T(W[3]T(W[4]TdZ[4]∗g′(Z[3]))∗g′(Z[2]))∗g′(Z[1])A[0]T

d b [ 1 ] = 1 m d Z [ 2 ]      ∂ Z [ 4 ] ∂ b [ 4 ] = 1 m W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) ∗ g ′ ( Z [ 1 ] ) db^{[1]} =\frac{1}{m} dZ^{[2]} \;\; \frac{\partial Z^{[4]}}{\partial b^{[4]}} = \frac{1}{m} W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) * g^{'}(Z^{[1]}) db[1]=m1​dZ[2]∂b[4]∂Z[4]​=m1​W[2]T(W[3]T(W[4]TdZ[4]∗g′(Z[3]))∗g′(Z[2]))∗g′(Z[1])

我們接着比對每一層 d w dw dw:

d W [ 4 ] = 1 m d Z [ 4 ]      ∂ Z [ 4 ] ∂ W [ 4 ] = 1 m d Z [ 4 ]    A [ 3 ] T dW^{[4]} =\frac{1}{m} dZ^{[4]} \;\; \frac{\partial Z^{[4]}}{\partial W^{[4]}} = \frac{1}{m} dZ^{[4]} \;A^{[3]T} dW[4]=m1​dZ[4]∂W[4]∂Z[4]​=m1​dZ[4]A[3]T

d W [ 3 ] = 1 m d Z [ 3 ]      ∂ Z [ 3 ] ∂ W [ 3 ] = 1 m W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] )    A [ 2 ] T dW^{[3]} =\frac{1}{m} dZ^{[3]} \;\; \frac{\partial Z^{[3]}}{\partial W^{[3]}} = \frac{1}{m}W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})\;A^{[2]T} dW[3]=m1​dZ[3]∂W[3]∂Z[3]​=m1​W[4]TdZ[4]∗g′(Z[3])A[2]T

d W [ 2 ] = 1 m d Z [ 2 ]      ∂ Z [ 2 ] ∂ W [ 2 ] = 1 m W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) )    A [ 1 ] T dW^{[2]} =\frac{1}{m} dZ^{[2]} \;\; \frac{\partial Z^{[2]}}{\partial W^{[2]}} = \frac{1}{m}W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]})) * g^{'}(Z^{[2]}))\;A^{[1]T} dW[2]=m1​dZ[2]∂W[2]∂Z[2]​=m1​W[3]T(W[4]TdZ[4]∗g′(Z[3]))∗g′(Z[2]))A[1]T

d W [ 1 ] = 1 m d Z [ 1 ]      ∂ Z [ 1 ] ∂ W [ 1 ] = 1 m W [ 2 ] T ( W [ 3 ] T ( W [ 4 ] T d Z [ 4 ] ∗ g ′ ( Z [ 3 ] ) ) ∗ g ′ ( Z [ 2 ] ) ) ∗ g ′ ( Z [ 1 ] )    A [ 0 ] T dW^{[1]} =\frac{1}{m} dZ^{[1]} \;\; \frac{\partial Z^{[1]}}{\partial W^{[1]}} = \frac{1}{m}W^{[2]T}(W^{[3]T}(W^{[4]T}dZ^{[4]} * g^{'}(Z^{[3]}) )* g^{'}(Z^{[2]})) * g^{'}(Z^{[1]})\;A^{[0]T} dW[1]=m1​dZ[1]∂W[1]∂Z[1]​=m1​W[2]T(W[3]T(W[4]TdZ[4]∗g′(Z[3]))∗g′(Z[2]))∗g′(Z[1])A[0]T

當然這隻是前向 & 回報的一個計算推導,可以讓我們更加清晰的去了解這個計算過程,是以建議可以嘗試抛開python内置的一些内置子產品去實作一個原生的神經網絡;相信一定會受益匪淺.

繼續閱讀