用Tensorflow进行深度学习的一些损失函数的可视化

cckchina 2018-07-18

用Tensorflow进行深度学习的一些损失函数的可视化

TensorFlow目前是数值计算的最佳开源库,它使机器学习更快更容易。在这篇文章中,您将学习机器学习中使用的一些损失函数。

损失函数在机器学习领域非常重要。它们用作测量模型预测输出Y_out与ground truth标签Y之间的距离或差异的方法,以有效地训练我们的模型。

下面是一些重要的Loss函数,它们都是使用Tensorflow库实现的。

为了了解不同的损失函数如何执行,我们将使用Matplotlib(python绘图库)对它们进行可视化。

# Import libraries

import matplotlib.pyplot as plt

import tensorflow as tf

#Start a tensorflow session

sess = tf.Session()

# Create our sample data from a line space

Y_pred = tf.linspace(-1., 1., 500)

#Create our target as a zero constant tensor

Y_truth = tf.constant(0.)

注意:我们创建自己的样本数据,仅用于可视化。在实践中,您使用了真实世界的数据和标签。

回归算法的损失函数

回归算法只是将连续数预测为输出的算法。即输出没有有限的范围。

  • L2范数损失/欧几里德损失函数

这就是预测值与真实值之间的差/距离的平方。L2范数损失是好的,因为它似乎收敛于目标。实现这一点可以使算法在接近目标时更慢地收敛,避免超过最小值。

用Tensorflow进行深度学习的一些损失函数的可视化

L2 loss function

#Calculating the L2 loss

val = tf.square(Y_truth - Y_pred)

L2_val = sess.run(val)

#ploting the predicted values against the L2 loss

Y_array = sess.run(Y_pred)

plt.plot(Y_array, L2_val, 'b-', label='L2 loss' )

plt.title('L2 loss')

plt.xlabel('$Y_{pred}$', fontsize=15)

plt.ylabel('$Y_{true}$', fontsize=15)

用Tensorflow进行深度学习的一些损失函数的可视化

预测输出Y_pred与ground truth Y的关系图

注意:Tensorflow具有L2损失的内置韩式 tf.nn.l2_loss()。但Tensorflow的L2函数将结果除以2

  • L1范数损失/绝对损失函数

L1的损失和L2的损失是一样的但是我们不是取距离的平方,而是取绝对值。L1的损失在检测离群值时比L2范数更好,因为对于非常大的值来说它不是很陡。需要注意的主要一点是,当接近目标/最小值时,L1损失不是平滑的,这可能导致算法不收敛。

#Computing L1 loss with the same values

temp = tf.abs(Y_truth - Y_pred)

L1_val = sess.run(temp)

#ploting the predicted values against the L2 loss

Y_array = sess.run(Y_pred)

plt.plot(Y_array, L1_val, 'r-' )

plt.title('L1 loss')

plt.xlabel('$Y_{pred}$', fontsize=15)

plt.ylabel('$Y_{true}$', fontsize=15)

用Tensorflow进行深度学习的一些损失函数的可视化

Plot of L1 loss

  • Pseudo-Huber损失

Pseudo-Huber损失是Huber损失函数的一种变体,它通过靠近目标凸起而对于极值而言不那么陡峭,从而获得L1和L2损失的最佳特性。这种损失取决于额外的参数deltaδ,它决定了函数的陡峭程度。

用Tensorflow进行深度学习的一些损失函数的可视化

Pseudo Huber loss

其中a =(Y - Y _pred)

#Plot of the Pseudo-Huber loss

delta = tf.constant(0.24)

temp_ph = tf.multiply(tf.square(delta),tf.sqrt(1. + tf.square((Y_truth - Y_pred) / delta)) - 1. )

pseudo_h_vals = sess.run(temp_ph)

#ploting the predicted values against the L2 loss

Y_array = sess.run(Y_pred)

plt.plot(Y_array, pseudo_h_vals, 'g-' )

plt.title('Pseudo Huber loss')

plt.xlabel('$Y_{pred}$', fontsize=15)

plt.ylabel('$Y_{true}$', fontsize=15)

用Tensorflow进行深度学习的一些损失函数的可视化

Pseudo Huber plot

分类损失函数

这些损失用于评估分类值之间的距离。

  • 交叉熵损失

交叉熵损失有时被称为逻辑损失函数。当我们预测两个0和1类时,使用二元分类的交叉熵损失。这里我们希望测量从实际类(0或1)到预测值的距离,该预测值通常是0到1之间的实数。

用Tensorflow进行深度学习的一些损失函数的可视化

cross entriopy loss

#Redefining our data

Y_pred = tf.linspace(-4., 6., 500)

Y_label = tf.constant(1.)

Y_labels = tf.fill([500], 1.)

#applying sigmoid

x_entropy_vals = - tf.multiply(Y_label, tf.log(Y_pred)) - tf.multiply((1. - Y_label), tf.log(1. - Y_pred))

x_entropy_loss = sess.run(x_entropy_vals)

#ploting the predicted values against the cross entropy loss

Y_array = sess.run(Y_pred)

plt.plot(Y_array, x_entropy_loss, 'r-' )

plt.title('Cross entropy loss')

plt.xlabel('$Y_{pred}$', fontsize=15)

plt.ylabel('$Y_{label}$', fontsize=15)

plt.ylim(-2, 5)

plt.show()

用Tensorflow进行深度学习的一些损失函数的可视化

Cross entropy loss

  • Sigmoid交叉熵损失

这与交叉熵损失函数非常相似,除了我们在应用交叉熵损失之前通过sigmoid函数转换x值。

我们将使用下面的tensorflow函数,其中 Logits 是我们想要应用 sigmoid函数 的张量。这通常是我们模型的预测值,而标签是ground truth值。

tf.nn.sigmoid_cross_entropy_with_logits(

_sentinel=None,

labels=None,

logits=None,

name=None

)

x_entropy_sigmoid_vals = tf.nn.sigmoid_cross_entropy_with_logits(labels= Y_labels, logits=Y_pred)

x_entropy_sigmoid_out = sess.run(x_entropy_sigmoid_vals)

#ploting the predicted values against the Sigmoid cross entropy loss

Y_array = sess.run(Y_pred)

plt.plot(Y_array, x_entropy_sigmoid_out, 'y-' )

plt.title('Sigmoid cross entropy loss')

plt.xlabel('$Y_{pred}$', fontsize=15)

plt.ylabel('$Y_{label}$', fontsize=15)

plt.ylim(-2, 5)

plt.show()

用Tensorflow进行深度学习的一些损失函数的可视化

  • 加权交叉熵损失

这是S形交叉熵损失的加权版本。在这里,我们提供积极目标的权重。即,我们指定的重量越高,正值的峰值越高。这可用于控制异常值以进行正面预测。

我们再次使用内置的Tensorflow函数来可视化

tf.nn.weighted_cross_entropy_with_logits(

targets,

logits,

pos_weight,

name = None

我们将对两个不同权重的图进行可视化,以向您展示权重如何控制峰值为正值。

#comparing two weights

weight = tf.constant(1.)

x_entropy_weighted_vals = tf.nn.weighted_cross_entropy_with_logits(targets=Y_labels, logits=Y_pred, pos_weight=weight)

x_entropy_weighted_out = sess.run(x_entropy_weighted_vals)

weight2 = tf.constant(0.5)

x_entropy_weighted_val_2 = tf.nn.weighted_cross_entropy_with_logits(targets=Y_labels, logits=Y_pred, pos_weight=weight2)

x_entropy_weighted_out_2 = sess.run(x_entropy_weighted_val_2)

#ploting the predicted values against the Sigmoid cross entropy loss

Y_array = sess.run(Y_pred)

plt.plot(Y_array, x_entropy_weighted_out, 'b-', label=' weight = 1.0' )

plt.plot(Y_array, x_entropy_weighted_out_2, 'r--', label='weight = 0.5' )

plt.title('Weighted cross entropy loss')

plt.legend(loc=4)

plt.xlabel('$Y_{pred}$', fontsize=15)

plt.ylabel('$Y_{label}$', fontsize=15)

plt.ylim(-2, 5)

plt.show()

用Tensorflow进行深度学习的一些损失函数的可视化

  • Softmax交叉熵损失

当只有一个目标类别而不是多个目标类别时,此损失用于衡量损失。因此,该函数首先使用softmax函数将输出转换为概率分布,所有概率分布总和为1,然后根据真实概率分布计算损失函数。

y_pred_dist = tf.constant([[1., -3., 10.]])

target_dist = tf.constant([[0.1, 0.02, 0.88]])

softmax_xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=target_dist, logits=y_pred_dist)

print(sess.run(softmax_xentropy))

Output: [1.1601256]

  • 稀疏softmax交叉熵

这一损失与前一项相同,除了目标是概率分布,它是哪个类别为真的索引。我们只传递哪个类别为真值的索引,而不是一个值为1的稀疏全零目标向量,如下所示:

y_pred = tf.constant([[1., -3., 10.]])

sparse_target_dist = tf.constant([2]) #true value is in the second position of the sparse tensor

sparse_x_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels= sparse_target_dist, logits=y_pred)

print(sess.run(sparse_x_entropy))

Output: [0.00012564]

请记住,这些并不是机器学习中使用的所有损失函数。我只是想为你展示一些常见的。

相关推荐