神经网络模型的效果以及优化的目标是通过损失函数(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]越好。交叉熵就是用来判断输出向量和期望向量有多接近的。

python 机器学习分类算法修改损失函数 分类问题的损失函数_TensorFlow代表正确答案,python 机器学习分类算法修改损失函数 分类问题的损失函数_交叉熵_02代表预测值时,交叉熵可表示为:
python 机器学习分类算法修改损失函数 分类问题的损失函数_TensorFlow_03
举个例子,假设某个样例的正确答案时(1,0,0)。

① 当模型预测答案时 (0.5,0.4,0.1) ,那么它们的交叉熵为:
python 机器学习分类算法修改损失函数 分类问题的损失函数_交叉熵_04
② 当模型预测答案时 (0.8,0.1,0.1) ,那么它们的交叉熵为:
python 机器学习分类算法修改损失函数 分类问题的损失函数_TensorFlow_05
很明显,第二个模型预测的结果优于第一个,通过交叉熵得到的结果也是第二个更小,这也说明交叉熵越小代表预测值越接近真实值

通过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回归的神经网络结构图:

python 机器学习分类算法修改损失函数 分类问题的损失函数_Soft_06


假设原始的神经网络输出为 python 机器学习分类算法修改损失函数 分类问题的损失函数_TensorFlow_07,那么经过Softmax回归处理之后的输出为

python 机器学习分类算法修改损失函数 分类问题的损失函数_TensorFlow_08

这样就把神经网络的输出变成了一个概率分布,从而通过交叉熵来计算预测的概率分布和真是答案的概率分布之间的距离了。

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

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

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