交叉熵(cross entropy)是香农信息论中的一个重要概念,其概念主要来源于KL散度(Kullback-Leibler divergence),又称为相对熵。相对熵的定义如下所示:
其中,P(x)和Q(x)分别为随机变量x的真实分布和预测或者拟合分布。我们将上式中的log函数展开得到如下形式:
通过上式我们发现等式右边第一项由于P(x)为随机变量的真实分布所以第一项为常量恒不变,所以对于相对熵我们只研究其第二项,即交叉熵:
其中n为样本的类别数。
通过相对熵的公式,我们会发现KL(P||Q)的值越小,P(x)和Q(x)的值越接近,即预测分布越接近真实分布,此时训练达到了目标。由于相对熵的第一项为常量,当我们希望KL(P||Q)的值越小时,实际上就可以转化为求解第二项即交叉熵的最小化问题。然而在神经网络中,我们通常以一个batch_size大小的样本集去训练神经网络,此时交叉熵的公式在以上的公式基础之上稍作变化,即此时我们需要求一个batch_size大小的样本数据集的交叉熵的平均值,即
其中m为batch_size的值,即样本数据集的大小。
在tensorflow中的代码如下所示:
cross_entropy=-tf.reduce_mean(tf.reduce_sum(y_*tf.log(tf.clip_by_value(y,1e-10,1.0))))
其中y_为真实分布,tf.clip_by_value()函数可以将y(预测值)的值限定在一定范围内,从而避免出现一些运算错误(例如log0)。以上的y_和y均经过softmax函数处理,即转化为了概率的形式。