一文讀懂深度學習模型中損失函數(均方誤差,log loss和交叉熵)

定義

損失函數(誤差函數)是關於模型輸出和樣本標籤值之差的函數,通過對誤差函數求導來調節權重參數。
本質:選取恰當的函數來衡量模型輸出分佈和樣本標籤分佈之間的接近程度。
注:損失函數的基本要求是用來衡量模型輸出分佈和樣本標籤分佈之間的接近程度,高級需求是在樣本分佈不均勻地情況下,精確地描述模型輸出分佈和樣本標籤之間的接近程度。

功能

調節權重參數

與BP算法,激活函數的關係

誤差函數的選擇,不僅與要解決的問題有關,而且也和激活函數有關,然後通過對誤差函數求導,利用BP調節模型中的所有參數。

誤差函數的特點

  1. 必須是一個凸函數,然後才能用於找到最小值。
  2. 必須沒一點都可導,可導才能通過BP算法完成對權重參數的調節。
  3. BP算法的目的,就是求能夠使誤差函數取得最小值對應的權重參數,因此,誤差函數求導以後,極值點對應的權重參數就是最優解,極值點的導數爲0,參數不再更新,找到了最優解。這也是梯度下降法尋找最優解的原理。

常見誤差函數

均方誤差函數

公式

迴歸問題最常用的損失函數是均方誤差MSE,定義如下
在這裏插入圖片描述
上式中,yi爲一個batch中第 i 個數據的正確答案,而爲神經網絡給出的預測值。
MSE是求一個batch(一批的數據)的平均誤差的函數。

應用場景

主要用於迴歸問題。
交叉熵的損失函數只和分類正確的預測結果有關係,而MSE的損失函數還和錯誤的分類有關係,該分類函數除了讓正確的分類儘量變大,還會讓錯誤的分類變得平均,但實際在分類問題中這個調整是沒有必要的。但是對於迴歸問題來說,這樣的考慮就顯得很重要了。所以,迴歸問題熵使用交叉上並不合適。

pytorch實現代碼

loss_fn = torch.nn.MSELoss(reduce=False, size_average=False)
loss = loss_fn(input.float(), target.float())

注:均方誤差函數只能用於迴歸問題,不能用於分類問題。

log loss(二分類交叉熵)

意義

  1. 多分類交叉熵的一種特殊情況。

公式

H(y,p)=1Ni=1n(yilogpi+(1yi)log(1pi))H(y,p) =-\frac{1}{N}\sum_{i=1}^{n}(y_{i}logp_{i}+(1-y_{i})log(1-p_{i}))
yiy_{i}爲樣本標籤,pip_{i}爲預測標籤,對所有樣本的對數損失表示對每個樣本的對數損失的平均值, 對於完美的分類器, 對數損失爲 0。
假設樣本標籤爲1 ,則只保留第一項,後一項爲0。概率pip_{i}越大,損失函數越小。
假設樣本標籤爲0,則只保留後一項,前一項爲0。 概率pip_{i}越小,損失函數越小。
該公式完美地詮釋了爲何選用Log作爲損失函數,而且與實際情況相符。
注:多分類問題是log loss問題的一般化,對樣本標籤採取獨熱編碼,其原理與該公式完全一致,都是通過信息熵來衡量樣本標籤分佈和深度學習模型預測分佈的接近程度

缺點

此loss function每一次梯度的回傳對每一個類別具有相同的關注度!所以極易受到類別不平衡的影響,在圖像分割領域尤其如此。
注:類別不平衡,是訓練樣本經常出現的情況,所以log loss一般不單獨作爲損失函數。

**舉例:**目標在整幅圖像當中佔比也就僅僅千分之一,那麼在一副圖像中,正樣本(像素點)與父樣本的比例約爲1~1000,如果訓練圖像中還包含大量的背景圖,即圖像當中不包含任何的疾病像素,那麼不平衡的比例將擴大到>10000,那麼訓練的後果將會是,網絡傾向於什麼也不預測!生成的mask幾乎沒有病竈像素區域!

交叉熵

意義

  1. 本身是用來衡量兩個概率分佈的接近程度。
  2. 對後續損失函數的影響:交叉熵是後續其它優化損失函數的基礎,要理解交叉熵,必須要理解信息量信息熵的概念。

公式

H(p,q)=i=1np(x)logq(x)H(p,q) = -\sum_{i=1}^{n}p(x)logq(x)
注:交叉熵的意義是衡量兩個分佈之間的距離。即樣本標籤值p(x)和模型輸出值之間的距離。

應用場景

主要用於分類問題,也可以用於圖像分割。

pytorch實現代碼

loss_func = torch.nn.CrossEntropyLoss()
loss = loss_func(output, labels)  # 樣本標籤值必須是一維向量

損失函數的選取方法

  1. 損失函數的選擇,和需要解決的問題類型樣本類別的均衡性都有關係,一般地,如果是迴歸問題,選用均方誤差函數,而分類問題,選用交叉熵損失函數。

參考鏈接:
https://blog.csdn.net/tsyccnh/article/details/79163834
https://blog.csdn.net/geter_CS/article/details/84857220
https://blog.csdn.net/hao5335156/article/details/81029791
https://blog.csdn.net/weixin_41417982/article/details/81388416?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/qiu931110/article/details/82111201?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/qiu931110/article/details/82111201?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/qq_30129009/article/details/100999086
https://blog.csdn.net/yhily2008/article/details/80261953?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/m0_37477175/article/details/83004746#Dice_loss_70

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章