在機器學習中,損失函數是至關重要的一部分,用於衡量目標結果的好壞,用於訓練模型,損失函數就是目標函數了。 L1、L2損失函數相信大多數人都早已不陌生。那你了解Huber損失、Quantile損失麼?這些可都是機器學習大牛最常用的回歸損失函數哦!今天就給大家分享五種回歸損失函數,入門機器學習必備哦!
我們在進行機器學習的時候,使用的每一個算法都有一個目標函數,算法便是對這個目標函數進行優化,特別是在分類或者回歸任務中。機器學習中的所有算法都依靠最小化或最大化函數,我們將其稱為“目標函數”。被最小化的函數就被稱為“損失函數”。損失函數也可以衡量預測模型在預測期望結果方麵的性能。找到函數的最小值點的最常用方法是“梯度下降”。
損失函數,並非隻有一種。根據不同的因素,包括是否存在異常值,所選機器學習算法,梯度下降的的時效,找到預測的置信度和導數的難易度,我們可以選擇不同的損失函數。本文就帶領大家學習不同的損失函數,以及它們如何在數據科學和機器學習中幫助我們。
損失函數可以大體分為兩種類型:分類損失和回歸損失。
回歸損失
均方誤差(MSE),二次損失,L2損失
均方誤差是最常用的回歸損失函數,它是我們的目標變量和預測值的差值平方和。
均方誤差函數圖
平均絕對誤差,L1損失
平均絕對誤差L1損失是一種用於回歸模型的損失函數。是目標變量和預測變量之間絕對差值之和。因此它衡量的是一組預測值中的平均誤差大小,而不考慮它們的方向。範圍為0到∞。
L2損失 vs L1損失
簡而言之,使用平方誤差更容易解決問題,但使用絕對誤差對於異常值更魯棒。我們來看一下為什麼。
不管我們什麼時候訓練機器學習模型,我們的目標都是想找到一個點將損失函數最小化。當然,當預測值正好等於真值時,這兩個函數都會達到最小值。
我們快速瀏覽一下這兩種函數的Python代碼。我們可以自己寫函數,也可以用sklearn的內助度量函數:
# true: 真目標變量的數組
# pred: 預測值的數組
def mse(true, pred):
return np.sum((true - pred)**2)
def mae(true, pred):
return np.sum(np.abs(true - pred))
# 在 sklearn 中同樣適用
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
我們來看看兩種情況下MAE和均方根誤差(RMSE,和MAE相同尺度下MSE的平方根)。在第一種情況下,預測值和真值非常接近,誤差在眾多觀測值中變化很小。在第二種情況下,出現了一個異常觀測值,誤差就很高。
我們從中可以觀察到什麼?這怎樣能幫我們選擇使用哪種損失函數?
因為MSE是誤差的平方值(y?—?y_predicted = e),那麼誤差(e)的值在e > 1時會增加很多。如果我們的數據中有異常值,e的值會非常高,e2會>> |e|。這會讓存在MSE誤差的模型比存在MAE誤差的模型向異常值賦予更多的權重。在上麵第2種情況中,存在RMSE誤差的模型為了能將該單個異常值最小化會犧牲其它常見情況,這降低模型的整體性能。
如果訓練數據被異常值破壞的話(也就是我們在訓練環境中錯誤地接收到巨大的不切實際的正/負值,但在測試環境中卻沒有),MAE會很有用。
我們可以這樣思考:如果我們必須為所有的觀測值賦予一個預測值,以最小化MSE,那麼該預測值應當為所有目標值的平均值。但是如果我們想將MAE最小化,那麼預測值應當為所有觀測值的中間值。我們知道中間值比起平均值,對異常值有更好的魯棒性,這樣就會讓MAE比MSE對異常值更加魯棒。
使用MAE損失(特別是對於神經網絡來說)的一個大問題就是,其梯度始終一樣,這意味著梯度即便是對於很小的損失值來說,也還會非常大。這對於機器學習可不是件好事。為了修正這一點,我們可以使用動態學習率,它會隨著我們越來越接近最小值而逐漸變小。在這種情況下,MSE會表現的很好,即便學習率固定,也會收斂。MSE損失的梯度對於更大的損失值來說非常高,當損失值趨向於0時會逐漸降低,從而讓它在模型訓練收尾時更加準確(見下圖)。
決定使用哪種損失函數
如果異常值表示的反常現象對於業務非常重要,且應當被檢測到,那麼我們就應當使用MSE。另一方麵,如果我們認為異常值僅表示損壞數據而已,那麼我們應當選擇MAE作為損失函數。
如果想比較在有或沒有異常值這兩種情況下,使用L1和L2損失函數時回歸模型的性能,建議讀讀這篇不錯的研究。記住,L1和L2損失分別是MAE和MSE的別名。
L1損失對異常值更魯棒,但它的導數是不連續的,從而讓它無法有效的求解。L2損失對異常值很敏感,但會求出更穩定和更接近的解(通過將導數設為0)。
這兩者存在的問題:可能會出現兩種損失函數都無法給出理想預測值的情況。例如,如果我們的數據中90% 的觀測值的目標真值為150, 剩餘10%的目標值在0-30之間。那麼存在MAE損失的模型可能會預測全部觀測值的目標值為150,而忽略了那10%的異常情況,因為它會試圖趨向於中間值。在同一種情況下,使用MSE損失的模型會給出大量值範圍在0到30之間的預測值,因為它會偏向於異常值。在很多業務情況中,這兩種結果都不夠理想。
那麼在這種情況下該怎麼辦?一個比較容易的修正方法是轉換目標變量。另一種方法是試試不同的損失函數。這就引出了我們要講的下一部分:Huber損失函數。
Huber損失函數,平滑平均絕對誤差 相比平方誤差損失,Huber損失對於數據中異常值的敏感性要差一些。在值為0時,它也是可微分的。它基本上是絕對值,在誤差很小時會變為平方值。誤差使其平方值的大小如何取決於一個超參數δ,該參數可以調整。當δ~ 0時,Huber損失會趨向於MAE;當δ~ ∞(很大的數字),Huber損失會趨向於MSE。
δ的選擇非常關鍵,因為它決定了你如何看待異常值。殘差大於δ,就用L1(它對很大的異常值敏感性較差)最小化,而殘差小於δ,就用L2“適當地”最小化。
為何使用Huber損失函數?
使用MAE用於訓練神經網絡的一個大問題就是,它的梯度始終很大,這會導致使用梯度下降訓練模型時,在結束時遺漏最小值。對於MSE,梯度會隨著損失值接近其最小值逐漸減少,從而使其更準確。
在這些情況下,Huber損失函數真的會非常有幫助,因為它圍繞的最小值會減小梯度。而且相比MSE,它對異常值更具魯棒性。因此,它同時具備MSE和MAE這兩種損失函數的優點。不過,Huber損失函數也存在一個問題,我們可能需要訓練超參數δ,而且這個過程需要不斷迭代。
Log-Cosh損失函數
Log-Cosh是應用於回歸任務中的另一種損失函數,它比L2損失更平滑。Log-cosh是預測誤差的雙曲餘弦的對數。
優點:
對於較小的X值,log(cosh(x))約等於(x ** 2) / 2;對於較大的X值,則約等於abs(x) - log(2)。這意味著Log-cosh很大程度上工作原理和平均方誤差很像,但偶爾出現錯的離譜的預測時對它影響又不是很大。它具備了Huber損失函數的所有優點,但不像Huber損失,它在所有地方都二次可微。
我們為何需要二階導數?很多機器學習模型,比如XGBoost,使用牛頓法來尋找最好結果,因此需要二階導數(海塞函數)。對於像XGBoost這樣的機器學習框架,二次可微函數更為有利。
Huber損失函數和Log-cosh損失函數的Python代碼:
# huber 損失
def huber(true, pred, delta):
loss = np.where(np.abs(true-pred) < delta , 0.5*((true-pred)**2), delta*np.abs(true - pred) - 0.5*(delta**2))
return np.sum(loss)
?
# log cosh 損失
def logcosh(true, pred):
loss = np.log(np.cosh(pred - true))
return np.sum(loss)
Quantile損失函數 在大多數現實預測問題中,我們常常很想知道我們的預測值的不確定性。對於很多業務問題而言,相對於知道某個預測點,了解預測值範圍能夠大幅優化決策過程。最小二乘回歸的預測區間基於我們假設殘差值(y?—?y_hat)在所有獨立變量值上的變化保持一致。
如果我們是想預測某個區間而非某個點,Quantile損失函數會非常有用。違背此假設的回歸模型是不可信的。當然我們也不能認為這種情況下用非線性函數或基於樹的模型能更好的建模,把擬合線性模型作為基準的理念扔在一邊就完了。這時,我們就可以用到Quantile損失和Quantile回歸,因為基於Quantile損失的回歸能夠提供更明智的預測區間,即便是有非常量方差和非正常分布的誤差來說,效果同樣不錯。
我們來看一些案例,更好的理解為何基於Quantile損失的回歸能對異方差問題效果良好。
Quantile回歸 VS 普通最小乘二回歸
理解 Quantile 損失函數
基於 Quantile 的回歸模型目的是根據預測變量的特定值,預測反應變量的條件分位數。 Quantile 損失實際上就是 MAE 的延伸(當分位數為第50個百分位數時,它就是MAE)。
其理念就是根據我們是否想增加正誤差或負誤差的分量選擇合適的分位數值。損失函數會根據所選分位數(γ)的值,為估計過高或估計不足做出不同的處罰。例如,γ=0.25的Quantile損失函數會向估計過高做出更多的懲罰,將預測值保持在略微低於平均值的狀態。
比較研究
為了展示以上所有損失函數的屬性,文章作者模擬了一個取樣於sinc(x)函數的數據集,以及兩個人工模擬噪聲數據集:高斯噪聲分量ε ~ N(0, σ2),以及脈衝噪聲分量ξ ~ Bern(p)。作者添加了脈衝噪聲項來說明魯棒影響。下圖是用不同損失函數擬合GBM回歸模型的結果。
圖中依次為(A)MSE損失函數 (B)MAE損失函數(C)Huber損失函數(D)Quantile損失函數(E)原始sinc(x) 函數(F)擬合了MSE和MAE損失的平滑GBM(G)擬合了huber損失為 δ = {4, 2, 1}的平滑GBM(H)擬合了Quantile損失為α = {0.5, 0.1, 0.9}的平滑GBM
從以上模擬中我們可以觀察到:
有MAE損失的模型預測值受脈衝噪聲的影響較小,而有MSE損失的模型預測值由於噪聲數據導致的偏差,則出現輕微偏差。
有Huber損失的模型預測值對於所選超參數的值敏感度較小。
Quantile損失在對應置信度水平上做出了很好的預測。
最後我們把以上所有損失函數繪製在一張圖中:
來源:技術學派頭條號
上一篇 python快速編程入門教程
熱門課程
專業講師指導 快速擺脫技能困惑相關文章
多種教程 總有一個適合自己專業問題谘詢
你擔心的問題,火星幫你解答學習如何在火星時代教育選擇高質量的Maya建模培訓學校,提高您的3D建模技巧,開啟您的CG藝術職業生涯。
火星時代教育的Blender軟件培訓班,通過專業的教育機構和一流的教師來提升你的3D動畫設計技能。無論你是初學者還是有經驗的設......
在這個為期數月的Blender美工培訓班中,火星時代教育帶您進一步探索數碼藝術,全麵了解Blender這一強大的3D建模和動畫軟件。
本文深入探討了cg遊戲模型培訓學校的關鍵優勢,同時列舉了其在未來發展的重要方向。文章最後介紹了火星時代教育在這個領域的貢獻和優勢。
在火星時代教育,我們提供針對CG影視模型的培訓課程,教授3D建模和視覺特效的技巧和知識,為學員打造專業的火星時代CG影視模型製作能力。
該文章通過詳細的教學文章,剖析Maya影視模型製作的步驟和技巧,由火星時代教育提供
1. 打開微信掃一掃,掃描左側二維碼
2. 添加老師微信,馬上領取免費課程資源
同學您好!