多層感知機及其BP算法(Multi-Layer Perception)


Deep Learning 近年來在各個領域都取得了 state-of-the-art 的效果,對於原始未加工且單獨不可解釋的特征尤為有效,傳統的方法依賴手工選取特征,而 Neural Network 可以進行學習,通過層次結構學習到更利於任務的特征。得益於近年來互聯網充足的數據,計算機硬件的發展以及大規模並行化的普及。本文主要簡單回顧一下 MLP ,也即為Full-connection Neural Network ,網絡結構如下,分為輸入,隱層與輸出層,除了輸入層外,其余的每層激活函數均采用 $sigmod$ ,MLP 容易受到局部極小值與梯度彌散的困擾,如下圖所示:

MLP 的 Forward Pass

MLP 的 BP 算法基於經典的鏈式求導法則,首先看前向傳導,對於輸入層有 $I$ 個單元, 對於輸入樣本 $(x,z)$ ,隱層的輸入為:

\[a_h = \sum_{i=1}^I w_{ih}x_i\]

\[b_h = f(a_h)\]

這里函數 $f$  為 非線性激活函數,常見的有$sigmod$ 或者是 $tanh$,本文選取 $sigmod$ 作為激活函數。計算完輸入層向第一個隱層的傳導后,剩下的隱層計算方式類似,用 $h_l$ 表示第 $l$ 層的單元數:

\[a_h = \sum_{h'=1}^{h_{l-1}}w_{h'h}b_{h'}\]

\[b_h = f(a_h)\]

對於輸出層,若采用二分類即 $logistic  \ regression$ ,則前向傳導到輸出層:

\[a = \sum_{h'}w_{h'h}b_{h'}\]

\[y = f(a)\]

這里   $y$ 即為 MLP 的輸出類別為 1 的概率,輸出類別為 0 的概率為 $1-y$,為了訓練網絡,當 $z=1$ 時,$y$ 越大越好,而當 $z=0$ 時, $1-y$越大越好 ,這樣才能得到最優的參數 $w$ ,采用 MLE 的方法,寫到一起可以得到 $y^z(1-y)^{1-z}$ ,這便是單個樣本的似然函數,對於所有樣本可以列出 $log$ 似然函數  $O = \sum_{(x,z)} zlogy + (1-z)log(1-y) $ ,直接極大化該似然函數即可,等價於極小化以下的 $-log$ 損失函數:

\[O = - \left [ \sum_{(x,z)}  zlogy + (1-z)log(1-y)  \right ] \]

對於多分類問題,即輸出層采用   $softmax$ ,假設有 $K$ 個類別,則輸出層的第 $k$ 個單元計算過程如下:

\[a_k =\sum_{h'} w_{h'k}b_{h'} \]

\[y_k = f(a_k)\]

則得到類別 k 的概率可以寫作 $ \prod_ky_k^{z_k}$ ,注意標簽 $z$ 中只有第 $k$ 維為 1,其余為 0,所以現在只需極大化該似然函數即可:

\[O =\prod_{(x,z)} \prod_{k}y_k^{z_k}\]

同理等價於極小化以下損失:

\[ O = -\prod_{(x,z)} \prod_{k}y_k^{z_k}\]

以上便是 $softmax$ 的損失函數,這里需要注意的是以上優化目標 $O$ 均沒帶正則項,而且 $logistic$ 與 $softmax$ 最后得到的損失函數均可以稱作交叉熵損失,注意和平方損失的區別。

Backward Pass

有了以上前向傳導的過程,接下來看誤差的反向傳遞,對於 $sigmod$ 來說,最后一層的計算如下:$a =\sum_h w_h \cdot b_h$ ,$y = f(a) = \sigma(a) $ ,這里 $b_h$ 為倒數第二層單元 $h$ 的輸出,$\sigma$  為 $sigmod$ 激活函數,且滿足  $\sigma '(a) = \sigma(a) (1-\sigma(a))$ ,對於單個樣本的損失 :

\[O = -\left [z log(\sigma(a) +(1-z)log(1-\sigma(a))  \right ]\]

可得到如下的鏈式求導過程:

\[\frac{\partial O}{\partial w_h} =   \frac{\partial O}{\partial a} \cdot \frac{\partial a}{\partial w_h}\]

顯而易見對於后半部分 $\frac{\partial a}{\partial w_h}$ 為  $b_h$ ,對於前半部分 $\frac{\partial O}{\partial a} $ : 

\begin{aligned}
\frac{\partial O}{\partial a}
&=-\frac{\partial \left [z \ log(\sigma(a)) +(1-z)log(1-\sigma(a)) \right ] }{\partial a}\\
&=-\left [ \frac{z}{\sigma(a)} - \frac{1 - z}{1 - \sigma(a)} \right ]\sigma'(a) \\
&=-\left [ \frac{z}{\sigma(a)} - \frac{1 - z}{1 - \sigma(a)} \right ]\sigma(a)(1-\sigma(a))\\
&= \sigma(a) -z\\
&= y - z
\end{aligned}

以上,便得到了 $logistic$ 的殘差,接下來殘差反向傳遞即可,殘差傳遞形式同 $softmax$ ,所以先推倒 $softmax$ 的殘差項,對於單個樣本, $softmax$ 的 $log$ 損失函數為:

\[O = -\sum_iz_i logy_i\]

其中:

\[y_i = \frac{e^{a_i}}{\sum_je^{a_j}}\]

根據以上分析,可以得到 $y_{k'}$ 關於 $a_k$ 的導數:

\[\frac{\partial y_{k'}}{\partial a_k}=\left\{
\begin{aligned}
\frac{\sum_{i \ne k}e^{a_j} \cdot e^{a_k}}{\sum_je^{a_j} \cdot \sum_je^{a_j} } &=y_k (1-y_k)\ \ \ \ k'=k\\
\frac{e^{a_{k'}} \cdot e^{a_k}}{\sum_je^{a_j} \cdot \sum_je^{a_j} } &=-y_{k'}y_k \ \ \ \ \ \ \ \ \ k \neq k
\end{aligned}
\right.\]

現在能得到損失函數 $O$ 對於 $a_k$ 的導數:

\[\begin{aligned}
\frac{\partial O}{\partial a_k} &= \frac{\partial\left [ -\sum_iz_ilogy_i \right ]}{\partial a_k} \\
&= -\sum_iz_i \cdot \frac{\partial logy_i}{\partial a_k} \\
&= -\sum_iz_i \frac{1}{y_i} \frac{\partial y_i}{\partial a_k} \\
&= -z_k(1-y_k) - \sum_{i \ne k} z_i \frac{1}{y_i}(-y_i y_k) \\
&= -z_k + z_ky_k + \sum_{i \ne k} z_i y_k \\
&= -z_k + y_k(\sum_iz_i) \\
&=y_k-z_k
\end{aligned}\]

這里有  $\sum_iz_i = 1$ ,即只有一個類別。  到這一步, $softmax$ 與 $sigmod$  的殘差均計算完成,可以用符號 $\delta$ 來表示,對於單元 $j$ ,其形式如下:

\[\delta_j = \frac{\partial O}{\partial a_j}\]

這里可以得到 $softmax$  層向倒數第二層的殘差反向傳遞公式:

\[  \delta_h = \frac{\partial O}{\partial b_h} \cdot \frac{\partial b_h}{\partial a_h} = \frac{\partial b_h}{\partial a_h} \sum_{k}\frac{\partial O}{\partial a_k} \cdot \frac{\partial a_k}{\partial b_h} = f'(a_h) \sum_k w_{hk}\delta_k\]

其中 $ a_k = \sum_hw_{hk}b_h $ ,對於 $sigmod$ 層,向倒數第二層的反向傳遞公式為:

\[  \delta_h = \frac{\partial O}{\partial b_h} \cdot \frac{\partial b_h}{\partial a_h} = \frac{\partial b_h}{\partial a_h} \cdot \frac{\partial O}{\partial a} \cdot \frac{\partial a}{\partial b_h} = f'(a_h) w_h\delta\]

以上公式的 $\delta$ 代表 $sigmod$ 層唯一的殘差,接下來就是殘差從隱層向前傳遞的傳遞過程,一直傳遞到首個隱藏層即第二層(注意,殘差不會傳到輸入層,因為不需要,對輸入層到第二層的參數求導,其只依賴於第二層的殘差,因為第二層是這些參數的放射函數):

\[ \delta_h =   f'(a_h) \sum_{h'=1}^{h_{l+1}} w_{hh'}\delta_{h'}\]

整個過程可以看下圖:

最終得到關於權重的計算公式:

\[\frac{\partial O}{\partial w_{ij}} = \frac{\partial O}{\partial a_{j}} \frac{\partial a_j}{\partial w_{ij}} = \delta_jb_i\]

 至此完成了backwark pass 的過程,注意由於計算比較復雜,有必要進行梯度驗證。對函數  $O$ 關於參數 $w_{ij}$ 進行數值求導即可,求導之后與與上邊的公式驗證差異,小於給定的閾值即認為我們的運算是正確的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM