前言
損失函數(Loss Function):是定義在單個樣本上的,是指一個樣本的誤差,度量模型一次預測的好壞。
代價函數(Cost Function)=成本函數=經驗風險:是定義在整個訓練集上的,是所有樣本誤差的平均,也就是所有損失函數值的平均,度量平均意義下模型預測的好壞。
目標函數(Object Function)=結構風險=經驗風險+正則化項=代價函數+正則化項:是指最終需要優化的函數,一般指的是結構風險。正則化項(regularizer)=懲罰項(penalty term)。
損失函數類型
平方損失函數(Quadratic Loss Function)又稱均方誤差(Mean Squared Error, MSE)
一種常用的回歸損失函數。它衡量的是模型預測值與真實值之差的平方的平均值。平方損失函數對于大的誤差給予了更大的懲罰,這使得它成為許多回歸任務中首選的損失函數之一。
平方損失函數的公式(MSE):
import torch# 創建一個包含從 0.0 到 4.0(包括0.0和4.0)的浮點數的一維張量 x
x = torch.arange(5.0) # 注意這里的 5.0,它確保了 x 是浮點類型# 創建一個與 x 形狀相同但所有元素都是 1.0 的浮點類型張量 Y
Y = torch.ones_like(x, dtype=torch.float32) # 顯式指定 dtype 為 torch.float32# 創建一個 MSELoss 的實例
MSE = torch.nn.MSELoss()# 計算 x 和 Y 之間的均方誤差,并將結果存儲在變量 a 中
a = MSE(x, Y)# 打印結果
print(a) # 輸出:tensor(3.),表示 x 和 Y 之間的均方誤差
print(x) # 輸出:tensor([0., 1., 2., 3., 4.]),x 的值
print(Y) # 輸出:tensor([1., 1., 1., 1., 1.]),Y 的值
注意
- 平方損失函數對異常值(outliers)非常敏感,因為異常值會導致誤差的平方變得非常大,從而影響整個損失函數的值。
- 在某些情況下,如果預測值與實際值的差距非常大,使用平方損失函數可能會導致梯度爆炸,從而使得模型的訓練變得不穩定。對于這類問題,可能需要考慮使用其他的損失函數,如絕對誤差損失(L1損失)等。
L1范數損失(L1 Loss)也被稱為最小絕對偏差(LAD)、平均絕對值誤差(MAE)
L1 Loss損失函數的公式(MAE):
優點:
- 穩定性:L1 Loss對于任何輸入值都有著穩定的梯度,即其梯度為常數(±1),這避免了梯度爆炸的問題,使得模型訓練過程更加穩定。
- 魯棒性:L1 Loss對離群點(outliers)的懲罰是固定的,不會因離群點而產生過大的損失值,從而提高了模型對異常值的魯棒性。
- 稀疏性:L1 Loss在優化過程中傾向于產生稀疏解,即使得模型中的許多權重接近于0,這有助于特征選擇,簡化模型,并提高模型的泛化能力。
缺點:
- 不可導性:在0點處,L1Loss的梯度未定義(或者說是不連續的),這可能導致在優化過程中遇到一些困難,尤其是在使用梯度下降等基于梯度的優化算法時。
- 收斂性:由于L1 Loss的梯度為常數,當預測值接近真實值時,梯度仍然較大,這可能導致模型在最優解附近震蕩,難以精確收斂。
使用場景
L1 Loss通常用于回歸任務,尤其是在需要模型的權重具有稀疏性的場景下。然而,由于其在0點處的不可導性,L1 Loss在神經網絡等復雜模型中的直接使用較少。相反,Smooth L1 Loss(平滑L1損失)作為L1 Loss和L2 Loss的結合,既保留了L1 Loss的魯棒性,又解決了其在0點處不可導的問題,因此在目標檢測等任務中得到了廣泛應用。
# x = tensor([0., 1., 2., 3., 4.])
# y = tensor([1., 1., 1., 1., 1.]) # 計算差的絕對值
abs_diff = torch.abs(x - y)
# 輸出: tensor([1., 0., 1., 2., 3.]) # 計算L1損失(平均絕對誤差)
L1loss = torch.nn.L1Loss()
a = L1loss(x, y)
# 或者直接計算平均值,不使用torch.nn.L1Loss()
# a = torch.mean(abs_diff) # 輸出L1損失
print(a) # 應該是 (1 + 0 + 1 + 2 + 3) / 5 = 1.4
SmoothL1Loss,平滑L1損失函數
是深度學習中常用的一種損失函數,尤其在處理回歸問題時表現出色。它是L1損失和L2損失的結合體,旨在減少對異常值的敏感性,并在優化過程中提供更加穩定的梯度。
特性與優勢
- 結合L1和L2的優點:當誤差較小時(∣x∣<β),SmoothL1Loss的計算方式類似于L2損失(平方誤差),這使得它在原點附近更加平滑,有助于模型的快速收斂。當誤差較大時(∣x∣≥β),SmoothL1Loss的計算方式則類似于L1損失(絕對誤差),這有助于減少離群點對損失函數的影響,使模型更加魯棒。
- 對異常值不敏感:相比于L2損失,SmoothL1Loss在誤差較大時不會過度放大損失值,從而避免了梯度爆炸的問題。這對于包含異常值或噪聲的數據集尤其有用。
- 穩定的梯度:SmoothL1Loss在誤差的整個范圍內都提供了相對穩定的梯度,這有助于模型的穩定訓練。
應用場景
SmoothL1Loss在目標檢測、物體跟蹤、姿態估計等需要精確回歸的任務中得到了廣泛應用。特別是在目標檢測的Bounding Box回歸中,SmoothL1Loss能夠有效地計算預測框與真實框之間的誤差,并幫助模型優化預測結果。
在PyTorch的torch.nn.SmoothL1Loss類中,reduction和beta是兩個重要的參數,它們分別用于控制損失值的計算和平滑轉換點的設置。
reduction參數指定了應用于輸出損失值的縮減方法。它有三個可選值:‘none’、‘mean’和’sum’。
- 當reduction='mean’時,函數會計算所有元素損失的平均值作為最終的損失值。這是回歸任務中常用的做法,因為它將損失值標準化為單個標量,便于比較和反向傳播。
- 如果設置為’none’,則函數將返回一個與輸入形狀相同的損失張量,不進行任何縮減。
- 如果設置為’sum’,則函數會計算所有元素損失的總和作為最終的損失值。
beta參數是一個超參數,用于定義SmoothL1Loss函數中的平滑轉換點。在SmoothL1Loss的公式中,當誤差的絕對值小于beta時,損失函數采用L2損失(平方誤差)的形式;當誤差的絕對值大于或等于beta時,損失函數采用L1損失(絕對誤差減去0.5*beta)的形式。
- beta=1.0是PyTorch中SmoothL1Loss的默認值。這個值的選擇是基于經驗和實踐的,旨在在L1損失和L2損失之間找到一個平衡點,以便在大多數情況下都能獲得良好的性能。
- 調整beta的值可以改變損失函數對誤差的敏感度。較小的beta值會使損失函數在誤差較小時更加接近L2損失,從而在原點附近更加平滑;較大的beta值則會使損失函數更早地過渡到L1損失的形式,從而減少對大誤差的懲罰。