给定两个概率分布p和q,通过q来表示p的交叉熵为:
H ( p , q ) = − ∑ x p ( x ) l o g q ( x ) \LARGE H(p,q)=-\sum_{x}p(x)logq(x) H(p,q)=−∑xp(x)logq(x)
交叉熵刻画的是两个概率分布之间的距离,或可以说它刻画的是通过概率分布q来表达概率分布p的困难程度,p代表正确答案,q代表的是预测值,交叉熵越小,两个概率的分布约接近。
在神经网络中通常使用 Softmax 回归把前向传播得到的结果变成概率分布,所以交叉熵经常和 softmax 一起使用。
且在逻辑回归中,平方损失函数为非凸函数,交叉熵损失函数为凸函数。(只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解)
import numpy as np
def cross_entropy(p, q):
return -np.sum(p * np.log(q))
if __name__ == '__main__':
print(cross_entropy([1, 0, 0], [0.5, 0.4, 0.1]))
print(cross_entropy([1, 0, 0], [0.8, 0.1, 0.1]))
print(cross_entropy([1, 0, 0], [0.9, 0.05, 0.05]))
print(cross_entropy([1, 0, 0], [0.99, 0.005, 0.005]))
print(cross_entropy([1, 0, 0], [0.99999, 0.000005, 0.000005]))
# 0.3010299956639812
# 0.09691001300805639
# 0.045757490560675115
# 0.004364805402450088
# 4.342966533881614e-06
注:正确概率 p 一般是 one-hot 向量,而预测概率 q 经过 softmax 之后没有零值,因为 log0 无意义。