【第五章:计算机视觉-项目实战之推荐/广告系统】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 代码(可运行 & 可扩展)

python 复制代码
import tensorflow as tf
from tensorflow.keras import layers, Model

class 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 是最佳选择

一句话总结本节:

粗排不是优化单一目标,而是通过多任务学习最大化整体系统价值,而目标融合是粗排能否真正跑起来的决定性步骤。

相关推荐
熬了夜的程序员3 小时前
【LeetCode】89. 格雷编码
算法·leetcode·链表·职场和发展·矩阵
RainSky_3 小时前
LNMP 一键安装包部署 Django 项目
后端·django·1024程序员节
newxtc3 小时前
【江苏政务服务网-注册_登录安全分析报告】
人工智能·安全·yolo·政务·1024程序员节·安全爆破
rengang663 小时前
013-Spring AI Alibaba Studio 功能完整案例
人工智能·spring·spring ai·ai应用编程
上去我就QWER3 小时前
Python下常用开源库
python·1024程序员节
Bryce李小白3 小时前
Flutter中Key的作用以及应用场景
1024程序员节
對玛祷至昏4 小时前
数据结构理论知识
数据结构·算法·排序算法
oliveira-time4 小时前
二分搜索(Binary Search)
算法
黄思搏4 小时前
红黑树 - Red-Black Tree 原理与 C# 实现
数据结构·1024程序员节