神经网络损失函数汇总
目錄
一、基礎知識
二、分類
(1)二分類交叉熵損失函數(binary_crossentropy)
(2)categorical_crossentropy損失函數
(3)sparse_categorical_crossentropy
(4)平衡交叉熵函數(balanced cross entropy)
(5)focal loss?
三、回歸
(1)均方誤差(MSE-Mean Square Error,L2 loss)
(2)平均絕對誤差(MAEMean Absolute Error,L1?loss)
(3)SmoothL1 Loss(Huber損失函數)
(4)L1、L2、smooth L1總結-工業應用中如何選擇合適的損失函數
一、基礎知識
在理解各種損失函數的選擇原理之前,先回顧一下損失函數、模型訓練、訓練方法的相關基本概念
損失函數(Loss Function):用來估量模型的預測值 f(x)?與真實值 y?的偏離程度,以下是選擇損失函數的基本要求與高級要求:
- 基本要求:用來衡量模型輸出分布和樣本標簽分布之間的接近程度,
- 高級要求:在樣本分布不均勻地情況下,精確地描述模型輸出分布和樣本標簽之間的接近程度
模型訓練(Training):訓練的過程實質是優化(最小化)損失函數,讓 f(x) 與 y 盡量接近。實際上是模型參數擬合的過程(比如使用最小二乘法、梯度下降法求解回歸模型中的參數),也可以理解為模型求解的過程(比如使用最大期望法求解概率模型中的參數)。和其他數學建模中的求解參數過程本質上沒太大區別。
常用訓練方法:梯度下降算法尋找函數最小值
一般的損失函數的都是直接計算 batch 的數據,因此返回的 loss 結果都是維度為 batch_size的向量, 值得注意的是, pytorch中很多的損失函數都有 size_average 和 reduce 兩個布爾類型的參數,具體內容為:
- 如果 reduce = False,那么 size_average 參數失效,直接返回向量形式的 loss;
- 如果 reduce = True,那么 loss 返回的是標量
- 如果 size_average = True,返回 loss.mean();
- 如果 size_average = True,返回 loss.sum();
為了更好地理解損失函數的定義以下代碼部分將這兩個參數均設置為False
一般來說,工程實踐中常用的損失函數大致可以分成兩大應用情況:回歸(Regression)和分類(Classification)
二、分類
(1)二分類交叉熵損失函數(binary_crossentropy)
inary_crossentropy損失函數的公式如下(一般搭配sigmoid激活函數使用):
根據公式我們可以發現,i∈[1,output_size] 中每個i是相互獨立的,互不干擾,因此它一般用于多標簽分類(yolov3的分類損失函數就是用這個),比如說我們有標簽 ‘人’,‘男人’, ‘女人’ ,如果使用categorical_crossentropy,由于它的數學公式含義,標簽只能是其中一個,而binary_crossentropy各個i是相互獨立的,意味著是有可能出現一下這種情況:(舉例)
‘人’ 標簽的概率是0.9, ‘男人’ 標簽概率是0.6,‘女人’ 標簽概率是0.3。
那么我們有足夠的說服力斷定他是 ‘人’,并且很可能是 ‘男人’。
(2)categorical_crossentropy損失函數
?根據公式我們可以發現,因為yi,要么是0,要么是1。而當yi等于0時,結果就是0,當且僅當yi等于1時,才會有結果。也就是說categorical_crossentropy只專注與一個結果,因而它一般配合softmax做單標簽分類。
如果是分類編碼(one-hot編碼),則使用categorical_crossentropy。one-hot編碼就是在標簽向量化的時候,每個標簽都是一個N維的向量(N由自己確定),其中這個向量只有一個值為1,其余的都為0。也就是將整數索引i轉換為長度為N的二進制向量,這個向量只有第i個元素是1,其余的都是0.
(3)sparse_categorical_crossentropy
在開發文檔中有例程
import tensorflow as tf import numpy as np y_true = tf.constant([1, 2]) y_pred = tf.constant([[0.05, 0.95, 0], [0.1, 0.8, 0.1]]) loss = tf.reduce_mean(tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred)) scce = tf.keras.losses.SparseCategoricalCrossentropy()print(loss.numpy()) print(scce(y_true, y_pred).numpy())其中有兩個基準值1,2說明一共有兩類且分別為第一類,第二類,又有兩個預測數組[0.05, 0.95, 0], [0.1, 0.8, 0.1]。表明在預測第一個的時候,屬于第一類的概率為0.05,屬于第二類的概率為0.95,既不屬于第一類也不屬于第二類的概率為0。同理,在預測第二個的時候,屬于第一類的概率為0.1,屬于第二類的概率為0.8,既不屬于第一類也不屬于第二類的概率為0.1。
所以在使用這個函數時,需要如下組織y_true和y_pred:
假如分類時存在三類:其中y_true為:
因為sparse_categorical_crossentropy接受的是離散值,且y_true出現了1,2,3 所以共三類,共四個需要預測。y_pred的組織應該如下:
[0.05, 0.95, 0,0], [0.1, 0.8, 0.1,0], [0.1, 0.8, 0.1,0], [0.1, 0.8, 0.1,0]意思為,對于第1個預測:屬于第一類,第二類,第三類的概率分別為0.05,0.95,0;不屬于任何一類的概率為0。
對于第2,3,4個的預測依次類推。
其中這樣的組織方式,適用于分類任務,也適用于語義分割任務。因為語義分割任務就是像素點所屬類別的預測。
再比如:
注意,假如y_true:[1, 2, 4, 4],還是看做三類:
y_pred:
categorical_crossentropy與sparse_categorical_crossentropy的區別:
sparse_categorical_crossentropy跟categorical_crossentropy的區別是其標簽不是one-hot,而是integer。比如在categorical_crossentropy是[1,0,0],在sparse_categorical_crossentropy中是3.
(4)平衡交叉熵函數(balanced cross entropy)
交叉熵損失函數:
?樣本不均衡問題:
其中m為正樣本個數,n為負樣本個數,N為樣本總數,m+n=N。當樣本分布失衡時,在損失函數L的分布也會發生傾斜,如m<<n時,負樣本就會在損失函數占據主導地位。由于損失函數的傾斜,模型訓練過程中會傾向于樣本多的類別,造成模型對少樣本類別的性能較差。
(5)focal loss?
focal loss是最初由何愷明提出的,最初用于圖像領域解決數據不平衡造成的模型性能問題。本文試圖從交叉熵損失函數出發,分析數據不平衡問題,focal loss與交叉熵損失函數的對比,給出focal loss有效性的解釋。
?
focal loss VS?balanced cross entropy
focal loss相比balanced cross entropy而言,二者都是試圖解決樣本不平衡帶來的模型訓練問題,后者從樣本分布角度對損失函數添加權重因子,前者從樣本分類難易程度出發,使loss聚焦于難分樣本。
focal loss 為什么有效
focal loss從樣本難易分類角度出發,解決樣本非平衡帶來的模型訓練問題。
相信很多人會在這里有一個疑問,樣本難易分類角度怎么能夠解決樣本非平衡的問題,直覺上來講樣本非平衡造成的問題就是樣本數少的類別分類難度較高。因此從樣本難易分類角度出發,使得loss聚焦于難分樣本,解決了樣本少的類別分類準確率不高的問題,當然難分樣本不限于樣本少的類別,也就是focal loss不僅僅解決了樣本非平衡的問題,同樣有助于模型的整體性能提高。
要想使模型訓練過程中聚焦難分類樣本,僅僅使得Loss傾向于難分類樣本還不夠,因為訓練過程中模型參數更新取決于Loss的梯度。
?思考:
三、回歸
(1)均方誤差(MSE-Mean Square Error,L2 loss)
均方誤差(MSE)是回歸損失函數中最常用的誤差,它是預測值與目標值之間差值的平方和,其公式如下所示:
以 y-f(x) 為橫坐標,MSE 為縱坐標,繪制其損失函數的圖形:
MSE 曲線的特點是光滑連續、可導,便于使用梯度下降算法。平方誤差有個特性,就是當 yi 與 f(xi) 的差值大于 1 時,會增大其誤差;當 yi 與 f(xi) 的差值小于 1 時,會減小其誤差。這是由平方的特性決定的。也就是說, MSE 會對誤差較大(>1)的情況給予更大的懲罰,對誤差較小(<1)的情況給予更小的懲罰。比如說真實值為1,預測10次,有一次預測值為1000,其余次的預測值為1左右,顯然loss值主要由1000決定。
優點:收斂速度快-MSE 隨著誤差的減小,梯度也在減小,這有利于函數的收斂,即使固定學習率,函數也能較快收斂到最小值。
缺點:離群點影響大從Training的角度來看,模型會更加偏向于懲罰較大的點,賦予其更大的權重,忽略掉較小的點的作用,無法避免離群點可能導致的梯度爆炸問題。如果樣本中存在離群點,MSE 會給離群點賦予更高的權重,但是卻是以犧牲其他正常數據點的預測效果為代價,因此會導致降低模型的整體性能。
(2)平均絕對誤差(MAEMean Absolute Error,L1?loss)
平均絕對誤差(MAE)是另一種常用的回歸損失函數,它是目標值與預測值之差絕對值的和,表示了預測值的平均誤差幅度,而不需要考慮誤差的方向,范圍是0到∞,其公式如下所示:
?以 y-f(x) 為橫坐標,MAE 為縱坐標,繪制其損失函數的圖形:
MAE 的曲線呈 V 字型,連續但在 y-f(x)=0 處不可導,計算機求導比較難。且 MAE 大部分情況下梯度相等,這意味著即使對于小的損失值,其梯度也是大的,不利于函數的收斂和模型的學習
優點:由于MAE 計算的是絕對誤差,無論是 y-f(x)>1 還是 y-f(x)<1,沒有平方項的作用,懲罰力度相同,因此MAE 相比 MSE 對離群點不過分敏感,擬合直線能夠較好地表征正常數據的分布情況,其魯棒性更好
缺點:MAE訓練中梯度始終很大,且在0點連續但不可導,這意味著即使對于小的損失值,其梯度也是大的。這不利于函數的收斂和模型的學習,模型學習速度慢,同時也會導致使用梯度下降訓練模型時,在結束時可能會遺漏全局最小值。
代碼實現由torch.nn.L1Loss的參數reduction決定,當參數reduction
- 選擇 ‘mean’ 或’none’時,即為MAE,
- 選擇’sum’時即為L1 loss;
(3)SmoothL1 Loss(Huber損失函數)
顧名思義,smooth L1說的是光滑之后的L1,前面說過了L1損失的缺點就是有折點,不光滑,導致不穩定,那如何讓其變得光滑呢?
Huber函數是對MAE和MSE二者的綜合,其在函數值為0時,它也是可微分的。,其包含了一個超參數δ,δ 值決定了 Huber側重于 MSE 還是 MAE 的優秀形式表現
- 當δ~ 0時,Huber損失會趨向于MSE;
- 當δ~ ∞(很大的數字),Huber損失會趨向于MAE
分別取 δ = 0.1、δ = 10,繪制相應的 Huber Loss損失函數的圖形:
當 |y?f(x)| > δ 時,梯度一直近似為 δ,能夠保證模型以一個較快的速度更新參數當 |y?f(x)| ≤ δ 時,梯度逐漸減小,也能夠保證模型更精確地得到全局最優值該函數實際上就是一個分段函數,在[-1,1]光滑,這樣解決了MAE的不光滑問題,在[-∞,1)(1,+∞])區間解決了MSE可能導致的離群點梯度爆炸的問題,即:
Huber 函數它圍繞的最小值會減小梯度,且相比MSE,它對異常值更具魯棒性, Huber 函數同時具備了 MSE 和 MAE 的優點,既弱化了離群點的過度敏感問題,又實現了處處可導的功能
優點:同時具備了 MSE 和 MAE 的優點,既弱化了離群點的過度敏感問題,又實現了處處可導的功能,收斂速度也快于MAE
- 相比于MAE損失函數,可以收斂得更快;
- 相比于MSE損失函數,對離群點、異常值不敏感,梯度變化相對更小,訓練時不容易拋出奇怪的結果
注意點:δ超參數需要在訓練中選擇,常常使用交叉驗證法選取合適超參數δ ,超參數的選取直接影響訓練的效果的好壞
(4)L1、L2、smooth L1總結-工業應用中如何選擇合適的損失函數
- 從誤差的角度來說:MSE可以用來評價數據變化的程度,MAE則能更好的反應預測值誤差的實際情況
- 從離群點角度選擇: 如果離群點僅僅只是在數據提取的過程中的損壞或者清洗中的錯誤采樣,則無須給予過多關注,那么我們應該選擇 MAE, 但如果離群點是實際的數據或者重要的數據需要被檢測到的異常值,那我們應該選擇 MSE
- 從收斂速度的角度來說:MSE>Huber>MAE
- 從求解梯度的復雜度來說:MSE 要優于 MAE,且梯度也是動態變化的,MSE能較快準確達到收斂。
- 從模型的角度選擇:對于大多數CNN網絡,我們一般是使用MSE而不是MAE,因為訓練CNN網絡很看重訓練速度,對于邊框預測回歸問題,通常也可以選擇平方損失函數,但平方損失函數缺點是當存在離群點(outliers)的時候,這些點會占loss的主要組成部分。對于目標檢測FastR CNN采用稍微緩和一點絕對損失函數(smooth L1損失),它是隨著誤差線性增長,而不是平方增長。
總結
以上是生活随笔為你收集整理的神经网络损失函数汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见损失函数综述及区别
- 下一篇: 图像复原的损失函数总结——Loss Fu