机器学习中的损失函数

在人类的发展过程中,通过从过去的错误中学习来不断进步。那么,如果机器也能像人类一样从错误中学习,那将会怎样?在神经网络和人工智能领域,机器尝试找到最佳的预测结果,但如果不与之前的错误进行比较,又如何能够改进呢?这就是反向传播中的损失函数发挥作用的地方。损失函数,也称为误差函数或代价函数,是在数据训练和使用优化器调整权重时机器所犯的错误。通过减少损失,机器可以预测更准确的结果。

损失函数的类型及其在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支持的几乎所有主要损失函数。更多信息,可以查看官方文档。

常见问题解答

损失:它就像模型训练期间的成绩单,显示预测的偏差有多大。目标是尽可能地最小化这个数字。度量:将它们视为额外的分数,如准确率或精确度,在训练后测量。它们告诉模型的表现如何,而不会改变它的学习方式。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485