當前位置:
首頁 > 知識 > 深度神經網路損失函數和激活函數的選擇

深度神經網路損失函數和激活函數的選擇

在深度神經網路(DNN)反向傳播演算法(BP)中,我們對DNN的前向反向傳播演算法的使用做了總結。裡面使用的損失函數是均方差,而激活函數是Sigmoid。實際上DNN可以使用的損失函數和激活函數不少。這些損失函數和激活函數如何選擇呢?下面我們就對DNN損失函數和激活函數的選擇做一個總結。


1. 均方差損失函數+Sigmoid激活函數的問題

在講反向傳播演算法時,我們用均方差損失函數和Sigmoid激活函數做了實例,首先我們就來看看均方差+Sigmoid的組合有什麼問題。

首先我們回顧下Sigmoid激活函數的表達式為:

σ(z)的函數圖像如下:

從圖上可以看出,對於Sigmoid,當z的取值越來越大後,函數曲線變得越來越平緩,意味著此時的導數σ′(z)也越來越小。同樣的,當z的取值越來越小時,也有這個問題。僅僅在z取值為0附近時,導數σ′(z)的取值較大。

在上篇講的均方差+Sigmoid的反向傳播演算法中,每一層向前遞推都要乘以σ′(z),得到梯度變化值。Sigmoid的這個曲線意味著在大多數時候,我們的梯度變化值很小,導致我們的W,b更新到極值的速度較慢,也就是我們的演算法收斂速度較慢。那麼有什麼什麼辦法可以改進呢?

2. 使用交叉熵損失函數+Sigmoid激活函數改進DNN演算法收斂速度

上一節我們講到Sigmoid的函數特性導致反向傳播演算法收斂速度慢的問題,那麼如何改進呢?換掉Sigmoid?這當然是一種選擇。另一種常見的選擇是用交叉熵損失函數來代替均方差損失函數。

我們來看看每個樣本的交叉熵損失函數的形式:

其中,?為向量內積。這個形式其實很熟悉,在邏輯回歸原理小結中其實我們就用到了類似的形式,只是當時我們是用最大似然估計推導出來的,而這個損失函數的學名叫交叉熵。

使用了交叉熵損失函數,就能解決Sigmoid函數導數變化大多數時候反向傳播演算法慢的問題嗎?我們來看看當使用交叉熵時,我們輸出層δL的梯度情況。

對比兩者在第L層的δL梯度表達式,就可以看出,使用交叉熵,得到的的δl梯度表達式沒有了σ′(z),梯度為預測值和真實值的差距,這樣求得的Wl,bl的地圖也不包含σ′(z),因此避免了反向傳播收斂速度慢的問題。

通常情況下,如果我們使用了sigmoid激活函數,交叉熵損失函數肯定比均方差損失函數好用。


3. 使用對數似然損失函數和softmax激活函數進行DNN分類輸出

在前面我們講的所有DNN相關知識中,我們都假設輸出是連續可導的值。但是如果是分類問題,那麼輸出是一個個的類別,那我們怎麼用DNN來解決這個問題呢?

比如假設我們有一個三個類別的分類問題,這樣我們的DNN輸出層應該有三個神經元,假設第一個神經元對應類別一,第二個對應類別二,第三個對應類別三,這樣我們期望的輸出應該是(1,0,0),(0,1,0)和(0,0,1)這三種。即樣本真實類別對應的神經元輸出應該無限接近或者等於1,而非改樣本真實輸出對應的神經元的輸出應該無限接近或者等於0。或者說,我們希望輸出層的神經元對應的輸出是若干個概率值,這若干個概率值即我們DNN模型對於輸入值對於各類別的輸出預測,同時為滿足概率模型,這若干個概率值之和應該等於1。

DNN分類模型要求是輸出層神經元輸出的值在0到1之間,同時所有輸出值之和為1。很明顯,現有的普通DNN是無法滿足這個要求的。但是我們只需要對現有的全連接DNN稍作改良,即可用於解決分類問題。在現有的DNN模型中,我們可以將輸出層第i個神經元的激活函數定義為如下形式:

這個方法很簡潔漂亮,僅僅只需要將輸出層的激活函數從Sigmoid之類的函數轉變為上式的激活函數即可。上式這個激活函數就是我們的softmax激活函數。它在分類問題中有廣泛的應用。將DNN用於分類問題,在輸出層用softmax激活函數也是最常見的了。

下面這個例子清晰的描述了softmax激活函數在前向傳播演算法時的使用。假設我們的輸出層為三個神經元,而未激活的輸出為3,1和-3,我們求出各自的指數表達式為:20,2.7和0.05,我們的歸一化因子即為22.75,這樣我們就求出了三個類別的概率輸出分布為0.88,0.12和0。

從上面可以看出,將softmax用於前向傳播演算法是也很簡單的。那麼在反向傳播演算法時還簡單嗎?反向傳播的梯度好計算嗎?答案是Yes!

對於用於分類的softmax激活函數,對應的損失函數一般都是用對數似然函數,即:

可見,梯度計算也很簡潔,也沒有第一節說的訓練速度慢的問題。舉個例子,假如我們對於第2類的訓練樣本,通過前向演算法計算的未激活輸出為(1,5,3),則我們得到softmax激活後的概率輸出為:(0.015,0.866,0.117)。由於我們的類別是第二類,則反向傳播的梯度應該為:(0.015,0.866-1,0.117)。是不是很簡單呢?

當softmax輸出層的反向傳播計算完以後,後面的普通DNN層的反向傳播計算和之前講的普通DNN沒有區別。


4. 梯度爆炸梯度消失與ReLU激活函數

學習DNN,大家一定聽說過梯度爆炸和梯度消失兩個詞。尤其是梯度消失,是限制DNN與深度學習的一個關鍵障礙,目前也沒有完全攻克。

什麼是梯度爆炸和梯度消失呢?從理論上說都可以寫一篇論文出來。不過簡單理解,就是在反向傳播的演算法過程中,由於我們使用了是矩陣求導的鏈式法則,有一大串連乘,如果連乘的數字在每層都是小於1的,則梯度越往前乘越小,導致梯度消失,而如果連乘的數字在每層都是大於1的,則梯度越往前乘越大,導致梯度爆炸。

比如我們在前一篇反向傳播演算法裡面講到了δ的計算,可以表示為:

也就是說大於等於0則不變,小於0則激活後為0。就這麼一玩意就可以解決梯度消失?至少部分是的。具體的原因現在其實也沒有從理論上得以證明。這裡我也就不多說了。


5. DNN其他激活函數

除了上面提到了激活函數,DNN常用的激活函數還有:

1) tanh:這個是sigmoid的變種,表達式為:

它的導數就是sigmoid函數。softplus的函數圖像和ReLU有些類似。它出現的比ReLU早,可以視為ReLU的鼻祖。

3)PReLU:從名字就可以看出它是ReLU的變種,特點是如果未激活值小於0,不是簡單粗暴的直接變為0,而是進行一定幅度的縮小。如下圖。當然,由於ReLU的成功,有很多的跟風者,有其他各種變種ReLU,這裡就不多提了。


6. DNN損失函數和激活函數小結

上面我們對DNN損失函數和激活函數做了詳細的討論,重要的點有:1)如果使用sigmoid激活函數,則交叉熵損失函數一般肯定比均方差損失函數好。2)如果是DNN用於分類,則一般在輸出層使用softmax激活函數和對數似然損失函數。3)ReLU激活函數對梯度消失問題有一定程度的解決,尤其是在CNN模型中。

來源:http://www.cnblogs.com/pinard/p/6437495.html


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI講堂 的精彩文章:

TAG:AI講堂 |