2024年4月15日 星期一

[文章轉貼] 九大損失函數全匯總! !

文章轉自微信公眾號:機器學習與人工智慧AI 
文章原始連結:https://mp.weixin.qq.com/s/W-T3QpgZ_SvOwcRDs40_Eg

本文重點:匯總,9種常見且重要的損失函數!

大家好~
咱們今兒來聊聊關於損失函數的內容。emm...非常重要! !
大概每個人都是從均方誤差開始學習損失函數的,均方誤差是一種用於迴歸問題的損失函數,用於衡量模型的預測值與真實值之間的差異的平方和。
那時候,透過這個最簡單的損失函數,直覺的理解了,均方誤差的值越小表示模型對資料的擬合越好的整個邏輯。
在訓練過程中,機器學習演算法的目標通常是最小化均方誤差,以使模型能夠更好地逼近真實資料分佈。然而,要注意,對於不同類型的問題,可能需要使用不同的損失函數,因為損失函數的選擇取決於問題的性質和要解決的任務。
老規矩大傢伙如果覺得近期文章還不錯!歡迎大家點個讚、轉個發~
損失函數的意義在機器學習和深度學習中,非常重要,咱們大概從幾個方面聊聊:
  1. 衡量模型效能: 損失函數提供了一種量化模型預測結果與實際結果之間差異的方法。透過這種量化,我們可以客觀地評估模型的好壞。損失函數的值越低,表示模型的預測結果與真實結果的差異越小,模型的表現越好。

  2. 模型最佳化的指導: 訓練模型的過程其實是一個最佳化過程,目的是最小化損失函數。透過最佳化演算法(如梯度下降),模型參數被逐漸調整,以降低損失函數的值。因此,損失函數直接決定了模型的學習過程和最終表現。

  3. 模型選擇與調整: 不同的問題可能更適合不同的損失函數。例如,迴歸問題常用均方誤差(MSE),而分類問題常用交叉熵損失。透過選擇適當的損失函數,可以更好地適應特定問題的需求。

  4. 處理不平衡資料: 在現實世界的資料中,很常見資料不平衡的情況,如在分類問題中某些類別的樣本數量遠多於其他類別。特定的損失函數(如加權交叉熵)可以幫助模型更好地處理這種不平衡,提高模型在較少樣本類別上的表現。

  5. 防止過擬合: 某些損失函數(如L1和L2正則化)包含了懲罰項,用於控制模型複雜度,避免過度擬合。這對於提高模型的泛化能力是非常重要的。

  6. 影響模型的學習方式: 不同的損失函數對模型的影響方式不同。例如,Huber損失對離群點(outliers)的敏感度較低,可以讓模型在面對異常值時更加穩健。

綜上,損失函數不僅是衡量模型效能的關鍵,也是指導模型訓練和最佳化過程的核心部分,對於實現高效、準確的機器學習模型至關重要。

選擇哪種損失函數取決於特定的應用場景和模型要求。有時,可能會結合多個損失函數以達到最佳效果。
咱們就把九種常見的損失函數面向進行詳細闡述~

均方誤差

均方誤差(Mean Squared Error,MSE)是機器學習中常用的損失函數之一,用於衡量模型的預測值與真實值之間的差異。 MSE適用於迴歸問題,旨在最小化模型的預測誤差。

計算方法

假設我們有一個包含n個樣本的資料集,其中每個樣本的真實值為,模型的預測值為,則均方誤差的計算方法如下:


  1. 首先,我們計算每個樣本的預測值與真實值之間的差異,即
  2. 然後,將這些差異平方,以消除正負差異,得到
  3. 最後,計算所有樣本的平方差異的平均值,即求和並除以樣本數n,得到均方誤差MSE。

適用場景

均方誤差通常用於迴歸問題,其中模型的目標是預測連續數值輸出(例如,房價預測、銷售量預測等)。均方誤差對異常值(離群點)敏感,因為它對差異的平方進行了求和,因此在使用MSE時需要注意異常值的處理。

程式碼直觀理解原理

透過一段Python程式碼,直觀的理解均方誤差~
import  numpy  as  np
import  matplotlib.pyplot  as  plt # 產生範例

資料
true_values = np.array([ 24578 ]) predicted_values 
= np.array([ 1.53.5np . . # 計算均方誤差mse = np.mean((predicted_values - true_values) **  2 ) # 繪製資料點plt.scatter(true_values, predicted_values, label= 'Data points' ) # 繪製直線 y=x,表示完美預測plt .plot([ 010 ], [ 010 ], linestyle= '--' , color= 'red' , label= 'Perfect Prediction' ) # 加入均方誤差資訊plt.text( 18f 'MSE =  {mse: .2 f} ' , fontsize= 12 , color= 'blue' ) # 設定圖表標籤plt.xlabel( 'True Values' ) plt.ylabel( 'Predicted Values' ) plt.legend() plt .title( 'Mean Squared Error (MSE)' ) plt.grid( True ) # 顯示影像plt.show()






















整段程式碼產生了一個散佈圖,其中x軸表示真實值,y軸表示模型的預測值,還在圖中添加了均方誤差的資訊。
均方誤差越小,散點越接近紅色虛線,表示模型的預測越接近真實值。







均方根誤差

均方根誤差(Root Mean Squared Error,RMSE)與均方誤差(MSE)類似,但是在計算前會對均方誤差進行平方根運算,以測量模型的預測值與真實值之間的平均偏差。

計算方法

假設我們有一個包含n個樣本的資料集,其中每個樣本的真實值為,模型的預測值為,則均方根誤差的計算方法如下:


  1. 首先,我們計算每個樣本的預測值與真實值之間的差異,即
  2. 然後,將這些差異平方,以消除正負差異,得到
  3. 接下來,計算所有樣本的平方差異的平均值,即求和並除以樣本數n,得到均方誤差MSE。
  4. 最後,對均方誤差取平方根,得到均方根誤差RMSE。

適用場景

均方根誤差通常用於迴歸問題,特別是在希望更好地理解模型的預測誤差的情況下,因為它以與原始資料相同的度量單位表示誤差。與MSE不同,RMSE對誤差的量級更為敏感,因此可以用來比較不同問題中模型的表現。

程式碼直觀理解原理

使用Python繪製均方根誤差影像的程式碼:
import  numpy  as  np
import  matplotlib.pyplot  as  plt # 產生範例

資料
true_values = np.array([ 24578 ]) predicted_values 
= np.array([ 1.53.5np . . # 計算均方誤差mse = np.mean((predicted_values - true_values) **  2 ) # 計算均方根誤差rmse = np.sqrt(mse) # 繪製資料點plt.scatter(true_values, predicted_values, label= 'Data points' ) # 繪製直線 y=x,表示完美預測plt.plot([ 010 ], [ 010 ], linestyle= '--' , color= 'red' , label= 'Perfect Prediction' ) #新增均方根誤差訊息plt.text( 18f'RMSE =  {rmse: .2 f} ' , fontsize= 12 , color= 'blue' ) # 設定圖表標籤plt.xlabel( 'True Values' ) plt.ylabel( 'Predicted Values' ) plt.legend() plt.title( 'Root Mean Squared Error (RMSE)' ) plt.grid( True ) # 顯示影像plt.show()

























整段程式碼產生了一個散佈圖,其中x軸表示真實值,y軸表示模型的預測值,還在圖中添加了均方根誤差的資訊。
均方根誤差越小,散點越接近紅色虛線,表示模型的預測越接近真實值。



平均絕對誤差

平均絕對誤差(Mean Absolute Error,MAE)用於迴歸問題中衡量模型的預測值與真實值之間的平均絕對差異。

計算方法

假設我們有一個包含n個樣本的資料集,其中每個樣本的真實值為,模型的預測值為,則平均絕對誤差的計算方法如下:

  1. 對於每個樣本,計算模型的預測值與真實值之間的差異,即
  2. 對這些差異取絕對值,以確保它們都為正數。
  3. 計算所有樣本的絕對差異的平均值,即求和並除以樣本數n,得到平均絕對誤差MAE。

適用場景

平均絕對誤差適用於迴歸問題,特別適用於資料中存在離群值(outliers)的情況,因為它對異常值的影響較小。與均方誤差(MSE)和均方根誤差(RMSE)不同,MAE不會對誤差平方運算,因此更為穩健,對異常值不敏感。

程式碼直觀理解原理

使用Python繪製平均絕對誤差影像的程式碼:
import  numpy  as  np
import  matplotlib.pyplot  as  plt # 產生範例

資料
true_values = np.array([ 24578 ]) predicted_values 
= np.array([ 1.53.5np . . # 計算平均絕對誤差mae = np.mean(np.abs(predicted_values - true_values)) # 繪製資料點plt.scatter(true_values, predicted_values, label= 'Data points' ) # 繪製直線 y=x,表示完美預測plt .plot([ 010 ], [ 010 ], linestyle= '--' , color= 'red' , label= 'Perfect Prediction' ) # 增加平均絕對誤差資訊plt.text( 18f 'MAE =  {mae: .2 f} ' , fontsize= 12 , color= 'blue' ) # 設定圖表標籤plt.xlabel( 'True Values' ) plt.ylabel( 'Predicted Values' ) plt.legend() plt .title( 'Mean Absolute Error (MAE)' ) plt.grid( True ) # 顯示影像plt.show()






















整段程式碼產生了一個散佈圖,其中x軸表示真實值,y軸表示模型的預測值,還在圖中添加了平均絕對誤差的資訊。平均絕對誤差越小,散點越接近紅色虛線,表示模型的預測越接近真實值。
與均方誤差不同,MAE的損失是線性的,因此它對異常值的影響較小。

交叉熵損失

交叉熵損失(Cross-Entropy Loss),也稱為對數損失(Logarithmic Loss),是機器學習中用於分​​類問題的常見損失函數。它用於衡量模型的分類輸出與真實標籤之間的差異。以下詳細闡述交叉熵損失的計算方法、推理過程、適用場景,並使用Python繪製交叉熵損失的圖像。

計算方法

假設我們有一個包含n個樣本的分類問題,每個樣本屬於某一類別(通常以one-hot編碼表示),模型的分類輸出為,真實標籤為(也是一個類別的one-hot編碼)。交叉熵損失的計算方法如下:




其中,表示類別數,表示第i個樣本的第j個類別的真實標籤,表示模型的輸出機率(通常是經過Softmax函數處理的)。
推理過程
  1. 對於每個樣本,計算真實標籤與模型輸出的交叉熵,這是透過將真實標籤的one-hot編碼與模型輸出的機率值相乘並取對數而得到的。
  2. 將所有樣本的交叉熵求和,並除以樣本數n,得到平均交叉熵損失。

適用場景

交叉熵損失通常用於分類問題,特別是在多類別分類問題中。它對模型的分類結果與真實標籤之間的誤差進行有效的建模,激勵模型產生更準確的分類機率分佈。交叉熵損失在深度學習中廣泛應用,特別是在圖像分類、文字分類、語音辨識等任務。

程式碼直觀理解原理

使用Python繪製交叉熵損失影像的程式碼:
import  numpy  as  np
import  matplotlib.pyplot  as  plt # 定義模型

輸出的機率分佈(通常透過Softmax函數得到)predicted_probs
= np.linspace( 0.010.99100 )   # 模擬從0.01到0.99假設 的機率值真實標籤為類別1 # 計算交叉熵損失cross_entropy_loss = -np.log(predicted_probs) # 繪製影像plt.plot(predicted_probs, cross_entropy_loss) plt.abel( 'Predicted Probossability' ) plt.ylabel( 'Cross-Entropyabel( 'Predicted Probossability' ) plt.ylabel( 'Cross-Entropy' ) plt.title( 'Cross-Entropy Loss vs. Predicted Probability' ) plt.grid( True ) # 顯示影像plt.show()
  













程式碼產生了一個影像,其中x軸表示模型輸出的機率值,y軸表示交叉熵損失。
可以看到,當模型輸出的機率接近真實標籤時,交叉熵損失接近0,而隨著機率的偏離,損失逐漸增加,這表明模型的預測與真實標籤之間的差異越大,損失越大。






對數損失

對數損失,也稱為對數似然損失,是機器學習中用於分​​類問題的常見損失函數。
它用於衡量模型的分類機率分佈與真實標籤之間的差異。

計算方法

假設我們有一個包含n個樣本的二分類問題,每個樣本屬於兩個類別中的一個,模型的分類輸出為,真實標籤為(通常是0或1)。對數損失的計算方法如下:


  1. 對於每個樣本,計算真實標籤為1時的部分:,以及真實標籤為0時的部分:
  2. 將上述兩部分求和,然後除以樣本數n,得到平均對數損失。

適用場景

對數損失通常用於分類問題,特別是在二分類問題。它對模型的分類機率分佈與真實標籤之間的差異進行有效的建模,激勵模型產生更準確的分類機率。
對數損失在許多機器學習演算法中廣泛應用,包括邏輯迴歸、神經網路中的二分類任務等。

程式碼直觀理解原理

使用Python繪製對數損失影像的程式碼:
import  numpy  as  np
import  matplotlib.pyplot  as  plt

# 定義模型輸出的機率分佈(範圍在0到1之間)
predicted_probs = np.linspace( 0.010.99100 )

# 計算對數損失
log_loss_positive = -np. predicted_probs)
log_loss_negative = -np.log( 1  - predicted_probs)

# 繪製圖像
plt.plot(predicted_probs, log_loss_positive, label= ' Log Loss (y=1)' )
plt.plot(predicted_probs, log_loss_pronative Loss. y=0)' )
plt.xlabel( 'Predicted Probability' )
plt.ylabel( 'Log Loss' )
plt.title( 'Log Loss vs. Predicted Probability' )
plt.legend()
plt.grid( True )

# 顯示圖像
plt.show()
上述程式碼產生的影像,x軸表示模型輸出的機率值,y軸表示對數損失。對數損失對於模型輸出的機率接近真實標籤1或0時都接近0,而對於機率偏離真實標籤時,損失逐漸增加。
這表示模型的分類機率越接近真實情況,損失越低。





Hinge損失

Hinge損失是機器學習中用於支援向量機等分類演算法的損失函數。它用於衡量模型的分類輸出與真實標籤之間的差異,並被設計為較好的分離超平面最佳化目標。

計算方法

假設我們有一個包含n個樣本的二分類問題,每個樣本的真實標籤為(通常是+1或-1),模型的分類輸出為,其中是輸入樣本。
Hinge損失的計算方法:


推理過程
  1. 對於每個樣本,計算模型的分類輸出與真實標籤之間的差異,即
  2. 使用Hinge損失函數,取差異與0的最大值,即
  3. 將所有樣本的Hinge損失進行求和,並除以樣本數n,得到平均Hinge損失。

適用場景

Hinge損失通常用於支援向量機(SVM)等二分類演算法中,它鼓勵模型產生具有更大邊距的分類超平面,並對誤分類的樣本有懲罰。
Hinge損失在處理線性可分和線性不可分的資料集時都有效,但在訓練過程中需要小心調整超參數,以平衡邊距和誤分類樣本的權衡。

程式碼直觀理解原理

import  numpy  as  np
import  matplotlib.pyplot  as  plt

# 定義模型輸出的一維特徵值範圍
f_x = np.linspace( -22100 )

# 計算Hinge損失
hinge_loss = np.maximum( 01  - f_x)

#繪製影像
plt.plot(f_x, hinge_loss)
plt.xlabel( 'Model Output (f(x))' )
plt.ylabel( 'Hinge Loss' )
plt.title( 'Hinge Loss vs. Model Output' )
plt.grid ( True )

# 顯示影像
plt.show()
其中x軸表示模型的分類輸出,y軸表示Hinge損失。
Hinge損失對於模型輸出在1附近的情況,損失接近0,而在模型輸出在-1和1之外的情況下,損失增加。
這反映了Hinge損失的特性,對於正確分類的樣本,損失接近零,對於誤分類的樣本,損失會增加,鼓勵模型產生更好的分類邊界。





Huber損失

Huber損失是一種平滑的損失函數,通常用於迴歸問題中,以降低對異常值(離群點)的敏感度。與均方誤差(MSE)相比,Huber損失對離群點具有更好的穩健性,能夠在一定程度上減少異常值的影響。

計算方法

Huber損失的計算方法如下:
Huber損失= 


其中, 是真實值, 是模型的預測值, 是Huber損失的閾值參數,通常是一個正數。
推理過程
  1. 如果真實值和模型的預測值之間的差異  小於等於閾值,則使用平方差的一半來計算損失。
  2. 如果  大於閾值,則計算一個線性部分,該部分使損失函數以恆定的斜率增加,以減少對離群點的敏感性。

適用場景

Huber損失通常用於迴歸問題,特別是在資料中存在離群值(異常值)的情況下。與均方誤差(MSE)相比,Huber損失更加穩健,能夠在一定程度上減少離群值對模型的影響。 Huber損失的閾值參數可以根據問題的特性進行調整,以控制對離群值的敏感度。

程式碼直觀理解原理

以下是使用Python繪製Huber損失影像的範例程式碼:
import  numpy  as  np
import  matplotlib.pyplot  as  plt

# 定義Huber損失函數
def  huber_loss (y, y_hat, delta) :
    absolute_error = np.abs(y - y_hat)  if
    abssolute_error  <= delta
        return  0 . *  2
    else :
        return  delta * (absolute_error -  0.5  * delta)

# 定義閾值參數
delta =  1.0

# 建立一組真實值與預測值
y_values = np.linspace( -33400 )
y_hat =  1.5   # 假設一個特定的預測值

# 計算對應的Huber損失
loss_values = np.zeros_like(y_values)
for  i  in  range(len(y_values)):
    loss_values[i] = huber_loss(y_values[i], y_hat, delta)

# 繪製
影像(y_values, loss_values, label= f'Prediction =  {y_hat} ' )
plt.xlabel( 'True Values' )
plt.ylabel( 'Huber Loss' )
plt.title( f'Huber Loss vs. True Values (Delta =  { delta} )' )
plt.legend()
plt.grid( True )

# 顯示影像
plt.show()
這段程式碼的目的是繪製Huber損失函數的圖像,並在圖上添加一條表示特定預測值的線。 Huber損失函數是一種用於迴歸問題的損失函數,對離群值具有較好的穩健性。在這個圖上,我們可以看到不同真實值下的Huber損失,並以一條線表示特定預測值的損失。這有助於理解Huber損失在不同預測值情況下的行為。



Kullback-Leibler散度

Kullback-Leibler(KL)散度,也稱為相對熵(Relative Entropy),是一種用於衡量兩個機率分佈之間差異的度量。在機器學習中,KL散度通常用於衡量兩個機率分佈之間的相似性或差異性。以下詳細闡述KL散度的計算方法、推理過程、適用場景,並使用Python繪製KL散度的影像。

計算方法

假設有兩個機率分佈散度的計算方法如下:


其中,代表機率分佈中的一個事件,分別是事件i在分佈中的機率。
推理過程
散度用於衡量分佈相對於分佈的資訊損失或資訊增益。
  1. 對於每個事件,計算的比值,然後取自然對數。
  2. 將這個比值乘以
  3. 將所有事件的結果求和,得到散度。
散度是不對稱的,即通常不相等。它度量的是將分佈用於近似分佈時所引入的資訊損失。

適用場景:

KL散度在機器學習中的許多領域都有應用,包括:
  • 機率模型比較:用於比較兩個機率分佈,例如在生成模型評估中。
  • 資訊理論:KL散度是資訊理論中的重要概念,用於測量資訊的差異。
  • 正規化:在正規化損失函數中,KL散度可以作為正規項,幫助模型更好地擬合資料。

程式碼直觀理解原理

KL散度的影像通常需要指定兩個機率分佈P和Q,然後計算每個事件i上的KL散度。
使用Python繪製KL散度的影像:
import  numpy  as  np
import  matplotlib.pyplot  as  plt

# 定義兩個機率分佈P和Q(範例中使用均勻分佈)
P = np.array([ 0.20.30.10.4 ])
Q = np.array([ 0.250.250.250.25 ])

# 計算KL散度
KL_divergence = np.sum(P * np.log(P / Q))

# 定義柱形的顏色
color_P =  'blue'
color_Q =  'red'

# 繪製圖像
plt .bar(range(len(P)), P, label= 'P' , color=color_P)
plt.bar(range(len(Q)), Q, alpha= 0.5 , label= 'Q' , color=color_Q )
plt.xlabel( 'Event' )
plt.ylabel( 'Probability' )
plt.title( f'KL Divergence =  {KL_divergence: .2 f} ' )
plt.legend()
plt.grid( True )

# 顯示影像
plt .show()
在影像中,其中有兩個範例機率分佈P和Q(這裡使用了均勻分佈作為範例),並計算了KL散度。
P用實心條表示,Q用半透明條表示。 KL散度值被顯示在圖表的標題中。 KL散度越大,表示兩個分佈越不相似。





餘弦相似度損耗

餘弦相似度損失(Cosine Similarity Loss)通常用於監督學習任務,如人臉識別、圖像檢索和文本相似度等,其中要最大化相似樣本對的餘弦相似度並最小化不相似樣本對的餘弦相似度。

計算方法

給定兩個向量  和 ,它們的餘弦相似度損失可以表示為:



其中,表示向量的內積,分別表示向量的範數,表示兩個向量之間的夾角。
推理過程
  1. 計算兩個向量的內積,表示它們的相似度量。

  2. 計算兩個向量的範數,用於標準化相似度,使其範圍在-1到1之間。

  3. 將內積除以兩個向量的範數,得到餘弦相似度。

  4. 最小化餘弦相似度來使相似樣本對的餘弦相似度接近1,而不相似樣本對的餘弦相似度接近-1。

適用場景

餘弦相似度損失通常用於以下場景:
  • 人臉辨識:用於度量不同人臉圖像之間的相似性,以便將它們分配到正確的身份。
  • 影像檢索:用於在影像庫中尋找與查詢影像相似的影像。
  • 文本相似度:用於衡量文本之間的相似性,如自然語言處理任務中的文本相似性評估。
  • 推薦系​​統:用於度量使用者與物品之間的相似性,以進行個人化推薦。
餘弦相似度損失在需要度量向量之間的相似性或距離的任務中非常有用,尤其是當特徵維度較高時,它通常優於歐氏距離。

程式碼直觀理解原理

餘弦相似度損失是一個用於度量相似性的度量,通常不以圖像的形式呈現。相似性可以透過計算兩個向量之間的餘弦相似度來確定。
但是,餘弦相似度本身不是一個損失函數,因此不容易透過影像來表示。咱們可以考慮繪製餘弦相似度隨著夾角變化的影像,來表示餘弦相似度在不同夾角下的變化。
import  numpy  as  np
import  matplotlib.pyplot  as  plt

# 定義夾角的範圍(0到π)
theta = np.linspace( 0 , np.pi,  100 )

# 計算餘弦相似度
cos_similarity = np.cos(theta) # cos(theta)

# 繪製影像
plt.plot(theta, cos_similarity)
plt.xlabel( 'Angle (radians)' )
plt.ylabel( 'Cosine Similarity' )
plt.title( 'Cosine Similarity vs. Angle' )
plt.grid( True ) # 顯示影像 True ) # 顯示影像 True )

# 顯示影像
plt.show()
影像中x軸表示夾角(弧度),y軸表示餘弦相似度。可以看到,在夾角為0度(向量方向相同)時,餘弦相似度為1;在夾角為180度(向量方向相反)時,餘弦相似度為-1;在夾角為90度(向量垂直)時,餘弦相似度為0。這個影像展示了餘弦相似度隨夾角變化的情況。