天天看點

pytorch中常見的損失函數pytorch中常見的損失函數1.交叉熵損失2.KL散度3.平均絕對誤差(L1範數)04 均方誤差損失(L2範數)5.鉸鍊損失函數6.餘弦相似度

pytorch中常見的損失函數

參考自:https://mp.weixin.qq.com/s/2oUNYUwkrVUN1fV4zDER7Q

文章目錄

  • pytorch中常見的損失函數
  • 1.交叉熵損失
    • 交叉熵簡介
      • BCELoss
      • BCEWithLogitsLoss
      • NLLLoss
      • CrossEntropyLoss
  • 2.KL散度
    • KL散度簡介
      • KLDivLoss
  • 3.平均絕對誤差(L1範數)
    • L1範數簡介
      • L1Loss
      • l1_loss
  • 04 均方誤差損失(L2範數)
    • L2範數簡介
        • MSELoss
        • mse_loss
  • 5.鉸鍊損失函數
    • Hinge loss簡介
      • HingeEmbeddingLoss
  • 6.餘弦相似度
    • 餘弦相似度簡介
      • CosineEmbeddingLoss

1.交叉熵損失

交叉熵簡介

在分類問題模型中,如邏輯回歸、神經網絡等,在這些模型的最後通常會經過一個sigmoid函數(softmax函數),輸出一個機率值(一組機率值),這個機率值反映了預測為正類的可能性(一組機率值反應了所有分類的可能性)。而對于預測的機率分布和真實的機率分布之間,使用交叉熵來計算他們之間的差距。

  • 二分類交叉熵損失公式:

    L = 1 N ∑ i L i = 1 N ∑ i − [ y i ⋅ log ⁡ ( p i ) + ( 1 − y i ) ⋅ log ⁡ ( 1 − p i ) ] L=\frac{1}{N} \sum_{i} L_{i}=\frac{1}{N} \sum_{i}-\left[y_{i} \cdot \log \left(p_{i}\right)+\left(1-y_{i}\right) \cdot \log \left(1-p_{i}\right)\right] L=N1​∑i​Li​=N1​∑i​−[yi​⋅log(pi​)+(1−yi​)⋅log(1−pi​)]

    y i y_i yi​ 表示樣本标簽,正類為,負類為0, p i p_i pi​ 表示樣本 i i i預測為正的機率
  • 多分類下的交叉熵損失公式:

    L = 1 N ∑ i L i = 1 N ∑ i − ∑ c = 1 M y i c log ⁡ ( p i c ) L=\frac{1}{N} \sum_{i} L_{i}=\frac{1}{N} \sum_{i}-\sum_{c=1}^{M} y_{i c} \log \left(p_{i c}\right) L=N1​∑i​Li​=N1​∑i​−∑c=1M​yic​log(pic​)

    M M M 表示類别的數量

    y i c y_{ic} yic​ 表示變量(0或1),如果該類别和樣本 i的類别相同就是1,否則是0

    p i c p_{ic} pic​ 表示對于觀測樣本 i i i 屬于類别 c c c 的預測機率。

BCELoss

BCELoss 是CrossEntropyLoss的一個特例,隻用于二分類問題

BCELoss前面需要加上Sigmoid函數

參數:
  1. weight:每個分類的縮放權重,傳入的大小必須和類别數量一至
  2. size_average:bool類型,為True時,傳回的loss為平均值,為False時,傳回的各樣本的loss之和
  3. reduce:bool類型,傳回值是否為标量,預設為True
  4. reduction:string類型,‘none’ | ‘mean’ | 'sum’三種參數值

參數中的weight決定單個樣本所占權值,預設為1.0。

Loss_function = torch.nn.BCELoss()
loss = Loss_function(output, target)
           

BCEWithLogitsLoss

在BCELoss的基礎上融合了Sigmoid

參數:
  1. weight:每個分類的縮放權重,傳入的大小必須和類别數量一至
  2. size_average:bool類型,為True時,傳回的loss為平均值,為False時,傳回的各樣本的loss之和
  3. reduce:bool類型,傳回值是否為标量,預設為True
  4. reduction:string類型,‘none’ | ‘mean’ | 'sum’三種參數值
  5. pos_weight:正樣本的權重, 當p>1,提高召回率,當p<1,提高精确度。可達到權衡召回率(Recall)和精确度(Precision)的作用。

NLLLoss

多分類的交叉熵函數,在使用前需要對input進行log_softmax處理

CrossEntropyLoss

相當于整合了log_softmax和NLLLoss()

參數:
  1. weight:每個分類的縮放權重,傳入的大小必須和類别數量一至
  2. size_average:bool類型,為True時,傳回的loss為平均值,為False時,傳回的各樣本的loss之和
  3. ignore_index:忽略某一類别,不計算其loss,其loss會為0,并且,在采用size_average時,不會計算那一類的loss,除的時候的分母也不會統計那一類的樣本
  4. reduce:bool類型,傳回值是否為标量,預設為True
  5. reduction:string類型,‘none’ | ‘mean’ | 'sum’三種參數值

2.KL散度

KL散度簡介

KL散度(相對熵)是用來衡量兩個機率分布之間的差異。

D ( P ∥ Q ) = ∑ P ( x ) log ⁡ P ( x ) Q ( x ) \mathrm{D}(\mathrm{P} \| \mathrm{Q})=\sum P(x) \log \frac{P(x)}{Q(x)} D(P∥Q)=∑P(x)logQ(x)P(x)​

KL散度可以化簡為資訊熵和交叉熵

KLDivLoss

參數:
  1. size_average:bool類型,為True時,傳回的loss為平均值,為False時,傳回的各樣本的loss之和
  2. reduce:bool類型,傳回值是否為标量,預設為True
  3. reduction-三個值,none: 不使用約簡;mean:傳回loss和的平均值;sum:傳回loss的和。預設:mean
  4. log_target:預設False,指定是否在日志空間中傳遞目标

3.平均絕對誤差(L1範數)

L1範數簡介

L1範數損失函數,也被稱為最小絕對值偏差(LAD),最小絕對值誤差(LAE)。總的說來,它是把目标值 Y i Y_i Yi​與估計值 f ( x i ) f(x_i) f(xi​) 的絕對內插補點的總和 S S S 最小化:

S = ∑ i = 1 n ∣ Y i − f ( x i ) ∣ S=\sum_{i=1}^{n}\left|Y_{i}-f\left(x_{i}\right)\right| S=∑i=1n​∣Yi​−f(xi​)∣

缺點:

  • 梯度恒定,不論預測值是否接近真實值,這很容易導緻發散,或者錯過極值點。
  • 導數不連續,導緻求解困難。這也是L1損失函數不廣泛使用的主要原因。

優點:

  • 收斂速度比L2損失函數要快,L1能提供更大且穩定的梯度。
  • 對異常的離群點有更好的魯棒性

L1Loss

參數:
  1. size_average:bool類型,為True時,傳回的loss為平均值,為False時,傳回的各樣本的loss之和
  2. reduce:bool類型,傳回值是否為标量,預設為True
  3. reduction-三個值,none: 不使用約簡;mean:傳回loss和的平均值;sum:傳回loss的和。預設:mean

l1_loss

04 均方誤差損失(L2範數)

L2範數簡介

L1範數損失函數,也被稱為最小平方誤(LSE)。總的說來,它是把目标值 Y i Y_i Yi​與估計值 f ( x i ) f(x_i) f(xi​) 的內插補點的平方和 S S S 最小化:

S = ∑ i = 1 n ( Y i − f ( x i ) ) 2 S=\sum_{i=1}^{n}\left(Y_{i}-f\left(x_{i}\right)\right)^{2} S=∑i=1n​(Yi​−f(xi​))2

缺點:

  • 收斂速度比L1慢,因為梯度會随着預測值接近真實值而不斷減小。
  • 對異常資料比L1敏感,這是平方項引起的,異常資料會引起很大的損失。

優點:

  • 它使訓練更容易,因為它的梯度随着預測值接近真實值而不斷減小,那麼它不會輕易錯過極值點,但也容易陷入局部最優。
  • 它的導數具有封閉解,優化和程式設計非常容易,是以很多回歸任務都是用MSE作為損失函數。

MSELoss

torch.nn.MSELoss(size_average=None, reduce=None, reduction: str = 'mean')
參數:
  size_average:bool類型,為True時,傳回的loss為平均值,為False時,傳回的各樣本的loss之和
  reduce:bool類型,傳回值是否為标量,預設為True
  reduction-三個值,none: 不使用約簡;mean:傳回loss和的平均值;sum:傳回loss的和。預設:mean
           

mse_loss

5.鉸鍊損失函數

Hinge loss簡介

有人把hinge loss稱為鉸鍊損失函數,它可用于“最大間隔(max-margin)”分類,其最著名的應用是作為SVM的損失函數。

L i = ∑ j ≠ y i max ⁡ ( 0 , s j − s y i + Δ ) L_{i}=\sum_{j \neq y_{i}} \max \left(0, s_{j}-s_{y_{i}}+\Delta\right) Li​=∑j​=yi​​max(0,sj​−syi​​+Δ)

HingeEmbeddingLoss

參數:
  1. margin:float類型,預設為1.
  2. size_average:bool類型,為True時,傳回的loss為平均值,為False時,傳回的各樣本的loss之和
  3. reduce:bool類型,傳回值是否為标量,預設為True
  4. reduction-三個值,none: 不使用約簡;mean:傳回loss和的平均值;sum:傳回loss的和。預設:mean

6.餘弦相似度

餘弦相似度簡介

餘弦相似度是機器學習中的一個重要概念,在Mahout等MLlib中有幾種常用的相似度計算方法,如歐氏相似度,皮爾遜相似度,餘弦相似度,Tanimoto相似度等。其中,餘弦相似度是其中重要的一種。餘弦相似度用向量空間中兩個向量夾角的餘弦值作為衡量兩個個體間差異的大小。相比距離度量,餘弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。

餘弦相似度更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用于使用使用者對内容評分來區分使用者興趣的相似度和差異,同時修正了使用者間可能存在的度量标準不統一的問題(因為餘弦相似度對絕對數值不敏感),公式如下:

sim ⁡ ( X , Y ) = cos ⁡ θ = x ⃗ ⋅ y ⃗ ∥ x ∥ ⋅ ∥ y ∥ \operatorname{sim}(X, Y)=\cos \theta=\frac{\vec{x} \cdot \vec{y}}{\|x\| \cdot\|y\|} sim(X,Y)=cosθ=∥x∥⋅∥y∥x

⋅y

​​

CosineEmbeddingLoss

參數:
  1. margin:float類型,應為-1到1之間的數字,建議為0到0.5,預設值為0
  2. size_average:bool類型,為True時,傳回的loss為平均值,為False時,傳回的各樣本的loss之和
  3. reduce:bool類型,傳回值是否為标量,預設為True
  4. reduction-三個值,none: 不使用約簡;mean:傳回loss和的平均值;sum:傳回loss的和。預設:mean

繼續閱讀