首先看几个定义:
- 损失函数
用于定义单个训练样本(的预测值)与真实值之间的误差 - 代价函数
用于定义单个批次或者整个训练集样本(的预测值)与真实值之间的误差 - 目标函数
泛指任意可以被优化的函数
在机器学习中,损失函数是代价函数的一部分,而代价函数是目标函数的一种类型。
损失函数大致可以分为两类:1)回归损失;2)分类损失。各损失函数有各自的优缺点,没有最好的损失函数,只有最合适的损失函数。
回归损失
L1损失
也称为平均绝对误差(Mean Absolute Error, MAE),该损失衡量的是预测值和真实值之间距离的平均误差,计算方式如下:
$MAE =\frac{1}{n} \sum_{i=1}^{n}|y_{truth}^{i}-y_{pred}^{i}|$
该损失函数的优点:
- 无论对于怎样的输入,都有稳定的梯度(1或者-1),不会导致梯度爆炸等问题
- 鲁棒性比较强,对于异常点不太敏感(相对于L2损失将异常值的误差放大)
该损失函数的缺点:
- 在中心点不能求导,不方便求解
- 由于稳定的梯度,在训练后期如果不改变学习率,损失函数会在稳定值的附近发生持续震荡难以收敛
L2损失
也称为均方差(Mean Squared Error, MSE),该损失衡量预测值和真实值之间距离的平方和,计算方式如下:
$MSE =\frac{1}{n} \sum_{i=1}^{n}(y_{truth}^{i}-y_{pred}^{i})^2$
该损失函数的优点:
- 各点连续光滑,求导方便
- 稳定性强,当添加新数据时L2损失的整体变动要比L1损失要小得多
- 对异常值敏感,当异常值对研究很重要时,该损失函数不失为好选择
该损失函数的缺点:
- 离最低点越远,梯度越大,使用梯度下降法求解时可能会导致梯度爆炸
- 离最低点越近,梯度越小,这会造成训练速度变慢
- 对异常值敏感,梯度更新的方向很容易受离群点影响,不具备鲁棒性(当异常值对研究不那么重要时,这就成缺点了)
Smooth L1损失
该损失函数是对L1损失和L2损失的折中,对个单个样本来说,其计算方式如下:
其中$x=y_{truth}-y_{pred}$。具体来说早期训练时采用L1损失,梯度稳定,快速收敛;训练后期使用L2损失,逐渐收敛到最优解。
该损失函数的优点:
- 相比于L1损失函数,可以收敛更快
- 相比于L2损失函数,对离群点、异常值不敏感,梯度变化相对更小,训练更加稳定
分类损失
交叉熵损失
熵
熵的概念首次被香农提出,目的是寻找一种高效、无损的编码信息的方法。以编码后数据的平均长度来衡量高效性,平均长度越短越高效;编码后不能有原始信息的丢失,即为无损。所以熵就是无损编码事件信息的最小平均编码长度。
对于具有$N$种等可能性状态的信息来说,每种状态的可能性是$\frac{1}{N}$,编码该信息所需要的最小编码长度是:$log_{2}N=-log_{2}\frac{1}{N}=-log_{2}P$。那么对于通用的概率分布来说,计算最小平均编码长度,也就是熵的公式可以泛化为:$Entropy=-\sum_{i}P(i)log_{2}P(i)$。当我们知道任何事件的概率分布时,都可以计算它的熵。
一般来说,对高可能性事件采用短编码,对低可能性事件采用长编码,得到的平均编码长度会比较短。
如果熵比较大,说明平均编码长度比较长,这意味着这一信息有比较多的可能状态,相应的每个状态的可能性比较低,因此每当来一个新的信息,我们很难对其作出准确预测,即有比较大的混乱程度/不确定性/不可预测性。
交叉熵
当我们知道了事件的概率分布时,我们可以计算它的熵;如果我们不知道事件的概率分布,又想计算熵,就需要做一个估计。
假设真实的概率分布是$P$,估计的概率分布是$Q$,使用$P$计算平均编码长度,实际编码长度基于$Q$计算,这个计算结果就是$P$和$Q$的交叉熵。如此,实际编码长度和理论最小编码长度就有了对比的意义。
【注】假设交叉熵用$H(P,Q)$表示,那么在大多数情况下$H(P,Q)!=H(Q,P)$。且由于熵是理论上的最小平均编码长度,所以$H(P,Q)>=H(P)$。
对于分类任务来说,假设用one-hot编码作为标签,那么每个样本都有100%的确定度。如果有5个类别,某样本的真实标签为[1,0,0,0,0]
,而预测标签为[0.4,0.3,0.05,0.05,0.2]
,那么两者的交叉熵为$-(1log(0.4) + 0log(0.3) + 0log(0.05) + 0log(0.05) + 0log(0.2)) \approx 0.916$。随着预测越来越准确,交叉熵的值会越来越小,如果预测完全正确,那么交叉熵的值就为0。因此,训练分类模型时,可以使用交叉熵作为损失函数。此外,我们也可以看到交叉熵的损失*只取决于被正确分类的概率,因为对于真实标签的概率分布来说其它类别的概率都是0。
交叉熵损失
在二分类模型中,标签只有是和否两种,此时,可以使用二分类交叉熵作为损失函数。计算公式如下:
由于是二分类,所以$P(yes)+P(no)=1$且$Q(yes)+Q(no)=1$,所以二分类交叉熵损失可以变成:
需要说明的是,模型并不会直接预测各类别的概率,而是首先计算各类别的得分,再由softmax
(或者sigmoid
)转换为概率分布。
该损失函数的优点:
- 采用类间竞争机制,比较擅长学习类与类之间的信息
- 具有凸函数的性质,使得优化算法(如梯度下降)可以更容易地找到全局最优解,避免陷入局部最优解
- 模型预测效果和偏导值负相关,即模型效果越差偏导值越大,所以在模型效果差的时候收敛速度快,模型效果好的时候更新速度慢
该损失函数的缺点:
- 只关心对正确标签预测概率的准确性,忽略了其它错误标签的差异,在特征空间中可能不会形成紧凑且易于区分的类别表示,从而导致学习到的特征比较分散
- 当特征不够紧凑时,由于新数据的特征表示可能与训练数据的特征表示存在较大差异,模型在新数据上可能难以实现准确的分类,影响模型泛化性
当类别之间存在重叠或者模糊边界时,交叉熵损失函数不是好的选择,可能需要更复杂的损失函数。
负对数似然损失函数
负对数似然损失函数应用于多分类问题,在二分类情况下等价于交叉熵损失函数,计算方式如下:
其中$M$是分类任务的类别数目。
和交叉熵损失函数没有本质不同,无非是用于多分类还是二分类,激活函数使用softmax
还是sigmoid
。
NCE损失
噪声对比估计损失,全称Noise Contrastive Estimation。分类任务中的类别比较少的时候,可以直接用标准的softmax
公式计算,但是当类别特别多的时候,需要采用估算近似的方法简化softmax
中归一化的计算。
极大似然估计
在机器学习领域有一个方法,对问题建模以后为其构造一个目标函数,然后对这个目标函数进行优化,从而得到一组最优参数,最后利用这组最优参数对应的模型进行预测,这就是极大似然估计。
在建模统计语言模型时,利用极大似然估计和马尔科夫假设(n-gram语言模型),我们可以写出其极大似然函数:
因为直接计算连乘可能导致数值下溢,通常会对上式取对数,转换为求和形式:
我们的目标就是最大化似然函数$L_{MLE}$,就是把$p(w|c)$看成$w$和$c$的函数,$\theta$为待定参数集,我们的目标就是得到$p_{\theta}(w|c)=F(w,c;\theta)$;一旦$\theta$确定,任何概率$p(w|c)$都可以计算出来。
假设输入到softmax
之前的结果用$s_{\theta}(w,c)$表示,这是一个打分函数,输出的分数用来量化单词$w$在上下文$c$中的匹配性,那么:
假设我们从训练数据中得出经验分布$p^{‘}(w|c)$,根据最大期望算法,对数似然函数可以写出:
由于单词库$V$数量巨大,因此计算$Z(c)$计算量很大,这就是NCE要解决的问题。
NCE
NCE的核心思想是通过学习数据分布样本和噪声分布样本之间的差异,发现数据中的一些特性,由于这个方法需要依靠与噪声数据进行对比,所以被称为“噪声对比估计”(Noise Contrastive Estimation)。更具体地,NCE将多分类问题转换成了一个二分类问题,分类器能够对数据样本和噪声样本进行二分类,这个分类器的参数$\theta$等价于$p_{\theta}(w|c)$中的$\theta$。对于设置的噪声分布,我们希望它尽可能接近数据分布,否则这个二分类任务过于简单,也就无法很好地学到数据特性。
对于单词$w_i$,假设它的上下文为$c_i$,假设噪声分布为$Q$,从$Q$中生成$k$个噪声词(从词表中采样)$\widetilde{w}_{ij}$。那么$(c_i,w_i)$构成了正样本$(y=1)$,$(c_i,\widetilde{w}_{ij})$构成了负样本$(y=0)$。如那么可以构造如下损失函数:
上述损失函数中有$k+1$个样本,可以看成从两种不同的分布中分别采样得到,一个是根据训练集的经验分布$P_{train}$每次从词表中采样一个目标样本,其依赖于上下文$c$;另一个是依据噪音分布$Q$每次从词表中采样$k$个噪音样本(不包括目标样本)。基于这两种分布,有如下混合分布的采样概率:
那么$P(y=1,w|c)=\frac{\frac{1}{k+1}P_{train}(w|c)}{\frac{1}{k+1}P_{train}(w|c)+\frac{k}{k+1}Q(w)}$,而$P_{train}(w|c)$就是我们要学习的参数。
看起来上式的分母还是需要对词表中的每一个词进行归一化操作?NCE将其处理成可学习的参数。从实际学习的数值看,每次分母的数值接近1且方差较小,因此实际操作时,可以直接设为1。所以$P_{train}(w|c)$可以简化为$P_{train}(w|c)=exp(h^{T} v_{w})$。那么预测出正样本的概率为:
那么最终的NCE损失函数为:
研究者通过实验和推导证明,当负样本和正样本数量之比$k$越大,NCE的导数趋向于softmax
的梯度,那么NCE对于噪声分布好坏的依赖程度也就越小。也就是说,在计算能力允许的条件下,应尽可能增大负样本数量。有研究证明,25个噪音样本足以匹配常规softmax的性能,且有45倍的加速。
【参考文献】