资讯

负对数似然是什么?把“概率最大”变成“损失最小”

2026-11-053 分钟阅读百科
TL;DR负对数似然(Negative Log Likelihood,NLL)是对数似然函数取负号得到的量,最小化它等价于极大似然估计;在分类任务中,它对正确类别预测概率取负对数,与交叉熵损失等价,是神经网络分类和大语言模型训练中最常用的损失函数,取对数还能避免数值下溢。

负对数似然(Negative Log Likelihood,NLL)是机器学习中最常用的损失函数之一。它的含义是:先计算模型给真实观测数据分配的概率,取对数,再加上一个负号。最小化负对数似然,就等价于让模型给真实数据分配的概率尽可能大,也就是进行极大似然估计。

从似然说起

似然衡量的是:在给定的模型参数下,观察到当前这些数据的可能性有多大。极大似然估计的思想是,选择让这个可能性最大的参数。如果各个样本之间相互独立,整个数据集的似然就等于每个样本的概率的乘积。

为什么要取对数

直接计算很多个概率的乘积会遇到问题。每个概率都是 0 到 1 之间的数,很多个这样的数乘在一起,结果会变得极其微小。比如一千个 0.1 相乘,结果是 10 的负一千次方,这远远超出了计算机能够表示的最小数值,会被当作零处理,这叫数值下溢。取对数可以把乘积变成求和,一千个很小的数相乘,变成一千个负数相加,数值的范围就变得容易处理了。而且求和的形式更便于求导和计算梯度。由于对数函数是单调递增的,让似然最大的参数,也就是让对数似然最大的参数,不会改变优化的结果。

为什么要取负号

在机器学习中,人们习惯于把训练表述为“最小化一个损失函数”,大多数优化工具和算法也都是按照最小化来设计的。对数似然越大越好,加上一个负号之后,就变成了越小越好,可以直接作为损失函数来最小化。另外,由于概率在 0 到 1 之间,它的对数是负数,取负号之后负对数似然是一个非负的数,也更符合“损失”的直觉:模型越好,损失越接近零。

在分类中的含义

在分类任务中,模型会输出样本属于每一个类别的概率,通常是通过 softmax 函数得到的。对于单个样本,负对数似然就是模型预测的“正确类别的概率”取对数后再取负号。比如一张猫的图片,如果模型认为它是猫的概率是 0.9,负对数似然约为 0.1;如果概率只有 0.1,负对数似然约为 2.3;如果概率接近于零,负对数似然会趋近于无穷大。这意味着:模型对正确答案越有把握,损失越小;如果模型非常自信地给出了错误的答案,就会受到非常严厉的惩罚。

在分类问题中,负对数似然与交叉熵损失是等价的:当真实的标签用“正确类别为 1、其他类别为 0”的形式表示时,交叉熵的计算结果正好就是正确类别概率的负对数。所以这两个名称常常被混用。在 PyTorch 中,NLLLoss 接收的是取过对数的概率,而 CrossEntropyLoss 直接接收模型的原始输出,内部自动完成 softmax 和取对数的操作。

在大语言模型中

大语言模型的预训练目标,就是最小化文本中每一个 token 的负对数似然:给定前面的文字,模型预测下一个 token 的概率分布,真实的下一个 token 的概率越高,损失越小。对整个文本的平均负对数似然取指数,就得到了困惑度,它是衡量语言模型好坏的常用指标:困惑度越低,说明模型对文本的预测越准确。此外,负对数似然也被用于回归问题:如果假设预测误差服从正态分布,最小化负对数似然就等价于最小化均方误差。