1. 程式人生 > >深度神經網路之損失函式和啟用函式

深度神經網路之損失函式和啟用函式

1.損失函式和啟用函式簡介

通過前面深度神經網路之前向傳播演算法深度神經網路之反向傳播演算法的學習,我們能夠了解到損失函式是用來評估模型的預測值與真實值之間的差異程度。另外損失函式也是神經網路中優化的目標函式,神經網路訓練或者優化的過程就是最小化損失函式的過程,損失函式越小,說明模型的預測值就越接近真實值,模型的準確性也就越好。前面我們已經學習過平方損失函式對數損失函式交叉熵損失函式等不同形式的損失函式,這裡也就不做太多介紹。

那麼在深度神經網路之中,啟用函式的作用又是什麼呢?首先我們來看單層感知機模型,如下圖所示,感知機可以利用分割線將平面分割開來。
01

現在我們利用多個感知機進行組合,獲得更強的分類能力,模型分類效果如下圖所示。
02

但無論怎樣組合,模型輸出的時候都只是線性模型,如何解決非線性分類呢?好吧,上面是我們沒有增加啟用函式的情況。那麼現在我們在每一層迭代完之後,增加一個啟用函式,如下圖的y=σ(a)所示,這樣模型的輸出便能解決非線性情況。將多個有啟用函式的神經元組合起來,我們就可以得到一個相當複雜的函式。
03

引入非線性啟用函式之中,模型的表達能力增強,能夠有效解決非線性情況。通過不同形式的啟用函式,模型也就能夠學習到不同形式的分類方式,比如平滑分類平面,方面我們解決各種問題。
04

通過上面的介紹,我們能夠了解到神經網路之中損失函式和啟用函式的作用,但實際上DNN可以使用的損失函式和啟用函式有不少,這時我們應該如何去做選擇呢?下面我們介紹一些DNN之中常見的損失函式和啟用函式。

2.交叉熵損失函式和Sigmoid啟用函式

深度神經網路之反向傳播演算法之中,我們用的是均方差損失函式和Sigmoid啟用函式,首先我們看看均方差損失函式和Sigmoid啟用函式有什麼問題。如下所示,是我們已經非常熟悉的Sigmoid啟用函式表示式
σ(z)=11+ez \sigma(z)=\frac{1}{1+e^{-z}}
其中σ(z)的影象如下圖所示,從圖中可以看出,當z越來越大時,函式曲線也就變得越平緩,意味著此時導數σ′(z)也越小。同樣,當z越來越小時,也會出現σ′(z)也越小。僅僅當z取值為0的附近時,導數σ′(z)取值較大。
05

深度神經網路之反向傳播演算法

之中,我們瞭解到每次反向迭代遞推時,都要乘以σ′(z)得到梯度變化值。而Sigmoid的曲線意味著在大多數時候,DNN的梯度變化值較小,則會導致W,b更新到極值的速度很慢。那麼有什麼辦法可以改變這種情況呢?

常見的方法是選用交叉熵損失函式來代替均方差損失函式,首先來看看交叉熵損失函式的形式。其中 為向量內積,我們在機器學習之Logistic迴歸中便用到類似的交叉熵損失函式形式。
J(W,b,a,y)=ylna(1y)ln(1a) J(W,b,a,y)=-y \cdot lna-(1-y)\cdot ln(1-a)
然後應用交叉熵損失函式之後,輸出層 δL\delta ^L的梯度變化情況如下所示。
δL=J(W,b,aL,y)zL=y1aL(1aL)+(1y)11aLaL(1aL) \delta^L=\frac{J(W,b,a^L,y)}{\partial z^L}=-y\frac{1}{a^L}(1-a^L)+(1-y)\frac{1}{1-a^L}a^L(1-a^L)

=y(1aL)+(1y)aL=aLy =-y(1-a^L)+(1-y)a^L=a^L-y

使用交叉熵損失函式與深度神經網路之反向傳播演算法中使用均方差損失函式的δL\delta^L有什麼區別呢?我們發現使用均方差損失函式時δL=(aLy)σ(z)\delta^L=(a^L-y)\odot {\sigma}'(z),對比發現使用交叉熵損失函式沒有σ(z){\sigma}'(z)。這樣求得的wl,blw^l,b^l便不包含σ(z){\sigma}'(z),因此避免了反向傳播收斂速度慢的問題。通常情況下,使用Sigmoid啟用函式時,交叉熵損失函式比均方差損失函式好用。

3.對數似然損失函式和softmax啟用函式

前面我們假設模型的輸出都是連續可導的值,但如果是分類問題,輸出的是不同類別,那麼怎麼用DNN解決呢?比如我們有三個類別的分類問題,這樣DNN輸出層對應的便是三個神經元,每個神經元分別代表類別1、類別2、類別3,這樣我們的期望輸出應該是(1,0,0)、(0,1,0)、(0,0,1),即樣本真實類別對應的神經元輸出應該無限接近或等於1。或者說,我們希望輸出層的神經元對應的輸出是若干個概率值,這若干個概率值即DNN模型對於輸入值進行各類別的輸出預測,同時這若干個概率之和為1。

很明顯,現在普通DNN無法滿足目前要求,我們需要作出相應改變,來讓DNN分類模型輸出層的輸出值在0到1之間,同時所有輸出值之和為1。為此,我們定義輸出層第i個神經元的啟用函式如下所示
aiL=eziLj=1nLezjL a_i^L=\frac{e^{z_i^L}}{\sum_{j=1}^{n_L}e^{z_j^L}}
其中nLn_L為輸出層的神經元個數,或者說分類問題的類別數。很容易看出,所有的aiLa_i^L都是在(0,1)之間的數字,而j=1nLezjL\sum_{j=1}^{n_L}e^{z_j^L}保證所有的aiLa_i^L之和為1。

下面我們通過例子來描述softmax啟用函式在前向傳播演算法中的應用,假設輸出層為三個神經元,未啟用的輸出為(3,1,-3),求出各自的指數表示式為(20,2.7,0.05),歸一化後為22.75,求出三個類別的概率為(0.88,0.12,0)。
06

對於用作分類的softmax啟用函式,對應的損失函式一般都是用對數似然函式,函式表示式如下所示。
J(W,b,aL,y)=kyklnakl J(W,b,a^L,y)=-\sum_ky_klna_k^l
其中yky_k的取值為0或1,如果某一訓練樣本的輸出為第i類,則yi=1y_i=1,其餘的jij\neq i都有yj=0y_j=0。由於每個樣本只屬於一個類別,所以對數似然函式簡化為下式,其中i即為訓練樣本的類別序號。
J(W,b,aL,y)=lnaiL J(W,b,a^L,y)=-lna_i^L
可見損失函式只是和真實類別對應的輸出有關,這樣假設真實類別是第i類,則其他不屬於第i類序號對應的神經元梯度導數為0。對於真實類別第i類,所對應的梯度計算為
J(W,b,aL,y)WiL=J(W,b,aL,y)aiLaiLziLziLWiL \frac{\partial J(W,b,a^L,y)}{\partial W_i^L}=\frac{\partial J(W,b,a^L,y)}{\partial a_i^L}\frac{\partial a_i^L}{\partial z_i^L}\frac{\partial z_i^L}{\partial W_i^L}

=1aiL(eziL)(j=1nLezjL)eziLeziL(j=1nLezjL)2aiL1=1aiL{eziLj=1nLezjLeziLj=1nLezjLeziLj=1nLezjL}aiL1 =-\frac{1}{a_i^L}\frac{(e^{z_i^L})(\sum_{j=1}^{n_L}e^{z_j^L})-e^{z_i^L}e^{z_i^L}}{(\sum_{j=1}^{n_L}e^{z_j^L})^2}a_i^{L-1}=-\frac{1}{a_i^L}\{ \frac{e^{z_i^L}}{\sum_{j=1}^{n_L}e^{z_j^L}} -\frac{e^{z_i^L}}{\sum_{j=1}^{n_L}e^{z_j^L}}\frac{e^{z_i^L}}{\sum_{j=1}^{n_L}e^{z_j^L}} \}a_i^{L-1}