真实面经题目 · 原创解析

ESMM模型里,CVR和CTR任务共享Embedding层,这个在代码层面具体是怎么实现的?

ESMM 中 CTR 和 CVR 任务共享 Embedding 的代码实现,本质是同一批稀疏特征经过同一组 Embedding layer 查表,得到共享底层表示,再分别进入 CTR tower 和 CVR tower。回答要讲清共享参数、前向路径、loss 设计和训练样本空间。

出现于 2 个公司岗位 · 3 条面经记录

60 秒回答模板

代码层面可以把用户、商品、上下文等稀疏特征先定义成共享 Embedding 表,CTR 和 CVR 两个任务都调用同一批 embedding layer 得到底层向量。然后把共享向量分别送入 CTR tower 和 CVR tower,输出 pCTR 和 pCVR,ESMM 通常还会用 pCTCVR=pCTR*pCVR 约束转化链路。训练时 CTR loss 用曝光样本,CTCVR loss 用曝光到转化链路,参数更新会同时影响共享 Embedding 和各自 tower。

考点 同一张表
难度 算法岗真实面经题
回答目标 讲清方法、取舍和追问

深入解析

01

先定义共享特征

ESMM 面向点击和转化两个任务,输入通常是同一套用户、商品、场景和上下文稀疏特征。代码里会先为这些 field 建立 Embedding 表或统一的 feature embedding 模块。

02

共享 Embedding 调用

共享不是复制两份参数,而是 CTR tower 和 CVR tower 的前向过程都引用同一个 embedding layer。这样同一个 feature id 查到的是同一组向量,反向传播时两个任务的梯度都会更新这组参数。

03

拆分任务 tower

Embedding 输出通常会 concat 或 pooling 后形成共享底层表示,再分别进入 CTR tower 和 CVR tower。两个 tower 可以有不同 MLP、BN、dropout 和输出层,从而学习各自任务的高层表达。

04

理解 ESMM 约束

ESMM 通过 pCTCVR=pCTR*pCVR 建模从曝光到点击再到转化的链路。训练时常对 CTR 和 CTCVR 同时计算 loss,缓解传统 CVR 只在点击样本上训练带来的样本选择偏差。

05

工程注意事项

实现时要注意 field 配置、Embedding 维度、参数命名、特征缺失、梯度冲突和任务 loss 权重。共享底层能提升样本利用,但如果两个任务冲突明显,可能需要门控、MMoE 或部分共享结构。

易错点

  • 不要说共享 Embedding 是把两份向量初始化成一样,真正共享是引用同一组参数。
  • 不要只讲模型结构,ESMM 的关键还包括 pCTCVR=pCTR*pCVR 的链路约束。
  • 不要忽略样本空间,CVR 只用点击样本训练会有选择偏差。
  • 不要默认多任务一定互相促进,任务冲突和 loss 权重需要监控。

面试官追问

共享 Embedding 的梯度怎么更新?

两个任务 loss 反向传播都会流到同一个 Embedding 参数上,最终梯度会累加或按权重组合,因此 loss 权重和任务冲突需要关注。

ESMM 为什么能缓解 CVR 样本选择偏差?

传统 CVR 常只在点击样本上训练,而线上要在曝光空间预估。ESMM 通过 CTR 和 CTCVR 联合建模,让转化链路在曝光样本空间内学习。

什么时候不适合完全共享 Embedding?

如果 CTR 和 CVR 关注的特征语义差异大,完全共享可能产生负迁移。可以尝试部分共享、任务专属 embedding、门控网络或 MMoE。