王子一:飞猪稀疏高客单场景下的CVR优化实践

导读:飞猪推荐场景基于旅游业务,它具有样本标签稀疏与客单价较高的特点。在高度稀疏的单场景下进行建模具有很大的挑战性。在实际业务中,我发现CVR优化不仅仅依赖于模型设计,更应该注重特征层面的设计。今天我分享的主题是稀疏高客单场景下CVR优化。

今天的介绍会围绕下面四点展开:

  • 背景介绍
  • 特征设计
  • 稀疏场景下CVR模型优化
  • 总结

01

背景介绍

首先和大家分享飞猪推荐的业务背景。

王子一:飞猪稀疏高客单场景下的CVR优化实践

飞猪app导购链路由三个主流场景组成:首页猜你喜欢(承接用户行前“种草”的需求)、主搜(承接用户的多样性需求)和小搜(承接用户更加明确的需求)。旅行的推荐场景相较于其他推荐场景的客单价更高,这意味着相对较小的CVR提升会带来GMV的显著增长。

王子一:飞猪稀疏高客单场景下的CVR优化实践

飞猪推荐场景下另外一个特点是用户的反馈行为十分稀疏。这是因为旅行是一个低频需求,一个用户一年平均只会有一到两次旅行需求,且由于最近疫情的影响,这类需求变得更加少。上图展示的是飞猪app在某一场景下的转化漏斗。用户点击与曝光的比例约为1:50,购买与点击的比例则更小,约为1.4:100。所以,在高度稀疏的单场景下建模CVR模型是一个极具挑战性的问题。

--

02

特征设计

下面分享排序模型中的特征设计相关工作。

王子一:飞猪稀疏高客单场景下的CVR优化实践

虽然深度学习模型以及在搜推广领域取得巨大成功,且大家普遍认为深度学习可以代替复杂的手工特征工程。但实际上,在搜推广领域并没有一个完全令人满意的模型来取代特征工程。所以,在日常的业务优化中,我们始终相信:特征决定了学习任务的上限,而模型只是用来逼近这个上限。

上图右侧是我们日常业务中使用的特征体系,它由四个部分组成:item侧特征、user侧特征、query侧特征和上下文特征。

王子一:飞猪稀疏高客单场景下的CVR优化实践

首先介绍item侧特征。其中最容易想到的是item的静态特征,包含item的价格、目的地、类目特征等,它们对排序模型非常有效。除了静态特征之外,我们还考虑了item的效率特征来在一定程度上反映商品的热度。具体地,我们可以通过构造item不同周期内ctr、cvr的值来反映商品的热度趋势。值得注意的是,商品的效率特征的值来输入排序模型是不够的,在一定程度上也是有偏的,因为这部分数值在不同周期内的含义不同。例如,若旅游旺季的转化率与旅游淡季的转化率相等,实际上它对应的商品热度相差很大。针对上述问题,我们额外设计了item在不同维度下的rank特征,它包含item在不同维度的ctr与cvr的排名,它能更加稳定地反映商品的热度。我们可以通过自己的想象力创造各种各样的条件(即维度),比如item在不同query下的排名特征、item在不同用户购买力下的排名特征、item在不同用户年龄阶段的排名特征、item在不同lbs下的排名特征等。上述例子仅仅包含了一阶条件下的排名特征,我们也可以设计二阶或者更高阶维度的商品排名。

值得强调的是,在构造效率、排名这类型统计特征时,我们需要防止特征穿越问题,一定要使用yesterday计算出来的数据进行模型训练。这是因为模型在线上inference时是拿不到当天的效率特征的(实时效率除外)。

王子一:飞猪稀疏高客单场景下的CVR优化实践

user侧特征代表着用户的个性化特征。最容易想到的特征是user静态特征,包括用户性别、年龄、购买力等。除此之外,我们构造实时和准实时特征来表达用户的即时兴趣。例如,我们构造了用户t+1偏好特征,根据用户历史行为序列计算不同周期内对不同目的地的偏好、不同类目的偏好、不同poi的偏好等。上述特征对应该用户的准实时偏好特征,在一定程度上反映了用户兴趣的变化。用户的实时特征对于排序模型更为重要,常用的特征有用户当前的lbs信息、当前时间信息、用户实时的点击序列、用户实时的购买序列等。在使用实时特征时我们一定要注意线上线下特征一致性的问题,否则就会导致模型训练时离线AUC指标很好,但是模型在线推理时AUC指标下降的现象。所以,我们在使用实时特征时务必先进行埋点,之后在离线按着时间戳解析埋点特征。

王子一:飞猪稀疏高客单场景下的CVR优化实践

上下文特征包含召回侧特征(match type、match score、召回的trigger特征)、粗排侧特征(粗排打分)、user侧上下文特征(用户当前lbs信息与商品lbs的距离)以及item侧的上下文特征。比如,如果是详情页的排序场景,item侧的上下文特征还包含入口trigger item与目标item的相似性特征、item价格在排序集合中的排名特征、item距离在排序集合中的排名特征等。同样地,上下文特征也需要发挥自己的想象力构造出尽可能完备的特征,这样能极大地提高模型的性能。有一个思路是可以最大程度利用未曝光的数据来构造上下文特征,事实证明利用未曝光数据构造的特征在我们的排序任务中特别有效。

王子一:飞猪稀疏高客单场景下的CVR优化实践

最后,query特征依赖于NLP算法团队的能力。例如,query类型的识别、query向量的预训练与query的相关性特征是由专业的NLP算法团队提供的。值得注意的是,搜索场景很重视搜索结果的鲁棒性,所以query归一化对排序的稳定性有非常重要的影响。综上,我们需要与NLP算法团队紧密合作,使得他们可以提供尽可能丰富的query侧特征,它们对排序模型的最终效果也有一定提升。

--

03

稀疏场景下CVR模型优化

王子一:飞猪稀疏高客单场景下的CVR优化实践

CVR模型的优化有两种技术路线。第一种是直接套用CTR模型,这是因为CVR模型训练与CTR模型训练只是数据样本集合和标签不同,解决方案其实是相似的。第二种路线是针对CVR预测中的问题特别设计针对性的CVR模型。具体地,CVR预测主要存在三类问题:SSB问题、稀疏性问题和延迟反馈问题。飞猪主要针对稀疏样本下CVR的准确预估问题进行模型优化。

王子一:飞猪稀疏高客单场景下的CVR优化实践

业界最有名的缓解CVR样本稀疏性的方法是ESMM模型,它通过CVR模型与CTR模型共享embedding来缓解CVR样本稀疏的问题。同时,它通过建模CTCVR与CTR的关系来缓解样本SSB问题。模型训练时的损失函数由CTR任务与CTCVR任务的损失函数组成。

王子一:飞猪稀疏高客单场景下的CVR优化实践

旅行场景下的样本稀疏性问题,更显著的是正样本的稀疏性,即正负样本极度不平衡问题。针对这个问题,我们提出了泛label建模缓解正负样本的不平衡问题。从上图可以看出,成交items在曝光样本中占比很小,我们的想法是选取与成交items相关的标签来辅助CVR模型的训练。事实上,购买是用户的最强意图,其中也隐含了用户对同类目和目的地商品的偏好。通过分析飞猪某一个推荐场景下的转化漏斗,我们发现购买行为与点击行为比约为1:1000,购买同类目商品的行为与点击行为比约为1:30,购买同目的地商品的行为与点击行为比约为1:30。从分析结果来看,我们任务1:30的购买/点击比已经很大程度上缓解了数据稀疏性问题,所以我们决定使用同类目以及同目的地的购买标签来辅助CVR模型学习。

王子一:飞猪稀疏高客单场景下的CVR优化实践

具体地,我们构造了label_dest与label_cate两类泛label。虽然它们并没有直接反应用户在目标场景下的真实购买需求,但是它们隐含了用户的购买偏好,可以用来辅助主任务进行学习。我们将用户特征分别与目的地特征和类目特征进行拼接,经过全连接层得到相应标签的打分,通过各自的损失函数更新模型参数。通过这一方法,由于label_dest和label_cate对应的模型可以被充分学习,而模型的部分参数与主任务的CVR模型可以进行共享,且它们输出的向量表征会与CVR模型提取的特征进行拼接,所以主任务CVR模型面临的数据稀疏性问题可以在一定程度上得到缓解。

王子一:飞猪稀疏高客单场景下的CVR优化实践

在实际使用场景下,我们还面临一个较为棘手的问题即主任务在一个batch size下可能没有一个正样本,这会导致CVR模型的学习有被负样本主导的风险。所以,我们加入了一个trick。具体地,我们使用动态路由的方法使得模型在不同输入样本的条件下更新不同分支的参数。判断条件是一个batch内是否包含了正样本。最终模型输出的得分是包含正样本的分支的输出。

王子一:飞猪稀疏高客单场景下的CVR优化实践

除了泛label建模的方法,我们还提出了全域成交建模的方法来缓解正样本稀疏性的问题。一般而言,推荐或搜索的流程分为召回(召回后的结果约为3000)->粗排(粗排后的结果约为300)->精排(300个里最后有10个左右展示给了用户)。通过精排模型,我们会样本根据得分依次展现给用户,而这些样本即为曝光样本。因为用户几乎不可能浏览所有候选商品,所以曝光样本只占精排打分样本的很小一部分。进一步,用户的购买样本集合是曝光样本集合中很小的子集。而商品在特定场景的成交是全域成交的一个子集,因此针对不同场景我们通过全域成交进行建模,理论上就可以缓解本场景CVR建模中正样本稀疏性的问题。传统意义上,CVR数据集由曝光成交的正样本和曝光未成交的负样本(点击样本)组成。而全域成交建模通过加入了本场景中进入了精排但未曝光且在其他场景下成交的样本(其未在本场景成交)作为新增的正样本,本场景未曝光未成交的样本作为新增的负样本。

王子一:飞猪稀疏高客单场景下的CVR优化实践

王子一:飞猪稀疏高客单场景下的CVR优化实践

通过全域成交建模,我们定义了两个新的概率预估公式:曝光商品在全网成交的概率以及全网成交商品在小搜成交(即在本场景成交)的概率。具体概率的定义如上图公式所示。

王子一:飞猪稀疏高客单场景下的CVR优化实践

通过将两个新定义的概率预估公式相乘,我们可以推导出目标概率预估,即曝光商品在本场景下的成交概率。这就意味着我们可以通过建模两个新定义的概率来间接地得到目标概率。

王子一:飞猪稀疏高客单场景下的CVR优化实践

引入全域成交样本后,样本稀疏性问题得到极大的缓解,所以我们直接建模L2o(曝光-成交)的概率。但是,我们在上述建模过程中并没有使用CTR标签,这就会导致线上实际的转化率并没有得到提升,甚至会有所下降。分析原因,这是因为线上的排序既会影响点击也会影响成交,只有排序的结果同时兼顾点击和成交,线上的效率才能最大化。目前所呈现的建模方式虽然使得CTCVR指标有所提升,但是CTR指标很糟糕,所以导致线上转化率降低。

王子一:飞猪稀疏高客单场景下的CVR优化实践

基于上述分析,我们加入了CTR任务作为辅助任务,提高L2o模型在CTR数据上的效率。这一建模方式同时兼顾了CTR任务的效果和CTCVR任务的效果,达到使用户点击率提升的同时提高CTCVR指标的目的。

王子一:飞猪稀疏高客单场景下的CVR优化实践

在优化过程中,我们发现当CTCVR指标的提升达到一个瓶颈时,我们转而考虑进一步优化CTR的建模。具体地,我们将点击关系分为三类:query-item、user-item和context-item,并依此设计了额外三个辅助任务。三个任务的CTR标签和之前CTR辅助任务的标签一致。这一改进的建模方式在保证不影响CTCVR效果的基础上提升了CTR的效果,而这对线上CVR也有着正向影响。

王子一:飞猪稀疏高客单场景下的CVR优化实践

除了特征和模型上的一些工作,我们还尝试在损失函数上进行优化。一般情况下,模型会经过在离线训练数据集上训练,在测试集上评估来观察模型效果。交叉熵损失函数是排序任务最常用的优化目标,而AUC是排序任务中最常见的评估指标。但是交叉熵函数与AUC函数存在一定的gap,所以我们考虑是否可以通过AUC指标来直接训练排序模型。

王子一:飞猪稀疏高客单场景下的CVR优化实践

但是直接使用AUC进行训练存在很大的问题,从AUC的计算公式可以看出,在有限样例下,AUC函数是不可导的(阶跃函数不连续),无法对模型参数进行优化。

王子一:飞猪稀疏高客单场景下的CVR优化实践

为了避免AUC损失函数不可到的问题,我们设计了近似函数rank loss,具体公式如上图所示。Rank loss在形式上与AUC损失类似,只是通过近似函数来使得整体函数可导。

王子一:飞猪稀疏高客单场景下的CVR优化实践

在实际应用时,直接使用rank loss还是存在一定的问题,它会使得模型优化的收敛变得十分困难。基于此问题,我们融合了交叉熵损失和rank loss。融合方式可以有相加与相乘两种形式。从实践中我们发现两种方式的训练效果相近。

--

04

总结

最后做一个简单的总结。

首先,作为一个算法工程师,特征是排序任务中最值得花时间研究的部分。个人认为这部分工作的重要性占比可以达到八成到九成左右。其次,模型只是用来逼近学习任务的上限,模型太多不如先尝试MLP。在此基础上,我们可以针对自己的业务场景,尝试引入更多的辅助标签和数据来缓解稀疏学习的问题。这部分工作的重要性占比约为5%到10%。最后,交叉熵损失能够胜任绝大部分任务,学有余力的情况下可以尝试使用替代的AUC 损失。实际使用过程中,我们发现使用交叉熵损失函数已经可以使得模型得到不错的线上效果。

--

05

Q&A

Q :增加item侧效率特征是否会加重马太效应?

A:可能问题提到的结论有一些理论的支撑,但是在我们实际应用中,增加item效率特征对模型AUC的提升起着至关重要的作用。只要你能注意特征穿越问题,item的效率特征能很好地体现商品的热度特征,进而得到较优的排序结果。

Q:排名类特征会做归一化吗?不同维度下排名特征的差异较大,飞猪是如何解决这一潜在问题的?

A:不需要做归一化处理。Item的排名特征在排序模型中可以看作直接作用在一类具体的用户上的,在这类用户上是完全可比的,不同类的排序特征不共享底层的embedding,而且排名不会受到周期性因素的影响,所以它是一个较为鲁棒的特征。

Q:排序特征存在波动性问题,例如今天排第一名明天排第二名,飞猪是如何缓解这一现象的?

A:确实会出现短期内特征出现波动的问题,因此一般情况下的排序特征并不会仅针对一天内的数据进行统计,而是会基于一个时间窗口下的数据进行排名。短期内的排名特征确实存在波动性,所以通常情况下我们的时间周期会设置为7天、15天或者30天甚至更长。

Q:实时特征为什么存在线上线下不一致的问题?

A:这是因为线上可能存在埋点相关的问题。比如,线上是否将上一时刻的点击行为进行有效的埋点。这属于工程方面的问题,若实时流捕捉不及时则会出现线上线下不一致的问题。

Q:统计类和排序特征需要经过额外处理再作为模型的输入吗?

A:排序模型的输入是经过embedding化的特征。所以,统计类特征可以经过等频或者等宽离散化,经过一个embedding层得到输入特征。排序特征则不需要进行离散化,我们通常只保留前20或30名的特征,其分别对应着一个embedding。

Q:query归一化具体指的是什么?

A:用户的搜索输入具有差异。例如搜索“上海迪士尼”集合“上海 迪士尼”,或者“上海迪士尼”和“上海迪斯尼”,这两个query词本质上是一样的,若不使用归一化进行处理,则这两个query对应的特征就会不同的。query归一化是一个比较复杂的问题需要依赖NLP团队的算法能力。

Q:ESMM需要将CTR侧样本标签不为1的样本过滤掉吗?

A:不需要。ESMM并没有建模CVR,而是建模CTR与CTCVR。CTR与CTCVR建模的样本集是全域的曝光样本,CVR只是一个中间输出概率。

Q:在泛label建模中使用路由的方式选择有正样本的一路作为最终的CVR输出,这个trick有实验证明其有效性吗?

A:这个trick是需要根据当前样本稀疏问题的严重性来考虑是否使用的。我们在实验过程中设置的batch size为1024,而我们正负样本的比例远小于1:1024,所以我们认为这个trick是有效的。如果在你们的场景下batch size在大部分情况下能覆盖到正样本,那么这个trick的作用较小。

Q:泛label建模多分支的trick是否会改变样本分布?

A:可以这么认为。但是模型的共享参数的训练样本还是全域样本,只是最终的分支会丢弃一些样本来保证一路一定存在一个正样本。虽然这一做法会在一定程度上使得样本分布有偏(这路模型的顶层结构未见过全部的负样本),但是由于底层参数是共享的因此这种偏几乎可以忽略。

Q:将未曝光未成交的样本作为负样本会增大马太效应吗?

A:不会。我们加入未曝光未成交的样本作为负样本有以下考虑。如果我们仅仅将其他场景下成交的样本作为增加的正样本,那么这些额外正样本在某些特征维度是无法与原始样本集对齐的,导致特征分布不一致。于此类似的是,新增的负样本在一些维度上也会存在特征的缺失。所以引进未曝光未成交的样本作为负样本可以缓解模型在引进的正样本上学偏。

Q:旅行场景下从点击到成交的决策pipeline较长,飞猪在评价业务目标的时候是依据一次请求是否成交还是宽口径的成交?

A:我们的成交口径也是当天的,并没有拉长,我们目前将用户在曝光样本中点击了商品但在其他场景下成交的样本都作为本场景的正样本,即记录本场景的成交量中。


今天的分享就到这里,谢谢大家。

阅读更多技术干货文章、下载讲师PPT,请关注微信公众号“DataFunTalk”。


分享嘉宾:王子一 飞猪 高级算法工程师

编辑整理:吴祺尧 加州大学圣地亚哥分校

出品平台:DataFunTalk


分享嘉宾:

王子一:飞猪稀疏高客单场景下的CVR优化实践


关于我们:

DataFun:专注于大数据、人工智能技术应用的分享与交流。发起于2017年,在北京、上海、深圳、杭州等城市举办超过100+线下和100+线上沙龙、论坛及峰会,已邀请超过2000位专家和学者参与分享。其公众号 DataFunTalk 累计生产原创文章700+,百万+阅读,14万+精准粉丝。


欢迎转载分享评论,转载请私信。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章