天天看點

PyTorch中的損失函數大緻使用場景

PyTorch中的損失函數大緻使用場景

最近學習 pytorch,将其損失函數大緻使用場景做了一下彙總,多參考網上大家的文章,或直接引用,文後附有原文連結,如有不對,歡迎指正

一、L1Loss

L1 Loss,它有幾個别稱:

  1. L1 範數損失
  2. 最小絕對值偏差(LAD)
  3. 最小絕對值誤差(LAE)

最常看到的 MAE 也是指L1 Loss損失函數

它是把目标值 g 與模型輸出(估計值) y 做絕對值得到的誤差 。

什麼時候用?

  1. 回歸任務
  2. 簡單的模型
  3. 由于神經網絡通常是解決複雜問題,是以很少使用。

二、MSELoss

也就是L2 Loss了,它有幾個别稱:

  1. L2 範數損失
  2. 最小均方值偏差(LSD)
  3. 最小均方值誤差(LSE)

最常看到的 MSE 也是指L2 Loss損失函數,PyTorch中也将其命名為torch.nn.MSELoss

它是把目标值 g 與模型輸出(估計值) y 做差然後平方得到的誤差

什麼時候使用?

  1. 回歸任務
  2. 數值特征不大
  3. 問題次元不高

三、SmoothL1Loss

簡單來說就是平滑版的L1 Loss。

原理

當預測值和ground truth差别較小的時候(絕對值差小于1),其實使用的是L2 Loss;而當差别大的時候,是L1 Loss的平移。

SmoothL1Loss其實是L2Loss和L1Loss的結合 ,它同時擁有L2 Loss和L1 Loss的部分優點。

  1. 當預測值和ground truth差别較小的時候(絕對值差小于1),梯度不至于太大。(損失函數相較L1 Loss比較圓滑)
  2. 當差别大的時候,梯度值足夠小(較穩定,不容易梯度爆炸)。
PyTorch中的損失函數大緻使用場景

SmoothL1Loss

什麼時候使用?

  1. 回歸
  2. 當特征中有較大的數值
  3. 适合大多數問題

四、交叉熵損失 CrossEntropyLoss

原理

交叉熵損失函數圖形(分類情況):

單個樣本的交叉熵損失函數:

PyTorch中的損失函數大緻使用場景

image.png

當 y = 1 時:

PyTorch中的損失函數大緻使用場景

image.png

這時候,L 與預測輸出的關系如下圖所示:

PyTorch中的損失函數大緻使用場景

image.png

看了 L 的圖形,簡單明了!橫坐标是預測輸出,縱坐标是交叉熵損失函數 L。顯然,預測輸出越接近真實樣本标簽 1,損失函數 L 越小;預測輸出越接近 0,L 越大。是以,函數的變化趨勢完全符合實際需要的情況。

當 y = 0 時:

PyTorch中的損失函數大緻使用場景

image.png

這時候,L 與預測輸出的關系如下圖所示:

PyTorch中的損失函數大緻使用場景

image.png

同樣,預測輸出越接近真實樣本标簽 0,損失函數 L 越小;預測函數越接近 1,L 越大。函數的變化趨勢也完全符合實際需要的情況。

從上面兩種圖,可以幫助我們對交叉熵損失函數有更直覺的了解。無論真實樣本标簽 y 是 0 還是 1,L 都表征了預測輸出與 y 的差距。

另外,重點提一點的是,從圖形中我們可以發現:預測輸出與 y 差得越多,L 的值越大,也就是說對目前模型的 “ 懲罰 ” 越大,而且是非線性增大,是一種類似指數增長的級别。這是由 log 函數本身的特性所決定的。這樣的好處是模型會傾向于讓預測輸出更接近真實樣本标簽 y。

什麼時候用?

torch.nn.CrossEntropyLoss(weight=None,ignore_index=-100, reduction='mean')

參數:

weight (Tensor, optional) – 自定義的每個類别的權重. 必須是一個長度為 C 的 Tensor

ignore_index (int, optional) – 設定一個目标值, 該目标值會被忽略, 進而不會影響到 輸入的梯度。

reduction-三個值,none: 不使用約簡;mean:傳回loss和的平均值;sum:傳回loss的和。預設:mean。

當訓練有 C 個類别的分類問題時很有效. 可選參數 weight 必須是一個1維 Tensor, 權重将被配置設定給各個類别. 對于不平衡的訓練集非常有效。

在多分類任務中,經常采用 softmax 激活函數+交叉熵損失函數,因為交叉熵描述了兩個機率分布的差異,然而神經網絡輸出的是向量,并不是機率分布的形式。是以需要 softmax激活函數将一個向量進行“歸一化”成機率分布的形式,再采用交叉熵損失函數計算 loss。

五、NLLLoss

什麼時候用?

用于多分類的負對數似然損失函數

在神經網絡中,可以通過在最後一層添加

LogSoftmax

層來得到對數機率(log-probability). 此時,損失函數計算為

LogSoftmax

+

NLLLoss

的輸出. 如果不喜歡新增額外的網絡層,可以直接采用

CrossEntropyLoss

CrossEntropyLoss

的作用就相當于

nn.LogSoftmax

+

nn.NLLLoss

六、BCELoss

什麼時候用?

二分類任務時的交叉熵計算函數

此函數可以認為是

nn.CrossEntropyLoss

函數的特例。其分類限定為二分類,y必須是{0,1}。還需要注意的是,input應該為機率分布的形式,這樣才符合交叉熵的應用。是以在BCELoss之前,input一般為sigmoid激活層的輸出,官方例子也是這樣給的。該損失函數在自編碼器中常用

七、BCEWithLogitsLoss

什麼時候用?

二分類任務時的交叉熵計算函數

BCEWithLogitsLoss損失函數把 Sigmoid 層內建到了 BCELoss 類中。該版比用一個簡單的 Sigmoid 層和 BCELoss 在數值上更穩定,因為把這兩個操作合并為一個層之後, 可以利用 log-sum-exp 的 技巧來實作數值穩定。

八、SoftMarginLoss

什麼時候用?

計算的是,輸入 tensor x 和 target tensor y (包含 1 或 -1) 間的二類分類邏輯損失函數(two-class classification logistic loss )。

九、MultiLabelSoftMarginLoss

什麼時候用?

SoftMarginLoss

的多分類版本

計算的是,輸入 tensor x 和 target tensor y (size 為 (N,C) 間,基于最大熵(max-entropy)優化 multi-label one-versus-all(一對多)的損失函數,y 隻能取 (1,0) 兩種,代表正類和負類。

十、KL 散度損失 KLDivLoss

KL 散度,又叫做相對熵,用于描述兩個機率分布之間的差,越相似則越接近零。

計算 input 和 target 之間的 KL 散度,KL 散度可用于衡量不同的連續分布之間的距離,在連續的輸出分布的空間上(離散采樣)上進行直接回歸時很有效的。

資訊熵 = 交叉熵 - 相對熵 從資訊論角度觀察三者,其關系為資訊熵 = 交叉熵 - 相對熵。在機器學習中,當訓練資料固定,最小化相對熵 D(p||q) 等價于最小化交叉熵 H(p,q)

什麼時候用?

不同的連續分布之間的距離

十一、MultiMarginLoss

含義

MultiMarginLoss 計算的是,給定輸入 2D mini-batch Tensor x 和輸出 target 類别索引的 1D Tensor y (0≤y≤x.size(1)−1) 時,multi-class 分類的 hinge loss(margin-based loss) 的優化。

nn.MultiMarginLoss (p=1, margin=1.0, weight=None, size_average=None, reduce=None, reduction='mean')

PyTorch中的損失函數大緻使用場景

image.png

其中次數p一般預設為1。

weight為根據樣本類别分布而設定的權重,可選擇性設定。margin為hinge的門檻值,就像圖像表示的函數,1也是margin值。該樣本錯誤預測的得分和正确預測的得分,兩者的內插補點可用來表示兩種預測結果的相似關系,margin是一個由自己指定的安全系數。

我們希望正确預測的得分高于錯誤預測的得分,且高出一個邊界值 margin,換句話說,越高越好,越低越好,(–)越大越好,(–)越小越好,但二者得分之差最多為margin就足夠了,差距更大并不會有任何獎勵。這樣設計的目的在于,對單個樣本正确分類隻要有margin的把握就足夠了,更大的把握則不必要,過分注重單個樣本的分類效果反而有可能使整體的分類效果變壞。分類器應該更加專注于整體的分類誤差。

什麼時候用?

計算多分類的折頁損失

十二、MultiLabelMarginLoss

什麼時候用?

多類别(multi-class)多分類(multi-classification)的 Hinge 損失,是上面 MultiMarginLoss 在多類别上的拓展。同時限定 p = 1,margin = 1。

PyTorch中的損失函數大緻使用場景

image.png

十三、MarginRankingLoss

什麼時候用?

nn.MarginRankingLoss(margin=0.0, size_average=None, reduce=None, reduction='mean')

計算兩個向量之間的相似度,當兩個向量之間的距離大于margin,則loss為正,小于margin,loss為0

十四、HingeEmbeddingLoss

什麼時候用?

計算的是,給定輸入 tensor x 和 labels tensor y (包含1和-1) 時的損失函數;

往往用于度量兩個輸入是否相似,如采用 L1 成對距離(pairdistance);

多用于學習非線性嵌入(nonlinear embeddings) 或者半監督學習。

十五、CosineEmbeddingLoss

什麼時候用?

和上面的

HingeEmbeddingLoss

功能類似,計算的是,給定輸入 tensor x 和 labels tensor y (包含1和-1) 時的損失函數;

用于采用 cosine 距離來度量兩個輸入是否相似;

往往被用于學習非線性嵌入和半監督學習中。

十六、CTCLoss

什麼時候用?

nn.CTCLoss(blank=0, reduction='mean', zero_infinity=False)

功能: Connectionist Temporal Classification。主要是解決時序類資料的分類問題,特别是label 和output 不對齊的問題(Alignment problem)

十七、PoissonNLLLoss

什麼時候用?

用于target服從泊松分布的分類任務

十八、TripletMarginLoss

什麼時候用?

計算三元組損失,人臉驗證中常用。

如下圖Anchor、Negative、Positive,目标是讓Positive元和Anchor元之間的距離盡可能的小,Positive元和Negative元之間的距離盡可能的大。

PyTorch中的損失函數大緻使用場景

image.png

參考:

PyTorch中的損失函數--L1Loss /L2Loss/SmoothL1Loss

簡單的交叉熵損失函數,你真的懂了嗎

PyTorch 學習筆記(六):PyTorch的十八個損失函數

十九種損失函數,你認識幾個?

【Pytorch版本】損失函數大彙總

繼續閱讀