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