真实面经题目 · 原创解析
ESMM模型里,CVR和CTR任务共享Embedding层,这个在代码层面具体是怎么实现的?
ESMM 中 CTR 和 CVR 任务共享 Embedding 的代码实现,本质是同一批稀疏特征经过同一组 Embedding layer 查表,得到共享底层表示,再分别进入 CTR tower 和 CVR tower。回答要讲清共享参数、前向路径、loss 设计和训练样本空间。
真实面经题目 · 原创解析
ESMM 中 CTR 和 CVR 任务共享 Embedding 的代码实现,本质是同一批稀疏特征经过同一组 Embedding layer 查表,得到共享底层表示,再分别进入 CTR tower 和 CVR tower。回答要讲清共享参数、前向路径、loss 设计和训练样本空间。
代码层面可以把用户、商品、上下文等稀疏特征先定义成共享 Embedding 表,CTR 和 CVR 两个任务都调用同一批 embedding layer 得到底层向量。然后把共享向量分别送入 CTR tower 和 CVR tower,输出 pCTR 和 pCVR,ESMM 通常还会用 pCTCVR=pCTR*pCVR 约束转化链路。训练时 CTR loss 用曝光样本,CTCVR loss 用曝光到转化链路,参数更新会同时影响共享 Embedding 和各自 tower。
ESMM 面向点击和转化两个任务,输入通常是同一套用户、商品、场景和上下文稀疏特征。代码里会先为这些 field 建立 Embedding 表或统一的 feature embedding 模块。
共享不是复制两份参数,而是 CTR tower 和 CVR tower 的前向过程都引用同一个 embedding layer。这样同一个 feature id 查到的是同一组向量,反向传播时两个任务的梯度都会更新这组参数。
Embedding 输出通常会 concat 或 pooling 后形成共享底层表示,再分别进入 CTR tower 和 CVR tower。两个 tower 可以有不同 MLP、BN、dropout 和输出层,从而学习各自任务的高层表达。
ESMM 通过 pCTCVR=pCTR*pCVR 建模从曝光到点击再到转化的链路。训练时常对 CTR 和 CTCVR 同时计算 loss,缓解传统 CVR 只在点击样本上训练带来的样本选择偏差。
实现时要注意 field 配置、Embedding 维度、参数命名、特征缺失、梯度冲突和任务 loss 权重。共享底层能提升样本利用,但如果两个任务冲突明显,可能需要门控、MMoE 或部分共享结构。
两个任务 loss 反向传播都会流到同一个 Embedding 参数上,最终梯度会累加或按权重组合,因此 loss 权重和任务冲突需要关注。
传统 CVR 常只在点击样本上训练,而线上要在曝光空间预估。ESMM 通过 CTR 和 CTCVR 联合建模,让转化链路在曝光样本空间内学习。
如果 CTR 和 CVR 关注的特征语义差异大,完全共享可能产生负迁移。可以尝试部分共享、任务专属 embedding、门控网络或 MMoE。