对于分类问题的交叉熵损失函数:
L
=
1
n
∑
i
=
1
n
(
−
∑
j
=
1
C
y
i
,
j
log
p
i
,
j
)
L=\frac{1}{n}\sum^{n}_{i=1}(-\sum^{C}_{j=1}y_{i,j}\log p_{i,j})
L=n1∑i=1n(−∑j=1Cyi,jlogpi,j)
n为batchSize的大小,C为分类问题中类的数目,
y
i
,
j
y_{i,j}
yi,j为第 i 个样本在第 j 类上的真实标签,
p
i
,
j
p_{i,j}
pi,j为第i个样本对第j类的预测概率
举个例子:
假设是三分类(cat, dog, pig)问题:一共有两个样本x1,x2,分布对应的真实类别为y1=dog,y2=cat. y用one-hot方式表示,即
y
1
y_{1}
y1=[
y
1
,
1
,
y
1
,
2
,
y
1
,
3
y_{1,1}, y_{1,2}, y_{1,3}
y1,1,y1,2,y1,3]=[0,1,0],
y
2
y_{2}
y2=[
y
2
,
1
,
y
2
,
2
,
y
2
,
3
y_{2,1}, y_{2,2}, y_{2,3}
y2,1,y2,2,y2,3]=[1,0,0]
设
p
1
=
(
p
1
,
1
,
p
1
,
2
,
p
1
,
3
)
=
[
0.1
,
0.8
,
0.1
]
p_{1}=(p_{1,1}, p_{1,2}, p_{1,3})=[0.1, 0.8, 0.1]
p1=(p1,1,p1,2,p1,3)=[0.1,0.8,0.1]
p
2
=
(
p
2
,
1
,
p
2
,
2
,
p
2
,
3
)
=
[
0.7
,
0.2
,
0.1
]
p_{2}=(p_{2,1}, p_{2,2}, p_{2,3})=[0.7, 0.2, 0.1]
p2=(p2,1,p2,2,p2,3)=[0.7,0.2,0.1]
则交叉熵为:
L
=
1
2
(
−
1
∗
l
o
g
0.8
−
1
∗
l
o
g
0.7
)
L=\frac{1}{2}(-1*log0.8 - 1*log0.7)
L=21(−1∗log0.8−1∗log0.7)
这里可以看到实际上只有当前样本对应的类计算出来是有值的,因为其他地方都是0。所以,公式可以简化为:
L = 1 n ∑ i = 1 n ( − log p i , Y i ) L=\frac{1}{n}\sum^{n}_{i=1}(-\log p_{i,Y_{i}}) L=n1∑i=1n(−logpi,Yi)
Y
i
Y_{i}
Yi 用来指示第 i 个样本所属的类别,比如例子中的
Y
1
Y_{1}
Y1=2,
Y
2
Y_{2}
Y2=1
p
i
,
Y
i
p_{i,Y_{i}}
pi,Yi表示第 i 个样本在其所属类别上的预测概率
那么交叉熵和softmax function有什么关系呢? 神经网络的输出通常称为 logit(logit是模型的raw outputs, 还没有通过softmax layer. 也就是softmax layer的输入就是logit.) , 也就是全连接层输出的结果,其范围是不确定的, ∈ ( − ∞ , + ∞ ) \in (-\infty,+\infty) ∈(−∞,+∞),而softmax可以将这样的输出转为(0,1)之间,所以将 logit 用softmax转换为概率值就可以用来计算交叉熵
p i , j = e l i , j ∑ k = 1 C e l i , k p_{i,j} = \frac{e^{l_{i,j}}}{\sum_{k=1}^{C}e^{l_{i,k}}} pi,j=∑k=1Celi,keli,j
记 p i , j p_{i,j} pi,j为第 i 个样本属于第j类的预测概率, l i , j {l_{i,j}} li,j为神经网络对第 i 个样本在第 j 类的输出 logit, C为类的数目
logit是模型的raw outputs, 还没有通过softmax layer. 也就是softmax layer的输入就是logit.
L = 1 n ∑ i = 1 n ( − log p i , Y i ) = 1 n ∑ i = 1 n ( − log e l i , j ∑ k = 1 C e l i , k ) L=\frac{1}{n}\sum^{n}_{i=1}(-\log p_{i,Y_{i}})=\frac{1}{n}\sum^{n}_{i=1}(-\log \frac{e^{l_{i,j}}}{\sum_{k=1}^{C}e^{l_{i,k}}}) L=n1i=1∑n(−logpi,Yi)=n1i=1∑n(−log∑k=1Celi,keli,j)