交叉熵刻画了两个概率分布之间的距离,他是分类问题中使用比较广泛的损失函数。
给定两个概率分布p和q,用q来表示p的交叉熵为:
在多分类问题中,p是真实答案的概率分布,q是预测出的答案的概率分布。举一个例子,理解交叉熵计算过程:
假设有一个三分类问题,某个样例的正确答案是(1,0,0)。某模型经过softmax回归之后的预测答案是(0.5,0.4,0.1),那么这个预测和正确答案之间的交叉熵为:H((1,0,0),(0.5,0.4,0.1))=-(1*log0.5+0*log0.4+0*log0.1)≈0.3
另一个模型softmax预测答案是(0.8,0.1,0.1),那么这个预测值和真实值之间的交叉熵是:H((1,0,0),(0.8,0.1,0.1))=-(1*log0.8+0*log0.1+0*log0.1)≈0.1
从直观上就可以容易地知道第二个预测答案是要优于第一个的。通过交叉熵计算得到的结果也是一致的(第二个交叉熵的值更小)。
Tensorflow中交叉熵代码形式是:
cross_entropy=-tf.reduce_mean( y_真实值*tf.log(tf.clip_by_value(y_预测值,1e-10,1.0)))
tf.clip_by_value(t, clip_value_min, clip_value_max, name=None)
基于定义的min与max对tesor数据进行截断操作,目的是为了应对梯度爆发或者梯度消失的情况。tensor_value>max,则tensor_value=max。 tensor_value<min,则tensor_value=min。
交叉熵损失函数也可以直接调用tf.nn.softmax_cross_entropy_with_logits(y_预测值,y_真实值)函数。
参考文章: