想象你是婚宴的总管,几十位宾客同时落座,每个人都有不同的亲疏远近。第一种做法是挨个儿问“这位客人重要吗”,给出一个独立分数——这叫 Pointwise;第二种是两两比较“张三大爷比李四阿姨更重要吗”,把每一对分个输赢——这叫 Pairwise。但真正的难题是:整桌人的座次是否让重要宾客坐到了主位、长辈坐到了向阳位、小孩坐到了上菜口?这需要你同时打量整张桌子、整份宾客名单,统筹安排一个“整体最满意”的座次——这就是 Listwise 排序。 Listwise 是 Learning to Rank(LTR)三大范式中效果最好的一种:它不再孤立地看某道菜好不好吃,也不只纠结某两把椅子谁高谁低,而是直接把整桌座次当作优化目标。本文的主角 ListNet 和 ListMLE,就是两位风格各异的“排座大师”:ListNet 盯住“最尊贵的客人坐上主位的概率”,ListMLE 则从主位到末位“逐席揭晓”最合理的落座顺序。它们背后还有一张“验收评分表”叫 NDCG,虽不可直接用于训练,却能被聪明的代理函数变成可微分的软目标。
掌握 Listwise 排序,意味着你不再靠零散打分或成对比较来处理排序,而是站在整个结果列表的高度优化相关性,这是搜索、推荐、广告排序岗位绕不开的核心能力。
目录
可视化演示
Listwise方法直接优化列表排序质量:ListNet用Top-1概率损失,ListMLE用似然损失。切换模式对比两种算法的优化过程与NDCG评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
ListNet Top-1概率损失 Plackett-Luce模型计算排序概率 Top-1概率交叉熵损失优化 L=-ΣP_true·log(P_pred) 学习率越高,收敛越快但可能震荡
问题的起源:单点打分与两两对比的局限
宴席总管第一天上班,老管家教他一个笨办法:每上一道菜,就按“好吃程度”打个分,最后按分数高低决定谁坐主位。可这办法很快露馅了——糖醋鱼 8 分、白灼虾 9 分,但主位上坐的是最在乎面子的大伯,他根本不吃虾,相比之下更希望位置靠近老寿星。孤立地评价每道菜,完全忽视了“菜和客人之间的关系”以及“整桌菜彼此的配合”。这就是 Pointwise 的局限:它对每个文档独立打分,不考虑同一查询下文档之间的相对顺序和互相影响。
第二天老管家又教一招:把任意两位宾客摆在一起比一比,谁更重要谁靠前,把所有两两比较的结果汇总成最终座次。这招比单点打分聪明些,但新的问题出现了——当宾客有几十位时,“张三大爷 vs 李四阿姨”这类比较对数量爆炸(约 n² 个),而且不同查询下的文档数量差异巨大,导致训练样本严重不平衡。更关键的是,两两比较只保证“相对关系”正确,却无法直接告诉管家“整张桌子是否让最重要的人坐到了最核心的位置”。这就是 Pairwise 的局限。
排序的真正挑战从来不是“某道菜好不好吃”或“某对客人谁更尊贵”,而是“整桌座次是否全局最优”。搜索引擎面对的场景一模一样:用户输入一个查询,返回的十个结果是一个整体,用户一眼扫过去,前三名决定了他是否满意。于是,学术界和工业界都把目光投向了第三种思路——把整份候选列表当作一个整体来优化,这便是 Listwise 的起点。列表级视角意味着损失函数直接定义在整个列表上,追求的是全局最优需求,而不是局部的两两正确。
核心思想:把整张桌子当成一个整体
宴席总管终于想通了:别再纠结单个客人和单对关系,直接把整份宾客名单摊在桌上,设计一套“整体满意度”的度量方式,然后让排座模型朝着这个度量不断优化。这就是 Listwise 的核心思想:训练样本是一个完整的文档列表(一次查询对应的所有候选文档),模型不仅要给每个文档打分,还要把这串分数转换成某种“整体结构”,再去和理想的列表结构比较。
具体来说,模型 $f$ 对列表中的每个文档 $x_i$ 输出一个分数 $s_i = f(x_i; \theta)$,这些分数合起来构成一个序列。为了让“排序”这件事能交给梯度下降处理,Listwise 方法通常会把这个分数序列通过 softmax 之类的函数转成一个概率分布,然后与由真实相关性标注构造的理想分布(或理想排列)进行比较。比较的差异就是损失,模型据此更新参数。
有了这个“整桌比对”的框架,接下来登场的两位排座大师就有了共同的舞台:把分数序列变成概率分布,再用一种合理的“列表级损失”来度量差距。ListNet 选择了“最尊贵的客人坐上主位的概率分布”作为比较对象,ListMLE 则选择了“从主位到末位逐席揭晓的顺序概率”作为比较对象。两者都忠实贯彻了“整体优化”的信条,只是观察全局的视角不同。
- 模型逐个打分排序模型对列表中第 $i$ 个文档提取特征后输出一个实数分数。
- 组装分数序列把 $n$ 个文档的分数按顺序拼成一个序列,表示模型眼中的整桌座次。
- 列表级损失对比用损失函数 $\ell$ 把预测序列与真实标签序列 $y_1, \ldots, y_n$ 的差距压缩成一个标量,供梯度反传。
ListNet算法:让最尊贵的客人坐上主位的概率最大
ListNet 的排座哲学很直接:一场宴席成功与否,最重要的信号是“地位最高的 VIP 是否坐上了主位”。但宴席还没开始,谁也不敢打包票,于是 ListNet 给每位宾客计算一个“坐上主位”的概率——分数越高的人,概率越大。这个概率用 softmax 计算:所有人的分数先取指数,再各自除以总和,得到的数字介于 0 到 1,且加起来恰好等于 1。这就是 Top-1 概率:它回答的是“每位文档成为列表第一的可能性有多大”。
有了预测的 Top-1 概率分布,还要有一个“理想分布”作对照。真实标签文档的相关性分数(比如人工标注的分级 0~4)同样可以过一次 softmax,构造出理想情况下每位文档坐上主位的概率。两个分布一比对,ListNet 使用的损失是交叉熵(cross entropy):预测分布越接近理想分布,损失越小,模型参数就越优。整个过程就像管家反复排练:练到预测的“主位概率”和理想状态高度一致。
值得注意的是,交叉熵里用到的 $y_i$ 并不是原始相关度分级,而是由分级分数过 softmax 得到的标签分布构造——这也意味着 ListNet 对标签的利用是“软”的:相关度 5 分的文档主位概率最高,但相关度 2 分的文档也有微小的概率,不会被一票否决。这给了模型平滑的梯度信号。换句话说,ListNet 这位总管不要求每一步都绝对正确,只要求概率天平一点点倾向理想局面,所以训练过程通常非常稳健。
P_{\mathrm{top1}}(i) = \dfrac{e^{s_i}}{\displaystyle\sum_{j=1}^{n} e^{s_j}}, \qquadL_{\mathrm{ListNet}} = -\sum_{i=1}^{n} y_i \, \log P_{\mathrm{top1}}(i)- 指数化分数对第 $i$ 个文档的原始分数 $s_i$ 取自然指数,保证后续值恒为正且放大高低分差距。
- 归一化分母把所有 $n$ 个文档的指数分数相加,作为总权重,确保概率总和为 1。
- 得到 Top-1 概率指数分数除以总权重,落在 0~1,表示该文档排第一的概率。
- 交叉熵损失用理想分布 $y_i$ 作为权重,对预测概率取对数后加权求和并加负号;预测越准,损失越小。
ListMLE算法:按顺序逐席揭晓的似然之道
如果说 ListNet 是站在门口盯着“主位”做概率博弈,那 ListMLE 就是一位亲自上场、从主位开始逐席安排的实战派总管。它的逻辑是:既然座次有先后,那我就按顺序一席一席地安排——先从全部宾客中选一位坐主位,再从剩下的宾客中选一位坐次席,以此类推。每一步的选择都用 softmax 从“剩余候选人”中挑概率最高的那个,整串选择连起来就是一个排列似然。
用数学语言说:假设理想排列是 $\pi$(第一个元素是应坐主位的文档,第二个是应坐次席的文档……),那么模型给出整个排列的概率等于每一席选择概率的乘积。ListMLE 的训练目标就是最大化这个乘积——也就是让理想排列在模型眼里“最顺理成章”。为了避免连乘造成数值下溢,实际优化时取负对数,把连乘变成连加,这就是负对数损失。每一步的 softmax 只作用于剩余候选,因此随着席位减少,计算量也在逐层缩小,训练效率比一次性处理整个排列更友好。
ListMLE 的损失有个优雅的解释:每一项都在鼓励模型“让被选中的文档分数,比剩余候选都高出一截”。这使它天然关注排序中的头部位置——主位安排错了,损失立刻飙升;末位安排错了,影响相对较小。这种“头部优先”的特性与搜索引擎用户的浏览习惯高度一致:用户很少翻到第二页,前三名的质量决定了体验。因此 ListMLE 在实践中往往比 ListNet 收敛更快,尤其是在列表较长、理想排列明确的场景里。
P(\pi \mid s) = \prod_{k=1}^{n} \frac{e^{s_{\pi_k}}}{\displaystyle\sum_{j=k}^{n} e^{s_{\pi_j}}}, \qquadL_{\mathrm{ListMLE}} = -\log P(\pi \mid s)- 第 $k$ 席的选择概率在安排第 $k$ 席时,从剩余文档 $\pi_k, \pi_{k+1}, \ldots, \pi_n$ 中选中 $\pi_k$ 的概率。
- 连乘整串选择从主位到末位,每一席的选择概率相乘,得到理想排列的整体似然。
- 负对数似然损失取负对数把连乘展开为求和,每一项是“剩余候选指数和的日志”减去“被选中文档的分数”。
NDCG不可微怎么办:用软评分代理硬指标
无论是 ListNet 还是 ListMLE,管家最终都要向主家汇报:这桌席安排得到底好不好?行业通用的验收表叫 NDCG(Normalized Discounted Cumulative Gain,归一化折损累积增益)。它的逻辑很朴素:越相关的文档应该排得越靠前,而且位置越靠前,收益越大,位置靠后则收益按对数折损。把每个位置上的“相关度收益”按折损系数加权求和,再除以“完美排序能拿到的最高分”,就得到一个 0~1 的分数——1 分代表完美座次。
麻烦在于,NDCG 的计算依赖一个硬性的排序操作:你得先知道“排在第 $i$ 位的是谁”,才能把对应的相关度乘上位置折损。排序这个动作本身不可导,就像“把宾客逐个按重要性拎出来排好”没法用连续的梯度来描述——你没法问“稍微往左一点点,NDCG 变化多少?”,因为排序结果是离散的。这一特性决定了 NDCG 只能当“验收指标”用于离线评估,不能直接当损失函数喂给神经网络。
既然硬指标不可导,聪明的主办方想出一个变通办法:把“排序”这个离散动作软化。我们不直接问“谁排第几位”,而是问“每个文档处在高收益位置的概率有多大”——用 softmax 概率替代排序结果。于是 NDCG 的期望近似变成了一个处处可导的加权和:每个文档的固定折损收益乘以它的 softmax 概率,再求和。这个代理损失对每个文档的分数都能算出梯度,梯度下降就能继续工作了。
有了这个可微代理,管家的培训就有了明确方向:拿代理损失当“方向盘”,拿真实 NDCG 当“仪表盘”——训练中用方向盘调整方向,训练后看仪表盘验收成果。这也是为什么 ListNet、ListMLE 虽然不直接优化 NDCG,却总能稳步提升它的原因:它们的损失函数与 NDCG 的软近似在方向上高度一致。
- 固定位置折扣每个位置 $i$ 对应的折损收益是常数,由位置决定,与模型无关。
- 软排序概率用 softmax 给出文档 $i$ 占据第 $i$ 位(或成为头部)的软概率,替代离散排序。
- 加权求和的代理所有文档的折扣收益按其软概率加权求和,整体对 $s_i$ 可导,梯度可以顺畅反传。
实践调优:不同宴席用不同排座策略
两位排座大师风格迥异,实战中该如何选?首先看训练效率。ListNet 的交叉熵需要同时维护“预测分布”和“标签分布”两个 softmax,每次迭代都要完整遍历整份列表;ListMLE 的负对数损失虽然每步也在算 softmax,但只针对剩余候选,且损失形式更简洁(一项 log-sum-exp 减一项被选中分数)。在等量数据下,ListMLE 往往训练更快,尤其当列表长度在几十的量级时,收敛步数明显更少。这也是工业界不少排序模型选择 ListMLE 及其变体的原因。
再看泛化能力。ListNet 的 Top-1 概率分布是“软”的——相关度较低的文档也有非零概率,梯度信号在整个列表上平滑铺开,因此对标注噪声和异常文档的耐受性更强;ListMLE 则把概率集中在每一步的“正确选择”上,对理想排列的质量要求更高,一旦标签里混入错误排序,损失会被个别错误席位主导,泛化容易受扰动。实践中的经验法则是:数据干净、列表长,优先 ListMLE;数据噪声大、列表短,ListNet 更稳。
调参数建议也有门道:一是列表长度别贪多——ListMLE 的计算复杂度随列表长度呈平方增长,工业界常用滑动窗口把候选截断到 30~50 个文档,既保留列表级优势又控制开销;二是初始学习率要比 Pointwise 模型小一个量级,因为列表级损失对参数更敏感,学习率大了容易震荡;三是相关性标签尽量用分级(0~4)而非二值,分级标签能让 NDCG 的指数增益发挥更大作用。工程上,工程实现常采用两阶段架构:粗排用轻量模型从海量候选中筛出几百条,精排再用 Listwise 模型细致排序,兼顾延迟与效果。
最后回到宴席比喻:ListNet 像一位稳健的统筹者,反复推演“主位概率”的天平,适合宾客关系复杂、信息模糊的场合;ListMLE 像一位雷厉风行的执行者,从主位开始一路果断安排,适合名单清晰、规矩分明的正式宴席。真正的排序高手,会在不同场景里灵活切换这两种策略,并用 NDCG 的软代理持续校准方向。
AI 应用场景
搜索广告排序:让每一屏都“宾主尽欢”
阶段:相关性排序 / 精排(Rerank)
解决的问题:传统广告排序按单个广告的预测点击率独立打分,忽略了同一屏广告之间的互相竞争与用户浏览习惯——用户对第 1 位的关注远高于第 5 位。Listwise 能把“整屏广告列表”作为优化对象,让高相关高收益的广告占据头部位置,从而提升整体点击量和广告收入。
具体案例:某电商搜索平台在“双十一”大促期间,将 ListMLE 应用于广告精排模型,以“预估点击率 + 预估转化率”加权作为相关性分数,对每屏 50 个广告做列表级训练。结果显示,在离线 NDCG@10 提升约 7% 的同时,线上广告点击率提升 4.2%,且头部位置的广告相关性明显更贴合用户意图。
推荐系统精排:从“两两对比”升级为“整页最优”
阶段:推荐精排(Rerank)
解决的问题:推荐系统召回数百个候选物品后,精排若只用 Pairwise 方法保证“物品 A 比物品 B 更值得推荐”,容易忽略列表整体的多样性与互补性——比如用户已经看过某个博主的视频,再推同博主的其他视频反而造成审美疲劳。Listwise 方法直接将整个推荐列表作为训练单元,优化列表级收益。
具体案例:某短视频 App 的首页推荐采用 ListNet 变体,将“完播率、点赞率、关注率”等多目标信号合成相关性标签,对 200 个候选做列表级重排。上线后,人均观看时长提升 3.1%,首页整体曝光点击率提升 2.6%,同时因为列表头部更贴合用户兴趣,主动滑走的用户比例下降了 1.8%。
Python 演示
import numpy as np def softmax(values): values = values - values.max() exps = np.exp(values) return exps / exps.sum() def listnet_loss_grad(scores, rels): p_s = softmax(scores) p_y = softmax(rels) loss = -np.sum(p_y * np.log(p_s + 1e-12)) return loss, p_s - p_y def listmle_loss_grad(scores, order): n = len(scores) loss = 0.0 grad = np.zeros(n) for k in range(n): sub = scores[order[k:]] p = softmax(sub) loss += np.log(np.exp(sub - sub.max()).sum()) - sub[0] grad[k:] += p grad[k] -= 1 return loss, grad def train(method, X, y, steps=150, lr=0.05): n_queries, n_docs, n_feats = X.shape w = np.zeros(n_feats) history = [] for _ in range(steps): total_loss = 0.0 grad_w = np.zeros(n_feats) for q in range(n_queries): scores = X[q] @ w if method == 'listnet': loss, dw = listnet_loss_grad(scores, y[q]) grad_w += dw @ X[q] else: order = np.argsort(-y[q]) loss, dw = listmle_loss_grad(scores, order) grad_w += dw @ X[q] total_loss += loss w -= lr * grad_w / n_queries history.append(total_loss / n_queries) return w, history np.random.seed(42)n_queries, n_docs, n_feats = 50, 5, 4w_true = np.array([2.0, 1.0, 0.5, -0.5])X = np.random.randn(n_queries, n_docs, n_feats)y = X @ w_true + np.random.randn(n_queries, n_docs) * 0.2y -= y.min() w_net, h_net = train('listnet', X, y)w_mle, h_mle = train('listmle', X, y)print('真实权重: ', np.round(w_true, 2))print('ListNet学习: ', np.round(w_net, 2))print('ListMLE学习: ', np.round(w_mle, 2))print('ListNet最终损失:', round(h_net[-1], 4))print('ListMLE最终损失:', round(h_mle[-1], 4))
values = values - values.max()减去最大值防止指数溢出,保证 softmax 数值稳定。p_s = softmax(scores); p_y = softmax(rels)把预测分数和真实相关度都转成“Top-1 概率分布”。return loss, p_s - p_yListNet 的梯度恰是预测分布与标签分布之差,推导自交叉熵对分数的偏导。for k in range(n)从第 1 席到末席逐位处理,体现 ListMLE 的序贯选择思想。sub = scores[order[k:]]取出当前剩余候选的分数,模拟“从剩余宾客中选下一位”。grad[k:] += p每个剩余候选都累积其被选中的 softmax 概率贡献。grad[k] -= 1被选中位置额外减去 1,对应负对数损失中-s_pi_k的导数。scores = X[q] @ w线性打分模型:特征矩阵乘以权重得到每个文档的分数。w -= lr * grad_w / n_queries用平均梯度更新权重,完成一步梯度下降。
常见误区
误区我听说 Listwise 方法的目的是优化 NDCG,那是不是把 NDCG 公式直接写进损失函数,算一个值再反向传播就行了?
正解NDCG 的计算依赖排序(把文档按分数排好再数位置),排序操作不可导,梯度无法穿过它。Listwise 真正的做法是用可微的 softmax 概率分布去“逼近”列表级目标:ListNet 用 Top-1 分布的交叉熵,ListMLE 用排列似然,它们只是间接让排序结果更接近 NDCG 最优,并非直接对 NDCG 求导。
为何常见:教材和论文常用“优化 NDCG”这种简写,省略了“可微代理”的细节,初学者很容易把评估指标误当成可训练损失。
误区ListNet 用的是 Top-1 概率,那我是不是只需要保证预测列表的第一个文档是对的,后面的文档随便排都行?
正解Top-1 概率是用 softmax 对整个分数列表归一化得到的分布,所有文档的概率之和为 1。交叉熵损失会同时拉高相关文档的概率、压低不相关文档的概率,让整个概率分布向理想分布靠拢,而不是只盯着第一名。相关度第二、第三的文档同样在分布中占据分量,它们的顺序也会被优化。
为何常见:“Top-1“ 这个字面说法极具误导性,让人以为目标是”只保第一”,忽略了它本质上是全列表的分布匹配。
误区ListMLE 直接最大化似然,名字里都没有"Net"和概率,那它应该绕开了 softmax,所以训练更快。
正解ListMLE 的每一步序贯选择实际上都做了一次 softmax——只是作用在“剩余候选”上。它更快的原因是损失形式更简洁:ListNet 的交叉熵需要同时维护预测分布与标签分布的乘积求和,而 ListMLE 的负对数损失只是 log-sum-exp 减去被选中分数,每步计算量更小,收敛步数也更少。
为何常见:看到 ListMLE 的公式是连乘和对数,没有显式写出 softmax 符号,容易误以为它绕开了归一化操作。
误区既然 Listwise 是以整个列表为单位优化,那我把所有候选文档都放进列表,效果应该最好,列表越长信息越全。
正解列表过长会带来三重问题:一是 ListMLE 的序贯 softmax 复杂度随列表长度平方增长,训练开销陡增;二是长列表尾部相关性标注噪声大,会干扰头部梯度的纯净度;三是用户根本不会浏览那么深,优化尾部位置的边际价值极低。工业界通常把候选截断到 30~50 个文档,或者先粗排筛出几百条再做列表级精排。
为何常见:教科书的小例子往往只有几个文档,演示效果漂亮,容易让人忽略真实场景中列表规模带来的工程约束。
面试题
Q1. 关于 Pointwise、Pairwise、Listwise 三种排序范式的区别,下列说法正确的是?
- A.Pointwise 只考虑单文档的绝对相关度打分← 正确答案
- B.Pairwise 直接优化整个文档列表的排序
- C.Listwise 只使用成对比较来训练排序模型
- D.三种范式都会直接优化 NDCG 评估指标
答案:A。Pointwise 对每个文档独立打分,不考虑文档间关系,所以 A 正确。Pairwise 优化的是文档对的相对顺序而非整个列表,B 错;Listwise 以整个列表为训练单位,不是成对比较,C 错;NDCG 因含有不可导的排序操作,不能直接作为损失函数被三种范式直接优化,D 错。
Q2. ListNet 中计算“Top-1 概率”依赖的数学函数是?
- A.Sigmoid 激活函数将分数压缩到零一区间
- B.Tanh 双曲正切函数对分数做归一化处理
- C.Softmax 函数将分数映射成概率分布← 正确答案
- D.ReLU 线性整流函数只保留正数分值
答案:C。ListNet 通过 softmax 把一组分数转换为非负且和为 1 的概率分布,每个概率对应“排第一”的可能性。Sigmoid 是对单个值做挤压、Tanh 输出区间含负数、ReLU 是阈值截断,它们都无法同时完成全列表归一化,因此 A、B、D 均不符合。
Q3. 实现 softmax 时先减去所有分数的最大值,主要目的是什么?
- A.保证所有概率数值的总和恰好等于一
- B.防止指数运算溢出导致的数值不稳定← 正确答案
- C.提高排序模型在测试集上的最终准确率
- D.让梯度下降的收敛速度变的更快更平滑
答案:B。softmax 公式中含 $e^{s_i}$,当分数较大时指数结果会溢出为无穷大。减去最大值后再取指数,所有指数项都落在 $e^0$ 到 $e^{-\infty}$ 之间,数值稳定,且 softmax 的平移不变性保证结果不变。A 是 softmax 自身的性质而非减最大值的目的,C、D 与数值稳定性无关,故只有 B 正确。
Q4. ListNet 与 ListMLE 损失函数的本质区别是什么?
- A.前者匹配 Top-1 概率分布而后者最大化排列似然← 正确答案
- B.前者使用交叉熵而后者使用均方误差损失
- C.前者适合小数据集而后者适合大数据集
- D.两者在数学形式上完全等价只是命名不同
答案:A。ListNet 构造 Top-1 概率分布,用交叉熵度量预测分布与理想分布的差距;ListMLE 则按理想排列逐席计算选择概率的连乘,取负对数作为损失。两者都用 softmax 且形式不同,B 错(ListMLE 不用均方误差);数据集规模的适用性不是二者的本质区别,C 错;D 的“完全等价”明显错误。
Q5. 下列哪些属于 Listwise 排序方法的典型特征?
- A.以整个文档列表作为训练样本单位← 正确答案
- B.优化 NDCG 的可微近似代理损失← 正确答案
- C.每次只比较相邻两个文档的先后顺序
- D.损失函数定义在列表级的概率分布上← 正确答案
答案:ABD。Listwise 把一次查询对应的整份文档列表作为样本,A 正确;由于 NDCG 不可导,实践中用 softmax 等可微代理逼近列表级指标,B 正确;损失函数如交叉熵或负对数似然都定义在列表级分布上,D 正确。每次只比较相邻两个文档是 Pairwise 的思想,与 Listwise 相悖,C 错。
Q6. NDCG 评估指标在训练中不能直接作为损失函数的最主要原因是?
- A.计算复杂度太高导致训练时间过长
- B.排序操作不可导导致梯度无法反向传播← 正确答案
- C.评估结果与真实相关度标签完全无关
- D.只能用于推荐场景不能用于搜索场景
答案:B。NDCG 需要先对文档按预测分数排序,再根据排序位置计算折损收益。排序是一个离散操作,其输出对分数不可导,梯度无法穿过它到达模型参数,因此不能直接做损失。计算复杂度不是核心障碍,A 错;NDCG 与标签强相关,C 错;NDCG 广泛应用于搜索、推荐等多个场景,D 错。
Q7. 关于 ListMLE 的负对数似然损失,下列说法正确的是?
- A.对所有文档分数求平均值的负期望值
- B.按理想排序逐位选择的负对数似然累加← 正确答案
- C.对文档两两比较后取逆序对的加权求和
- D.计算每个文档独立出现概率的交叉熵
答案:B。ListMLE 将理想排列表示为逐席选择概率的连乘积,负对数把连乘变成求和,所以损失是“每一位选择动作”的负对数似然之和。A 是分数平均,C 是 Pairwise 的排序损失思路,D 是无序假设下的交叉熵,均与 ListMLE 的序贯结构不符。
Q8. 关于 Listwise 方法相对 Pairwise 的优势,下列说法正确的有?
- A.能处理同查询下文档间的全局依赖← 正确答案
- B.避免文档对数量不平衡带来的训练偏差← 正确答案
- C.在小数据集上一定取得最优的表现
- D.损失函数更贴近列表级评估指标 NDCG← 正确答案
答案:ABD。Listwise 以整个列表为优化单元,天然建模文档间的全局关系,A 正确;Pairwise 会生成约 n² 个文档对,长列表的对数远多于短列表,带来样本不平衡,而 Listwise 每查询只产出一个样本,B 正确;Listwise 的目标与 NDCG 等列表级指标更一致,D 正确。C 的“一定最优”过于绝对,模型效果还取决于数据质量与超参数,故不选。
Q9. 当真实的标注相关度恰好构成完美排序时,理想状态下 ListNet 的标签 Top-1 概率分布有何特点?
- A.最相关文档概率为一其余全为零← 正确答案
- B.所有文档概率均匀分布互不相同
- C.概率大小与文档特征向量数量成正比
- D.概率大小取决于查询难度的二次方
答案:A。若相关度分数向完美排序收敛,softmax 的热度(temperature)趋于 0 时,最高分文档的概率趋近 1,其余趋近 0,此时标签分布呈 one-hot 形态。均匀分布是未训练时的状态,B 错;概率与特征向量数量、查询难度平方没有直接关系,C、D 为无依据的干扰项。
Q10. 关于 ListMLE 的梯度更新过程,下列说法正确的有?
- A.每一席需累积剩余候选文档的 softmax 概率← 正确答案
- B.被选中位置的文档在该步会额外减去一← 正确答案
- C.梯度方向与 ListNet 的梯度方向完全相同
- D.计算复杂度不随文档数量增加而发生变化
答案:AB。推导 ListMLE 对分数求导可得,每处理一席,剩余候选都累加其被选中的 softmax 概率,而被选中位置再减 1,正好对应“日志和”与“被选分数”两项的导数,A、B 正确。ListNet 梯度是预测分布减标签分布,与 ListMLE 的序贯累积结构不同,C 错;ListMLE 每席对剩余候选做 softmax,总复杂度为 O(n²) 量级,随 n 增长而增长,D 错。