文章目录
深度学习中的损失函数
在深度学习中,损失函数(loss function)是指用来衡量模型预测结果与实际结果之间差异的函数。模型的目标是最小化损失函数,以此来提高模型的准确性和泛化能力。不同的任务和模型会使用不同的损失函数。
常用的损失函数
下面介绍几个常用的损失函数及其应用场景。
1. 均方误差损失函数(Mean Squared Error,MSE)
均方误差损失函数是最常用的回归问题的损失函数。其定义为预测值与真实值之间的平方差的平均值。
M
S
E
=
1
n
∑
i
=
1
n
(
y
i
−
y
i
^
)
2
MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y_i})^2
MSE=n1i=1∑n(yi−yi^)2
其中
y
i
y_i
yi 是第
i
i
i 个样本的真实值,
y
i
^
\hat{y_i}
yi^ 是第
i
i
i 个样本的预测值,
n
n
n 是样本数量。该损失函数的值越小,表示模型的预测结果越接近真实值。
import tensorflow as tf
mse_loss = tf.keras.losses.MeanSquaredError()
2. 交叉熵损失函数(Cross-Entropy,CE)
交叉熵损失函数是在分类问题中常用的一种损失函数,是用于分类问题中评估模型预测与真实标签之间的差异的常用损失函数。它可以用来量化模型输出的概率分布与真实标签之间的差距,从而让模型能够更好地学习分类任务。
在二分类问题中,假设我们有一个二分类模型,将输入
x
x
x映射到预测值
y
^
\hat{y}
y^。实际标签为
y
=
0
y=0
y=0或
y
=
1
y=1
y=1,我们可以用交叉熵损失函数来衡量模型预测与真实标签之间的差距。二分类交叉熵损失函数的公式为:
C
E
(
y
,
y
^
)
=
−
y
log
(
y
^
)
−
(
1
−
y
)
log
(
1
−
y
^
)
CE(y,\hat{y})=-y\log(\hat{y})-(1-y)\log(1-\hat{y})
CE(y,y^)=−ylog(y^)−(1−y)log(1−y^)
其中,
y
y
y为真实标签,
y
^
\hat{y}
y^是模型对
x
x
x的预测值。当
y
=
0
y=0
y=0时,上式等价于
−
log
(
1
−
y
^
)
-\log(1-\hat{y})
−log(1−y^),当
y
=
1
y=1
y=1时,上式等价于
−
log
(
y
^
)
-\log(\hat{y})
−log(y^)。这个函数的直观解释是,当模型的预测值
y
^
\hat{y}
y^越接近实际标签
y
y
y时,交叉熵损失越小。
对于多分类问题,交叉熵损失函数可以使用softmax函数将模型的预测值转化为概率分布,然后与真实标签之间的差距进行比较。假设有
m
m
m个类别,一个样本的真实标签表示为
y
=
[
y
1
,
y
2
,
.
.
.
,
y
m
]
y=[y_1, y_2, ..., y_m]
y=[y1,y2,...,ym],其中
y
i
=
1
y_i=1
yi=1表示样本属于第
i
i
i个类别,
y
i
=
0
y_i=0
yi=0表示样本不属于第
i
i
i个类别。模型的预测概率分布表示为
y
^
=
[
y
^
1
,
y
^
2
,
.
.
.
,
y
^
m
]
\hat{y}=[\hat{y}_1, \hat{y}_2, ..., \hat{y}_m]
y^=[y^1,y^2,...,y^m],其中
y
^
i
\hat{y}_i
y^i为模型预测样本属于第
i
i
i个类别的概率。则多分类交叉熵损失函数的公式为:
C
E
(
y
,
y
^
)
=
−
∑
i
=
1
m
y
i
log
(
y
^
i
)
CE(y,\hat{y})=-\sum_{i=1}^{m} y_i\log(\hat{y}_i)
CE(y,y^)=−i=1∑myilog(y^i)
与二分类情况相似,当一个样本的真实标签
y
y
y是one-hot编码时,交叉熵损失函数的计算只会依赖于模型对该样本所属类别的预测概率
y
^
\hat{y}
y^。
交叉熵损失函数在深度学习中被广泛应用,尤其是在图像分类、语音识别、自然语言处理等任务中。通常使用梯度下降算法来最小化交叉熵损失函数,以优化模型的参数,提高分类准确率。
import tensorflow as tf
ce_loss = tf.keras.losses.BinaryCrossentropy()
3.对数损失函数(Logarithmic Loss)
与交叉熵损失函数类似,用于二分类问题中衡量模型预测概率分布与真实标签之间的差距。
对数损失函数(Logarithmic Loss)常用于二分类问题中,用于衡量模型预测概率分布与真实标签之间的误差。其定义为:
L
(
y
,
y
^
)
=
−
1
N
∑
i
=
1
N
[
y
i
log
(
y
i
^
)
+
(
1
−
y
i
)
log
(
1
−
y
i
^
)
]
L(y, \hat{y}) = -\frac{1}{N}\sum_{i=1}^{N}[y_i\log(\hat{y_i})+(1-y_i)\log(1-\hat{y_i})]
L(y,y^)=−N1i=1∑N[yilog(yi^)+(1−yi)log(1−yi^)]
其中
y
i
y_i
yi为样本
i
i
i的真实标签,
y
i
^
\hat{y_i}
yi^为样本
i
i
i的预测值,
N
N
N为样本数。
对于二分类问题,真实标签 y i y_i yi仅能是0或1。当 y i = 1 y_i=1 yi=1时,对数损失函数被简化成 log ( y i ^ ) \log(\hat{y_i}) log(yi^);当 y i = 0 y_i=0 yi=0时,对数损失函数被简化成 log ( 1 − y i ^ ) \log(1-\hat{y_i}) log(1−yi^)。这是因为对于正确预测的样本,我们希望模型预测的概率越大越好,即 y i ^ \hat{y_i} yi^越接近1越好;而对于错误预测的样本,我们希望模型预测的概率越小越好,即 y i ^ \hat{y_i} yi^越接近0越好。
对数损失函数通常用于评估二分类模型分类精度。在模型训练中,我们希望最小化对数损失函数,通过梯度下降算法调整模型参数以使得对数损失达到最小值。
对数损失函数的优点是灵活性高,且对状况的惩罚不是直接的二元交叉熵,更能处理某些样本的错误分类,这种错误分类通常较难进行更正。因此,在模型性能较差时,对数损失函数比CE更易于训练。缺点是对异常样本过于敏感,可能会导致模型的过拟合。此时可以采用正则化方法或者其他鲁棒的损失函数。
4.多分类交叉熵(Categorical Cross-Entropy,CCES)损失函数
多分类交叉熵(Categorical Cross-Entropy,CCES)损失函数是用于多分类问题中的常用损失函数。其定义为:
L
(
y
,
y
^
)
=
−
1
N
∑
i
=
1
N
∑
j
=
1
C
y
i
,
j
log
(
y
i
,
j
^
)
L(y, \hat{y}) = -\frac{1}{N}\sum_{i=1}^{N}\sum_{j=1}^{C}y_{i,j}\log(\hat{y_{i,j}})
L(y,y^)=−N1i=1∑Nj=1∑Cyi,jlog(yi,j^)
其中,
y
i
,
j
y_{i,j}
yi,j是第
i
i
i个样本属于第
j
j
j个类别的真实概率,
y
i
,
j
^
\hat{y_{i,j}}
yi,j^是第
i
i
i个样本属于第
j
j
j个类别的模型预测概率值,
N
N
N为样本数量,
C
C
C为类别数量。
对于多分类问题,模型的输出通常表示为一个长度为 C C C的向量,其每个元素对应类别的预测概率,因此我们需要将真实标签 y i , j y_{i,j} yi,j转化为one-hot编码的形式。例如,如果第 i i i个样本属于第 k k k个类别,则其真实标签为 y i , j = 1 y_{i,j}=1 yi,j=1, j = k j=k j=k,其他 y i , j y_{i,j} yi,j为0。
多分类交叉熵损失函数的目标是最小化模型预测概率分布与真实标签之间的距离,以提高分类准确率。与二分类问题类似,对于正确预测的样本,我们希望模型预测的概率越大越好;而对于错误预测的样本,通过对数计算,我们会有深刻的惩罚。
多分类交叉熵损失函数通常用于评估多分类模型性能。在模型训练中,我们希望最小化多分类交叉熵损失函数,通过梯度下降算法调整模型参数以使得多分类交叉熵达到最小值。
多分类交叉熵损失函数的优点是易于最小化和优化,同时该函数跨越多个类别,相比其他损失函数如hinge loss,交叉熵更加灵活,不容易过拟合。不过也需要注意,网络在最后一层需上一个softmax层来进行归一化,并将计算结果映射到[0,1]之间。
5. KL 散度损失函数(Kullback–Leibler Divergence,KLD)
KL 散度损失函数是用来衡量两个概率分布之间的差异的函数。在深度学习中,它通常用于衡量生成模型生成的样本分布与真实分布之间的差异。
KL散度(Kullback-Leibler Divergence,KLD)损失函数是用于衡量两个概率分布之间距离的常用损失函数。在深度学习中,KL散度通常用于模型优化中的正则化项,以鼓励模型产生具有差异性(即相似但不相同)的预测结果。 KL散度的定义为:
D
K
L
(
p
∣
∣
q
)
=
∑
i
p
(
i
)
log
p
(
i
)
q
(
i
)
D_{KL}(p||q) = \sum_{i}p(i)\log\frac{p(i)}{q(i)}
DKL(p∣∣q)=i∑p(i)logq(i)p(i)
其中
p
p
p和
q
q
q是两个离散概率分布。
直观地讲,KL散度用于衡量用于近似 q q q的概率分布 p p p与真实概率分布 q q q之间的差距。在深度学习中,我们通常将 q q q定义为标准分布,例如高斯分布或均匀分布,以鼓励模型对所有预测输出分配相等的概率。
在深度学习中,KL散度通常用于模型的正则化。我们通常希望最小化KL散度来鼓励模型产生准确且稳定的输出,并降低过拟合的风险。KL散度作为正则化项与其他损失函数(例如交叉熵损失函数)一起使用,以优化深度学习模型。
需要注意的是,KL散度不是一个真正的距离度量,它不满足对称性、三角不等式等性质。因此,在深度学习中,我们通常将KL散度作为正则化项或衡量损失的工具,而不是距离度量。
import tensorflow as tf
kld_loss = tf.keras.losses.KLDivergence()
6. Hinge 损失函数
分类Hinge损失函数是一种基于间隔(margin)的损失函数,通常用于多分类问题中。它鼓励模型将正确类别的分数与其他类别的分数分开至少一个固定的边距,当然它也是支持二分类问题。它的定义为:
L
(
y
,
f
(
x
)
)
=
1
n
∑
i
=
1
n
max
(
0
,
1
−
y
i
⋅
f
(
x
i
)
)
L(y, f(x)) = \frac{1}{n}\sum_{i=1}^n\max(0, 1-y_i\cdot f(x_i))
L(y,f(x))=n1i=1∑nmax(0,1−yi⋅f(xi))
在这里,
x
i
x_i
xi是第
i
i
i个样本的特征向量,
y
i
y_i
yi是第
i
i
i个样本的真实标签。
f
(
x
i
)
f(x_i)
f(xi)是模型对第
i
i
i个样本预测的类别得分或概率向量。
n
n
n是总样本数。
此分类Hinge损失函数的目标是最大化正确类别的分数,同时最小化错误类别的预测分数,同时保证正确类别的预测值应该大于其他所有类别的预测值之和,它以这种方式鼓励模型在决策边界附近具有可区分的性质。
分类Hinge损失函数被广泛应用于支持向量机(SVM)中。与SVM相似,分类Hinge损失函数不关心模型的输出值或概率分布,而关注的是模型对正样本和负样本的分离程度。因此,通常在分类Hinge损失函数的最终输出结果之前,需要将其输入到一层softmax层中进行标准化和归一化。
注意,如果使用分类Hinge损失函数进行多分类任务,通常需要将其与softmax加权损失函数组合使用。其中,分类Hinge损失函数鼓励正确分类得分大于错分得分,softmax加权损失函数则鼓励预测概率分布与真实概率分布之间的相似性。
import tensorflow as tf
hinge_loss = tf.keras.losses.Hinge()
总结
本文介绍了深度学习中常用的损失函数及其应用场景。需要根据不同的任务和模型选择合适的损失函数来训练模型。在实际应用中,除了损失函数,还需要考虑优化器、学习率等参数的设置,以及模型的选择、数据的预处理等问题,这些都是深度学习中需要重点关注的问题。