一、概念
損失函數在深度學習領域是用來計算搭建模型預測的輸出值和真實值之間的誤差。
具體實現過程:在一個批次(batch)前向傳播完成后,得到預測值,然后損失函數計算出預測值和真實值之間的差值,反向傳播去更新權值和偏置等參數,以降低差值,不斷向真實值接近,最終得到效果良好的模型。
常見的損失函數包括:MSE(均方差, 也可以叫L2Loss),Cross Entropy Loss(交叉熵),L1 Loss(L1平均絕對值誤差),Smooth L1 Loss(平滑的L1 loss),BCELoss (Binary Cross Entropy)等。下面分別對這些損失函數舉例說明。
只寫了一部分,后面陸續增加。。
二、Pytorch舉例
2.1 MSELoss
MSELoss 就是計算真實值和預測值的均方差,也可以叫L2 Loss。
特點:MSE收斂速度比較快,能提供最大似然估計,是回歸問題、模式識別、圖像處理中最常使用的損失函數。
import torch
from torch import nn
from torch.nn import MSELossinputs = torch.tensor([1, 2, 3], dtype=torch.float32)
outputs = torch.tensor([2, 2, 4], dtype=torch.float32)# MSE
# size_average為True,表示計算批前向傳播后損失函數的平均值,如果為False,則計算損失函數的和。
# 同樣,reduce為True,返回標量;reduce為False, size_average參數失效,直接返回向量形式的loss
# reduction目的為減少tensor中元素的數量。為none,表示不減少;為'sum',表示求和;為'mean',表示求平均值loss_mse = nn.MSELoss()
result_mse = loss_mse(inputs, outputs)
print(result_mse)loss_mse1 = nn.MSELoss(reduction='sum')
result_mse1 = loss_mse1(inputs, outputs)
print(result_mse1)loss_mse2 = nn.MSELoss(size_average=False, reduce=False, reduction='sum')
result_mse2 = loss_mse2(inputs, outputs)
print(result_mse2)
輸出
tensor(0.6667)
tensor(2.)
tensor([1., 0., 1.])
2.2 L1Loss
L1Loss是計算預測值和真實值的平均絕對誤差。
特點:對異常點的魯棒性更強,但在殘差為零處不可導,收斂速度比較慢。
loss_l1 = L1Loss()
result_l1 = loss_l1(inputs, outputs)
print(result_l1)
tensor(0.6667)
2.3 SmoothL1loss
SmoothL1loss是L1Loss 和MSE的混合,最早在Fast R-CNN中提出。
特點:收斂速度穩定,模型更容易收斂到局部最優,防止梯度爆炸。
# beta默認為1,表示指定要在L1和L2損失之間更改的閾值。
loss_smol1 = SmoothL1Loss()
result_smol1 = loss_smol1(inputs, outputs)
print(result_smol1)
tensor(0.3333)
2.4 CrossEntropyLoss
CrossEntropyLoss表示概率分布之間的距離,當交叉熵越小說明二者之間越接近,對于高維輸入比較有用。一般都需要激活函數將輸入轉變為(0,1)之間。
經典公式:
其實這個表示BCELoss(二分類交叉熵)。
pytorch的公式表示的是多分類問題:
1)當目標targets 包括類索引,ignore_index才可以設置.
2)表示每個類別的概率;當每個小批項目需要超過單個類別的標簽時非常有用,例如混合標簽、標簽平滑等。
其中: x為輸入值,y為目標值,C代表類別數量,w為權值參數。
# weight :為每個類指定的手動重縮放權重。
# ignore_index:ignore_index表示指定忽略目標值,但不影響輸入梯度。
# label_smoothing :在[0.0,1.0]之間的浮點型。指定計算損失時的平滑量,其中 0.0 表示不平滑。 如重新思考計算機視覺的初始架構中所述,目標成為原始基本事實和均勻分布的混合。
# 交叉熵損失
x = torch.tensor([0.5, 0.2, 0.3])
x = torch.reshape(x, (1, 3))
print(x)
y = torch.tensor([1])loss_cross = CrossEntropyLoss()
result_cross = loss_cross(x, y)
print(result_cross)
tensor([[0.5000, 0.2000, 0.3000]])
tensor(1.2398)
三、參考文章
目標檢測回歸損失函數簡介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss
損失函數(八)