评价函数的分类:点估计、成对、列表

评价函数怎么分类?说白了,就是看它一次能「看」多少样本。

我刚开始接触排序学习时,总觉得评价函数就是算个准确率。后来踩了坑才发现——评价函数的粒度,直接决定了模型优化的方向和难度。你想想看,如果一次只看一个样本,跟一次看一堆样本,那训练出来的模型能一样吗?

业内一般把评价函数分成三类:点估计(Pointwise)、成对(Pairwise)、列表(Listwise)。这三类不是谁替代谁的关系,而是适用场景不同。下面我一个个说。

1. 点估计评价函数

点估计,就是每次只评估单个样本的预测值与真实值之间的差距。

举个例子:你预测某个商品的点击率是 0.8,实际是 0.6。那点估计函数就只算这一个样本的误差,跟其他样本没关系。

常见的点估计函数有:

  • 均方误差(MSE):预测值与真实值差的平方。对异常值敏感,我一般不用在排序场景。
  • 交叉熵(Cross-Entropy):分类任务标配。二分类用 Binary Cross-Entropy,多分类用 Categorical Cross-Entropy。
  • 平均绝对误差(MAE):绝对值误差,对异常值更鲁棒,但梯度不光滑。

核心特点:点估计只关心「单个样本预测得准不准」,不关心样本之间的相对顺序。

我在项目中遇到过一个问题:用 MSE 训练排序模型,结果模型把所有样本都预测成 0.5 左右。为什么?因为 MSE 鼓励预测值靠近均值,但排序任务需要的是「区分度」——你预测得再准,如果分不出好坏,排序就是废的。

适用场景:回归任务、分类任务、评分预测(如电影评分)。不适合纯排序场景。

2. 成对评价函数

成对评价函数,一次看两个样本。它不关心每个样本的具体分数,只关心「A 是否比 B 更相关」。

这就像你面试候选人——你不需要给每个人打 85 分还是 90 分,你只需要说「张三比李四更适合这个岗位」就够了。

常见的成对评价函数:

  • Pairwise Hinge Loss:如果正样本得分比负样本高出一个 margin,loss 为 0;否则惩罚。公式:max(0, margin - (s_pos - s_neg))。
  • Pairwise Logistic Loss:用 sigmoid 把得分差映射成概率,再用交叉熵。比 Hinge Loss 更平滑。
  • RankNet Loss:微软提出的经典成对损失,基于概率模型。我早期做搜索排序时用过,收敛稳定。

注意:成对评价函数有个隐含假设——所有「对」是独立同分布的。但实际中,同一个 query 下的文档对之间是相关的。我曾经因为这个假设,导致模型在长尾 query 上表现很差。

成对评价函数的优点是:直接优化排序的相对顺序,比点估计更贴近排序目标。缺点是:计算复杂度是 O(n²),样本量大时很慢。而且它只关心「谁比谁好」,不关心「好多少」。

适用场景:搜索排序、推荐排序、任何需要「分出先后」的任务。

3. 列表评价函数

列表评价函数,一次看整个排序列表。它直接优化最终的评价指标,比如 NDCG、MAP、MRR。

你想想看,点估计看一个,成对看两个,列表直接看全部——哪个最贴近真实需求?当然是列表。因为用户最终看到的就是一个排好序的列表,不是单个分数,也不是两两比较。

常见的列表评价函数:

  • ListNet:用 Top-1 概率分布来建模排序列表,用 KL 散度衡量预测分布和真实分布的差异。
  • ListMLE:直接最大化正确排序的似然概率。我试过,收敛快但容易过拟合。
  • SoftRank:把排序位置「软化」成概率分布,让 NDCG 可微。嗯,这个思路很巧妙。
  • LambdaRank / LambdaMART:虽然不是严格意义上的列表损失,但它用 λ 梯度直接优化 NDCG,实践中效果极好。

核心特点:列表评价函数直接优化最终指标,理论上最优。但计算复杂度高,且需要整个列表的标注。

我曾经在一个推荐系统项目中,用 ListNet 替代了 Pairwise Hinge Loss。效果提升很明显——NDCG@10 涨了 5 个点。但训练时间也翻了一倍。这就是 trade-off。

注意:列表评价函数对标注噪声非常敏感。如果标注质量差,列表级别的优化反而会放大错误。我建议先确保标注一致性,再上列表方法。

三类评价函数对比

维度 点估计 成对 列表
评估粒度 单个样本 两个样本 整个列表
优化目标 预测准确率 相对顺序 最终排序指标
计算复杂度 O(n) O(n²) O(n log n) 或更高
对标注要求 低(只需绝对分数) 中(需相对顺序) 高(需完整排序)
典型场景 评分预测、分类 搜索排序、推荐 搜索排序、推荐
代表函数 MSE, Cross-Entropy Hinge Loss, RankNet ListNet, LambdaRank

知识结构图

下面这张图帮你理清三类评价函数的关系和选择路径:

评价函数分类体系 评价函数 点估计 (Pointwise) 成对 (Pairwise) 列表 (Listwise) MSE Cross-Entropy Hinge Loss RankNet ListNet LambdaRank 选择建议 • 标注只有绝对分数 → 点估计 • 标注只有相对顺序 → 成对 • 标注有完整排序列表 → 列表(效果最好,代价最高)

如何选择?

说实话,没有银弹。我个人的经验是:

  1. 先看标注数据长什么样。如果只有点击率这种连续值,点估计是唯一选择。如果有「用户点击了 A 没点 B」这种隐式反馈,成对就够了。
  2. 再看业务指标。如果最终考核的是 NDCG、MAP 这类列表指标,列表评价函数理论上限更高。但要注意,列表方法对数据量和标注质量要求也更高。
  3. 最后看工程成本。点估计最快,成对次之,列表最慢。我见过不少团队,数据量上亿,用列表方法根本跑不动,最后还是用成对加一些 trick 来近似。

我的建议:从成对评价函数入手。它比点估计更贴近排序目标,又比列表方法容易实现。等模型和 pipeline 稳定了,再尝试列表方法做 fine-tuning。