神经网络入门篇之深层神经网络:详解前向传播和反向传播(Forward and backward propagation)
深層神經(jīng)網(wǎng)絡(luò)(Deep L-layer neural network)
復(fù)習(xí)下前面的內(nèi)容:
1.邏輯回歸,結(jié)構(gòu)如下圖左邊。一個隱藏層的神經(jīng)網(wǎng)絡(luò),結(jié)構(gòu)下圖右邊:
注意,神經(jīng)網(wǎng)絡(luò)的層數(shù)是這么定義的:從左到右,由0開始定義,比如上邊右圖,\({x}_{1}\)、\({x}_{2}\)、\({x}_{3}\),這層是第0層,這層左邊的隱藏層是第1層,由此類推。如下圖左邊是兩個隱藏層的神經(jīng)網(wǎng)絡(luò),右邊是5個隱藏層的神經(jīng)網(wǎng)絡(luò)。
嚴(yán)格上來說邏輯回歸也是一個一層的神經(jīng)網(wǎng)絡(luò),而上邊右圖一個深得多的模型,淺與深僅僅是指一種程度。記住以下要點:
有一個隱藏層的神經(jīng)網(wǎng)絡(luò),就是一個兩層神經(jīng)網(wǎng)絡(luò)。記住當(dāng)算神經(jīng)網(wǎng)絡(luò)的層數(shù)時,不算輸入層,只算隱藏層和輸出層。
但是在過去的幾年中,DLI(深度學(xué)習(xí)學(xué)院 deep learning institute)已經(jīng)意識到有一些函數(shù),只有非常深的神經(jīng)網(wǎng)絡(luò)能學(xué)會,而更淺的模型則辦不到。盡管對于任何給定的問題很難去提前預(yù)測到底需要多深的神經(jīng)網(wǎng)絡(luò),所以先去嘗試邏輯回歸,嘗試一層然后兩層隱含層,然后把隱含層的數(shù)量看做是另一個可以*選擇大小的超參數(shù),然后再保留交叉驗證數(shù)據(jù)上評估,或者用開發(fā)集來評估。
再看下深度學(xué)習(xí)的符號定義:
上圖是一個四層的神經(jīng)網(wǎng)絡(luò),有三個隱藏層。可以看到,第一層(即左邊數(shù)過去第二層,因為輸入層是第0層)有5個神經(jīng)元數(shù)目,第二層5個,第三層3個。
用L表示層數(shù),上圖:\(L=4\),輸入層的索引為“0”,第一個隱藏層\({n}^{[1]}=5\),表示有5個隱藏神經(jīng)元,同理\({n}^{[2]}=5\),\({n}^{[3]}=3\),\({{n}^{[4]}}\)=\({{n}^{[L]}}=1\)(輸出單元為1)。而輸入層,\({n}^{[0]}={n}_{x}=3\)。
在不同層所擁有的神經(jīng)元的數(shù)目,對于每層l都用\({a}^{[l]}\)來記作l層激活后結(jié)果,會在后面看到在正向傳播時,最終能會計算出\({{a}^{[l]}}\)。
通過用激活函數(shù) \(g\) 計算\({z}^{[l]}\),激活函數(shù)也被索引為層數(shù)\(l\),然后用\({w}^{[l]}\)來記作在l層計算\({z}^{[l]}\)值的權(quán)重。類似的,\({{z}^{[l]}}\)里的方程\({b}^{[l]}\)也一樣。
最后總結(jié)下符號約定:
輸入的特征記作\(x\),但是\(x\)同樣也是0層的激活函數(shù),所以\(x={a}^{[0]}\)。
最后一層的激活函數(shù),所以\({a}^{[L]}\)是等于這個神經(jīng)網(wǎng)絡(luò)所預(yù)測的輸出結(jié)果。
前向傳播和反向傳播
- 之前的神經(jīng)網(wǎng)絡(luò)入門篇都是基于淺層神經(jīng)網(wǎng)絡(luò)進(jìn)行的,此篇開始基于深層神經(jīng)網(wǎng)絡(luò)進(jìn)行
之前學(xué)習(xí)了構(gòu)成深度神經(jīng)網(wǎng)絡(luò)的基本模塊,比如每一層都有前向傳播步驟以及一個相反的反向傳播步驟,這次講講如何實現(xiàn)這些步驟。
先講前向傳播,輸入\({a}^{[l-1]}\),輸出是\({a}^{[l]}\),緩存為\({z}^{[l]}\);從實現(xiàn)的角度來說可以緩存下\({w}^{[l]}\)和\({b}^{[l]}\),這樣更容易在不同的環(huán)節(jié)中調(diào)用函數(shù)。
所以前向傳播的步驟可以寫成: \({z}^{[l]}={W}^{[l]}\cdot{a}^{[l-1]}+{b}^{[l]}\)
? \({{a}^{[l]}}={{g}^{[l]}}\left( {{z}^{[l]}}\right)\)
向量化實現(xiàn)過程可以寫成: \({z}^{[l]}={W}^{[l]}\cdot {A}^{[l-1]}+{b}^{[l]}\)
? \({A}^{[l]}={g}^{[l]}({Z}^{[l]})\)
前向傳播需要喂入\({A}^{[0]}\)也就是\(X\),來初始化;初始化的是第一層的輸入值。\({a}^{[0]}\)對應(yīng)于一個訓(xùn)練樣本的輸入特征,而\({{A}^{[0]}}\)對應(yīng)于一整個訓(xùn)練樣本的輸入特征,所以這就是這條鏈的第一個前向函數(shù)的輸入,重復(fù)這個步驟就可以從左到右計算前向傳播。
下面講反向傳播的步驟:
輸入為\({{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)得到,前四個式子就可實現(xiàn)反向函數(shù)。
向量化實現(xiàn)過程可以寫成:
(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]}}\)
總結(jié)一下:
第一層可能有一個ReLU激活函數(shù),第二層為另一個ReLU激活函數(shù),第三層可能是sigmoid函數(shù)(如果做二分類的話),輸出值為,用來計算損失;這樣就可以向后迭代進(jìn)行反向傳播求導(dǎo)來求\({{dw}^{[3]}}\),\({{db}^{[3]}}\) ,\({{dw}^{[2]}}\) ,\({{db}^{[2]}}\) ,\({{dw}^{[1]}}\) ,\({{db}^{[1]}}\)。在計算的時候,緩存會把\({{z}^{[1]}}\) \({{z}^{[2]}}\)\({{z}^{[3]}}\)傳遞過來,然后回傳\({{da}^{[2]}}\),\({{da}^{[1]}}\) ,可以用來計算\({{da}^{[0]}}\),但不會使用它,這里講述了一個三層網(wǎng)絡(luò)的前向和反向傳播,還有一個細(xì)節(jié)沒講就是前向遞歸——用輸入數(shù)據(jù)來初始化,那么反向遞歸(使用Logistic回歸做二分類)——對\({{A}^{[l]}}\) 求導(dǎo)。
忠告:補補微積分和線性代數(shù),多推導(dǎo),多實踐。
總結(jié)
以上是生活随笔為你收集整理的神经网络入门篇之深层神经网络:详解前向传播和反向传播(Forward and backward propagation)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes 中的服务注册与发现
- 下一篇: 3天面了20个候选人,聊聊我的感受