nn.CrossEntropyLoss總結
- 目錄
-
- nn.CrossEntropyLoss
- nn.LogSoftmax
- nn.NLLLoss
- Cross entropy
目錄
- 版本
-
pytorch 1.0
-
nn.CrossEntropyLoss
- 依次執行
兩個操作(不了解可見下面的section)nn.LogSoftmax(), nn.NLLLoss()
- 調用時輸入參數:
- Input: ( N , C ) (N,C) (N,C),N是樣本數,C是類别數
- Target: ( N ) (N) (N),每個值在 [ 0 , C − 1 ] [0,C-1] [0,C−1]之間
- 用于多分類任務
-
數學公式
l o s s ( x , c l a s s ) = − log ( exp ( x [ c l a s s ] ) ∑ j exp ( x [ j ] ) ) = − x [ c l a s s ] + log ( ∑ j exp ( x [ j ] ) ) loss(x,class)=-\log(\frac{\exp(x[class])}{\sum_j{\exp(x[j])}}) = -x[class] + \log(\sum_j{\exp(x[j])}) loss(x,class)=−log(∑jexp(x[j])exp(x[class]))=−x[class]+log(j∑exp(x[j]))
該公式計算的是樣本 x x x的預測向量和其真實類别 c l a s s class class的誤差,這裡解釋一下:
應該是 C r o s s E n t r o p y = − ∑ i N y i ⋅ log ( x i ) \mathtt{CrossEntropy}=-\sum_i^{N}{y_i \cdot \log(x_i)} CrossEntropy=−∑iNyi⋅log(xi),(這裡公式不了解可見下面的section),這裡讨論一個樣本,一共有 N N N個類别,對每個類别計算并求和,但 N − 1 N-1 N−1個 y i y_i yi都為0,就可以化簡為 C r o s s E n t r o p y = − log ( x n ) \mathtt{CrossEntropy}=- \log(x_n) CrossEntropy=−log(xn)。CrossEntropy
nn.LogSoftmax
- Softmax() + Log
-
數學公式(直接,清晰)
L o g S o f t m a x ( x i ) = log ( exp ( x i ) ∑ j exp ( x j ) ) \mathtt{LogSoftmax}(x_i) = \log(\frac{\exp(x_i)}{\sum_j{\exp(x_j)}}) LogSoftmax(xi)=log(∑jexp(xj)exp(xi))
nn.NLLLoss
- 負對數似然損失(Negative Log Likelihood Loss),其實就是加個負号再求均值。
- 用于:多分類任務
- 調用時輸入參數:
- Input: ( N , C ) (N,C) (N,C), C = C= C=類别數
- Target: ( N ) (N) (N),就是label,它的每個值在 [ 0 , C − 1 ] [0,C-1] [0,C−1]範圍内。
-
數學公式
l ( x , y ) = L = { l 1 , … , l N } T , l n = − w y n x n , y n , w c = w e i g h t [ c ] ⋅ 1 { c ≠ i g n o r e _ i n d e x } l(x,y)=L=\{l_1,\dots,l_N\}^T,l_n=-w_{y_n}x_{n,y_n},w_c=weight[c] \cdot 1\{c\neq {ignore\_index}\} l(x,y)=L={l1,…,lN}T,ln=−wynxn,yn,wc=weight[c]⋅1{c=ignore_index}
其中, N N N表示batch大小, x n , y n x_{n,y_n} xn,yn表示第 n n n個樣本對其真實标簽 y n y_n yn的對數似然。而 w c w_c wc中,預設情況下, w e i g h t weight weight的值都為1,而 c ≠ i g n o r e _ i n d e x c\neq {ignore\_index} c=ignore_index也是為真的。是以,可以将
l_n
化簡為 l n = − x n , y n . l_n=-x_{n,y_n}. ln=−xn,yn.
現在的 L L L實際上是一個向量,預設的話,最後還會對其求均值。
- 執行個體:
a = torch.rand(3,5)
# tensor([[0.4417, 0.2536, 0.6055, 0.3409, 0.3773],
# [0.1164, 0.4653, 0.9451, 0.9057, 0.9112],
# [0.1945, 0.3237, 0.9122, 0.6768, 0.4759]])
b = torch.rand(3,5)
label = torch.argmax(b,dim=-1)
# tensor([3, 0, 4])
nn.NLLLoss(reduce=False)(a,label)
# tensor([-0.3409, -0.1164, -0.4759])
Cross entropy
在資訊論中,在相同潛在事件集合下,機率分布 p p p和 q q q間的交叉熵(Cross entropy)是指,當基于一個“非自然”(相對于“真實”分布 p p p而言)的機率分布 q q q進行編碼時,在事件集合中唯一辨別一個事件所需要的平均比特數(bit)。
給定兩個機率分布 p p p和 q q q, p p p相對于 q q q的交叉熵定義為:
H ( p , q ) = E p [ − log q ] = H ( p ) + D K L ( p ∣ ∣ q ) H(p,q) = E_p{[-\log{q}]}=H(p)+D_{KL}(p||q) H(p,q)=Ep[−logq]=H(p)+DKL(p∣∣q)
其中, H ( p ) H(p) H(p)是 p p p的熵, D K L ( p ∣ ∣ q ) D_{KL}(p||q) DKL(p∣∣q)是 p p p與 q q q的KL散度(相對熵)。
由
H ( p ) = ∑ x ∈ X p ( x ) ⋅ log ( 1 p ( x ) ) , D K L ( p ∣ ∣ q ) = ∑ x ∈ X p ( x ) ⋅ log p ( x ) q ( x ) H(p)=\sum_{x \in X}p(x)\cdot\log(\frac{1}{p(x)}), D_{KL}(p||q)=\sum_{x \in X}p(x)\cdot\log\frac{p(x)}{q(x)} H(p)=x∈X∑p(x)⋅log(p(x)1),DKL(p∣∣q)=x∈X∑p(x)⋅logq(x)p(x)
對于離散分布 p p p和 q q q,交叉熵定義為:
H ( p , q ) = − ∑ x p ( x ) log q ( x ) H(p,q)=-\sum_x{p(x)\log{q(x)}} H(p,q)=−x∑p(x)logq(x)
參考:
- torch.nn.CrossEntropyLoss
- (wiki)Cross_entropy
- (維基)交叉熵