文章轉自微信公眾號:機器學習與人工智慧AI
文章原始連結:https://mp.weixin.qq.com/s/W-T3QpgZ_SvOwcRDs40_Eg
本文重點:匯總,9種常見且重要的損失函數!
衡量模型效能: 損失函數提供了一種量化模型預測結果與實際結果之間差異的方法。透過這種量化,我們可以客觀地評估模型的好壞。損失函數的值越低,表示模型的預測結果與真實結果的差異越小,模型的表現越好。
模型最佳化的指導: 訓練模型的過程其實是一個最佳化過程,目的是最小化損失函數。透過最佳化演算法(如梯度下降),模型參數被逐漸調整,以降低損失函數的值。因此,損失函數直接決定了模型的學習過程和最終表現。
模型選擇與調整: 不同的問題可能更適合不同的損失函數。例如,迴歸問題常用均方誤差(MSE),而分類問題常用交叉熵損失。透過選擇適當的損失函數,可以更好地適應特定問題的需求。
處理不平衡資料: 在現實世界的資料中,很常見資料不平衡的情況,如在分類問題中某些類別的樣本數量遠多於其他類別。特定的損失函數(如加權交叉熵)可以幫助模型更好地處理這種不平衡,提高模型在較少樣本類別上的表現。
防止過擬合: 某些損失函數(如L1和L2正則化)包含了懲罰項,用於控制模型複雜度,避免過度擬合。這對於提高模型的泛化能力是非常重要的。
影響模型的學習方式: 不同的損失函數對模型的影響方式不同。例如,Huber損失對離群點(outliers)的敏感度較低,可以讓模型在面對異常值時更加穩健。
均方誤差
計算方法
首先,我們計算每個樣本的預測值與真實值之間的差異,即。 然後,將這些差異平方,以消除正負差異,得到。 最後,計算所有樣本的平方差異的平均值,即求和並除以樣本數n,得到均方誤差MSE。
適用場景
程式碼直觀理解原理
import numpy as np
import matplotlib.pyplot as plt # 產生範例
資料
true_values = np.array([ 2 , 4 , 5 , 7 , 8 ]) predicted_values
= np.array([ 1.5 , 3.5 , np . 5 . # 計算均方誤差mse = np.mean((predicted_values - true_values) ** 2 ) # 繪製資料點plt.scatter(true_values, predicted_values, label= 'Data points' ) # 繪製直線 y=x,表示完美預測plt .plot([ 0 , 10 ], [ 0 , 10 ], linestyle= '--' , color= 'red' , label= 'Perfect Prediction' ) # 加入均方誤差資訊plt.text( 1 , 8 , f '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()
均方根誤差
計算方法
首先,我們計算每個樣本的預測值與真實值之間的差異,即。 然後,將這些差異平方,以消除正負差異,得到。 接下來,計算所有樣本的平方差異的平均值,即求和並除以樣本數n,得到均方誤差MSE。 最後,對均方誤差取平方根,得到均方根誤差RMSE。
適用場景
程式碼直觀理解原理
import numpy as np
import matplotlib.pyplot as plt # 產生範例
資料
true_values = np.array([ 2 , 4 , 5 , 7 , 8 ]) predicted_values
= np.array([ 1.5 , 3.5 , np . 5 . # 計算均方誤差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([ 0 , 10 ], [ 0 , 10 ], linestyle= '--' , color= 'red' , label= 'Perfect Prediction' ) #新增均方根誤差訊息plt.text( 1 , 8 , f'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()
平均絕對誤差
計算方法
對於每個樣本,計算模型的預測值與真實值之間的差異,即。 對這些差異取絕對值,以確保它們都為正數。 計算所有樣本的絕對差異的平均值,即求和並除以樣本數n,得到平均絕對誤差MAE。
適用場景
程式碼直觀理解原理
import numpy as np
import matplotlib.pyplot as plt # 產生範例
資料
true_values = np.array([ 2 , 4 , 5 , 7 , 8 ]) predicted_values
= np.array([ 1.5 , 3.5 , np . 5 . # 計算平均絕對誤差mae = np.mean(np.abs(predicted_values - true_values)) # 繪製資料點plt.scatter(true_values, predicted_values, label= 'Data points' ) # 繪製直線 y=x,表示完美預測plt .plot([ 0 , 10 ], [ 0 , 10 ], linestyle= '--' , color= 'red' , label= 'Perfect Prediction' ) # 增加平均絕對誤差資訊plt.text( 1 , 8 , f '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()
交叉熵損失
計算方法
對於每個樣本,計算真實標籤與模型輸出的交叉熵,這是透過將真實標籤的one-hot編碼與模型輸出的機率值相乘並取對數而得到的。 將所有樣本的交叉熵求和,並除以樣本數n,得到平均交叉熵損失。
適用場景
程式碼直觀理解原理
import numpy as np
import matplotlib.pyplot as plt # 定義模型
輸出的機率分佈(通常透過Softmax函數得到)predicted_probs
= np.linspace( 0.01 , 0.99 , 100 ) # 模擬從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()
對數損失
計算方法
對於每個樣本,計算真實標籤為1時的部分:,以及真實標籤為0時的部分:。 將上述兩部分求和,然後除以樣本數n,得到平均對數損失。
適用場景
程式碼直觀理解原理
import numpy as np
import matplotlib.pyplot as plt
# 定義模型輸出的機率分佈(範圍在0到1之間)
predicted_probs = np.linspace( 0.01 , 0.99 , 100 )
# 計算對數損失
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()
Hinge損失
計算方法
對於每個樣本,計算模型的分類輸出與真實標籤之間的差異,即。 使用Hinge損失函數,取差異與0的最大值,即。 將所有樣本的Hinge損失進行求和,並除以樣本數n,得到平均Hinge損失。
適用場景
程式碼直觀理解原理
import numpy as np
import matplotlib.pyplot as plt
# 定義模型輸出的一維特徵值範圍
f_x = np.linspace( -2 , 2 , 100 )
# 計算Hinge損失
hinge_loss = np.maximum( 0 , 1 - 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()
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( -3 , 3 , 400 )
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()
Kullback-Leibler散度
計算方法
對於每個事件,計算與的比值,然後取自然對數。 將這個比值乘以。 將所有事件的結果求和,得到散度。
適用場景:
機率模型比較:用於比較兩個機率分佈,例如在生成模型評估中。 資訊理論:KL散度是資訊理論中的重要概念,用於測量資訊的差異。 正規化:在正規化損失函數中,KL散度可以作為正規項,幫助模型更好地擬合資料。
程式碼直觀理解原理
import numpy as np
import matplotlib.pyplot as plt
# 定義兩個機率分佈P和Q(範例中使用均勻分佈)
P = np.array([ 0.2 , 0.3 , 0.1 , 0.4 ])
Q = np.array([ 0.25 , 0.25 , 0.25 , 0.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()
餘弦相似度損耗
計算方法
計算兩個向量和的內積,表示它們的相似度量。
計算兩個向量和的範數,用於標準化相似度,使其範圍在-1到1之間。
將內積除以兩個向量的範數,得到餘弦相似度。
最小化餘弦相似度來使相似樣本對的餘弦相似度接近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()