神經網絡反向傳播的數學原理">神經網絡反向傳播的數學原理

分類:IT技術 時間:2017-09-28

雷鋒網按:本文原作者李飛騰,本文整理自知乎專欄——數字編程。雷鋒網 (公眾號:雷鋒網) 已獲得轉載授權。

如果能二秒內在腦袋裏解出下面的問題,本文便結束了。

已知: ,其中

求:

到這裏,請耐心看完下面的公式推導,無需長久心裏建設。

首先,反向傳播的數學原理是 “ 求導的鏈式法則 ” :

設 和 為 的可導函數,則

接下來介紹

  • 矩陣、向量求導的維數相容原則

  • 利用維數相容原則快速推導反向傳播

  • 編程實現前向傳播、反向傳播

  • 卷積神經網絡的反向傳播

快速矩陣、向量求導

這一節展示如何使用鏈式法則、轉置、組合等技巧來快速完成對矩陣、向量的求導

一個原則 維數相容 ,實質是 多元微分 基本知識,沒有在課本中找到下列內容, 維數相容原則 是我個人總結:

維數相容原則:通過 前後換序、轉置 使求導結果滿足矩陣乘法且結果維數滿足下式:

如果 ,那麽

利用維數相容原則解上例:

step1:把所有參數當做實數來求導,

依據鏈式法則有

可以看出除了 的求導結果在維數上連矩陣乘法都不能滿足。

step2:根據 step1 的求導結果,依據 維數相容原則 做調整: 前後換序、轉置

依據維數相容原則 ,但 ,自然得調整為

同理: ,但 ,那麽通過 換序、轉置 我們可以得到維數相容的結果

對於矩陣、向量求導:

  • “當做一維實數使用鏈式法則求導,然後做 維數相容 調整,使之符合矩陣乘法原則且維數相容” 是快速準確的策略;

  • “對單個元素求導、再整理成矩陣形式” 這種方式整理是困難的、過程是緩慢的,結果是易出錯的(不信你試試)。

如何證明經過維數相容原則調整後的結果是正確的呢?直覺!簡單就是美...

快速反向傳播

神經網絡的 反向傳播 求得 “各層” 參數 和 的導數,使用梯度下降(一階 GD、SGD,二階 LBFGS、共軛梯度等)優化目標函數。

接下來,展示不使用下標的記法( , or )直接對 和 求導 ,反向傳播是 鏈式法則維數相容原則 的完美體現,對每一層參數的求導利用上一層的中間結果完成。

這裏的標號,參考 UFLDL 教程 - Ufldl

前向傳播:

(公式 1)

(公式 2)

為第 層的中間結果, 為第 層的激活值,其中第 層包含元素:輸入 ,參數 ,激活函數 ,中間結果 ,輸出

設神經網絡的損失函數為 (這裏不給出具體公式,可以是交叉熵、MSE 等),根據 鏈式法則 有:

這裏記 ,其中 可由 公式 1 得出, 加轉置符號 是根據 維數相容原則 作出的調整。

如何求 ? 可使用如下遞推(需根據 維數相容原則 作出調整):

其中

那麽我們可以從最頂層逐層往下,便可以遞推求得每一層的

註意: 是逐維求導,在公式中是點乘的形式。

反向傳播整個流程如下:

1) 進行前向傳播計算,利用前向傳播公式,得到隱藏層和輸出層 的激活值。

2) 對輸出層 (第 層),計算殘差:

(不同損失函數,結果不同,這裏不給出具體形式)

3) 對於 的隱藏層,計算:

4) 計算各層參數 偏導數:

編程實現

大部分開源 library(如:caffe,Kaldi/src/{nnet1,nnet2})的實現通常把 作為一個 layer,激活函數 作為一個 layer(如:sigmoid、relu、softplus、softmax)。

反向傳播時分清楚該層的輸入、輸出即能正確編程實現, 如:

(公式 1)

(公式 2)

(1) 式 AffineTransform/FullConnected 層,以下是偽代碼:

註: out_diff = 是上一層(Softmax 或 Sigmoid/ReLU 的 in_diff)已經求得:

(公式 1-1)

(公式 1-2)

(公式 1-3)

(2) 式激活函數層(以 Sigmoid 為例)

註:out_diff = 是上一層 AffineTransform 的 in_diff ,已經求得,

在實際編程實現時,in、out 可能是矩陣 (通常以一行存儲一個輸入向量,矩陣的行數就是 batch_size),那麽上面的 C++ 代碼就要做出變化(改變前後順序、轉置,把函數參數的 Vector 換成 Matrix,此時 Matrix out_diff 每一行就要存儲對應一個 Vector 的 diff,在 update 的時候要做這個 batch 的加和,這個加和可以通過矩陣相乘 out_diff*input(適當的轉置)得到。

如果熟悉 SVD 分解的過程,通過 SVD 逆過程就可以輕松理解這種通過乘積來做加和的技巧。

丟掉那些下標記法吧!

卷積層求導

卷積怎麽求導呢?實際上卷積可以通過矩陣乘法來實現(是否旋轉無所謂的,對稱處理,caffe 裏面是不是有 image2col),當然也可以使用 FFT 在頻率域做加法。

那麽既然通過矩陣乘法, 維數相容原則 仍然可以運用,CNN 求導比 DNN 復雜一些,要做些累加的操作。具體怎麽做還要看編程時選擇怎樣的策略、數據結構。

快速矩陣、向量求導之維數相容大法已成。

雷鋒網版權文章,未經授權禁止轉載。詳情見 轉載須知 。


Tags: 求導 相容 鏈式 矩陣 反向 原則

文章來源:


ads
ads

相關文章
ads

相關文章

ad