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