Pytorch_第六篇_深度學習 (DeepLearning) 基礎 [2]---神經網絡經常使用的損失函數

深度學習 (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

相關文章
相關標籤/搜索