Skip to content

Model-agnostic Integrated Cross-channel Recommender #3

Open
@Doragd

Description

@Doragd

CIKM'22 腾讯 | 召回模型大一统:U2I/U2U/I2I召回联合建模

多路召回联合建模问题

推荐系统中的召回层主要是希望从全库去捞一批“尽可能好”的物料。“尽可能好”的定义是比较模糊的,可能有多方面的考虑,比如相关性,成交率和点击率等不同目标。如果只用一路召回,很难达到多个目标之间的平衡。最简单的方法就是采用多路召回的方式,去建模不同的目标,相互补充。此外,对某一路而言,建模方式和对象本身就限制了这一路的效果,比如U2I、I2I、U2U2I各自有不同的建模方式和对象,因此也需要相互补充。

然而多路之间由于目标相似也会存在相互竞争的问题,多路之间的重合度过高,召回quota浪费会比较严重。同时,一味地增加新的召回通路,尽管可能会补充一些之前没召回的物料,但是由于资源问题,ROI是很低的,存在边际递减效应。因此,我们需要适时去重新review现有的召回路,对召回路进行合并,比如U2I召回应该如何迭代,才能覆盖其他召回路召回的物料。合并带来的效果并不是说一定是有损或者持平的,在一路召回中联合建模不同对象或许也能实现不同对象之间的交互和关联,从而带来增量。因此,这篇文章主要研究了怎么去联合建模user-item、item-item,user-user之间的关系,并隐式实现了u2u2i、u2i2i等二跳关联。

大概的解决思路

这类联合建模核心关注有三点:

  • 怎么在现有的u2i模型里面去建模u2u,i2i
  • 建模完以后,怎么把新的u2i模型用来做u2u2i和u2i2i
  • 不同召回通路之间怎么去定义一个统一的rerank方式去打分截断

对于第一点,做法有很多,这篇文章核心是用数据增强去构建了用户和物料的增强视图,然后u2u,i2i,u2i三者分别做对比学习,从而来捕捉不同对象之间的关联。

对于第二点来说,就得看自己公司的结构是否支持这种多跳召回。对于u2u2i的话,u2u的部分可以用离线产出的索引来检索,u2i部分可以是离线索引的方式,也可以是ANN检索的方式。如果是ANN检索,问题主要是一个user拉了N个user,然后发起了N次ANN召回,负载比较高。对于u2i2i的话,u2i和i2i部分怎么去做也需要去思考。痛点就是实时性和系统负载的平衡。

对于第三点来说,一个模型实现了多路召回,返回的doc肯定还是需要一个统一的rerank方式去打分截断,怎么根据业务去定义这种rerank方式也是需要考虑的。

问题建模

文章把该问题建模成一个topN推荐问题,U就是用户集合,V是物料集合,X是用户的历史行为序列。$e_u$和$e_v$分别就是用户表征和物料表征。预估的商品被推荐的概率是三个概率的线性加权,权重比经过网格搜索是1:1:1。三个概率分别表示:u2i,u2u和i2i。

模型和训练


从这张图就知道,用的还是老生常谈的对比学习技术,其核心就是用什么增强方式构建正负样本。

模型输入

一个mini batch(N个)的(user, item)pair对,每个pair对包括:用户的id特征、用户画像特征、用户历史交互的物料id序列;物料id、物料基础特征、物料历史被交互的用户id序列。

高质量正负例构建

除了训练集本身的正负例,还采用了其他正负例构建方式来扩充训练集

  • 用户-用户检索:用用户表征用k近邻找用户侧的正例,用k means++聚类方式,将属于其他聚类中的用户作为难负例;
  • 物料-物料检索:用物料表征用k近邻找物料侧的正例,用k means++聚类方式,将属于其他聚类中的物料作为难负例;
  • 用户-物料检索:同上,用物料表征检索用户表征 + 用户表征去检索物料表征,然后采用k近邻和聚类来构建正负例

loss构建

随机sample N个(user, item)pair对,针对user和item构造增强view,增强方式一个是field mask,也就是随机mask掉用户和物料的若干特征,例如id,age,category,行为序列中的id等。另一个是对输入embedding进行dropout。对于一个(user, item) pair对,利用这两个增强方式,可以分别形成用户侧的增强正样本和物料侧的增强正样本。由此,一个训练样本变成四元组:$(u,\widetilde{u}, v,\widetilde{v})$。

然后就是经典的对比学习loss,分别针对u2i、u2u和i2i:

最后是针对训练集正负例的bce loss:

最终loss是:

值得注意的是这套框架可以应用到现有任何召回模型上。

部署和推理过程

腾讯新闻的视频推荐召回上部署了这个方法。训练好这个联合建模的模型(小时级训练)以后,

离线构建u2u和i2i正排,以及ANN索引:

  • 小时级去infer所有用户向量和物料向量,离线存储用户的历史交互物料序列(秒级更新)、用户-用户之间的相似度、物料-物料、用户-物料之间的相似度到redis里面。并对所有物料向量构建ANN索引。

在线Serving:

  • 当一个请求到来,u侧实时获取用户向量,执行ANN检索,得到$K_1$个item(U2I)。
  • 从redis中获取该用户最近交互的$M$个item,分别取出$M_3$个相似item,得到$K_2=M \times M_3$个item(I2I)。
  • 从redis中获取$M_1$个相似用户,每个用户获取最近交互的$M_2$个item,得到$K_3=M_1 \times M_2$个item(U2U)。
  • 对三个item集合合并成集合$V_C$,按照某种排序公式进行rerank,然后截断取topN。
  • 文中的公式如下。basic这里就是相似度。$s_i$表示item的重复度,也就是同时被几路召回,次数越多,说明越重要。然后最后一项是类目多样性分数,表示某个item与其他item类目不重复的数量。网格搜出来三项权重是:1:0.5:0.2。

效果

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions