电商多目标优化小结

作者:吴海波 蘑菇街

整理:Hoh Xil

来源:误入机器学习的码农@知乎专栏

背景

一直以来,电商场景就存在 ctr、cvr、gmv、成交 uv 等多个目标,都是核心指标。理想情况下,提升 ctr 就能提升 gmv,但据我所知,在一定程度上,ctr 和 gmv 并不是完全一致。一般大幅的 ctr 提升,都会带来相关的 gmv 的提升,但小幅度的 ctr 提升就不一定了,有的时候还是负向的。

那是否只优化 GMV 就可以了呢?一方面,虽然电商公司最终追求 gmv,但是 ctr 之类的指标,一定程度上代表着用户体验,也需重点关注。另一方面,GMV 等成交指标,比起点击率相关的指标,更难优化。成交比起点击,数据稀疏很多,且受更多的场外因素影响。

大数公司这个问题并不严峻,每个目标训练个模型,拍个公式在线上揉在一起也能用。且在大公司,不同模型各自有团队在做,也没有很强的融合意愿。而我们不行,由于淘宝的网络效应,决定了我们无法依靠 cpc 竞价的模式走向盈利。因此,只做好 ctr 预估并不够,如何融合 ctr、gmv、收入等目标,则成为我们重点要解决的问题。

去年 ESMM 出来时,我们已经做过一些相关尝试了,并没有很成功。当时的想法很朴素,希望从丰富的 ctr 样本中学习到一部分能够 generalization 的表达,辅助 cvr 的学习。ESMM 这篇论文给了我们进一步的信心。另外,还从 dupn 的论文中借鉴了不少特征构建的想法,经过几个月的尝试,迭代了几版,拿到相对不错的结果。

模型总体策略

1. 模型预估目标

用户在平台的行为遵循一定的顺序决策模式:

impression->click->conversion

CVR 模型旨在预估用户在观察到曝光商品进而点击到商品详情页之后购买此商品的概率,即:

pCVR=p(conversion|click, impression)

CVR 模型的目标是预估条件概率 pCVR,与其相关的两个概率为点击率 pCTR 和点击转化率 pCTCVR,它们之间的关系如下:

2. 模型结构

样本按照正负样本比例=1:6的比例进行采样,这里的正样本指的是点击正样本。

借鉴阿里妈妈提出的 ESMM 模型(完整空间多任务模型),使用全站用户行为序列数据(包括点击、加购、收藏等),使用多任务学习的思路,引入了两个辅助的学习任务,在完整的曝光样本空间,分别拟合 pCTR 和 pCTCVR,从而缓解传统 CVR 预估模型难以克服的样本选择偏差和训练数据稀疏的问题。

对于一个给定的展现,模型能够同时输出预估的 pCTR、pCVR、pCTCVR。模型主要由两个子网络组成,左边的子网络用来拟合 pCVR,右边的子网络用来拟合 pCTR。两个网络的输出结果相乘,即为 pCTCVR。具体反映在目标函数中:

即用 CTCVR 和 CTR 的监督信息训练网络,隐式学习 CVR。本次实验,只使用 MTL 模型的 CVR 网络产出的 CVR 预估分用于排序。

过程中一些有意思的点

1. 预估偏置问题

一开始,我们希望直接采用 ctcvr 的结果,去替代线上的融合模型。但结果不太理想,我们做了很多数据分析,发现主要是由于 ctcvr 在预估上存在比较大的偏置。比如对订单量很少的样本,cvr 预估会明显偏高。而在数据量相对丰富的头部样本,预估的分数没有表现出差异,过于集中。

尝试了几种校准方案后,效果不是特别理想。但发现模型结构中的 cvr,校准的难度比 ctcvr 低,经过一段时间的尝试,上线效果还是不错的。

2. 增加 attention 层的 share

原有结构仅共享底层 embedding 表达,即 CVR-task 和 CTR-task 两个子网络的 embedding 层共享 embedding 向量(特征表示)词典。embedding 层的参数占据整个网络参数的绝大部分,需要大量的训练样本才能充分学习到。

由于 CTR 任务的训练样本量远远超过 CVR 任务的训练样本量,ESMM 模型中,embedding 共享的机制能够使得 CVR 子任务能够从只有曝光没有点击的样本中学习,从而可以极大缓解训练数据稀疏的问题。

在此基础上,鉴于行为序的重要作用,我们把行为序列的 attention 参数共享。对比原结构:ctr、cvr、ctcvr 的 auc 都有明显的提升。

3. DUPN 类的特征

这个说法是我们内部发明的,其实一点也不严谨,只不过是我们借鉴了 dupn 那边论文中特征构建的方式。

不同的 ID 特征从不同规模上刻画了商品。比如 shop、brand、cid、sale 等属于比较泛化的特征,描述商品的一般特征;而商品 ID 属于非常个性化的特征,描述了商品的独特性。

在用户点击序列的基础上,拓展 dupn 的思路,根据用户当前或历史的行为,去预测用户的一些隐藏信息,比如偏好品牌、偏好类目、用户购买力、价格偏好、商品的评价数量、商品的价格、商品的销量、商品的喜欢数等泛化特征,这些信息与原始用户点击序列一起,会帮助模型学习商品表达。

4. 训练本身的问题

虽然 ESMM 的思路很赞,但是联合训练本身就会带来新的问题,模型训练收敛更难了,且更慢了。在我们前期实践过程中,经常会发现 logit 飘了、nan 了,除了一些代码 bug 外,就需要精细的调参和数据清洗了。

训练速度慢,对我们也是一个很大的挑战。我们的集群资源有限,特别要训练 ctcvr 模型,对数据量的要求更高,也是我们在 ctcvr 上进展缓慢的另一个重要原因。

可以预见,如果我们再增加更多的目标 loss,这个问题会更尖锐。

5. 一个小问题

在计算 ctcvr_logits 的时候,应该算:

sigmoid(ctr_logits) * sigmoid(cvr_logits)

即两个网络的输出,做 sigmoid 之后再相乘。众所周知,TensorFlow 中是不提供单独的 cross entropy loss 计算函数的,只有 ① 和 ② 两类:

① softmax_cross_entropy_with_logits

② sigmoid_cross_entropy_with_logits 

不过现在 Keras 里有这种东西了,categorical_crossentropy 可以指明输入的是 logits 而非 softmax。

重新实现 了sigmoid + loss 交叉熵函数,并对边界值进行了严格校验。但是在 embedding 向量从32维扩展到128维,会出现输出 Nan 的情况,调小优化器的学习率,可以暂时避免出现 Nan。

总结

这种 mutil-task 联合训练的方式,在我们线上实践中,比单独 ctr 和 cvr 模型分开训练,总体表现上要好不少,可以做到 ctr 不怎么降,gmv、收入有明显的提升。

再说个题外话,针对多目标的问题,我们还想过尝试 RL。RL 最吸引我的是 long term reward,我们可以在 reward 中引入多目标。但 RL 的问题太多了,而现有的技术,大多已经是基于实时的行为 seq 做,RL 目前没有给我特别大的吸引力。

最后,非常感谢参与其中的小伙伴们坚持不懈的努力。

对作者感兴趣的小伙伴,欢迎点击文末阅读原文,与作者交流。

——END——

文章推荐:

推荐系统走向下一阶段最重要的三个问题

京东电商推荐系统实践

DataFun:

专注于大数据、人工智能领域的知识分享平台。

一个「在看」,一段时光! :point_down:

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章