评价函数的分类:点估计、成对、列表
评价函数怎么分类?说白了,就是看它一次能「看」多少样本。
我刚开始接触排序学习时,总觉得评价函数就是算个准确率。后来踩了坑才发现——评价函数的粒度,直接决定了模型优化的方向和难度。你想想看,如果一次只看一个样本,跟一次看一堆样本,那训练出来的模型能一样吗?
业内一般把评价函数分成三类:点估计(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 |
知识结构图
下面这张图帮你理清三类评价函数的关系和选择路径:
如何选择?
说实话,没有银弹。我个人的经验是:
- 先看标注数据长什么样。如果只有点击率这种连续值,点估计是唯一选择。如果有「用户点击了 A 没点 B」这种隐式反馈,成对就够了。
- 再看业务指标。如果最终考核的是 NDCG、MAP 这类列表指标,列表评价函数理论上限更高。但要注意,列表方法对数据量和标注质量要求也更高。
- 最后看工程成本。点估计最快,成对次之,列表最慢。我见过不少团队,数据量上亿,用列表方法根本跑不动,最后还是用成对加一些 trick 来近似。
我的建议:从成对评价函数入手。它比点估计更贴近排序目标,又比列表方法容易实现。等模型和 pipeline 稳定了,再尝试列表方法做 fine-tuning。