深度神經網路(DNN)的反向傳播

DNN前向傳播

前向傳播是利用神經網路模型的過程,而反向傳播是根據已知的輸入輸出關係,確定模型參數的過程。

l-1層向l層的前向傳遞過程

在前向傳播的過程中,值從一個節點傳遞到後面是通過函數關係實現的。一般網路的傳遞關係如上圖所示。 a^{l-1}l-1 層的 m 個節點的值,即 a^{l-1}_{m 	imes 1}=(a^{l-1}_1,a^{l-1}_2,...,a^{l-1}_m)^T

z^{l}_{n 	imes 1}=W^l_{n 	imes m} a^{l-1}_{m 	imes 1}+b^l_{n 	imes 1} 為線性變換後的結果。 sigma(cdot)激活函數,至於激活函數有哪幾種分別有什麼功能咱們後面再說,可以先理解為激活函數就是一個可導的函數或者默認為sigmoid函數。

一、從期望的輸出獲取信息

我們知道,只要一個網路結構固定好,裡面的參數隨機生成,給一個已知的輸入就會有一個相應的輸出。那麼這個輸出和我們期望的輸出之間會有一個差別。我們用損失函數來描述這個差別。損失函數的設定也有很多種,方便起見我們這裡用平方損失函數,由輸出層與期望輸出的均方差值獲得。(二範數)

J(W,b,X,Y)=frac{1}{2} || a^L-Y ||_2^2=frac{1}{2} || sigma{( z^L )}-Y ||_2^2=frac{1}{2} || sigma{( W^La^{ L-1}+b^{ L })}-Y ||_2^2

我們希望通過不斷優化 Wb 最小化損失函數 J ,優化方法我們選擇梯度下降法。

首先,我們關注第L層即輸出層的 Wb與損失函數之間的梯度:

frac { partial{J}}{ partial{ W^{L}}}=frac{ partial{J}}{ partial{z^{L}}} frac{ partial{ z^{L} } }{ partial { W^{L}} } = (a^{L} - Y) odot sigma^{} (z^L )(a^{L-1})^T

frac {partial{J}}{partial{ b ^{L}}}=frac{partial{J}}{partial{z^{L}}} frac{ partial{ z^{L} } }{ partial { b ^{L}} } = (a^{L} - Y)odot sigma^{} (z^L )

從矩陣求導維數不變原理可以推導出 frac {partial{ z_{ n	imes1}^{L} }}{partial{ W_{ n 	imes m}^{L}} } = (a_{m 	imes 1}^{L-1})^T ,但具體是為什麼當時卡了我很久,所以我最後能理解到的位置是先看 z_1=sum_{j=1}^{m}w_{1j}a_j+b_1frac { partial{ z_{1 	imes {1}}^{L} }}{ partial{W_{ 1 	imes m}^{L}} } = (a_{ m 	imes 1}^{ L-1})^T。當n=2的時候這個式子還是成立,那麼就這樣吧哈哈。

一般地,我們看一下第 lW^l,b^l 與損失函數的梯度:

frac { partial{J}}{partial{W^{l}}}=frac{partial{J}}{partial{z^{l}}} frac{ partial{ z^{l} } }{ partial { W^{ l}} } =frac{ partial{J}}{partial{z^{L }}} frac{ partial{z ^ {L}}}{ partial{z^{L - 1 }}} ... frac{ partial{ z^{ l} } }{ partial { b^{ l}} }

frac { partial{J}}{partial{ b^{ l}}}=frac{partial{J}}{partial{z^{l}}} frac{ partial{ z^{l} } }{ partial { b^{ l}} } =frac{partial{J}}{partial{z^{L }}} frac{partial{z^{ L}}}{partial{z^{L - 1 }}} ... frac{ partial{ z^{ l} } }{ partial { b^{ l}} }

同時 z^{l}_{n 	imes 1}=W^l_{n 	imes m} a^{l-1}_{m 	imes 1}+b^l_{n 	imes 1} ,那麼仔細看看就會發現,我們不知道的只有一系列

frac{partial{z^{ L}}}{partial{z^{ L - 1 }}} , frac{ partial{z^{ L-1 }}}{ partial{ z^{ L - 2}}} ,..., frac{ partial { z^{ l }}}{partial{z^{ l -1 }}},...。

其實這個也很簡單,由於 z^{l}_{n 	imes 1}=W^l_{n 	imes m} sigma(z^{l-1}_{m 	imes 1})+b^l_{n 	imes 1} ,則 frac{ partial{z^{ l }}}{ partial{z^{ l - 1 }}}=(W^l)^T odot sigma^{}(z^{l-1})

敲黑板!

重點,我們令靈敏度 delta ^l = frac { partial{ J } }{ partial{ z^l }} ,存在遞推關係

也就是說所有層的靈敏度都可以通過遞推關係求出,則

frac { partial{J}}{partial{ W^{l}}}=delta^l frac{ partial{ z^{l} } }{ partial { W^{ l }} } =delta^l (a^{l-1})^T可以輕易的求出。

梯度求出來了,剩下的事情是梯度下降法的部分了。大家可以看看關於這方面的內容,這裡不再贅述。


推薦閱讀:

TAG:模式識別 | 神經網路 | 深度學習DeepLearning |