機器通過損失函數學習。它是一種評估特定算法對給定數據建模的好壞的方法。如果預測偏離實際結果太多,損失函數就會給出一個非常大的數字。在一些優化函數的幫助下,損失函數逐漸學會減少預測中的誤差。在本文中,我們将讨論一些損失函數及其在機器/深度學習領域中的應用。
在機器學習中,算法并沒有一個放之四海而皆準的損失函數。對于特定的問題,選擇損失函數涉及到很多因素,比如選擇的機器學習算法的類型,計算導數的容易程度以及數據集中異常值的百分比。
從廣義上講,損失函數可以根據我們所處理的學習任務的類型分為兩大類——回歸損失和分類損失。在分類中,我們試圖從有限的分類值集合中預測輸出即給定手寫數字的大量數據集,将它們分類為0-9個數字之一。另一方面,回歸處理的是預測一個連續的值,例如給定的建築面積,房間的數量,房間的大小,預測房間的價格。
NOTE
n -訓練示例的數量。
i -數據集中的第i個訓練例子。
y(i) -第i個訓練示例的Ground truth label.
y_hat(i) -第i個訓練示例的預測。
回歸損失均方誤差/平方損失/ L2損失
數學公式 : -
均方誤差
顧名思義,均方誤差測量為預測與實際觀測之間的平方差的平均值。它隻關注平均誤差幅度而不管它們的方向。然而,由于平方,與較少偏離的預測相比,遠離實際值的預測會受到嚴重懲罰。加上MSE具有很好的數學特性,可以更容易地計算梯度。
Python示例代碼如下:
import numpy as np
y_hat = np.array([0.000, 0.166, 0.333])
y_true = np.array([0.000, 0.254, 0.998])
def rmse(predictions, targets):
differences = predictions - targets
differences_squared = differences ** 2
mean_of_differences_squared = differences_squared.mean()
rmse_val = np.sqrt(mean_of_differences_squared)
return rmse_val
print("d is: " str(["%.8f" % elem for elem in y_hat]))
print("p is: " str(["%.8f" % elem for elem in y_true]))
rmse_val = rmse(y_hat, y_true)
print("rms error is: " str(rmse_val))
平均絕對誤差/ L1損失
數學公式 : -
平均絕對誤差
另一方面,平均絕對誤差被測量為預測和實際觀察之間的絕對差之和的平均值。與MSE一樣,這也可以在不考慮方向的情況下測量誤差的大小。與MSE不同,MAE需要更複雜的工具,如線性編程來計算梯度。加上MAE對異常值更加穩健,因為它不使用平方。
Python示例代碼如下:
import numpy as np
y_hat = np.array([0.000, 0.166, 0.333])
y_true = np.array([0.000, 0.254, 0.998])
print("d is: " str(["%.8f" % elem for elem in y_hat]))
print("p is: " str(["%.8f" % elem for elem in y_true]))
def mae(predictions, targets):
differences = predictions - targets
absolute_differences = np.absolute(differences)
mean_absolute_differences = absolute_differences.mean()
return mean_absolute_differences
mae_val = mae(y_hat, y_true)
print ("mae error is: " str(mae_val))
平均偏差誤差
這在機器學習領域中并不常見。這和MSE是一樣的隻是我們不取絕對值。顯然,有必要謹慎,因為正偏差和負偏差可能相互抵消。雖然在實踐中不準确,它可以确定模型具有正偏差或負偏差。
數學公式:
平均偏差誤差
分類損失Hinge Loss/多類SVM損失
簡單地說,正确類别的得分應該大于所有不正确類别的得分之和。因此,Hinge Loss用于最大邊距分類,尤其是支持向量機。雖然不可微,但它是一個凸函數,可以很容易地使用機器學習領域中常用的凸優化器。
數學公式:
SVM Loss or Hinge Loss
考慮一個例子,我們有三個訓練例子和三個預測類-狗,貓和馬。下面是我們的算法預測的每個類的值:-
Hinge Loss/多類SVM損失
計算所有3個訓練樣例的Hinge Loss,Python代碼如下: -
## 1st training example
max(0, (1.49) - (-0.39) 1) max(0, (4.21) - (-0.39) 1)
max(0, 2.88) max(0, 5.6)
2.88 5.6
8.48 (High loss as very wrong prediction)
## 2nd training example
max(0, (-4.61) - (3.28) 1) max(0, (1.46) - (3.28) 1)
max(0, -6.89) max(0, -0.82)
0 0
0 (Zero loss as correct prediction)
## 3rd training example
max(0, (1.03) - (-2.27) 1) max(0, (-2.37) - (-2.27) 1)
max(0, 4.3) max(0, 0.9)
4.3 0.9
5.2 (High loss as very wrong prediction)
交叉熵損失/負對數似然
這是最常見的分類問題設置。交叉熵損失随着預測概率偏離實際标簽而增加。
數學公式:
交叉熵損失
注意,當實際标簽為1 (y(i) = 1)時,函數的後半部分就會消失,而當實際标簽為0 (y(i) = 0)時,前半部分就會掉下來。簡而言之,我們隻是将實際預測概率的對數乘以ground truth類。一個重要的方面是交叉熵損失嚴重懲罰了那些自信但錯誤的預測。
Python代碼如下:
import numpy as np
predictions = np.array([[0.25,0.25,0.25,0.25],
[0.01,0.01,0.01,0.96]])
targets = np.array([[0,0,0,1],
[0,0,0,1]])
def cross_entropy(predictions, targets, epsilon=1e-10):
predictions = np.clip(predictions, epsilon, 1. - epsilon)
N = predictions.shape[0]
ce_loss = -np.sum(np.sum(targets * np.log(predictions 1e-5)))/N
return ce_loss
cross_entropy_loss = cross_entropy(predictions, targets)
print ("Cross entropy loss is: " str(cross_entropy_loss))
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!