神经网络经典损失函数以及tensorflow实现
由ypyu创建,最终由ypyu 被浏览 9 用户
神经网络模型的效果以及优化的目标是通过损失函数(loss function)来定义的,本文介绍两个经典的损失函数,分别对应监督学习中的分类问题和回归问题
- cross entropy loss function 交叉熵损失函数,对应分类问题
- mean squared error 均方误差,对应回归问题
并介绍如何采用Tensorflow中的API进行实现。
cross entropy loss function
通过神经网络解决多分类问题最常用的方法是设置 个输出节点,其中 表示类别数目,每一个样例通过前向传播都会得到一个 维数组作为输出结果,数组中每个维度对应一个类别,代表输入属于该类别的概率。
假设在一次训练过程中,batch size为 ,类别为 ,神经网络层数为 ,输出层结果为 , 训练数据标签为 表示第 个样本属于第 类的概率,那么交叉熵损失函数定义为:
有另一种定义方法如下所示,我们用第一种方法进行说明。
例如某个样例的正确答案是(1,0,0), 模型经过softmax回归之后的预测答案是(0.5, 0.4,0.1), 那么预测答案和正确答案之间的交叉熵为
如果另一个模型预测是(0.8, 0.1, 0.1), 显然预测结果更好,交叉熵也更小,计算得到
交叉熵损失函数能够解决在使用sigmoid函数时,如果使用二次代价损失函数,那么会产生学习缓慢的情况,这里https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/chap3/c3s1.html进行了详细的论述和推导,我们不再详细说明。
TensorFlow实现交叉熵损失函数代码如下所示
cross_entrophy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
其中y_表示正确结果,y表示预测结果,tf.clip_by_value(y, 1e-10, 1.0) # 表示将y中的值限制在(1e-10, 1.0)之间,避免发生计算错误,例如 是无效运算。
with tf.Session() as sess:
v = tf.constant([[1.0,2.0,3.0],[4.0,5.0,6.0]])
print tf.clip_by_value(v, 2.5, 4.5).eval()
----------------------------------输出结果------------------------------------
[[2.5 2.5 3. ]
[4. 4.5 4.5]]
因为交叉熵一般会与softmax回归一起使用,所以TensorFlow对这两个功能进行了统一封装,并且提供了函数,可以直接通过以下代码来实现使用了softmax回归之后的交叉熵损失函数,其中y代表原始神经网络的输出结果,而y_表示正确结果。
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels = y, logits = y)
均方误差(MSE, mean squared error)
回归问题是对具体数值的预测,比如房价预测、销量预测等等。这些问题需要预测的不是一个实现定义好的类别,而是一个任意实数,因此一般只有一个输出节点,这个节点的输出值就是预测值,最常用的损失函数是均方误差,定义如下
其中 表示一个batch中第 个数据的正确结果,而 表示神经网络的预测结果,TensorFlow实现如下所示:
mse = tf.reduce_mean(tf.square(y_ - y))
其中tf.square 表示对矩阵中的每个元素进行平方得到新矩阵,tf.reduce_mean表示求取矩阵的平均值。
with tf.Session() as sess:
v = tf.constant([[1.0,2.0,3.0],[4.0,5.0,6.0]])
print sess.run(tf.square(v))
print sess.run(tf.reduce_mean(tf.square(v)))
----------------------------------输出结果------------------------------------
[[ 1. 4. 9.]
[16. 25. 36.]]
15.166667
\