量化百科

神经网络经典损失函数以及tensorflow实现

由ypyu创建,最终由ypyu 被浏览 9 用户

神经网络模型的效果以及优化的目标是通过损失函数(loss function)来定义的,本文介绍两个经典的损失函数,分别对应监督学习中的分类问题和回归问题

  1. cross entropy loss function 交叉熵损失函数,对应分类问题
  2. mean squared error 均方误差,对应回归问题

并介绍如何采用Tensorflow中的API进行实现。


cross entropy loss function

通过神经网络解决多分类问题最常用的方法是设置 n 个输出节点,其中 n 表示类别数目,每一个样例通过前向传播都会得到一个 n 维数组作为输出结果,数组中每个维度对应一个类别,代表输入属于该类别的概率。

假设在一次训练过程中,batch size为 m ,类别为 n ,神经网络层数为 L ,输出层结果为 a_j^L,j=1,2,...,n , 训练数据标签为 y_{i,j} 表示第 i 个样本属于第 j 类的概率,那么交叉熵损失函数定义为:

C =- frac{1}{m}sum_{i=1}^{m}{sum_{j=1}^{n}{(y_j ln a_j^L)}} tag{1}

有另一种定义方法如下所示,我们用第一种方法进行说明。

C =- frac{1}{m}sum_{i=1}^{m}{sum_{j=1}^{n}{(y_j ln a_j^L+(1-y_j) ln (1-a_j^L))}} tag{2}

例如某个样例的正确答案是(1,0,0), 模型经过softmax回归之后的预测答案是(0.5, 0.4,0.1), 那么预测答案和正确答案之间的交叉熵为

C = -(1times log0.5 + 0 times log 0.4 + 0 times log 0.1)approx0.3 tag{3}

如果另一个模型预测是(0.8, 0.1, 0.1), 显然预测结果更好,交叉熵也更小,计算得到

C = -(1times log0.8 + 0 times log 0.1 + 0 times log 0.1)approx0.1tag{4}

交叉熵损失函数能够解决在使用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)之间,避免发生计算错误,例如 log 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)

回归问题是对具体数值的预测,比如房价预测、销量预测等等。这些问题需要预测的不是一个实现定义好的类别,而是一个任意实数,因此一般只有一个输出节点,这个节点的输出值就是预测值,最常用的损失函数是均方误差,定义如下

MSE(hat y,y) = frac{sum_{i=1}^{n}{(hat y_i -y_i)^2}}{n}tag{5}

其中 y_i 表示一个batch中第 i 个数据的正确结果,而 hat y_i 表示神经网络的预测结果,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

\

标签

神经网络损失函数TensorFlow函数