在深度学习中, 损失函数是⽤来衡量模型参数的质量的函数, 衡量的⽅式是 ⽐较⽹络输出和真实输出的差异,损失函数在不同的⽂献中名称是不⼀样 的,主要有以下⼏种命名⽅式:
在深度学习的分类任务中使⽤最多的是交叉熵损失函数,所以在这⾥我们 着重介绍这种损失函数。
在多分类任务通常使⽤softmax将logits转换为概率的形式,所以多分类的 交叉熵损失也叫做softmax损失,它的计算⽅法是:
其中,y是样本x属于某⼀个类别的真实概率,⽽f(x)是样本属于某⼀类别 的预测分数,S是softmax函数,L⽤来衡量p,q之间差异性的损失结果。 例⼦:
上图中的交叉熵损失为:
从概率⻆度理解,我们的⽬的是最⼩化正确类别所对应的预测概率的对数 的负值,如下图所示:
在tf.keras中使⽤CategoricalCrossentropy实现,如下所示:
# 导⼊相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0, 1, 0], [0, 0, 1]]
y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]
# 实例化交叉熵损失
cce = tf.keras.losses.CategoricalCrossentropy()
# 计算损失结果
cce(y_true, y_pred)
结果为:
1.176939
在处理⼆分类任务时,我们不在使⽤softmax激活函数,⽽是使⽤sigmoid 激活函数,那损失函数也相应的进⾏调整,使⽤⼆分类的交叉熵损失函 数:
其中,y是样本x属于某⼀个类别的真实概率,⽽y^是样本属于某⼀类别的 预测概率,L⽤来衡量真实值与预测值之间差异性的损失结果。
在tf.keras中实现时使⽤BinaryCrossentropy(),如下所示:
# 导⼊相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0], [1]]
y_pred = [[0.4], [0.6]]
# 实例化⼆分类交叉熵损失
bce = tf.keras.losses.BinaryCrossentropy()
# 计算损失结果
bce(y_true, y_pred)
结果为:
0.5108254
回归任务中常⽤的损失函数有以下⼏种:
Mean absolute loss(MAE)也被称为L1 Loss,是以绝对误差作为距离:
曲线如下图所示:
特点是:由于L1 loss具有稀疏性,为了惩罚较⼤的值,因此常常将其作为 正则项添加到其他loss中作为约束。L1 loss的最⼤问题是梯度在零点不平 滑,导致会跳过极⼩值。
在tf.keras中使⽤MeanAbsoluteError实现,如下所示:
# 导⼊相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0.], [0.]]
y_pred = [[1.], [1.]]
# 实例化MAE损失
mae = tf.keras.losses.MeanAbsoluteError()
# 计算损失结果
mae(y_true, y_pred)
结果为:
1.0
Mean Squared Loss/ Quadratic Loss(MSE loss)也被称为L2 loss,或欧 ⽒距离,它以误差的平⽅和作为距离:
特点是:L2 loss也常常作为正则项。当预测值与⽬标值相差很⼤时, 梯度 容易爆炸。
在tf.keras中通过MeanSquaredError实现:
# 导⼊相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0.], [1.]]
y_pred = [[1.], [1.]]
# 实例化MSE损失
mse = tf.keras.losses.MeanSquaredError()
# 计算损失结果
mse(y_true, y_pred)
结果为:
0.5
损失 Smooth L1损失函数如下式所示:
其中:=f(x)−y 为真实值和预测值的差值。
从上图中可以看出,该函数实际上就是⼀个分段函数,在[-1,1]之间实际 上就是L2损失,这样解决了L1的不光滑问题,在[-1,1]区间外,实际上就 是L1损失,这样就解决了离群点梯度爆炸的问题。通常在⽬标检测中使⽤ 该损失函数。
在tf.keras中使⽤Huber计算该损失,如下所示:
# 导⼊相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0], [1]]
y_pred = [[0.6], [0.4]]
# 实例化smooth L1损失
h = tf.keras.losses.Huber()
# 计算损失结果
h(y_true, y_pred)
结果:
0.18
知道分类任务的损失函数
多分类的交叉熵损失函数和⼆分类的交叉熵损失函数。
知道回归任务的损失函数
MAE,MSE,smooth L1损失函数。