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


1、softmax

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

輸出是一個概率分布: 每個元素都是非負的, 並且所有元素的總和都是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.
1
2
3
雖然在數學上等價於log(softmax(x)),但做這兩個

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

使用另一種公式來正確計算輸出和梯度。
1
2
3
4
5
測試:


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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
3、nn.CrossEntropyLoss() 與 NLLLoss()

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

4、log似然代價函數

C=−∑kyklogak
C=−∑kyklogak

其中,akak表示第k個神經元的輸出值;ykyk表示第k個神經元對應的真實值,取值為0或1。實際上,做分類時候,只有一個ykyk為1,其他均為0,最終結果是C=−yklogakC=−yklogak(akak對應着正確的那一個分類,log默認是e為底,ak∈[0,1]ak∈[0,1],當akak最大時候,C=0),損失為0.
---------------------
作者:HawardScut
來源:CSDN
原文:https://blog.csdn.net/hao5335156/article/details/80607732
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM