【Pytorch神经网络理论篇】 09 神经网络模块中的损失函数
1 訓練模型的步驟與方法
- 將樣本書記輸入到模型中計算出正向的結果
- 計算模型結果與樣本目標數值之間的差值(也稱為損失值loss)
- 根據損失值,使用鏈式反向求導的方法,依次計算出模型中每個參數/權重的梯度
- 使用優化器中的策略對模型中的參數進行更新
2 神經網絡模塊中的損失函數
2.1 損失函數定義
損失函數主要用來計算“輸出值”與“輸入值”之間的差距,即誤差,反向傳播中依靠損失函數找到最優的權重。
2.2 L1損失函數/最小絕對值偏差(LAD)/最小絕對值誤差(LAE)
L1損失函數用于最小化誤差,該誤差是真實值和預測值之間的所有絕對差之和。
2.2.1 代碼實現==>以類的形式進行封裝,需要對其實例化后再使用
import torch ### pre:模型的輸出值 ### label:模型的目標值 loss = torch.nn.L1Loss()[pre,label]2.3 L2損失函數
L2損失函數用于最小化誤差,該誤差是真實值和預測值之間所有平方差的總和
2.4 均值平方差損失(MSE)
均值平方差損失(MSE)主要針對的是回歸問題,主要表達預測值域真實值之間的差異
2.4.1 MSE的公式表述
?這里的n表示n個樣本。ylabel與ypred的取值范圍一般為0-1。
2.4.2 注釋
- MSE的值越小,表明模型越好
- 在神經網絡的計算中,預測值與真實值要控制在相同的數據分布中
- 假設預測值輸入Sigmoid激活函數后其取值范圍為0到1之間,則真實值的取值范圍也應該取到0到1之間
2.4.3 代碼實現==>以類的形式進行封裝,需要對其實例化后再使用
import torch ### pre:模型的輸出值 ### label:模型的目標值 loss = torch.nn.MSELoss()(pre,label)2.5 交叉熵損失函數(Cross Entropy)
2.5.1 交叉熵損失函數簡介
交叉熵損失函數可以用來學習模型分布與訓練分布之間的差異,一般用作分類問題,數學含義為預測輸入樣本屬于某一類別的概率。
2.5.2 公式介紹
?y^為真實分類y的概率值
2.5.3?代碼實現==>以類的形式進行封裝,需要對其實例化后再使用
import torch ### pre:模型的輸出值 ### label:模型的目標值 loss = torch.nn.CrossEntropyLoss()(pre,label)2.5.4 圖像理解
接下來,我們從圖形的角度,分析交叉熵函數,加深大家的理解。首先,還是寫出單個樣本的交叉熵損失函數:
我們知道,當 y = 1 時:
?這時候,L 與預測輸出的關系如下圖所示:
看了 L 的圖形,簡單明了!橫坐標是預測輸出,縱坐標是交叉熵損失函數 L。顯然,預測輸出越接近真實樣本標簽 1,損失函數 L 越小;預測輸出越接近 0,L 越大。因此,函數的變化趨勢完全符合實際需要的情況。
當 y = 0 時:
這時候,L 與預測輸出的關系如下圖所示:
同樣,預測輸出越接近真實樣本標簽 0,損失函數 L 越小;預測函數越接近 1,L 越大。函數的變化趨勢也完全符合實際需要的情況。
從上面兩種圖,可以幫助我們對交叉熵損失函數有更直觀的理解。無論真實樣本標簽 y 是 0 還是 1,L 都表征了預測輸出與 y 的差距。
從圖形中我們可以發現:預測輸出與 y 差得越多,L 的值越大,也就是說對當前模型的 “ 懲罰 ” 越大,而且是非線性增大,是一種類似指數增長的級別。這是由 log 函數本身的特性所決定的。這樣的好處是模型會傾向于讓預測輸出更接近真實樣本標簽 y。
2.6 其他損失函數
2.6.1?SmoothL1Loss
SmoothL1Loss:平滑版的L1損失函數。此損失函數對于異常點的敏感性不如MSE-Loss。在某些情況下(如Fast R-CNN模型中),它可以防止梯度“爆炸”。這個損失函數也稱為Huber loss。
2.6.2?NLLLoss
NLLLoss:負對數似然損失函數,在分類任務中經常使用。
2.6.3?NLLLoss22d
NLLLoss22d:計算圖片的負對數似然損失函數,即對每個像素計算NLLLoss。
2.6.4?KLDivLoss
KLDivLoss:計算KL散度損失函數。
2.6.5?BCELoss
BCELoss:計算真實標簽與預測值之間的二進制交叉熵。
2.6.6?BCEWithLogitsLoss
BCEWithLogitsLoss:帶有Sigmoid激活函數層的BCELoss,即計算target與Sigmoid(output)之間的二進制交叉熵。
2.6.7?MarginRankingLoss
MarginRankingLoss:按照一個特定的方法計算損失。計算給定輸入x、x(一維張量)和對應的標y(一維張量,取值為-1或1)之間的損失值。如果y=1,那么第一個輸入的值應該大于第二個輸入的值;如果y=-1,則相反。
2.6.8?HingeEmbeddingLoss
HingeEmbeddingLoss:用來測量兩個輸入是否相似,使用L1距離。計算給定一個輸入x(二維張量)和對應的標簽y(一維張量,取值為-1或1)之間的損失值。
2.6.9?MultiLabelMarginLoss
MultiLabelMarginLoss:計算多標簽分類的基于間隔的損失函數(hinge loss)。計算給定一個輸入x(二維張量)和對應的標簽y(二維張量)之間的損失值。其中,y表示最小批次中樣本類別的索引。
2.6.10?SoftMarginLoss
SoftMarginLoss:用來優化二分類的邏輯損失。計算給定一個輸入x(二維張量)和對應的標簽y(一維張量,取值為-1或1)之間的損失值。
2.6.11?MultiLabelSoftMarginLoss
MultiLabelSoftMarginLoss:基于輸入x(二維張量)和目標y(二維張量)的最大交叉熵,優化多標簽分類(one-versus-al)的損失。
2.6.12?CosineEmbeddingLoss
CosineEmbeddingLoss:使用余弦距離測量兩個輸入是否相似,一般用于學習非線性embedding或者半監督學習。
2.6.13?MultiMarginLoss
MultiMarginLoss:用來計算多分類任務的hinge loss。輸入是x(二維張量)和y(一維張量)。其中y代表類別的索引。
2.7 匯總
用輸入標簽數據的類型來選取損失函數
如果蝓入是無界的實數值,那么損失函數使用平方差
如果輸入標簽是位矢量(分類標識),那么使用交叉熵會更適合。
總結
以上是生活随笔為你收集整理的【Pytorch神经网络理论篇】 09 神经网络模块中的损失函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android转流媒体,android
- 下一篇: 智慧交通day04-特定目标车辆追踪03