在人类的发展过程中,通过从过去的错误中学习来不断进步。那么,如果机器也能像人类一样从错误中学习,那将会怎样?在神经网络和人工智能领域,机器尝试找到最佳的预测结果,但如果不与之前的错误进行比较,又如何能够改进呢?这就是反向传播中的损失函数发挥作用的地方。损失函数,也称为误差函数或代价函数,是在数据训练和使用优化器调整权重时机器所犯的错误。通过减少损失,机器可以预测更准确的结果。
损失函数的类型及其在Python中的实现
以下是一些常见的损失函数及其在TensorFlow API中的实现。在TensorFlow中,大多数损失函数都可以在tensorflow.keras.losses
中找到。
二元交叉熵用于计算真实标签和预测输出之间的交叉熵。它用于二分类问题,例如猫和狗的分类。以下是二元交叉熵损失计算的示例:
import tensorflow as tf
# 真实标签
y_true = [[0.,1.],
[0.,0.]]
y_pred = [[0.5,0.4],
[0.6,0.3]]
binary_cross_entropy = tf.keras.losses.BinaryCrossentropy()
binary_cross_entropy(y_true=y_true,y_pred=y_pred).numpy()
分类交叉熵损失函数用于计算真实标签和预测标签之间的损失。它主要用于多分类问题。例如,动物图像分类,如猫、狗、大象、马和人类。以下是分类交叉熵损失的计算方法:
# 真实标签
y_true = [[0, 1, 0], [0, 0, 1]]
y_pred = [[0.05, 0.95, 0.56], [0.1, 0.4, 0.1]]
categorical_cross_entropy = tf.keras.losses.CategoricalCrossentropy()
categorical_cross_entropy(y_true=y_true,y_pred=y_pred).numpy()
当分类任务中存在两个或更多类别时,使用稀疏分类交叉熵损失。与分类交叉熵相比,稀疏分类交叉熵的一个微小区别在于,稀疏分类交叉熵的标签预期为整数。以下是稀疏分类交叉熵损失的实现:
# 真实标签
y_true = [1, 2]
# 预测标签
y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
# 实现稀疏分类交叉熵
tf.keras.losses.sparse_categorical_crossentropy(y_true,y_pred).numpy()
泊松损失是张量元素的平均值。可以这样计算泊松损失:
# 真实标签
y_true = [[0., 1.], [0., 0.]]
# 预测标签
y_pred = [[1., 1.], [1., 0.]]
# 使用‘auto’/’sum_over_batch_size
p = tf.keras.losses.Poisson()
p(y_true, y_pred).numpy()
也称为KL散度,通过计算每个事件P的概率的负和,然后乘以事件概率的对数来计算。以下是TensorFlow中KL散度损失的实现:
# 真实标签
y_true = [[0, 1], [0, 0]]
# 预测标签
y_pred = [[0.7, 0.8], [0.4, 0.8]]
# KL散度损失
kl = tf.keras.losses.KLDivergence()
kl(y_true, y_pred).numpy()
MSE告诉回归线与预测点有多接近。这是通过取点到回归线的距离并平方它们来完成的。平方是必须的,以便消除负号问题。以下是TensorFlow中MSE的实现:
# 真实标签
y_true = [[10., 10.], [0., 0.]]
# 预测标签
y_pred = [[10., 10.], [1., 0.]]
# 均方误差损失
mse = tf.keras.losses.MeanSquaredError()
mse(y_true, y_pred).numpy()
MAE通过取点到回归线的距离来计算。MAE对异常值更敏感。因此,在不包含异常值的数据上使用MAE之前,请确认数据中不包含异常值。以下是TensorFlow中MAE的实现:
# 真实标签
y_true = [[10., 20.], [30., 40.]]
# 预测标签
y_pred = [[10., 20.], [30., 0.]]
mae = tf.keras.losses.MeanAbsoluteError()
mae(y_true, y_pred).numpy()
余弦相似度是两个非零向量之间相似度的度量。这个损失函数计算标签和预测之间的余弦相似度。它只是一个介于1和-1之间的数字。当它是一个介于-1和0之间的负数时,0表示正交性,值越接近-1表示相似度越大。以下是TensorFlow中余弦相似度的实现:
# 真实标签
y_true = [[10., 20.], [30., 40.]]
# 预测标签
y_pred = [[10., 20.], [30., 0.]]
cosine_loss = tf.keras.losses.CosineSimilarity(axis=1)
cosine_loss(y_true, y_pred).numpy()
Huber损失函数对于小值是二次的,对于大值是线性的。对于X的每个值,误差=y_true-y_pred。损失=0.5 * X^2 如果 |X| <= d。损失=0.5 * d^2 + d (|X| – d) 如果 |X| > d。以下是TensorFlow中Huber损失的实现:
# 真实标签
y_true = [[10., 20.], [30., 40.]]
# 预测标签
y_pred = [[10., 20.], [30., 0.]]
hub_loss = tf.keras.losses.Huber()
hub_loss(y_true, y_pred).numpy()
LogCosh损失计算预测误差的双曲余弦的对数。以下是TensorFlow中LogCosh损失的实现:
# 真实标签
y_true = [[0., 1.], [0., 0.]]
# 预测标签
y_pred = [[1., 1.], [1., 0.]]
l = tf.keras.losses.LogCosh()
l(y_true, y_pred).numpy()
Hinge损失主要用于最大边际问题,尤其是支持向量机。在Hinge损失中,值预期为-1或1。在二元情况下,即0或1,它将被转换为-1和1。以下是TensorFlow中Hinge损失的实现:
# 真实标签
y_true = [[0., 1.], [0., 0.]]
# 预测标签
y_pred = [[0.5, 0.4], [0.4, 0.5]]
h_loss = tf.keras.losses.Hinge()
h_loss(y_true, y_pred).numpy()
平方Hinge损失是Hinge损失的平方。以下是TensorFlow中平方Hinge损失的实现:
# 真实标签
y_true = [[0., 1.], [0., 0.]]
# 预测标签
y_pred = [[0.5, 0.4], [0.4, 0.5]]
h = tf.keras.losses.SquaredHinge()
h(y_true, y_pred).numpy()
它计算y_true和y_pred标签之间的分类Hinge损失。以下是TensorFlow中分类Hinge损失的实现:
# 真实标签
y_true = [[0., 1.], [0., 0.]]
# 预测标签
y_pred = [[0.5, 0.4], [0.4, 0.5]]
h = tf.keras.losses.CategoricalHinge()
h(y_true, y_pred).numpy()
已经讨论了TensorFlow API支持的几乎所有主要损失函数。更多信息,可以查看官方文档。
常见问题解答
损失:它就像模型训练期间的成绩单,显示预测的偏差有多大。目标是尽可能地最小化这个数字。度量:将它们视为额外的分数,如准确率或精确度,在训练后测量。它们告诉模型的表现如何,而不会改变它的学习方式。