所谓交叉熵,这篇文章《什么是交叉熵》讲的很明白。设X是预测分布,Y是真实分布,交叉熵H(X, Y)的表达式为:
H
(
X
,
Y
)
=
−
∑
i
Y
[
i
]
log
X
[
i
]
H(X,Y)=-\sum_i Y[i]\log X[i]
H(X,Y)=−i∑Y[i]logX[i]
其中
l
o
g
log
log表示自然对数,以
e
e
e为底数,不是10为底数。
再看到Pytorch Document中对交叉熵损失函数的描述为:
l
o
s
s
(
X
,
c
l
a
s
s
)
=
−
log
(
e
x
p
(
X
[
c
l
a
s
s
]
)
∑
j
e
x
p
(
X
[
j
]
)
)
loss(X, class)=-\log (\frac{exp(X[class])}{\sum_j exp(X[j])})
loss(X,class)=−log(∑jexp(X[j])exp(X[class]))
那么交叉熵
H
(
X
,
Y
)
H(X,Y)
H(X,Y)是怎么到交叉熵损失函数
l
o
s
s
(
X
,
c
l
a
s
s
)
loss(X, class)
loss(X,class)的呢?
首先,一般网络的流程是,将神经网络的输出值X输入
S
o
f
t
m
a
x
Softmax
Softmax后再输入交叉熵损失函数,
S
o
f
t
m
a
x
Softmax
Softmax的表达式如下:
S
o
f
t
m
a
x
(
X
,
i
)
=
e
x
p
(
X
[
i
]
)
∑
j
e
x
p
(
X
[
j
]
)
Softmax(X,i)=\frac{exp(X[i])}{\sum_j exp(X[j])}
Softmax(X,i)=∑jexp(X[j])exp(X[i])
用以训练的标签通常是在正确的那一类标1,其他错误的类全标0,交叉熵损失函数
l
o
s
s
(
X
,
c
l
a
s
s
)
loss(X, class)
loss(X,class)中的
c
l
a
s
s
class
class即表示这个样本的正确分类,也就是
H
(
X
,
Y
)
H(X,Y)
H(X,Y)中的真实分布
Y
Y
Y,即
Y
i
=
c
l
a
s
s
=
1
,
Y
i
≠
c
l
a
s
s
=
0
Y_{i=class}=1,Y_{i\neq class}=0
Yi=class=1,Yi=class=0,所以有
H
(
X
,
Y
)
=
−
∑
i
Y
[
i
]
log
X
[
i
]
=
−
log
X
[
c
l
a
s
s
]
H(X,Y)=-\sum_i Y[i]\log X[i] =-\log X[class]
H(X,Y)=−i∑Y[i]logX[i]=−logX[class]
又有
X
c
l
a
s
s
=
S
o
f
t
m
a
x
(
X
,
c
l
a
s
s
)
X_{class}=Softmax(X,class)
Xclass=Softmax(X,class),所以
H
(
X
,
Y
)
=
−
log
X
[
c
l
a
s
s
]
=
−
log
S
o
f
t
m
a
x
(
X
,
c
l
a
s
s
)
=
−
log
(
e
x
p
(
X
[
c
l
a
s
s
]
)
∑
j
e
x
p
(
X
[
j
]
)
)
=
l
o
s
s
(
X
,
c
l
a
s
s
)
H(X,Y)=-\log X[class]=-\log Softmax(X,class)=-\log (\frac{exp(X[class])}{\sum_j exp(X[j])}) = loss(X,class)
H(X,Y)=−logX[class]=−logSoftmax(X,class)=−log(∑jexp(X[j])exp(X[class]))=loss(X,class)