TensorFlow 损失函数

对于分类问题,我们一般用交叉熵来测算计算值与真实的差距。

交叉熵表现的是两个概率分布之间的差距。差距越大,交叉熵越大;差距越小,交叉熵越小。

这么说还是有点抽象。打个比方:

一个分类问题,正确答案是(1,0,0)。

一个预测模型经过softmax回归后给出的答案是

(0.5,0.4,0.4)

那么与真实值的交叉熵为:

H((1,0,0),(0.5,0.4,0.5))=-(1*log0.5+0*log0.4+0*log0.4)~0.3

另一个预测模型给出的答案是:

(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)))

通常,交叉熵与softmax回归一起使用,TensorFlow对这两个功能进行了统一的封装:

cross_entropy = tf.nn.softmax_cross_etnropy_withlogits(y,y_)

在只有一个正确答案的分类中TensorFlow提供了更加一个函数:

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))

对于回归问题,我们要做一个预测值,最后的结果要输出一个任意实数,整个神经网络只有一个输出点。

这种情况,我么计算损失函数是均方差。也就是真实值与预测值的方差平均数。代码如下:

mse = tf.reduce_mean(tf.square(y_- y))