用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范数损失是好的,因为它似乎收敛于目标。实现这一点可以使算法在接近目标时更慢地收敛,避免超过最小值。
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)
预测输出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)
Plot of L1 loss
- Pseudo-Huber损失
Pseudo-Huber损失是Huber损失函数的一种变体,它通过靠近目标凸起而对于极值而言不那么陡峭,从而获得L1和L2损失的最佳特性。这种损失取决于额外的参数deltaδ,它决定了函数的陡峭程度。
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)
Pseudo Huber plot
分类损失函数
这些损失用于评估分类值之间的距离。
- 交叉熵损失
交叉熵损失有时被称为逻辑损失函数。当我们预测两个0和1类时,使用二元分类的交叉熵损失。这里我们希望测量从实际类(0或1)到预测值的距离,该预测值通常是0到1之间的实数。
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()
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()
- 加权交叉熵损失
这是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()
- 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]
请记住,这些并不是机器学习中使用的所有损失函数。我只是想为你展示一些常见的。