天天看点

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. (维基)交叉熵