機器學習:神經網路的代價函數及反向傳播演算法

在《機器學習:神經網路的模型構建》中,我記錄了神經網路的一些基礎知識,包括神經網路的邏輯單元、模型表示、前向傳播等等。這篇筆記中,我會整理神經網路的代價函數以及反向傳播演算法~

那麼如何在給定的訓練集下,來為神經網路擬合參數呢?和之前學習的大多數演算法一樣,要從代價函數開始討論起了。


神經網路在分類中的應用

神經網路可以應用在兩種分類問題中:二分類問題和多分類問題。

在二分類問題中,y 等於 0 或 1,神經網路只有一個輸出單元;多分類問題中,y 可能為任何實數,神經網路有多個輸出單元。


神經網路的代價函數

現在我們有一個訓練集: left{ (x^{(1)},y^{(1)}), (x^{(2)},y^{(2)}), ... , (x^{(m)},y^{(m)}) 
ight} ,其中有 m 個訓練樣本,每個包含一組輸入 x^{(i)} 和一組輸出 y^{(i)} ,我們用 L 表示神經網路的總層數,用 s_{l} 表示第 l 層的單元數量,即神經元的數量(不包括偏置單元

一般來說,我們使用的神經網路的代價函數是邏輯回歸里代價函數的一般形式。

在邏輯回歸中,我們的代價函數通常為: J(	heta)=-frac{1}{m}[sum_{i=1}^{m}{y^{(i)}logh_{	heta}(x^{(i)})+(1-y^{(i)})log(1-h_{	heta}(x^{(i)}))}]+frac{x}{2m}sum_{j=1}^{n}{	heta_{j}^{2}} ,其中第一項表示預測值與實際值之間的差距,第二項為參數的正則化項。

對於神經網路來說,不再是只有一個輸出單元,取而代之的是 K 個,那麼其代價函數就表示為: J(Theta)=-frac{1}{m}[sum_{i=1}^{m}sum_{k=1}^{K}{y_{k}^{(i)}log(h_{Theta}(x^{(i)}))_{k}+(1-y_{k}^{(i)})log(1-(h_{Theta}(x^{(i)}))_{k})}]+frac{lambda}{2m}sum_{l=1}^{L-1}sum_{i=1}^{s_{l}}sum_{j=1}^{s_{l+1}}(Theta_{ji}^{(l)})^{2}

其中 h_{Theta}(x)in R^{K} (K 維向量), (h_{Theta}(x))_{i} 表示第 i 個輸出。

即每一個的邏輯回歸演算法的代價函數,按輸出的順序 1 ~ K,依次相加。


反向傳播演算法

那麼如何將神經網路的代價函數最小化呢?我們來看一下反向傳播演算法。

在上一個部分中,我們已經得到了代價函數 J(	heta) 的表達式,想要用梯度下降法或更高級的優化演算法來求參數,就需要來計算 J(	heta)frac{partial}{partial Theta_{ij}^{(l)}}J(Theta)

先回顧一下前向傳播演算法,如果有一個訓練集,只有一組樣本 (x,y) ,那麼求訓練集在神經網路中各層的輸出值的過程為:

a^{(1)} 就是第一層的激勵值,也就是輸入層,所以為 x ,那麼 z^{(2)} 就等於矩陣 Theta^{(1)}a^{(1)} ,第二層的激勵值 a^{(2)} 就為 g(z^{(2)}) ,後幾層同理,同樣用前向傳播求出 a^{(3)}a^{(4)} ,其中 g 為 S 型激勵函數。同樣, a^{(4)} 也是假設函數的輸出 h_{Theta}(x)

??接下來,為了計算導數項,我們就需要用到反向傳播演算法了!

簡單來說,我們引入了一個誤差變數 delta_{j}^{(l)} ,代表第 l 層中第 j 個節點的誤差,表示了該節點對最終輸出值的殘差產生的影響,也就是說這個誤差捕捉到了該節點的激勵值,然後計算出其誤差,例如:

delta_{j}^{(4)}=a_{j}^{(4)}-y_{j}

向量化表示就是:

delta^{(4)}=a^{(4)}-y

其中:向量維數等於輸出的單元個數。

下一步就是計算前幾層的誤差項了:

delta^{(3)}=(Theta^{(3)})^{T}delta^{(4)}.*g^{}(z^{(3)})

delta^{(2)}=(Theta^{(2)})^{T}delta^{(3)}.*g^{}(z^{(2)})

(推導方法有很多種,式子太複雜就不記錄了……)

到這裡也看出來為什麼叫反向傳播演算法了,因為是從輸出層開始,一層一層往前推算的,一直計算到第二層,因為第一層是輸入層,不存在誤差。

這就是反向傳播演算法的大致過程,那麼面對複雜的訓練集時,如何使用反向傳播演算法呢?

假設訓練集為 left{ (x^{(1)},y^{(1)}), (x^{(2)},y^{(2)}), ... , (x^{(m)},y^{(m)}) 
ight} ,設誤差 Delta_{ij}^{(k)}=0 ,下面是一段偽代碼:

For i=1 to m

{

Set a^{(1)}=x^{(i)}

Perform forward propagation to compute a^{(l)} for l=2,3,...,L

Using y^{(i)} , cpmpute delta^{L}=a^{L}-y^{i}

Compute delta^{(L-1)},delta^{(L-2)},...,delta^{2} Delta_{ij}^{(l)}:=Delta_{ij}^{(l)}+a_{j}^{(l)}delta_{i}^{(l+1)}

}

D_{ij}^{(l)}:=frac{1}{m}Delta_{ij}^{(l)}+lambda Theta_{ij}^{(l)} if j
e0 D_{ij}^{(l)}:=frac{1}{m}Delta_{ij}^{(l)} if j=0

簡單來說就是,從後向前依次計算每一層的 delta ,用 Delta 代表總誤差,每一層都有對應的 Delta^{(l)} ,再引入代價函數對參數進行求導的結果 Dj=0 時對應偏置項。

一旦計算出了 D_{ij}^{(l)} ,就可以得到代價函數對每個參數的偏導數,因為可以證明得到:

frac{partial}{partial Theta_{ij}^{(l)}}J(Theta)=D_{ij}^{(l)}

D_{ij}^{(l)} 用來累加誤差值,最後幫助我們計算偏微分~


推薦閱讀:

RSA演算法詳解
單機事務不同隔離級別的並發問題整理
精選 TOP45 值得學習的Python項目
024 Swap Nodes in Pairs[M]
矩陣中的路徑

TAG:機器學習 | 神經網路 | 演算法 |