機器/深度學習: 基礎介紹-損失函數(loss function)

機器學習大部分的算法都有希望最大化/最小化一個函數/指標,這個函數被稱為「目標函數(Object function)」(如果修過最佳化理論對這個名詞應該不陌生,整本書都在講這個),比如K-means群集分析就是希望「最小化群內的資料和群心的誤差平方和」,PCA則是希望「投影向量讓投影後的資料變異量最大化」。不同的演算法用到的假設都不太一樣,所以目標函數都不一樣。最近很夯的人工智慧(幾乎都是深度學習)用到的目標函數基本上都是「損失函數(loss function)」,而模型的好壞有絕大部分的因素來至損失函數的設計。

損失函數基本上可以分成兩個面向(分類和回歸),基本上都是希望最小化損失函數。

本篇文章將介紹
1.「什麼叫做損失函數為什麼是最小化」
2. 回歸常用的損失函數: 均方誤差(Mean square error,MSE)和平均絕對值誤差(Mean absolute error,MAE),和這兩個方法的優缺點。
3. 分類問題常用的損失函數: 交叉熵(cross-entropy)。

什麼叫做損失函數跟為什麼是最小化

換個角度解釋,如果我們是做股票預測模型,我們預測指數應該到10000點,結果實際是11000點,中間差了1000點,如果我們照著模型去投資,我們是不是損失了1000點的差異,所以應該不會有人用「我們模型跟實際值有1000點的殘差」來解釋吧。
所以損失函數中的損失就是「實際值和預測值的殘差」。

數學上都會用
y表示實際值,ŷ表示預測值。「損失/殘差」數學表示為

所以我們都希望這個loss/residual越小越好(最小化),這樣代表的就是模型好棒棒。

在分類的問題中,我們也是希望模型好棒棒,可以完美區隔不同類別的資料,我們也是希望分類的錯誤率越小越好(等同於正確率最大化)。
y表示實際類別,ŷ表示預測類別。

但在分類的問題中,我們不會直接拿分類錯誤率當作損失函數進行最佳化,但損失函數在分類問題的設計會有錯誤率的核心在內,這部分在Cross-entropy章節我會提到為什麼我們不直接拿錯誤率當損失函數。

回歸常用的損失函數: 均方誤差(Mean square error,MSE)和平均絕對值誤差(Mean absolute error,MAE)

簡單說一下均方誤差,就是計算方法是求「預測值與真實值之間差異的均方值」。
很多介紹都會直接寫公式出來,但我這邊多廢話一句,怎麼會有「均方值」這個字,我前面提到都是預測值與真實值之間的差異,這差異不是只是一個值嗎?因為資料有可能不只有一筆,有可能有一百筆甚至一千萬筆,所以需要計算這所有資料的平均值,但平均值計算的差值內有正有負,直接相加會有問題。
比如兩筆資料y1=0, y2=1結果模型預測ŷ1=100,ŷ2=-99。
loss1=y1- ŷ1=0–100=-100
loss2=y2- ŷ2=1-(-99)=100
loss1+ loss2=-100+100=0
然後下個結論模型好棒棒唷,預測差值等於0。
但這樣合理嗎?一定不合理阿。
所以加個平方,值都是正數,那預測值和實際值的差異就出來了。

MSE公式如下,假設有n筆資料:

上例子

MSE很大,所以模型不好。

平均絕對值誤差(Mean absolute error,MAE)如均方誤差內的介紹,預測值和實際值的差值內有正有負,直接相加會有問題,除了平方讓差值變成正數,當然還可以用絕對值讓差值變成正數。

下圖我畫出用MSE和MAE的差異,這邊我假設實際值為0,預測值為-10~10,可以發現平方的loss很大(紅色軸),絕對值的loss相對小很多(藍色軸),而且平方的loss變化比較曲線,絕對值的loss比較線性(V字)。

那平方的loss很大會造成什麼問題,我舉一個例子。但如果要直接比MSE和MAE很不公平,沒有站在同一基準,所以MSE部分,用Root MSE(RMSE)來比較,就是在MSE的結果上再開個根號。

下表我舉5個資料的例子,左表是殘差差異不大(介於-10~10),右表是我把第5筆資料殘差改成100(離群值outlier)。

從上表可以得知,如果所有的資料分布很均勻,這時候MAE和RMSE算出來差不多,但當有outlier出來時(上右表),雖然兩個指標都變大,但RMSE的變化反而大很多。

如果用MSE來推估模型時,因為模型在學習基本上目的就是要消除(最小化)residual,所以一定先拿residual最大的開刀,因此Outlier的權重基本上會比其他的大,所以參數在更新(深度學習)會往Outlier誤差的方向去更新,更容易造成模型performance變差。

但MAE在梯度學習部分存在一個問題,更新參數時,MAE的梯度始終相同,所以當loss很小的時候,梯度一樣很大,這樣在學習時,容易在快學習到最佳解時,更新的解進不到最佳的地方。

算兩次應該就知道了吧,MSE的梯度變化會隨著你帶進去的點變化,離最佳解越遠梯度越大,越靠近解梯度越小,而MAE的部分梯度是一個定值,看起來很小,但靠近解的時候這個值又太大。下表為更新20次的結果。

這邊我學習率(r)我故意用0.3,這樣才看得出差異。

下表是不同時間點的解跟梯度變化。在MSE部分,可以看到越接近解梯度越小,但在MAE部分,梯度都是一樣的(正1跟負1),所以最後靠近解的時候MAE會發生解在-0.1和0.2左右跳(下圖)。

但其實平方跟絕對值的貢獻不是在找解部分,因為大多數的資料頂多一兩個outlier,如果樣本數多一點,outlier根本不太影響,所以這兩個方法基本上都在正規化參數上比較常用來比較差異(關鍵字是L1和L2 Regularization)。

L1 Regularization其實是norm-1正規化→絕對值。
L2 Regularization其實是norm-2正規化→平方值。

小結一下: MAE對outlier比較有用,但因為微分不連續(剛剛的例子在x=0時,MAE函數就不可以微分),因此可能在執行時容易出錯,MSE對outlier較敏感,但在求解時,比較容易找到穩定的解。

分類問題常用的損失函數: 交叉熵(cross-entropy)

從此例可以發現

模型1的錯誤率跟模型2錯誤率一樣都是0.25,但是如果從模型機率輸出來看,模型一的機率輸出沒有比模型二好。
比如說data1實質上是男生,但模型一給data1是男生的機率只有0.4,但模型二給data1是男生的機率卻到了0.7。
所以
1. 單看錯誤率比較不出此兩模型的差異
2. 這樣後續模型學習時,比較難得到較好的學習方向,因為用錯誤率得到只知道此筆資料判別錯誤,但模型不會知道現在的模型錯的很多還是很少,這樣模型在學習時根本不知道最佳的模型在那的方向,也不知道要更新多少。

交叉熵(cross-entropy)

在介紹Cross-entropy之前要先介紹什麼是訊息量和熵(Entropy)。Entropy是接收的所有訊息中所包含的資訊的平均量,所以在介紹Entropy之前要先簡單說一下什麼是訊息量。

這邊也要先假設X是一個隨機變數,機率密度函數為p(x)= p(X=x),訊息量(information gain)的定義

應該會有人想這是什麼啊,我們舉個例子

A很笨考試都50分,B很聰明考試都滿分。這時候我們可以假設

A考試及格的機率是p(xA)=0.4,B考試及格的機率是p(xB)=0.99。
這時候I(xA)=-log(0.4)= 1.322,I(xB)=-log(0.99)= 0.014

A的訊息量比B還大,這怎麼解釋哩,A及格的機率很低,如果A忽然及格了,會引起大家的注意,所以相對的訊息量較大,但B因為幾乎都滿分,大家對B及格習以為常,B考及格大家都不是很在意,所以信息量較小。

從這個例子可以發現訊息量在什麼時候會比較大?
ANS: 機率越隨機(可能一下成績高一下成績低)的情況,訊息量比較大。

再來要講Entropy,一般我們在統計或是機器學習聽到的Entropy幾乎都是Shannon Entropy或是他的衍生,Entropy是接收的所有訊息中所包含的資訊的平均量,也可以解釋entropy是看資料的亂度或是資料的不確定性,entropy的公式

那回到剛剛的例子,所有的事件只有考試及格和不及格兩種狀況

A考試及格的機率是p(xA=及格)=0.4,所以不及格機率是p(xA=不及格)=1–0.4=0.6
Entropy: H(A)=-0.4log(0.4)-0.6 log(0.6)= 0.971

B考試及的機率是p(xB=及格)=0.99,所以不及格機率是p(xB=不及格)=1–0.99=0.01
Entropy: H(B)=-0.99log(0.99)-0.01 log(0.01)= 0.081

為什麼說entropy是量測不確定性

從此例可以得知B還沒考試我就知道他考試及格機率是0.99,白話說考一百次才不及格一次,幾乎不會猜錯(很確定),算出來的Entropy很小。
但A及格機率是0.4,因為一百次考試她會及格40次,我們也很難猜到她會不會及格,所以很容易猜錯(不確定性大),算出來的Entropy很大。
這樣的結論跟剛剛的訊息量是一樣的。
那什麼時候Entropy最大哩,答案就是p=0.5時候,完全猜不到的情況,Entropy=1。

不同機率(p)下算出的entropy值。由圖可以知道,機率趨近兩側entropy越小,越中間越大。

基礎介紹結束,這邊要開始提Cross-entropy

在分類問題時,每個資料都會一組預測的機率(從上面的例子來看,每個data分成男生、女生和其他都各有一組機率),所以在算每個資料的cross-entropy的時候,我們會看每個類別算出來的entropy,然後在算總和。

cross-entropy的公式如下:

C是類別數(比如男生、女生、其他三類),n是所有的資料數。
yc,i是binary indicator (0 or 1) from one hot encode (第i筆資料屬於第c類真實類別)。
pc,i是第i筆資料屬於第c類預測出來的機率。

回到剛剛「分類: 男生、女生和其他的例子」來說明

不同模型下算cross-entropy。

模型一
男生的cross-entropy:
-(1 × log(0.4)+0 × log(0.3)+1 × log(0.5)+0 × log(0.8))=2.322
女生的cross-entropy:
-(0 × log(0.3)+1 × log(0.4)+0 × log(0.2)+0 × log(0.1))= 1.322
其他的cross-entropy:
-(0 × log(0.4)+0 × log(0.3)+0 × log(0.3)+ 1 × log(0.1))= 3.322

模型一的cross-entropy
=男生的cross-entropy+女生的cross-entropy其他的cross-entropy
=2.322+1.322+3.322= 6.966

從上面計算可以發現,其實在大多項目上面幾乎都是0,所以cross-entropy其實只是算真實類別機率的訊息量相加。

這個可以回答一個問題「在輸出這麼多機率中,哪個東西對學習是比較重要的」,答案是真實類別的判斷機率,其他不太重要(其實也不是真的不重要,而是有可能你的模型很強其他類別判斷機率等於0,在計算log(0)時答案可能會爆掉,所以會盡量不去考慮其他類別)。

Cross-entropy雖然這樣寫,但實際計算可以直接忽略掉,簡單計算如下:

模型一的cross-entropy 簡化計算
=-(1 × log(0.4) +1 × log(0.5)+ 1 × log(0.4) + 1 × log(0.1))= 6.966

模型二的cross-entropy 簡化計算
=-(1 × log(0.7) +1 × log(0.8)+ 1 × log(0.9) + 1 × log(0.3))= 2.725

我們前面已經提到模型二的模型比模型一好,從cross-entropy也可以得知,cross-entropy越小,代表模型越好,這也是為什麼分類的損失函數為什麼用cross-entropy,前面有假設損失函數盡量都找越小越好的。

所以我們讓模型在學習分類時,目標就是希望cross-entropy越小越好。當然還有一些特殊的loss設計,比如focal loss,但這篇幅會太長,也這不是這篇得重點,之後寫一篇介紹focal loss。

最後放上一張輸出機率跟loss (cross-entropy)的關係圖,這張圖關係到為什麼會改用focal loss讓模型學的更好,如果有興趣可以先看這篇「 Focal Loss for Dense Object Detection」。

不同p值下所計算出的loss=-log(p)

看得懂的有發現我有寫錯的,再麻煩幫忙指正,感謝拉。

怕老了忘記這些吃飯的知識,開始寫文章記錄機器/深度學習相關內容。黃志勝 Chih-Sheng Huang (Tommy), mail: chih.sheng.huang821@gmail.com

怕老了忘記這些吃飯的知識,開始寫文章記錄機器/深度學習相關內容。黃志勝 Chih-Sheng Huang (Tommy), mail: chih.sheng.huang821@gmail.com