標籤:

損失函數——交叉熵損失函數

本文介紹常見的損失函數——交叉熵損失函數的函數特性以及優化形式。


這篇文章中,討論的Cross Entropy損失函數常用於分類問題中,但是為什麼它會在分類問題中這麼有效呢?我們先從一個簡單的分類例子來入手。

預測政治傾向例子

我們希望根據一個人的年齡、性別、年收入等相互獨立的特徵,來預測一個人的政治傾向,有三種可預測結果:民主黨、共和黨、其他黨。假設我們當前有兩個模型,這兩個模型最後輸出都是通過softmax的方式得到對於每個預測結果的概率:

模型1

| COMPUTED | TARGETS | CORRECT? |

| :---------: | :---------: | :------: |

| 0.3 0.3 0.4 | 0 0 1(民主黨) | 正確 |

| 0.3 0.4 0.3 | 0 1 0(共和黨) | 正確 |

| 0.1 0.2 0.7 | 1 0 0 (其他黨) | 錯誤 |

模型1對於樣本1和樣本2以非常微弱的優勢判斷正確,對於樣本3的判斷則徹底錯誤。

模型2

| COMPUTED | TARGETS | CORRECT? |

| :---------: | :---------: | :------: |

| 0.1 0.2 0.7 | 0 0 1(民主黨) | 正確 |

| 0.1 0.7 0.2 | 0 1 0(共和黨) | 正確 |

| 0.3 0.4 0.3 | 1 0 0 (其他黨) | 錯誤 |

模型2對於樣本1和樣本2判斷非常準確,對於樣本3判斷錯誤,但是相對來說沒有錯得太離譜。

好了,有了模型之後,我們需要通過定義損失函數來判斷模型在樣本上的表現了,那麼我們可以定義哪些損失函數呢?

Classification Error(分類錯誤率)

最為直接的損失函數定義為: classification error=frac{count of error items}{count of  all items}

模型1: classification error=frac{1}{3}

模型2: classification error=frac{1}{3}

我們知道,模型1模型2雖然都是預測錯了1個,但是相對來說模型2表現的更好,損失函數值照理來說應該更小,但是,很遺憾的是, classification error 並不能判斷出來,所以這種損失函數雖然好理解,但表現不太好。

Mean Squared Error (平方和)

平方和損失也是一種比較常見的損失函數,其定義為: MSE=frac{1}{n}sum_{i}^n(hat{y_i}-y_i)

模型1: MSE=frac{0.54+0.54+1.34}{3}=0.81

模型2: MSE=frac{0.14+0.14+0.74}{3}=0.34

MSE能夠判斷出來模型2優於模型1,那為什麼不採樣這種損失函數呢?原因在於,使用該損失函數時,得到的表達式是非凸函數,有很多局部的極值點。在做優化的時候不太好處理。

有了上面的直觀分析,我們可以清楚的看到,對於分類問題的損失函數來說,分類錯誤率和平方和損失都不是很好的損失函數,下面我們來看一下交叉熵損失函數是怎麼解決這個問題的。

Cross Entropy Error Function

交叉熵損失函數經常用於分類問題中,特別是在神經網路做分類問題時,也經常使用交叉熵作為損失函數,此外,由於交叉熵涉及到計算每個類別的概率,所以交叉熵幾乎每次都和softmax函數一起出現。

表達式

二分類

在二分的情況下,模型最後需要預測的結果只有兩種情況,對於每個類別我們的預測得到的概率為 p1-p 。此時表達式為: ?(ylog(p)+(1?y)log(1?p))

多分類

多分類的情況實際上就是對二分類的擴展: -sum_{c=1}^My_{o,c}log(p_{o,c})

其中:

  • M ——類別的數量;
  • y ——指示變數(0或1),如果該類別和樣本觀測到的類別相同就是1,否則是0;
  • p ——對於觀測樣本屬於類別c的預測概率。

函數圖像

可以看出,該函數是凸函數,求導時能夠得到全局最優值。

求導

我們用神經網路最後一層輸出的情況,來看一眼整個模型預測及獲得損失的的流程:

  1. 神經網路最後一層得到每個類別的得分scores
  2. 該得分經過softmax轉換為概率輸出;
  3. 模型預測的類別概率輸出與真實類別的one hot形式進行cross entropy損失函數的計算。

下面,我們以二分類的情形來推導一下整個求導公式,我們將求導分成兩個過程,即拆成兩項偏導的乘積。:

frac{partial E}{partial score_i}=frac{partial E}{partial p_i}cdot frac{partial p_i}{partial score_i}

計算第一項: frac{partial E}{partial p_i}

egin{align} frac{partial E}{partial pi} &= frac{partial ?(ylog(p)+(1?y)log(1?p))}{partial pi} \ &= -frac{partial yilogpi}{partial pi}-frac{partial (1-yi)log(1-pi)}{partial pi} \ &= -frac{yi}{pi}-[(1-yi)cdot frac{1}{1-pi}cdot (-1)] \ &= -frac{yi}{pi}-frac{1-yi}{1-pi} \ end{align}

計算第二項: frac{partial p_i}{partial score_i}

這一項要計算的是softmax函數對於score的導數,我們先回顧一下分數求導的公式:

f(x) = frac{g(x)}{h(x)}=frac{g(x)h(x)-g(x){h}(x)}{h^2(x)}

考慮 k 等於 i 的情況:

egin{align} frac{partial pi}{partial scorei} &= frac{({e^{yi}})cdot (sum_ie^{yi})-e^{yi}cdot {(sum_j e^{yi})}}{(sum_je^{yi})^2} \ &= frac{e^{yi}cdot sum_ie^{yi}-{(e^{yi})}^2}{(sum_je^{yi})^2} \ &= frac{e^{yi}}{sum_je^{yi}} - frac{(e^{yi})^2}{(sum_je^{yi})^2} \ &= frac{e^{yi}}{sum_je^{yi}}cdot (1 - frac{e^{yi}}{sum_je^{yi}}) \ &= sigma(yi)(1-sigma(yi)) \ end{align}

考慮k不等於i的情況:

egin{align} frac{partial p_i}{partial score_i} &= frac{(e^{y_k})cdot (sum_ie^{y_i})-e^{y_i}cdot {(sum_j e^{y_i})}}{(sum_je^{y_i})^2} \ &= frac{0cdot sum_ie^{y_i}-(e^{y_i})cdot (e^{y_k})}{(sum_je^{y_i})^2} \ &= -frac{e^{yi}cdot e^{yk}}{(sum_je^{yi})^2} \ &= -frac{e^{y_i}}{sum_je^{y_i} }cdot frac{e^{y_k} }{sum_je^{y_i}} \ &= -sigma(y_i)cdot sigma(y_k) \ end{align}

綜上可得softmax損失函數的求導結果:

egin{split}frac{partial p_i}{partial score_i}=egin{cases} sigma(y_i)(1-sigma(y_i)) & 	ext{$if j=k$} \ -sigma(y_i)cdot sigma(y_k) & 	ext{$if j 
eq k$}end{cases}end{split}

計算結果 frac{partial E}{partial score_i}

egin{align} frac{partial E}{partial score_i} &= frac{partial E}{partial p_i}cdot frac{partial p_i}{partial score_i} \ &= [-frac{y_i}{sigma(y_i)}-cdot frac{1-y_i}{1-sigma(y_i)}]cdot sigma(y_i)(1-sigma(y_i) \ &= -frac{c_i}{sigma(y_i)}cdot sigma(y_i)cdot (1-sigma(y_i))+frac{1-c_i}{1-sigma(y_i)}cdot sigma(y_i)cdot (1-sigma(y_i)) \ &= -c_i+c_icdot sigma(y_i)+sigma(y_i)-cicdot sigma(y_i) \ &= sigma(y_i)-c_i \ end{align}

可以看到,我們得到了一個非常漂亮的結果,所以,Cross Entropy損失函數,不僅可以很好的衡量模型的效果,又可以很容易的的進行求導計算。

優點

我們對結果進一步對參數求導:即 frac{partial E}{partial w_i}=frac{partial E}{partial score_i}cdot frac{partial score_i}{partial w_i}=x_icdot [sigma(y_i)-c_i]

在用梯度下降法做參數更新的時候,模型學習的速度取決於兩個值:一、學習率;二、偏導值。其中,學習率是我們需要設置的超參數,所以我們重點關注偏導值。從上面的式子中,我們發現,偏導值的大小取決於 x_i [sigma(y_i)-c_i] ,我們重點關注後者,後者的值大小反映了我們模型的錯誤程度,該值越大,說明模型效果越差,但是該值越大同時也會使得模型學習速度更快。所以,用交叉熵當損失函數在模型效果差的時候學習速度比較快,在模型效果好的時候學習速度變慢,這是我們希望得到的。

參考

[1]. 神經網路的分類模型 LOSS 函數為什麼要用 CROSS ENTROPY

[2]. Softmax as a Neural Networks Activation Function

[3]. A Gentle Introduction to Cross-Entropy Loss Function


推薦閱讀:

PMF:概率矩陣分解
Road To Data Science | 數據科學之路專欄索引目錄
python3機器學習經典實例-第四章聚類19

TAG:機器學習 |