神經網路入門篇之深層神經網路:詳解前向傳播和反向傳播(Forward and backward propagation)

Oten發表於2023-11-29

深層神經網路(Deep L-layer neural network)

複習下前面的內容:

1.邏輯迴歸,結構如下圖左邊。一個隱藏層的神經網路,結構下圖右邊:

注意,神經網路的層數是這麼定義的:從左到右,由0開始定義,比如上邊右圖,\({x}_{1}\)\({x}_{2}\)\({x}_{3}\),這層是第0層,這層左邊的隱藏層是第1層,由此類推。如下圖左邊是兩個隱藏層的神經網路,右邊是5個隱藏層的神經網路。

嚴格上來說邏輯迴歸也是一個一層的神經網路,而上邊右圖一個深得多的模型,淺與深僅僅是指一種程度。記住以下要點:

有一個隱藏層的神經網路,就是一個兩層神經網路。記住當算神經網路的層數時,不算輸入層,只算隱藏層和輸出層。

但是在過去的幾年中,DLI(深度學習學院 deep learning institute)已經意識到有一些函式,只有非常深的神經網路能學會,而更淺的模型則辦不到。儘管對於任何給定的問題很難去提前預測到底需要多深的神經網路,所以先去嘗試邏輯迴歸,嘗試一層然後兩層隱含層,然後把隱含層的數量看做是另一個可以自由選擇大小的超引數,然後再保留交叉驗證資料上評估,或者用開發集來評估。

再看下深度學習的符號定義:

上圖是一個四層的神經網路,有三個隱藏層。可以看到,第一層(即左邊數過去第二層,因為輸入層是第0層)有5個神經元數目,第二層5個,第三層3個。

用L表示層數,上圖:\(L=4\),輸入層的索引為“0”,第一個隱藏層\({n}^{[1]}=5\),表示有5個隱藏神經元,同理\({n}^{[2]}=5\)\({n}^{[3]}=3\)\({{n}^{[4]}}\)=\({{n}^{[L]}}=1\)(輸出單元為1)。而輸入層,\({n}^{[0]}={n}_{x}=3\)

在不同層所擁有的神經元的數目,對於每層l都用\({a}^{[l]}\)來記作l層啟用後結果,會在後面看到在正向傳播時,最終能會計算出\({{a}^{[l]}}\)

透過用啟用函式 \(g\) 計算\({z}^{[l]}\),啟用函式也被索引為層數\(l\),然後用\({w}^{[l]}\)來記作在l層計算\({z}^{[l]}\)值的權重。類似的,\({{z}^{[l]}}\)裡的方程\({b}^{[l]}\)也一樣。

最後總結下符號約定:

輸入的特徵記作\(x\),但是\(x\)同樣也是0層的啟用函式,所以\(x={a}^{[0]}\)

最後一層的啟用函式,所以\({a}^{[L]}\)是等於這個神經網路所預測的輸出結果。

前向傳播和反向傳播

  • 之前的神經網路入門篇都是基於淺層神經網路進行的,此篇開始基於深層神經網路進行

之前學習了構成深度神經網路的基本模組,比如每一層都有前向傳播步驟以及一個相反的反向傳播步驟,這次講講如何實現這些步驟。

先講前向傳播,輸入\({a}^{[l-1]}\),輸出是\({a}^{[l]}\),快取為\({z}^{[l]}\);從實現的角度來說可以快取下\({w}^{[l]}\)\({b}^{[l]}\),這樣更容易在不同的環節中呼叫函式。

所以前向傳播的步驟可以寫成: \({z}^{[l]}={W}^{[l]}\cdot{a}^{[l-1]}+{b}^{[l]}\)

\({{a}^{[l]}}={{g}^{[l]}}\left( {{z}^{[l]}}\right)\)

向量化實現過程可以寫成: \({z}^{[l]}={W}^{[l]}\cdot {A}^{[l-1]}+{b}^{[l]}\)

\({A}^{[l]}={g}^{[l]}({Z}^{[l]})\)

前向傳播需要喂入\({A}^{[0]}\)也就是\(X\),來初始化;初始化的是第一層的輸入值。\({a}^{[0]}\)對應於一個訓練樣本的輸入特徵,而\({{A}^{[0]}}\)對應於一整個訓練樣本的輸入特徵,所以這就是這條鏈的第一個前向函式的輸入,重複這個步驟就可以從左到右計算前向傳播。

下面講反向傳播的步驟:

輸入為\({{da}^{[l]}}\),輸出為\({{da}^{[l-1]}}\)\({{dw}^{[l]}}\), \({{db}^{[l]}}\)

所以反向傳播的步驟可以寫成:

(1)\(d{{z}^{[l]}}=d{{a}^{[l]}}*{{g}^{[l]}}'( {{z}^{[l]}})\)

(2)\(d{{w}^{[l]}}=d{{z}^{[l]}}\cdot{{a}^{[l-1]}}~\)

(3)\(d{{b}^{[l]}}=d{{z}^{[l]}}~~\)

(4)\(d{{a}^{[l-1]}}={{w}^{\left[ l \right]T}}\cdot {{dz}^{[l]}}\)

(5)\(d{{z}^{[l]}}={{w}^{[l+1]T}}d{{z}^{[l+1]}}\cdot \text{ }{{g}^{[l]}}'( {{z}^{[l]}})~\)

式子(5)由式子(4)帶入式子(1)得到,前四個式子就可實現反向函式。

向量化實現過程可以寫成:

(6)\(d{{Z}^{[l]}}=d{{A}^{[l]}}*{{g}^{\left[ l \right]}}'\left({{Z}^{[l]}} \right)~~\)

(7)\(d{{W}^{[l]}}=\frac{1}{m}\text{}d{{Z}^{[l]}}\cdot {{A}^{\left[ l-1 \right]T}}\)

(8)\(d{{b}^{[l]}}=\frac{1}{m}\text{ }np.sum(d{{z}^{[l]}},axis=1,keepdims=True)\)

(9)\(d{{A}^{[l-1]}}={{W}^{\left[ l \right]T}}.d{{Z}^{[l]}}\)

總結一下:

第一層可能有一個ReLU啟用函式,第二層為另一個ReLU啟用函式,第三層可能是sigmoid函式(如果做二分類的話),輸出值為,用來計算損失;這樣就可以向後迭代進行反向傳播求導來求\({{dw}^{[3]}}\)\({{db}^{[3]}}\)\({{dw}^{[2]}}\)\({{db}^{[2]}}\)\({{dw}^{[1]}}\)\({{db}^{[1]}}\)。在計算的時候,快取會把\({{z}^{[1]}}\) \({{z}^{[2]}}\)\({{z}^{[3]}}\)傳遞過來,然後回傳\({{da}^{[2]}}\)\({{da}^{[1]}}\) ,可以用來計算\({{da}^{[0]}}\),但不會使用它,這裡講述了一個三層網路的前向和反向傳播,還有一個細節沒講就是前向遞迴——用輸入資料來初始化,那麼反向遞迴(使用Logistic迴歸做二分類)——對\({{A}^{[l]}}\) 求導。

忠告:補補微積分和線性代數,多推導,多實踐。

相關文章