负对数似然损失函数(Negative Log-Likelihood Loss,NLL) 是机器学习,尤其是分类问题中常用的一种损失函数。它用于衡量模型预测的概率分布与真实标签之间的差异。负对数似然损失函数的目标是最大化正确类别的预测概率,同时最小化错误类别的预测概率。
基本概念
我们从对数似然(log-likelihood) 开始理解。假设模型的输出是一个概率分布,用于预测某个样本属于不同类别的概率。对于每个样本,真实标签表示其所属的正确类别。对数似然计算的是模型给正确类别分配的概率。如果模型给正确类别分配的概率越高,则模型的预测越好。
然而,我们不希望最大化似然,而是最小化损失。为此,我们使用负对数似然,通过将对数似然加上负号,使得模型最大化正确类别的概率时,负对数似然损失最小。
数学表达
假设我们有一个分类问题,输入的样本 x x x 属于类别 y y y,且模型的输出是对不同类别的概率预测。对于样本 x x x,模型的输出概率分布记为 P ( y ∣ x ) P(y|x) P(y∣x),即给定样本 x x x,预测其属于类别 y y y 的概率。
模型的目标是尽量给真实标签(即类别 y y y)赋予高的概率。负对数似然损失的数学表达如下:
L = − log P ( y ∣ x ) L = - \log P(y|x) L=−logP(y∣x)
其中:
- P ( y ∣ x ) P(y|x) P(y∣x) 是模型预测的样本 x x x 属于类别 y y y 的概率。
- − log P ( y ∣ x ) -\log P(y|x) −logP(y∣x) 是该概率的负对数。
当模型给出正确的高概率时, P ( y ∣ x ) P(y|x) P(y∣x) 接近1,此时 − log P ( y ∣ x ) -\log P(y|x) −logP(y∣x) 接近0,意味着损失较小;而如果模型给出的概率较低, P ( y ∣ x ) P(y|x) P(y∣x) 接近0, − log P ( y ∣ x ) -\log P(y|x) −logP(y∣x) 会趋向于无穷大,意味着损失非常大。
多分类场景下的负对数似然
在多分类问题中,模型的输出是一组概率分布,这组概率分布表示每个类别的预测概率。假设有 C C C 个类别,模型的输出为每个类别的预测概率 P ( y i ∣ x ) P(y_i|x) P(yi∣x),其中 i = 1 , 2 , … , C i=1,2,\dots,C i=1,2,…,C。对于多分类问题,负对数似然损失函数可以写为:
L = − ∑ i = 1 C y i log P ( y i ∣ x ) L = - \sum_{i=1}^{C} y_i \log P(y_i|x) L=−i=1∑CyilogP(yi∣x)
其中:
- y i y_i yi 是真实类别的指示变量(one-hot encoding),如果样本 x x x 属于类别 i i i,则 y i = 1 y_i = 1 yi=1,否则 y i = 0 y_i = 0 yi=0。
- P ( y i ∣ x ) P(y_i|x) P(yi∣x) 是模型预测样本 x x x 属于类别 i i i 的概率。
因为在真实标签下,只有对应的 y i y_i yi 为1,其它类别的 y i y_i yi 都为0,所以最终损失只依赖于正确类别的预测概率,即:
L = − log P ( y true ∣ x ) L = - \log P(y_{\text{true}}|x) L=−logP(ytrue∣x)
这意味着,我们只关心模型对真实类别的预测概率,并通过最小化这个损失来训练模型。
用通俗的语言解释
假设你在玩一个猜谜游戏,问题是“苹果是什么颜色?”,而你有三个选项:“红色”、“蓝色”、“绿色”。你的任务是尽可能准确地猜出答案(显然答案是“红色”)。
在训练模型时,系统会给每个选项分配一个概率值,表示模型认为这个选项为正确答案的概率。假设模型的输出是这样的概率分布:
- 红色:0.7
- 蓝色:0.2
- 绿色:0.1
这个时候,系统希望最大化“红色”这一选项的概率,因为“红色”是正确答案。如果模型给正确答案“红色”分配的概率很高,系统就很开心,认为模型表现很好。这时损失函数的值会很低。
而负对数似然损失函数的工作方式是:当模型给“红色”(正确答案)分配高概率时,它会惩罚得少(损失小);但如果模型把高概率分配给错误答案,比如给“蓝色”分配了0.7,而给“红色”分配了0.2,那损失就会很大,表示模型犯了大错误。
应用举例:在DPR中的应用
在DPR(Dense Passage Retriever 稠密段落检索)中,负对数似然损失函数被用来优化模型的检索性能。对于每一个问题,DPR希望模型能找到与问题最相关的正样本段落,同时排除那些不相关的负样本。损失函数的目标就是让模型尽量提高正样本的相似度分数,并降低负样本的相似度分数。
具体地,DPR会计算问题与所有段落的相似性分数,其中:
- 正样本的相似度分数应尽量高;
- 负样本的相似度分数应尽量低。
具体损失函数为:
L ( q i , p i + , p i , 1 − , … , p i , n − ) = − log e s i m ( q i , p i + ) e s i m ( q i , p i + ) + ∑ j = 1 n e s i m ( q i , p i , j − ) L(q_i, p_i^+, p_{i,1}^-, \dots, p_{i,n}^-) = - \log \frac{e^{sim(q_i, p_i^+)}}{e^{sim(q_i, p_i^+)} + \sum_{j=1}^{n} e^{sim(q_i, p_{i,j}^-)}} L(qi,pi+,pi,1−,…,pi,n−)=−logesim(qi,pi+)+∑j=1nesim(qi,pi,j−)esim(qi,pi+)
这里:
- s i m ( q i , p i + ) sim(q_i, p_i^+) sim(qi,pi+) 表示问题 q i q_i qi 与正样本段落 p i + p_i^+ pi+ 的相似度。
- s i m ( q i , p i , j − ) sim(q_i, p_{i,j}^-) sim(qi,pi,j−) 表示问题 q i q_i qi 与负样本段落 p i , j − p_{i,j}^- pi,j− 的相似度。
负对数似然损失函数通过对正样本的相似性进行负对数运算,迫使模型在训练过程中学会区分正负样本。这样,模型在面对新问题时,能够更有效地找到与问题最相关的段落。
总结
负对数似然损失函数是分类任务中的常用损失函数,目标是最大化模型对正确类别的预测概率。