PyTorch學習筆記——softmax和log_softmax的區別、CrossEntropyLoss() 與 NLLLoss() 的區別、log似然代價函數

 

 版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/hao5335156/article/details/80607732

1、softmax

函數 Softmax(x) 也是一個 non-linearity, 但它的特殊之處在於它通常是網絡中一次操作. 這是因爲它接受了一個實數向量並返回一個概率分佈.其定義如下. 定義 x 是一個實數的向量(正數或負數都無所謂, 沒有限制). 然後, 第i個 Softmax(x) 的組成是 


輸出是一個概率分佈: 每個元素都是非負的, 並且所有元素的總和都是1.

 

2、log_softmax

在softmax的結果上再做多一次log運算

While mathematically equivalent to log(softmax(x)), doing these two
    operations separately is slower, and numerically unstable. This function
    uses an alternative formulation to compute the output and gradient correctly.
雖然在數學上等價於log(softmax(x)),但做這兩個

單獨操作速度較慢,數值上也不穩定。這個函數

使用另一種公式來正確計算輸出和梯度。

測試:


import torch
import torch.autograd as autograd
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np

data=autograd.Variable(torch.FloatTensor([1.0,2.0,3.0]))
log_softmax=F.log_softmax(data,dim=0)
print(log_softmax)

softmax=F.softmax(data,dim=0)
print(softmax)

np_softmax=softmax.data.numpy()
log_np_softmax=np.log(np_softmax)
print(log_np_softmax)

3、nn.CrossEntropyLoss() 與 NLLLoss()

NLLLoss 的 輸入 是一個對數概率向量和一個目標標籤. 它不會爲我們計算對數概率. 適合網絡的最後一層是log_softmax. 損失函數 nn.CrossEntropyLoss() 與 NLLLoss() 相同, 唯一的不同是它爲我們去做 softmax.

4、log似然代價函數

 


其中,akak表示第k個神經元的輸出值;ykyk表示第k個神經元對應的真實值,取值爲0或1。實際上,做分類時候,只有一個ykyk爲1,其他均爲0,最終結果是(akak對應着正確的那一個分類,log默認是e爲底,ak∈[0,1]ak∈[0,1],當akak最大時候,C=0),損失爲0.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章