深度學習 (DeepLearning) 基礎 [2]---神經網絡經常使用的損失函數
Introduce
在上一篇「深度學習 (DeepLearning) 基礎 [1]---監督學習和無監督學習」中咱們介紹了監督學習和無監督學習相關概念。本文主要介紹神經網絡經常使用的損失函數。html
如下均爲我的學習筆記,如有錯誤望指出。git
神經網絡經常使用的損失函數
pytorch損失函數封裝在torch.nn中。github
損失函數反映了模型預測輸出與真實值的區別,模型訓練的過程即讓損失函數不斷減少,最終獲得能夠擬合預測訓練樣本的模型。網絡
note:因爲PyTorch神經網絡模型訓練過程當中每次傳入一個mini-batch的數據,所以pytorch內置損失函數的計算出來的結果若是沒有指定reduction參數,則默認對mini-batch取平均。函數
如下對幾個經常使用的損失函數以及其應用場景作一個簡單總結。(如下損失函數的公式均表明單個min-batch的損失,且假設x爲神經網絡的預測輸出,y爲樣本的真實值,xi爲一個mini-batch中第i個樣本的預測輸出,yi同理,n爲一個批量mini-batch的大小)學習
- nn.L1Loss(L1損失,也稱平均絕對偏差MAE):計算模型輸出x與目標y之間差的絕對值。經常使用於迴歸任務。
\[loss(x,y) = {1\over n}\sum|x_i-y_i| \]
'''代碼示例'''
loss_func = torch.nn.L1Loss(reduction='mean')
'''note:
reduction=None 啥也不幹
reduction='mean' 返回loss和的平均值
reduction='mean' 返回loss的和。
不指定即默認mean。
'''
- nn.MSELoss(L2損失,也稱均方偏差MSE):計算模型輸出x與目標y之間差的平方的均值,均方差。經常使用於迴歸任務。
\[loss(x,y) = {1\over n}\sum(x_i-y_i)^2 \]
'''代碼示例'''
loss_func = torch.nn.MSELoss(reduction='mean')
# note: reduction同上。
- nn.BCELoss(二進制交叉熵損失):計算模型輸出x與目標y之間的交叉熵。(我對於交叉熵的理解,交叉熵爲相對熵(即KL散度,用來衡量兩個分佈的差別程度)中的一項,最小化兩個分佈的差別,即最小化相對熵,由相對熵公式,因爲真實分佈是肯定的,那麼最小化相對熵就是最小化交叉熵,而最小化交叉熵的目標就是尋找一個預測分佈儘量逼近真實分佈,這和咱們模型的訓練目標是一致的,即讓模型預測逼近樣本真實值,參考連接)經常使用於二分類任務。
\[loss(x,y) = {1\over n}\sum-w_i[y_i*logx_i + (1-y_i)*log(1-x_i)] \]
'''代碼示例'''
loss_func = torch.nn.BCELoss(weight=None, reduction='mean')
# note:
# weight爲長度爲n的tensor,用來指定一個batch中各樣本佔有的權重,如公式中的wi,不指定默認爲各樣本權重均爲1。
# reduction同上。
# 用的時候須要在該層前面加上 Sigmoid 函數。
- nn.NLLLoss(負對數似然損失):將神經網絡輸出的隸屬各個類的機率向量x與對應真實標籤向量(我的理解應該是one-hot向量吧)相差再相加,最後再取負。若是不取負的話,應該是loss值越大預測標籤越接近真實標籤,取負的話反過來,越小則越接近真實標籤,符合loss函數的定義。經常使用於多分類任務。 如下公式假設節點xi屬於第j類,x[j]爲預測的x屬於第j類的機率,且w[j]爲第j類的權重。
\[loss(x,class) = {1\over n}\sum -w[j]*x[j] \]
'''代碼示例'''
loss_func = torch.nn.NLLLoss(weight=None, reduction='mean')
# note:
# weight同上,如公式中的w表明各個類在損失中佔有的權重,即類的重要程度,若不賦予權重w,則各種同等重要,上述公式中的w[class]去掉。
# reduction同上。
- nn.CrossEntropyLoss (交叉熵損失):如上述二進制交叉熵所示,隨着預測的機率分佈愈來愈接近實際標籤,交叉熵會逐漸減少。pytorch將nn.LogSoftmax()和nn.NLLLoss()組合到nn.CrossEntropyLoss(),即調用nn.CrossEntropyLoss() 底層會調用上述兩個函數,能夠理解爲 CrossEntropyLoss = LogSoftmax + NLLLoss。所以通常多分類任務都經常使用交叉熵損失。 如下label_i表明節點xi的真實標籤,c爲總的標籤數。
\[loss(x,class) = {1 \over n}\sum-w[label_i]log{exp(x_i[label_i])\over \sum_{j=1}^cexp(x[j])} = {1 \over n}\sum w[label_i](-x_i[label_i]+log(\sum_{j=1}^c)exp(x[j])) \]
'''代碼示例'''
loss_func = torch.nn.CrossEntropyLoss(weight=None,reduction='mean')
# note:
# weight同nn.NLLLoss。
# reduction同上。
本文參考-1.net
本文參考-2code