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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!