天天看點

nn.CrossEntropyLoss總結目錄

nn.CrossEntropyLoss總結

  • 目錄
    • nn.CrossEntropyLoss
    • nn.LogSoftmax
    • nn.NLLLoss
    • Cross entropy

目錄

  • 版本
    • pytorch 1.0

nn.CrossEntropyLoss

  • 依次執行

    nn.LogSoftmax(), nn.NLLLoss()

    兩個操作(不了解可見下面的section)
  • 調用時輸入參數:
    • 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(∑j​exp(x[j])exp(x[class])​)=−x[class]+log(j∑​exp(x[j]))

    該公式計算的是樣本 x x x的預測向量和其真實類别 c l a s s class class的誤差,這裡解釋一下:

    CrossEntropy

    應該是 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=−∑iN​yi​⋅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​)。

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(∑j​exp(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​=−wyn​​xn,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)

參考:

  1. torch.nn.CrossEntropyLoss
  2. (wiki)Cross_entropy
  3. (維基)交叉熵