0.導(dǎo)語無論在機器學(xué)習(xí)還是深度領(lǐng)域中,損失函數(shù)都是一個非常重要的知識點。損失函數(shù)(Loss Function)是用來估量模型的預(yù)測值 f(x) 與真實值 y 的不一致程度。我們的目標(biāo)就是最小化損失函數(shù),讓 f(x) 與 y 盡量接近。通??梢允褂锰荻认陆邓惴▽ふ液瘮?shù)最小值。 損失函數(shù)有許多不同的類型,沒有哪種損失函數(shù)適合所有的問題,需根據(jù)具體模型和問題進行選擇。一般來說,損失函數(shù)大致可以分成兩類:回歸(Regression)和分類(Classification)。 目前已經(jīng)發(fā)布: AI 基礎(chǔ):Python開發(fā)環(huán)境設(shè)置和小技巧 AI 基礎(chǔ):Scipy(科學(xué)計算庫) 簡易入門 AI基礎(chǔ):數(shù)據(jù)可視化簡易入門(matplotlib和seaborn) AI基礎(chǔ):機器學(xué)習(xí)庫Scikit-learn的使用 后續(xù)持續(xù)更新
1.回歸損失函數(shù)回歸模型中的三種損失函數(shù)包括:均方誤差(Mean Square Error)、平均絕對誤差(Mean Absolute Error,MAE)、Huber Loss。 1. 均方誤差(Mean Square Error,MSE) 均方誤差指的就是模型預(yù)測值 f(x) 與樣本真實值 y 之間距離平方的平均值。其公式如下所示: 其中,yi 和 f(xi) 分別表示第 i 個樣本的真實值和預(yù)測值,m 為樣本個數(shù)。 為了簡化討論,忽略下標(biāo) i,m = 1,以 y-f(x) 為橫坐標(biāo),MSE 為縱坐標(biāo),繪制其損失函數(shù)的圖形: MSE 曲線的特點是光滑連續(xù)、可導(dǎo),便于使用梯度下降算法,是比較常用的一種損失函數(shù)。而且,MSE 隨著誤差的減小,梯度也在減小,這有利于函數(shù)的收斂,即使固定學(xué)習(xí)因子,函數(shù)也能較快取得最小值。 平方誤差有個特性,就是當(dāng) yi 與 f(xi) 的差值大于 1 時,會增大其誤差;當(dāng) yi 與 f(xi) 的差值小于 1 時,會減小其誤差。這是由平方的特性決定的。也就是說, MSE 會對誤差較大(>1)的情況給予更大的懲罰,對誤差較?。?lt;1)的情況給予更小的懲罰。從訓(xùn)練的角度來看,模型會更加偏向于懲罰較大的點,賦予其更大的權(quán)重。 如果樣本中存在離群點,MSE 會給離群點賦予更高的權(quán)重,但是卻是以犧牲其他正常數(shù)據(jù)點的預(yù)測效果為代價,這最終會降低模型的整體性能。我們來看一下使用 MSE 解決含有離群點的回歸模型。 import numpy as np 擬合結(jié)果如下圖所示: 可見,使用 MSE 損失函數(shù),受離群點的影響較大,雖然樣本中只有 5 個離群點,但是擬合的直線還是比較偏向于離群點。這往往是我們不希望看到的。 2. 平均絕對誤差(Mean Absolute Error,MAE) 平均絕對誤差指的就是模型預(yù)測值 f(x) 與樣本真實值 y 之間距離的平均值。其公式如下所示: 為了簡化討論,忽略下標(biāo) i,m = 1,以 y-f(x) 為橫坐標(biāo),MAE 為縱坐標(biāo),繪制其損失函數(shù)的圖形: 直觀上來看,MAE 的曲線呈 V 字型,連續(xù)但在 y-f(x)=0 處不可導(dǎo),計算機求解導(dǎo)數(shù)比較困難。而且 MAE 大部分情況下梯度都是相等的,這意味著即使對于小的損失值,其梯度也是大的。這不利于函數(shù)的收斂和模型的學(xué)習(xí)。 值得一提的是,MAE 相比 MSE 有個優(yōu)點就是 MAE 對離群點不那么敏感,更有包容性。因為 MAE 計算的是誤差 y-f(x) 的絕對值,無論是 y-f(x)>1 還是 y-f(x)<1,沒有平方項的作用,懲罰力度都是一樣的,所占權(quán)重一樣。針對 MSE 中的例子,我們來使用 MAE 進行求解,看下擬合直線有什么不同。
注意上述代碼中對 MAE 計算梯度的部分。 擬合結(jié)果如下圖所示: 顯然,使用 MAE 損失函數(shù),受離群點的影響較小,擬合直線能夠較好地表征正常數(shù)據(jù)的分布情況。這一點,MAE 要優(yōu)于 MSE。二者的對比圖如下: 選擇 MSE 還是 MAE 呢? 實際應(yīng)用中,我們應(yīng)該選擇 MSE 還是 MAE 呢?從計算機求解梯度的復(fù)雜度來說,MSE 要優(yōu)于 MAE,而且梯度也是動態(tài)變化的,能較快準(zhǔn)確達到收斂。但是從離群點角度來看,如果離群點是實際數(shù)據(jù)或重要數(shù)據(jù),而且是應(yīng)該被檢測到的異常值,那么我們應(yīng)該使用MSE。另一方面,離群點僅僅代表數(shù)據(jù)損壞或者錯誤采樣,無須給予過多關(guān)注,那么我們應(yīng)該選擇MAE作為損失。 3. Huber Loss 既然 MSE 和 MAE 各有優(yōu)點和缺點,那么有沒有一種激活函數(shù)能同時消除二者的缺點,集合二者的優(yōu)點呢?答案是有的。Huber Loss 就具備這樣的優(yōu)點,其公式如下: Huber Loss 是對二者的綜合,包含了一個超參數(shù) δ。δ 值的大小決定了 Huber Loss 對 MSE 和 MAE 的側(cè)重性,當(dāng) |y?f(x)| ≤ δ 時,變?yōu)?MSE;當(dāng) |y?f(x)| > δ 時,則變成類似于 MAE,因此 Huber Loss 同時具備了 MSE 和 MAE 的優(yōu)點,減小了對離群點的敏感度問題,實現(xiàn)了處處可導(dǎo)的功能。 通常來說,超參數(shù) δ 可以通過交叉驗證選取最佳值。下面,分別取 δ = 0.1、δ = 10,繪制相應(yīng)的 Huber Loss,如下圖所示: Huber Loss 在 |y?f(x)| > δ 時,梯度一直近似為 δ,能夠保證模型以一個較快的速度更新參數(shù)。當(dāng) |y?f(x)| ≤ δ 時,梯度逐漸減小,能夠保證模型更精確地得到全局最優(yōu)值。因此,Huber Loss 同時具備了前兩種損失函數(shù)的優(yōu)點。 下面,我們用 Huber Loss 來解決同樣的例子。 X = np.vstack((np.ones_like(x),x)) # 引入常數(shù)項 1 注意上述代碼中對 Huber Loss 計算梯度的部分。 擬合結(jié)果如下圖所示: 可見,使用 Huber Loss 作為激活函數(shù),對離群點仍然有很好的抗干擾性,這一點比 MSE 強。另外,我們把這三種損失函數(shù)對應(yīng)的 Loss 隨著迭代次數(shù)變化的趨勢繪制出來: MSE: MAE: Huber Loss: 對比發(fā)現(xiàn),MSE 的 Loss 下降得最快,MAE 的 Loss 下降得最慢,Huber Loss 下降速度介于 MSE 和 MAE 之間。也就是說,Huber Loss 彌補了此例中 MAE 的 Loss 下降速度慢的問題,使得優(yōu)化速度接近 MSE。 最后,我們把以上介紹的回歸問題中的三種損失函數(shù)全部繪制在一張圖上。 好了,以上就是回歸問題 3 種常用的損失函數(shù)包括:MSE、MAE、Huber Loss 的簡單介紹和詳細對比。 2.分類損失函數(shù)0.模型輸出 在討論分類問題的損失函數(shù)之前,我想先說一下模型的輸出 g(s)。一般來說,二分類機器學(xué)習(xí)模型包含兩個部分:線性輸出 s 和非線性輸出 g(s)。其中,線性輸出一般是模型輸入 x 與 參數(shù) w 的乘積,簡寫成:s = wx;非線性輸出一般是 Sigmoid 函數(shù),其表達式如下: 經(jīng)過 Sigmoid 函數(shù),g(s) 值被限定在 [0,1] 之間,若 s ≥ 0,g(s) ≥ 0.5,則預(yù)測為正類;若 s < 0,g(s) < 0.5,則預(yù)測為負類。 關(guān)于正類和負類的表示,通常有兩種方式:一種是用 {+1, -1} 表示正負類;另一種是用 {1, 0} 表示正負類。下文默認使用 {+1, -1},因為這種表示方法有種好處。如果使用 {+1, -1} 表示正負類,我們來看預(yù)測類別與真實類別的四種情況:
發(fā)現(xiàn)了嗎?顯然,上面四個式子可以整合成直接看 ys 的符號即可:
這里的 ys 類似與回歸模型中的殘差 s - y。因此,在比較分類問題的各個損失函數(shù)的時候,我們就可以把 ys 當(dāng)作自變量 x 軸即可,這樣更加方便。 1.0-1 Loss 0-1 Loss 是最簡單也是最容易直觀理解的一種損失函數(shù)。對于二分類問題,如果預(yù)測類別 y_hat 與真實類別 y 不同,則 L=1;如果預(yù)測類別 y_hat 與 真實類別 y 相同,則 L=0(L 表示損失函數(shù))。0-1 Loss 的表達式為: 0-1 Loss 的曲線如下圖所示: 0-1 Loss 的特點就是非常直觀容易理解。但是它存在兩個缺點:
因此,實際應(yīng)用中,0-1 Loss 很少使用。 2.Cross Entropy Loss Cross Entropy Loss 是非常重要的損失函數(shù),也是應(yīng)用最多的損失函數(shù)之一。二分類問題的交叉熵 Loss 主要有兩種形式,下面分別詳細介紹。 第一種形式是基于輸出標(biāo)簽 label 的表示方式為 {0,1},也最為常見。它的 Loss 表達式為: 這個公式是如何推導(dǎo)的呢?很簡單,從極大似然性的角度出發(fā),預(yù)測類別的概率可以寫成: 我們可以這么來看,當(dāng)真實樣本標(biāo)簽 y = 1 時,上面式子第二項就為 1,概率等式轉(zhuǎn)化為: 當(dāng)真實樣本標(biāo)簽 y = 0 時,上面式子第一項就為 1,概率等式轉(zhuǎn)化為: 我們希望的是概率 P(y|x) 越大越好。首先,我們對 P(y|x) 引入 log 函數(shù),因為 log 運算并不會影響函數(shù)本身的單調(diào)性。則有: 我們希望 log P(y|x) 越大越好,反過來,只要 log P(y|x) 的負值 -log P(y|x) 越小就行了。那我們就可以引入損失函數(shù),且令 Loss = -log P(y|x) 即可。則得到損失函數(shù)為: 我們來看,當(dāng) y = 1 時: 因為, 所以,代入到 L 中,得: 這時候,Loss 的曲線如下圖所示: 從圖中明顯能夠看出,s 越大于零,L 越小,函數(shù)的變化趨勢也完全符合實際需要的情況。 當(dāng) y = 0 時: 對上式進行整理,同樣能得到: 這時候,Loss 的曲線如下圖所示: 從圖中明顯能夠看出,s 越小于零,L 越小,函數(shù)的變化趨勢也完全符合實際需要的情況。 第二種形式是基于輸出標(biāo)簽 label 的表示方式為 {-1,+1},也比較常見。它的 Loss 表達式為: 下面對上式做個簡單的推導(dǎo),我們在 0 小節(jié)說過,ys 的符號反映了預(yù)測的準(zhǔn)確性。除此之外,ys 的數(shù)值大小也反映了預(yù)測的置信程度。所以,從概率角度來看,預(yù)測類別的概率可以寫成: 分別令 y = +1 和 y = -1 就能很容易理解上面的式子。 接下來,同樣引入 log 函數(shù),要讓概率最大,反過來,只要其負數(shù)最小即可。那么就可以定義相應(yīng)的損失函數(shù)為: 這時候,我們以 ys 為橫坐標(biāo),可以繪制 Loss 的曲線如下圖所示: 其實上面介紹的兩種形式的交叉熵 Loss 是一樣的,只不過由于標(biāo)簽 label 的表示方式不同,公式稍有變化。標(biāo)簽用 {-1,+1} 表示的好處是可以把 ys 整合在一起,作為橫坐標(biāo),容易作圖且具有實際的物理意義。 總結(jié)一下,交叉熵 Loss 的優(yōu)點是在整個實數(shù)域內(nèi),Loss 近似線性變化。尤其是當(dāng) ys << 0 的時候,Loss 更近似線性。這樣,模型受異常點的干擾就較小。而且,交叉熵 Loss 連續(xù)可導(dǎo),便于求導(dǎo)計算,是使用最廣泛的損失函數(shù)之一。 3.Hinge Loss Hinge Loss,又稱合頁損失,其表達式如下: Hinge Loss 的曲線如下圖所示: Hinge Loss 的形狀就像一本要合上的書,故稱為合頁損失。顯然,只有當(dāng) ys < 1 時,Loss 才大于零;對于 ys > 1 的情況,Loss 始終為零。 Hinge Loss 一般多用于支持向量機(SVM)中,體現(xiàn)了 SVM 距離最大化的思想。而且,當(dāng) Loss 大于零時,是線性函數(shù),便于梯度下降算法求導(dǎo)。 Hinge Loss 的另一個優(yōu)點是使得 ys > 0 的樣本損失皆為 0,由此帶來了稀疏解,使得 SVM 僅通過少量的支持向量就能確定最終超平面。 4.Exponential Loss Exponential Loss,又稱指數(shù)損失,其表達式如下: 可以對上式進行一個直觀的理解,類似于上文提到的第二種形式的交叉熵 Loss,去掉 log 和 log 中的常數(shù) 1,并不影響 Loss 的單調(diào)性。因此,推導(dǎo)得出了 Exponential Loss 的表達式。 Exponential Loss 的曲線如下圖所示: Exponential Loss 與交叉熵 Loss 類似,但它是指數(shù)下降的,因此梯度較其它 Loss 來說,更大一些。 Exponential Loss 一般多用于AdaBoost 中。因為使用 Exponential Loss 能比較方便地利用加法模型推導(dǎo)出 AdaBoost算法。 5.Modified Huber Loss 在之前介紹回歸損失函數(shù),我們介紹過 Huber Loss,它集合了 MSE 和 MAE 的優(yōu)點。Huber Loss 也能應(yīng)用于分類問題中,稱為 Modified Huber Loss,其表達是如下: Modified Huber Loss 的曲線如下圖所示: 從表達式和 Loss 圖形上看,Modified Huber Loss 結(jié)合了 Hinge Loss 和 交叉熵 Loss 的優(yōu)點。一方面能在 ys > 1 時產(chǎn)生稀疏解提高訓(xùn)練效率;另一方面對于 ys < ?1 樣本的懲罰以線性增加,這意味著受異常點的干擾較少。scikit-learn 中的 SGDClassifier 就使用了 Modified Huber Loss。 6.Softmax Loss 對于多分類問題,也可以使用 Softmax Loss。 機器學(xué)習(xí)模型的 Softmax 層,正確類別對于的輸出是: 其中,C 為類別個數(shù),小寫字母 s 是正確類別對應(yīng)的 Softmax 輸入,大寫字母 S 是正確類別對應(yīng)的 Softmax 輸出。 由于 log 運算符不會影響函數(shù)的單調(diào)性,我們對 S 進行 log 操作。另外,我們希望 log(S) 越大越好,即正確類別對應(yīng)的相對概率越大越好,那么就可以對 log(S) 前面加個負號,來表示損失函數(shù): Softmax Loss 的曲線如下圖所示: 上圖中,當(dāng) s << 0 時,Softmax 近似線性;當(dāng) s>>0 時,Softmax 趨向于零。Softmax 同樣受異常點的干擾較小,多用于神經(jīng)網(wǎng)絡(luò)多分類問題中。 最后,我們將 0-1 Loss、Cross Entropy Loss、Hinge Loss、Exponential Loss、Modified Huber Loss 畫在一張圖中: 上圖 ys 的取值范圍是 [-2,+2],若我們把 ys 的坐標(biāo)范圍取得更大一些,上面 5 種 Loss 的差別會更大一些,見下圖: 顯然,這時候 Exponential Loss 會遠遠大于其它 Loss。從訓(xùn)練的角度來看,模型會更加偏向于懲罰較大的點,賦予其更大的權(quán)重。如果樣本中存在離群點,Exponential Loss 會給離群點賦予更高的權(quán)重,但卻可能是以犧牲其他正常數(shù)據(jù)點的預(yù)測效果為代價,可能會降低模型的整體性能,使得模型不夠健壯(robust)。 相比 Exponential Loss,其它四個 Loss,包括 Softmax Loss,都對離群點有較好的“容忍性”,受異常點的干擾較小,模型較為健壯。 好了,以上就是總結(jié)的幾個常用的損失函數(shù),知道這些細節(jié)和原理,對我們是很有幫助的。希望本文對你有所幫助~ 參考文獻: http://www./html/782/201806/2247495489/1.html https://www.cnblogs.com/massquantity/p/8964029.html 備注:公眾號菜單包含了整理了一本AI小抄,非常適合在通勤路上用學(xué)習(xí)。 |
|