【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(4)粗排算法模型多目标算法(Multi Task Learning)及目标融合
第五章:计算机视觉-项目实战之推荐/广告系统
第二部分:粗排算法
第四节:粗排算法模型多目标算法(Multi Task Learning)及目标融合
一、为什么粗排必须是多目标模型?——动机与问题本质
粗排(Coarse Ranking)是推荐广告系统中承前启后的关键一环。它位于:
召回之后、精排之前,用较轻量模型在较大候选集合上筛掉价值不高的样本
然而,粗排与召回不同,它不能只追求“召回兴趣一致的物品”。粗排阶段引入多目标学习(Multi-Task Learning,MTL)是由业务必然性决定的,因为:
| 业务目标 | 意义 |
|---|---|
| CTR(点击率) | 衡量用户兴趣强度 |
| CVR(转化率) | 衡量商业变现能力 |
| GMV / 收益 | 衡量整体推荐价值 |
| 停留时长 / 活跃度 | 衡量用户长期留存 |
| 生态/内容多样性 | 衡量推荐系统健康度 |
粗排不能只追求 CTR,否则系统会变成:
“骗点击”模型 → 短期数据漂亮 → 长期留存下降 → GMV、体验、DAU 变差
因此粗排多目标的核心任务是:
在可接受计算资源下,用一个共享模型同时优化多个业务目标,并最终形成统一排序分数
这就是多任务学习在粗排中的根本定位。
二、粗排阶段常见多任务结构对比
粗排的 MTL 模型常用 4 种结构:
| 模型结构 | 优点 | 缺点 | 是否适合粗排 |
|---|---|---|---|
| Hard Sharing | 简单、快、参数最少 | 易梯度干扰,多个任务互相拖累 | 一般不推荐 |
| ESMM | CTR & CVR 链路建模能力强 | 不适用于多任务扩展 | 有用但不够 |
| MMoE | 任务间竞争+共享最平衡 | 参数中等,结构略复杂 | ✅ 粗排首选 |
| PLE | 更精细任务隔离、效果更强 | 训练略慢 | ✅ 更高效果方案 |
粗排业界默认最佳选择:
MMoE(主流) → PLE(效果更极致)
三、多任务学习中的三大核心技术难点
| 难点 | 现象 | MTL中的表现 |
|---|---|---|
| 梯度冲突 | Loss A 降 → Loss B 升 | CTR 和 GMV 互相“抢特征” |
| 数据分布差异 | 任务样本不均衡 | CVR 天然 1:2000,CTR 1:50 |
| 优化目标博弈 | 短期 vs 长期目标矛盾 | 点击爽 vs 留存差 |
MMoE/PLE 结构的存在,就是为了解决梯度冲突 + 特征共享失衡这两个本质问题。
四、目标融合(Multi-Objective Fusion)——粗排最后的关键一公里
多个任务得到多个输出,如:
-
(
)
-
(
)
-
( gmv )
-
( stay_score )
最终粗排必须融合为一个分数用于排序,核心融合方式:
方式一:线性加权 (经典 & 工业可控)

优点稳定,缺点需要人工调参
方式二:基于收益的动态加权(效果更好)
根据实时 ROI / GMV 截断动态调整权重
适合广告粗排,收益最大化能力强
方式三:自适应融合(最智能)
利用权重网络(Gating Fusion)由模型学习权重,而不是人工设置
适用于推荐粗排,能够兼顾业务全面目标
五、TensorFlow 2.x + Keras 实战:MMoE 粗排多任务模型
以下为可直接训练的粗排多目标 MMoE Keras 代码(可运行 & 可扩展):
import tensorflow as tf
from tensorflow.keras import layers, Modelclass MMoE(layers.Layer):def __init__(self, units, num_experts, num_tasks):super().__init__()self.experts = [layers.Dense(units, activation="relu") for _ in range(num_experts)]self.gates = [layers.Dense(num_experts, activation="softmax") for _ in range(num_tasks)]def call(self, inputs):expert_outputs = tf.stack([expert(inputs) for expert in self.experts], axis=1)task_outputs = []for gate in self.gates:gate_weights = tf.expand_dims(gate(inputs), axis=-1)task_output = tf.reduce_sum(expert_outputs * gate_weights, axis=1)task_outputs.append(task_output)return task_outputs# 构建粗排模型
inputs = layers.Input(shape=(128,))
mmoe_outputs = MMoE(units=64, num_experts=8, num_tasks=2)(inputs)ctr_output = layers.Dense(1, activation="sigmoid", name="ctr")(mmoe_outputs[0])
cvr_output = layers.Dense(1, activation="sigmoid", name="cvr")(mmoe_outputs[1])model = Model(inputs=inputs, outputs=[ctr_output, cvr_output])
model.compile(optimizer="adam",loss={"ctr": "binary_crossentropy", "cvr": "binary_crossentropy"},loss_weights={"ctr": 1.0, "cvr": 2.0}
)
model.summary()
你会看到几个关键点:
✔ Experts 共享
✔ Gates 控制任务分离
✔ Loss 加权影响业务重点
✔ 结构轻 → 适合粗排
六、线上粗排架构与多任务融合的工程落地
部署到粗排线上,一般遵循:
特征服务 → 粗排模型(MTL) → 得分融合 → TopN → 精排 → 召回补充 → 重排序 → 展示
监控指标必须包含:
-
AUC(CTR/CVR)
-
GMV / ROI
-
分层曝光比例
-
长短期目标平衡度
七、本节总结(写在节尾的小结)
| 粗排阶段真正任务 | 对应 MTL 作用 |
|---|---|
| 平衡点击与收益 | CTR + CVR + GMV 多目标 |
| 在有限曝光中控权 | 分数融合策略 |
| 保证结构健康 | 多任务避免“骗点击” |
| 追求轻量高效 | MMoE / PLE 是最佳选择 |
一句话总结本节:
粗排不是优化单一目标,而是通过多任务学习最大化整体系统价值,而目标融合是粗排能否真正跑起来的决定性步骤。
