【深度学习】分类问题损失函数——交叉熵

神经网络模型的效果以及优化的目标是通过损失函数(loss function)来定义的。下面主要介绍适用于分类问题回归问题的经典损失函数,并通过TensoFlow实现这些损失函数。

回顾问题请参考:【回归问题损失函数——均方误差】

本文主要介绍分类问题下的损失函数——交叉熵,如何与softmax回归搭配使用,和它们的使用方法,以及如何用TensorFlow实现。

1 交叉熵

评判输出向量和期望向量接近程度的常用方法就是交叉熵(cross entropy),它刻画了两个概率分布之间的距离,是分类问题中常用的评判方法之一。

举个栗子,通过神经网络解决分类分类问题最常用的方法是设置n个输出节点,其中n为类别的个数。对于每一个样例,神经网可以得到的一个n维数组作为输出结果。数组中的每一个维度(也就是每一个输出节点)对应一个类别的概率。

理想情况下,如果一个样本属于类别k,那么这个类别所对应的输出节点的输出值应该为1,而其他节点为0。以识别数字0~9中的1为例,神经网络模型输出结果越接近[0,1,0,0,0,0,0,0,0,0]越好。交叉熵就是用来判断输出向量和期望向量有多接近的。

p p p代表正确答案, q q q代表预测值时,交叉熵可表示为:
H ( p , q ) = − ∑ x p ( x ) l o g ( q ( x ) ) H(p,q)=-\sum_xp(x)log (q(x)) H(p,q)=xp(x)log(q(x))
举个例子,假设某个样例的正确答案时(1,0,0)。

① 当模型预测答案时 (0.5,0.4,0.1) ,那么它们的交叉熵为:
H ( ( 1 , 0 , 0 ) , ( 0.5 , 0.4 , 0.1 ) ) = − ( 1 × l o g 0.5 + 0 × l o g 0.4 + 0 × l o g 0.1 ) ≈ 0.3 H\Big((1,0,0),(0.5,0.4,0.1)\Big)=-(1\times log0.5+0\times log0.4+0\times log0.1)\approx0.3 H((1,0,0),(0.5,0.4,0.1))=(1×log0.5+0×log0.4+0×log0.1)0.3
② 当模型预测答案时 (0.8,0.1,0.1) ,那么它们的交叉熵为:
H ( ( 1 , 0 , 0 ) , ( 0.8 , 0.1 , 0.1 ) ) = − ( 1 × l o g 0.8 + 0 × l o g 0.1 + 0 × l o g 0.1 ) ≈ 0.1 H\Big((1,0,0),(0.8,0.1,0.1)\Big)=-(1\times log0.8+0\times log0.1+0\times log0.1)\approx0.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, 0.1, 1.0)))

函数解释如下:
tf.reduce_mean:所有元素的均值。【详细参考】
tf.log:对张量内所有元素依次求对数。
tf.clip_by_value(y, 1e-10, 1.0):将y的数值限定在0.1到1之间,也就是说当y<0.1时,y=0.1;当y>1时,y=1。

2 Softmax回归

之后我们还需考虑一个问题,什么样的模型会输出 (0.5,0.4,0.3) 这杨的概率分布呢?这就要提到Softmax回归啦。

Softmax将原始输出成的输出转换成如上面的概率分布,下图展示了加上Softmax回归的神经网络结构图:
在这里插入图片描述
假设原始的神经网络输出为 y 1 , y 2 , y 3 , . . . , y n y_1, y_2, y_3, ..., y_n y1,y2,y3,...,yn,那么经过Softmax回归处理之后的输出为
S o f t m a x ( y ) i = y ′ = e y i ∑ j = 1 n e y i Softmax(y)_i=y'=\frac{e^{yi}}{\sum_{j=1}^ne^{yi}} Softmax(y)i=y=j=1neyieyi
这样就把神经网络的输出变成了一个概率分布,从而通过交叉熵来计算预测的概率分布和真是答案的概率分布之间的距离了。

因为交叉熵一般会与softmax回归一起使用,所有TensorFlow将这两个功能封装在一起,并提供tf.nn.softmax_cross_entropy_with_logits,这样通过一个命令就可以得到使用Softmax回归之后的交叉熵。
代码实现如下:

tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)

其中,y代表原神经网络的输出结果,y_给出了标准答案。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望天边星宿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值