神经网络入门篇之深层神经网络:详解前向传播和反向传播(Forward and backward propagation)
深層神經網絡(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]}}\) 求導。
忠告:補補微積分和線性代數,多推導,多實踐。
總結
以上是生活随笔為你收集整理的神经网络入门篇之深层神经网络:详解前向传播和反向传播(Forward and backward propagation)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes 中的服务注册与发现
- 下一篇: java信息管理系统总结_java实现科