想象你是一家餐厅的主厨。你的菜单上有几十道菜,每位顾客只能看到首页的一小部分。你希望顾客愿意点单(点击)、吃得尽兴且久坐(停留)、最后心满意足地买单(转化)。但现实总是让人头疼:招牌菜点击极高,价格贵却让人尝鲜后不再回头;甜品让人停留很久,但拉低了客单价;套餐转化最好,可惜只有老顾客才注意到。你要设计的不是某一道菜,而是整张菜单的排列顺序——这就是多目标排序要解决的问题。 在搜索引擎和推荐系统里,“菜单”换成了搜索结果页,“菜品”换成了网页、商品或视频。工程师面对的核心任务,不再是把单个目标做到极致,而是让点击率、停留时长、转化率三个目标联合起来,找到全局最优的排序方案。这条链路并不玄妙:先用 Learning to Rank 的三类方法学会“相关性”,再处理三个目标之间的冲突,设计合适的模型架构、训练策略和评估体系,最后借助成熟工具链落地上线。本文就用这场“餐厅经营”的故事,带你从原理走到实践。

岗位关联

掌握多目标排序联合优化,你就掌握了搜索/推荐系统核心排序链路的设计能力——这是搜索推荐算法工程师最重要的核心技能之一,直接决定点击、停留、转化三个业务指标的走向。

目录
  1. 可视化演示
  2. 排序学习原理:从单菜打分到整单排序
  3. 多目标问题解析:一张菜单的三重考验
  4. 模型架构设计:厨房的分工与总厨的调度
  5. 样本训练策略:食材处理决定菜品上限
  6. 评估指标体系:用评分榜检验菜单
  7. 工具链与落地:厨房设备与出餐流程
  8. 行业实践案例:餐厅的经营之道
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

多目标排序问题定义 核心挑战:目标冲突 排序系统流水线 点击率预测与位置偏差消除 长停留 = 内容满足需求 短停留 = 与期望不匹配 多目标排序联合优化可视化:展示CTR/停留时间/转化率预测、多目标融合策略与帕累托优化。

排序学习原理:从单菜打分到整单排序

主厨研究菜谱的第一步,是先搞清楚“相关性”——什么样的菜配什么样的客人。一位四川来的客人(搜索“麻辣”),你硬推甜品,再精致也白搭。搜索引擎里的相关性排序(Learning to Rank,简称 LTR)就是这个道理:让模型学会判断“哪些结果与当前查询更相关”,然后把最相关的排在最前面。

LTR 发展出三类方法,对应三种“查菜谱”的方式。点级法(Pointwise) 像给每道菜单独打分:这道菜辣度如何,那道菜甜度如何,分数高就往前排。对级法(Pairwise) 像两两 PK:把“回锅肉”和“麻婆豆腐”放到一起比较,判断哪道更贴合客人,再按胜场排序。列级法(Listwise) 则直接审视整张菜单:不再看单道菜或某对菜,而是评估整份排列表的合理性,哪个排序方案让客人整体最满意。三者层层递进,从“单点评估”走向“全局优化”。

实际工程中,点级法落地最早,公式直观:

点级法简单却有个短板:它把排序问题当成了回归问题,忽略了“比较”这一排序的本质。现实中更常用的是对级法和列级法——就像主厨最终会接受“两菜对比试吃”这种更贴近真实用餐体验的评价方式。

Lpoint=∑i=1N(y^i−yi)2\displaystyle L_{point} = \sum_{i=1}^{N} ( \hat{y}_i - y_i )^2
点级法的核心公式:预测分与真实分之间的平方误差。误差越小,说明这道菜的打分越准。
  1. 样本集合N 表示训练样本的个数,每个样本就是一条“用户-文档”记录,好比一次具体的点餐记录。
    i∈{1,2,…,N}\displaystyle i \in \{1, 2, \ldots, N\}
  2. 预测分与真实分之差$\hat{y}_i$ 是模型预测的相关性分数,$y_i$ 是用户的真实反馈(如是否点击)。差值代表“猜得准不准”。
    y^i−yi\displaystyle \hat{y}_i - y_i
  3. 平方误差求和把差值平方再全部累加,让偏差大的样本受到更严厉的惩罚,引导模型优先修正明显的错判。
    Lpoint=∑i=1N(y^i−yi)2\displaystyle L_{point} = \sum_{i=1}^{N} ( \hat{y}_i - y_i )^2

多目标问题解析:一张菜单的三重考验

一份理想菜单要同时通过三重考验:客人愿意点(点击)、点了吃得久(停留)、吃完愿意买单(转化)。在搜索场景里,点击对应 CTR(点击率),停留对应页面浏览时长,转化对应下单、注册、付费等关键动作。搜索推荐算法工程师的目标不再单一,而是要让这三个信号全都漂亮。

麻烦的是,三个目标常常打架。高点击的文章可能靠标题吸睛,点进去内容空洞,停留极短;停留长的内容可能来自长文或视频,天然更耗时间,却未必带来转化;而转化率高的商品往往戳中刚需,却可能点击平平。如果只盯着点击率,系统就会变成“标题党”制造机;只盯转化,又可能错过大量潜在兴趣用户。

换个角度看,三个目标之间其实存在一条天然的级联漏斗:曝光 → 点击 → 停留 → 转化。只有点击了,才谈得上停留;只有停留了,才有机会转化。这条漏斗提醒我们:每个目标都是上一层目标的条件概率。于是“联合优化”的核心变成了如何把三个目标的损失合并成一个统一的目标去训练模型:

联合损失听起来简单,实际落地时权重怎么定、量纲不一致怎么办,都藏在细节里。更重要的是,三个目标的预测不能各自为政——它们共享同一份用户行为数据,理应共享模型底层的理解。这就引出了模型架构设计。

Lmulti=λcLc+λsLs+λvLv\displaystyle L_{multi} = \lambda_c L_c + \lambda_s L_s + \lambda_v L_v
多目标联合损失:三个子损失(点击、停留、转化)乘以各自的权重再相加。权重就是主厨的“口味偏好”。
  1. 三个子损失$L_c$ 是点击预测的损失,$L_s$ 是停留预测的损失,$L_v$ 是转化预测的损失。每个损失衡量模型在单个目标上的表现。
    Lc,Ls,Lv\displaystyle L_c, \quad L_s, \quad L_v
  2. 权重系数$\lambda_c$、$\lambda_s$、$\lambda_v$ 分别表示三个目标的重要程度。权重越大,模型越优先照顾该目标。
    λc,λs,λv\displaystyle \lambda_c, \quad \lambda_s, \quad \lambda_v
  3. 加权求和把三个带权重的损失加起来,得到一个单一数值。训练时梯度会同时流向三个目标,实现“一锅同时做三道菜”。
    Lmulti=λcLc+λsLs+λvLv\displaystyle L_{multi} = \lambda_c L_c + \lambda_s L_s + \lambda_v L_v

模型架构设计:厨房的分工与总厨的调度

后厨要做三菜一汤,不可能三个厨师各用一套灶台——那样又贵又乱。聪明的做法是:共用底层的备菜区(食材清洗、切配),再分给各档口师傅分别掌勺。这就对应了多目标排序里最经典的硬参数共享架构:底层网络共享一份特征表示,上方分出三个任务塔,各管一个目标。共享底层让三个任务互相借用学习到的模式,冷门目标也能靠热门目标“带一带”。

但共享也有风险:三个目标若差异太大,硬扭在一起反而互相拖累。于是有了更精巧的 MMoE(多门控专家混合) 架构。可以理解为总厨请了多位“专家厨师”,每人擅长一种风格(比如川菜师傅、粤菜师傅、甜品师傅);门控网络则像一位聪明的点菜经理,根据客人特征(查询、场景),动态决定让哪些师傅多出力。每个样本来了,点菜经理按权重调配专家,塔网络再输出最终预测。

MMoE 的优雅之处在于:门控让“点击、停留、转化”三个目标既共享知识,又保留个性。回到餐厅比喻,就是备菜区共享、烹饪风格按客人口味灵活调配——既节省了食材,又让每道菜都恰到好处。

yt=ht(∑i=1mgi(x) fi(x))\displaystyle y_t = h_t \left( \sum_{i=1}^{m} g_i(\mathbf{x}) \, f_i(\mathbf{x}) \right)
MMoE 输出公式:多个专家网络 $f_i$ 的输出,被门控权重 $g_i$ 加权混合后,交给自己目标对应的塔网络 $h_t$ 生成最终分数。
  1. 专家网络$f_i(\mathbf{x})$ 是第 $i$ 个专家子网络,它从输入特征 $\mathbf{x}$ 中提炼出一种“处理视角”。
    f1(x),  f2(x),  …,  fm(x)\displaystyle f_1(\mathbf{x}), \; f_2(\mathbf{x}), \; \ldots, \; f_m(\mathbf{x})
  2. 门控权重$g_i(\mathbf{x})$ 是门控网络为第 $i$ 个专家分配的权重,数值随样本特征动态变化,代表“这次该多听谁的”。
    gi(x)∈[0,1],∑i=1mgi(x)=1\displaystyle g_i(\mathbf{x}) \in [0, 1], \quad \sum_{i=1}^{m} g_i(\mathbf{x}) = 1
  3. 加权融合把专家输出按门控权重加权求和,得到一个融合后的中间表示。
    ∑i=1mgi(x) fi(x)\displaystyle \sum_{i=1}^{m} g_i(\mathbf{x}) \, f_i(\mathbf{x})
  4. 塔网络输出融合表示再交给目标 $t$ 对应的塔网络 $h_t$,产出该目标的最终预测分。
    yt=ht(∑i=1mgi(x) fi(x))\displaystyle y_t = h_t \left( \sum_{i=1}^{m} g_i(\mathbf{x}) \, f_i(\mathbf{x}) \right)

样本训练策略:食材处理决定菜品上限

再好的架构,喂进去的食材不新鲜也白搭。排序模型的“食材”是训练样本,而样本里藏着两个致命的“味道偏差”。

第一个是位置偏差。用户在搜索结果页天然倾向于点前面的结果——就像客人翻开菜单,目光总会先落在前几道菜上。于是前排文档的点击率虚高,模型容易误以为“排在前面的就是更相关的”。纠正方法通常是引入位置特征,或者在训练时对位置因素做消偏,把“位置带来的点击”和“内容带来的点击”剥离开来。

第二个是反馈循环。模型决定排序,排序影响用户点击,点击又成为新的训练数据——这形成了一个闭环。如果模型一开始低估了某类长尾内容,这些内容就永远排不到前面,也就永远得不到曝光和点击数据,形成“越不曝光越没数据”的死循环。这是所有推荐搜索系统都要警惕的“信息茧房”源头。

针对样本的权重设计也是关键技巧。转化样本往往稀少(1000 次点击里可能只有 5 次下单),如果一视同仁,模型会忽视转化目标。于是给转化样本更高的权重,相当于主厨对珍贵食材格外上心:稀有松露虽然少,处理时却要加倍专注。加权后的交叉熵损失长这样:

样本策略做扎实了,模型才有资格上台表演。但“好不好吃”不能只靠主厨自己说了算,得有一套客观的评分体系。

L=−∑iwi[yilog⁡y^i+(1−yi)log⁡(1−y^i)]\displaystyle L = - \sum_{i} w_i \left[ y_i \log \hat{y}_i + (1 - y_i) \log (1 - \hat{y}_i) \right]
加权交叉熵损失:$w_i$ 是样本权重,$y_i$ 是真实标签,$\hat{y}_i$ 是预测概率。权重越大,这个样本对模型的“教育意义”越强。
  1. 交叉熵核心$y_i \log \hat{y}_i + (1-y_i) \log (1-\hat{y}_i)$ 衡量预测概率与真实标签之间的差距,值越小说明预测越准。
    yilog⁡y^i+(1−yi)log⁡(1−y^i)\displaystyle y_i \log \hat{y}_i + (1 - y_i) \log (1 - \hat{y}_i)
  2. 样本权重$w_i$ 是第 $i$ 个样本的权重。对稀有的转化样本、高价值的负样本,人工调高权重来强化学习。
    wi>0\displaystyle w_i > 0
  3. 负号与求和对带权损失取负并求和,得到总损失——训练目标就是最小化它。
    L=−∑iwi[yilog⁡y^i+(1−yi)log⁡(1−y^i)]\displaystyle L = - \sum_{i} w_i \left[ y_i \log \hat{y}_i + (1 - y_i) \log (1 - \hat{y}_i) \right]

评估指标体系:用评分榜检验菜单

餐厅好不好,不能只看某位客人满不满意,要看整桌客人的综合评价。排序模型也一样,需要一套“盲评”体系。

离线评估是模型上线前的体检。最常用的指标是 NDCG(归一化折损累积增益)。它考察一个核心问题:相关结果是不是排在了前面,而且越相关越靠前。假设有 5 个结果,模型把最相关的排在第 3 位,这就不如排在第 1 位好。NDCG 会按位置给增益打折——排得越靠后,贡献越小。这样,一套排序结果就能被压缩成一个 0 到 1 之间的分数,1 代表完美排序。

离线指标涨了,不等于线上一定赢。真正的试金石是在线 A/B 实验:把流量随机分成实验组和对照组,让两组用户分别体验新旧两版排序,然后对比点击率、停留时长、转化率等真实业务指标。只有 A/B 实验显著通过,新菜单才算真正征服了食客。

NDCG@k=∑i=1k2reli−1log⁡2(i+1)∑i=1k2reli∗−1log⁡2(i+1)\displaystyle \text{NDCG}@k = \frac{\sum_{i=1}^{k} \frac{2^{rel_i} - 1}{\log_2(i+1)}}{\sum_{i=1}^{k} \frac{2^{rel_i^*} - 1}{\log_2(i+1)}}
NDCG@k 公式:分子是当前排序的 DCG(折损累积增益),分母是理想排序的 IDCG。两者的比值越接近 1,排序越完美。
  1. 单点增益$2^{rel_i} - 1$ 把相关性等级 $rel_i$(如 0-4 分)放大成增益,越相关增益指数级上升。
    2reli−1\displaystyle 2^{rel_i} - 1
  2. 位置折损除以 $\log_2(i+1)$,让排在后面的结果增益打折,体现“排得越前价值越大”。
    2reli−1log⁡2(i+1)\displaystyle \frac{2^{rel_i} - 1}{\log_2(i+1)}
  3. 累计与归一化分子把前 $k$ 个位置的折损增益累加(DCG),分母用理想排序的累计增益(IDCG)做分母,比值就是 NDCG。
    NDCG@k=DCG@kIDCG@k\displaystyle \text{NDCG}@k = \frac{DCG@k}{IDCG@k}

工具链与落地:厨房设备与出餐流程

理念清晰后,需要趁手的工具把它变成现实。市面上的排序工具链已经非常成熟,按“厨房规模”可以分三档。

第一档是 XGBoost 和 LightGBM,适合中小团队快速起步。它们都实现了 GBDT(梯度提升树)算法,天生支持排序任务的 pairwise 目标(如 rank:pairwise),一句配置就能训练出一个不错的排序模型。XGBoost 功能全面,LightGBM 在大规模数据上更快更省内存。对很多业务来说,一个调好的 GBDT 排序模型已经能打赢“多模型拼装”的复杂方案。

第二档是 TensorFlow 等深度学习框架,适合需要精细建模大团队。MMoE、共享塔这些多目标架构,用 TF 的 Keras API 可以像搭积木一样实现:底层 embedding 共享,门控网络用 softmax 实现,三个塔各自输出。深度学习模型的优势在于能自动学习特征交互,也更容易融入用户序列、商品图文的丰富信号。

GBDT 的本质,是一棵树一棵树地“接力纠错”:

工具之外,链路设计同样关键。工业级搜索推荐系统通常采用粗排 → 精排 → 重排的流水线:粗排从海量候选中快速筛出几千条,精排用多目标模型对这几千条逐条打分排序,重排再考虑多样性、商业规则等约束做微调。三个环节各司其职,像流水线厨房一样高效出餐。

F(x)=∑m=1Mαm fm(x)\displaystyle F(\mathbf{x}) = \sum_{m=1}^{M} \alpha_m \, f_m(\mathbf{x})
GBDT 加法模型:总预测 $F(\mathbf{x})$ 是 $M$ 棵决策树 $f_m$ 的加权和,每棵新树都在学前面所有树的“残差”。
  1. 单棵树预测$f_m(\mathbf{x})$ 是第 $m$ 棵决策树对样本 $\mathbf{x}$ 的输出(落到的叶子分数)。
    fm(x)\displaystyle f_m(\mathbf{x})
  2. 树权重$\alpha_m$ 是每棵树的贡献系数,控制这棵树在最终预测中的话语权。
    αm\displaystyle \alpha_m
  3. 逐棵累加从第 1 棵树加到第 $M$ 棵树,得到最终预测分数。新树专门学习前序树的错误,所以叫“梯度提升”。
    F(x)=∑m=1Mαm fm(x)\displaystyle F(\mathbf{x}) = \sum_{m=1}^{M} \alpha_m \, f_m(\mathbf{x})

行业实践案例:餐厅的经营之道

最后,把前面所有方法串成一个完整的经营故事。某电商平台的搜索团队,要把排序从“单点击目标”升级为“点击、停留、转化联合优化”,他们是怎么做的?

第一步,架构升级:放弃原来三个模型分别打分再拼装的方案,改用 MMoE 架构——共享用户和商品特征(价格、销量、类目),三个塔分别预测点击率、停留时长、转化率,门控网络根据搜索词的商业意图动态调配(搜“手机”比搜“知识”更看重转化)。第二步,样本与训练:对曝光数据做位置消偏,转化样本按品类稀缺度加权。第三步,评估与迭代:离线先看 NDCG,选中的候选模型进入小流量 A/B 实验,观察漏斗上每一步的转化率变化,而不是只看单一指标。上线后,整体 GMV 提升了 3%,点击率基本持平,停留时长稳中有升。

这类实践还面临一个常见难题——冷启动。新上架的商品没有点击、停留、转化历史数据,多目标模型无从下手。主流解法有三种:用同品类相似商品的数据做迁移;用内容特征(如标题、图片、价格)做先验预估;或者干脆在冷启期间给新商品一个稳定的小流量探索窗口。这三种方法本质上是主厨面对新食材时的策略:参考同类食材的经验、观察食材本身的状态、给点试吃机会。

漏斗概率模型给冷启动和归因分析提供了理论基础:

多目标排序这条路,没有终点。随着深度学习与大模型的演进,未来会出现更多端到端的排序方案——从“人工设计多目标损失”走向“让模型自己学习目标之间的关系”。但无论工具怎么变,底层逻辑不变:理解用户、平衡目标、尊重数据。就像开餐厅,最重要的永远是“让食客吃得满意”这件事本身。

P(conv)=P(click)×P(stay∣click)×P(conv∣click,stay)\displaystyle P(conv) = P(click) \times P(stay \mid click) \times P(conv \mid click, stay)
漏斗概率公式:转化概率 = 点击概率 × 点击后停留概率 × 停留后转化概率。拆开来看,每一步的流失都可以单独诊断和优化。
  1. 点击概率$P(click)$ 是用户点击该结果的概率,位于漏斗最上游。
    P(click)\displaystyle P(click)
  2. 条件概率链$P(stay \mid click)$ 表示“已经点击的前提下,愿意停留”的概率,体现内容质量。
    P(stay∣click)\displaystyle P(stay \mid click)
  3. 最终转化$P(conv \mid click, stay)$ 表示“既点击又停留的前提下,最终转化”的概率。三者连乘得到总转化率。
    P(conv)=P(click)×P(stay∣click)×P(conv∣click,stay)\displaystyle P(conv) = P(click) \times P(stay \mid click) \times P(conv \mid click, stay)

AI 应用场景

电商搜索排序

阶段:精排模型设计与多目标融合

解决的问题:传统电商搜索只优化点击率,导致“标题党”商品霸榜,用户点进去却不下单。多目标排序让模型同时预测点击率、停留概率和转化概率,用加权损失统一训练,让排在前面的商品既吸引人又真正能成交。

具体案例:某电商平台搜索“连衣裙”,旧版排序按点击率排,前三名是低价的模特图商品,点进去详情页质量差。升级为 MMoE 多目标模型后,转化目标权重随搜索词动态调整,前排商品同时满足高点击、高停留、高转化,搜索 GMV 提升 3%。

信息流推荐多指标优化

阶段:召回后的精排打分与重排

解决的问题:短视频/图文信息流需要同时优化点击、完播/停留和互动(点赞评论)。单目标模型容易让人沉迷标题但内容空洞。多目标排序联合三个信号,让模型理解“什么内容真正让人愿意看完并互动”。

具体案例:某资讯 App 的信息流,用 MMoE 架构共享用户兴趣特征,门控网络根据用户当前场景动态分配目标权重:通勤时段更看重点击,晚间休闲时段更看重停留与互动。实验组人均停留时长提升 8%,互动率提升 5%。

招聘平台职位匹配排序

阶段:职位搜索结果排序

解决的问题:求职者搜索职位时,旧方案按相关度文本匹配排序,点击率尚可但投递转化低。多目标排序引入“点击职位、浏览详情时长、投递简历”三个目标,联合优化让高匹配度的职位排在前面,减少无效浏览。

具体案例:某招聘平台把“投递简历”设为转化目标,并给投递样本更高权重,同时在损失中加入“职位薪水档位”特征来辅助停留时长预测。改造后投递转化率提升 12%,求职者平均搜索轮次减少 20%。

Python 演示

python40 行
import numpy as np np.random.seed(42)N, D = 2000, 8X = np.random.randn(N, D)w_true = np.random.randn(D) def sigmoid(z):    return 1.0 / (1.0 + np.exp(-z)) click = (sigmoid(X @ w_true + 0.5) > 0.5).astype(float)stay = (sigmoid(X @ (w_true * 0.8) - 0.2) > 0.5).astype(float)conv = (sigmoid(X @ (w_true * 0.5) - 1.0) * click * stay > 0.5).astype(float) def train_logistic(X, y, lr=0.1, epochs=50):    w = np.zeros(D)    for _ in range(epochs):        p = sigmoid(X @ w)        grad = X.T @ (p - y) / len(y)        w -= lr * grad    return w w_c = train_logistic(X, click)w_s = train_logistic(X, stay)w_v = train_logistic(X, conv) alpha = np.array([0.4, 0.35, 0.25])final = alpha[0] * sigmoid(X @ w_c) + alpha[1] * sigmoid(X @ w_s) + alpha[2] * sigmoid(X @ w_v) def ndcg_at_k(score, label, k=5):    order = np.argsort(-score)    rel = label[order][:k]    dcg = sum((2 ** r - 1) / np.log2(i + 2) for i, r in enumerate(rel))    ideal = np.sort(label)[::-1][:k]    idcg = sum((2 ** r - 1) / np.log2(i + 2) for i, r in enumerate(ideal))    return dcg / idcg if idcg > 0 else 0.0 print("单点击模型 NDCG@5:", round(ndcg_at_k(sigmoid(X @ w_c), click), 4))print("多目标融合 NDCG@5:", round(ndcg_at_k(final, click), 4))print("多目标融合 NDCG@5:", round(ndcg_at_k(final, conv), 4))
目的:用 NumPy 从零实现多目标排序的联合训练——分别训练点击、停留、转化三个逻辑回归打分器,再按权重融合,最后用 NDCG 评估融合后的排序质量。
  1. click = (sigmoid(X @ w_true + 0.5) > 0.5).astype(float)生成点击标签,加入偏置项模拟点击更普遍。
  2. conv = (sigmoid(X @ (w_true * 0.5) - 1.0) * click * stay > 0.5).astype(float)转化标签依赖点击与停留,模拟真实的漏斗结构。
  3. grad = X.T @ (p - y) / len(y)逻辑回归的梯度计算,向量化实现,一行搞定全部样本的梯度。
  4. alpha = np.array([0.4, 0.35, 0.25])点击、停留、转化三个目标的融合权重,对应正文中的 $\lambda$。
  5. final = alpha[0] * sigmoid(X @ w_c) + ...三路打分加权求和,得到最终排序分,模拟联合优化。
  6. def ndcg_at_k(score, label, k=5)实现 NDCG@5 离线评估指标,验证排序质量。

常见误区

误区“点击、停留、转化分别训练三个模型,最后把分数拼起来不就行了吗?为什么要费劲搞共享参数?”

正解三个独立模型各自学习一套特征表示,就像三个厨师各用各的灶台和备菜区,厨房里堆满重复食材。共享底层的意思是让三个目标共用一套特征抽象——比如“用户喜欢便宜商品”这个规律,点击、停留、转化都能受益。独立模型在小数据目标上容易过拟合,共享后冷门目标能借力热门目标,泛化能力更强。MMoE 和共享塔的存在,不是为了省训练时间,而是为了借力。

为何常见:多模型的工程实现更简单直观,每个团队可以各管一个目标,职责分明;一旦涉及共享架构,就需要统一调度特征和训练流程,协作成本更高。

误区“三个目标的权重 $\lambda$ 不就是个超参数吗?我在验证集上调一调,看哪个组合分数高就用哪个。”

正解手工调权有两个隐患。第一,三个目标的损失量纲不同:点击损失可能在 0.3 左右,转化损失可能在 0.01 左右,直接加权会让大量级的损失主导梯度。第二,权重和指标之间不是单调关系——转化权重调大,短期转化率可能上升,但长期会因为推荐过于保守导致点击下降、用户流失。实践上要先对每个子任务做损失归一化(如除以基线损失),再设权重;同时结合业务阶段,比如大促期间临时提高转化权重。

为何常见:权重看起来就是一个“数”,让人误以为可以像调音量一样无脑扭。实际上它背后是梯度的平衡和业务目标的对齐。

误区“停留时长是优化目标,那肯定越长越好,我把所有长内容都排前面不就行了?”

正解停留时长高度依赖内容类型。一篇 3000 字的深度长文天然比 15 秒短视频停留久,但不能说长文价值更高。优化停留必须考虑内容属性,通常的做法是用“相对停留时长”(该内容类型下的基线停留做归一化),或者让模型学习“停留是否超出同类型期望”。真正常用的做法是把停留超过某阈值建模为二分类目标,而不是回归原始秒数。

为何常见:人脑天然喜欢“越大越好”的直觉,把连续指标当作可无限优化的目标,忽略了内容生态本身的多样性约束。

误区“NDCG 提升了 0.05,模型肯定更好了,直接全量上线吧!”

正解离线数据和线上环境存在两层鸿沟。第一,离线样本包含位置偏差——排在前面的结果天然点击高,模型学到的可能只是“模仿旧排序”。第二,线上系统是动态的:新模型改变排序后,用户的点击行为会改变,进而改变未来的训练数据,形成反馈循环。所以离线涨只是必要条件,必须通过 A/B 实验在真实流量上验证,并同时观察点击、停留、转化三个指标,防止单点提升、全局塌方。

为何常见:工程师天然信任可量化的离线指标,因为它快速、免费、可复现;而 A/B 实验要等流量、等天数,还要处理显著性检验,心理上总想跳过这一步。

误区“反正最终目标是转化,把 $\lambda_v$ 设成 0.9,让模型全力优化转化率!”

正解转化样本极度稀疏——1000 次曝光可能只有 5 次转化。把转化权重拉满,模型会对训练集中的少数转化样本严重过拟合,反而在线上泛化失败。更合理的做法是:转化权重适度调高(如 0.3-0.5),同时用“样本重采样”或“梯度裁剪”控制稀疏目标的影响,再把转化目标建模为漏斗条件概率(先点再转化),让模型分步学习,而不是一步到位。

为何常见:业务方给的压力往往集中在最终转化指标上,工程师容易用“最大权重”来回应 KPI 焦虑,忽略了数据分布的现实约束。

面试题

Q1. Learning to Rank 中,哪种方法按“文档对”的相对顺序进行学习?

单选题 · easy

  • A.点级法仅看单个文档
  • B.对级法比较两两文档← 正确答案
  • C.列级法优化整列排序
  • D.强化学习自动探索环境

答案:B。点级法(Pointwise)对单个文档独立打分,对级法(Pairwise)把文档两两组成对子,学习哪一篇更靠前;列级法(Listwise)直接优化整列排序。题干明确说“文档对”,所以选 B。

Q2. 多目标排序中点击、停留、转化三类目标的典型漏斗关系是?

单选题 · easy

  • A.曝光后先点击再停留转化← 正确答案
  • B.转化后才有停留和点击
  • C.三个目标完全相互独立
  • D.停留时间越长点击越低

答案:A。用户必须先看到结果并点击,才可能停留,停留之后才可能转化——这是一个逐级衰减的漏斗。B 把因果顺序颠倒了,C 忽略了目标间天然的依赖关系,D 只是个别现象而非漏斗规律。

Q3. NDCG@k 中 DCG 的折损因子一般取什么形式?

单选题 · mid

  • A.1/log2(i+1)← 正确答案
  • B.1/(i+1)
  • C.1/2 的 i 次方
  • D.1/i 的平方

答案:A。NDCG 用 $\log_2(i+1)$ 对第 $i$ 个位置的增益做打折(位置从 1 计数),这样排名靠后的结果贡献递减。其他选项虽然也有“递减”效果,但并非 NDCG 的标准定义,且衰减方式不符合信息检索的经验设定。

Q4. MMoE 中“门控网络”的核心作用是什么?

单选题 · mid

  • A.为每个样本动态分配专家权重← 正确答案
  • B.直接输出最终排序分数
  • C.把多目标合并成单一目标
  • D.对特征做离散化和归一化

答案:A。门控网络接收输入特征,输出一组权重(softmax 归一化),决定每个专家对这个样本贡献多少。它不直接输出排序分数(那是塔网络的事),也不做特征预处理,更不是简单地把目标合并。

Q5. 训练排序模型时,位置偏差最典型的损害是?

单选题 · hard

  • A.高估前排文档的真实点击率← 正确答案
  • B.使模型对特征完全失去敏感性
  • C.导致训练数据无法生成
  • D.降低特征覆盖率或数据量

答案:A。用户天然更倾向点击排名靠前的结果,所以前排文档的点击率被“位置”虚高。模型若直接用曝光点击做标签,会把位置因素误学成内容相关性,从而高估前排文档。它不会让特征失效、让数据无法生成,也不直接降低覆盖率。

Q6. 下列哪项是典型的“转化”信号?

单选题 · easy

  • A.用户点击进入商品详情页
  • B.用户完成支付并成功下单← 正确答案
  • C.用户滑动浏览页面内容
  • D.用户打开搜索 App 开始

答案:B。转化指用户完成了业务方定义的深度目标动作,电商场景中通常指下单、支付。点击进入详情页属于“点击”信号,滑动浏览属于“停留”信号,打开 App 属于曝光层行为。

Q7. 多目标联合损失 L=λ1L1+λ2L2+λ3L3 中,λ 的作用是?

单选题 · easy

  • A.平衡各目标的重要程度← 正确答案
  • B.改变样本的特征维度
  • C.提高模型的训练速度
  • D.消除位置偏差和噪声

答案:A。λ 是各子任务损失的权重系数,控制模型更偏向哪个目标。它不是特征变换、不涉及训练速度,也不能直接消除位置偏差——位置偏差要靠样本设计和训练策略来解决。

Q8. 下列哪些属于常用的多目标联合训练架构?

多选题 · mid

  • A.硬参数共享加独立任务塔← 正确答案
  • B.MMoE 专家混合与门控← 正确答案
  • C.单塔单目标独立训练
  • D.共享底层加多路输出← 正确答案

答案:ABD。硬参数共享加任务塔、MMoE、共享底层加多输出,都是多目标联合训练的常见方案,核心是“共享表示 + 分头预测”。C 是分别训练多个单目标模型,属于多模型拼装而非联合训练,无法共享特征表示。

Q9. 多目标排序中反馈循环会引发哪些问题?

多选题 · hard

  • A.曝光偏差被模型不断放大← 正确答案
  • B.头部数据越来越集中← 正确答案
  • C.长尾候选逐渐从结果中消失← 正确答案
  • D.梯度传播在训练中更加稳定

答案:ABC。模型排序影响曝光,曝光影响点击数据,数据又反哺模型——这个闭环会放大初始偏差:排序靠前的越来越有点击,排序靠后的越来越没数据,头部内容集中、长尾消失。梯度稳定与反馈循环无关,是优化层面的特性。

Q10. 下列哪些属于排序模型的离线评估指标?

多选题 · easy

  • A.NDCG 归一化折损累积增益← 正确答案
  • B.MAP 平均精确率排序指标← 正确答案
  • C.在线 CTR 实时点击率统计
  • D.MRR 倒数排名均值指标← 正确答案

答案:ABD。NDCG、MAP、MRR 都基于标注好的相关性标签,在离线数据集上计算排序质量,属于离线指标。在线 CTR 必须在真实流量中统计,属于在线指标,不属于离线评估。