推荐系统 - 总结 - 架构:从召回到排序再到重排

推荐系统与NLP和CV领域比,发展速度不算太快。不过最近两年,由于深度学习等一些新技术的引入,总体还是表现出了一些比较明显的技术发展趋势。这篇文章试图从推荐系统几个环节,以及不同的技术角度,来对目前推荐技术的趋势做个归纳。

1. 推荐系统的宏观架构

实际的工业推荐系统,如果粗分的化,经常讲的有两个阶段。首先是召回,主要根据用户部分特征,从海量的物品库里,快速找回用户潜在感兴趣的那一小部分物品,然后交给排序环节,排序环节可以融入较多特征,使用复杂模型,来精准地做个性化推荐。召回强调快,排序强调准

如果我们更细致地看实用的推荐系统,一般会有四个环节,如下图所示:

四个环节分别是:召回、粗排、精排和重排。

  • 召回的目的如上所述
  • 有时候因为每个用户召回环节返回的物品数量还是太多,怕排序环节速度跟不上,所以可以在召回和精排之间加入一个粗排环节,通过少量用户和物品特征、简单模型,来对召回的结果进行个粗略的排序,在保证一定精准的前提下,进一步减少往后传送的物品数量,粗排往往是可选的,可用可不同,跟场景有关。
  • 之后,是精排环节,使用你能想到的任何特征,可以上你能承受速度极限的复杂模型,尽量精准地对物品进行个性化排序。
  • 排序完成后,传给重排环节,传统地看,这里往往会上各种技术及业务策略,比如去已读、去重、打散、多样性保证、固定类型物品插入等等,主要是技术产品策略主导或者为了改进用户体验。

JD推荐系统架构:

                         

那么,每个环节,从技术发展的角度看,都各自有怎样的发展趋势呢?下面我们分头说明。

2. 召回技术演进趋势


推荐系统的召回阶段是很关键的一个环节,但是这个环节技术含量相对不高。往往灵机一动,就能想到一个策略,从而增加一路新的召回。你在网上搜,发现讲推荐算法的,95%是讲排序阶段的算法,讲召回的很少。总体而言,召回环节的有监督模型化以及一切Embedding化,这是两个相辅相成的总体发展趋势。而embedding的具体方法可以有各种选择,比如下面介绍的几个技术发展趋势,可以理解为不同的给用户和物品embedding的不同方法而已。

2.1 多路召回

传统的标准召回结构一般是多路召回,如上图所示。如果我们根据召回是否有用户个性化因素存在来划分,可以分成两大类:

  • 一类是无个性化因素的召回,比如热门商品的召回
  • 另外一类是包含个性化因素的召回路,比如用户兴趣标签召回。

我们应该怎么看待包含个性化因素的召回路呢?其实吧,你可以把某个召回路看作是:单特征模型排序的排序结果。意思是,可以把某路召回,看成是某个排序模型的排序结果,只不过,这个排序模型,在用户侧和物品侧只用了一个特征。比如说,标签召回,其实就是用用户兴趣标签和物品标签进行排序的单特征排序结果;再比如协同召回,可以看成是只包含UID和ItemID的两个特征的排序结果….诸如此类。我们应该统一从排序的角度来看待推荐系统的各个环节,这样可能会更好理解本文所讲述的一些技术。

2.2 用户行为序列召回

用户在使用APP或者网站的时候,一般会产生一些针对物品的行为,比如点击一些感兴趣的物品,收藏或者互动行为,或者是购买商品等。而一般用户之所以会对物品发生行为,往往意味着这些物品是符合用户兴趣的,而不同类型的行为,可能代表了不同程度的兴趣。比如购买就是比点击更能表征用户兴趣的行为。

如果我们抽象地来看的话,利用用户行为过的物品序列对用户兴趣建模,本质上就是这么个过程:输入是用户行为过的物品序列,可以只用物品ID表征,也可以融入物品的content Information比如名称,描述,图片等,现在我们需要一个函数Fun,这个函数以这些物品为输入,需要通过一定的方法把这些进行糅合到一个embedding里,而这个糅合好的embedding,就代表了用户兴趣。无论是在召回过程,还是排序过程,都可以融入用户行为序列。在召回阶段,我们可以用用户兴趣Embedding采取向量召回,而在排序阶段,这个embedding则可以作为用户侧的特征。

所以,核心在于:这个物品聚合函数Fun如何定义的问题。这里需要注意的一点是:用户行为序列中的物品,是有时间顺序的。理论上,任何能够体现时序特点或特征局部性关联的模型,都比较适合应用在这里,典型的比如CNN、RNN、Transformer等,都比较适合用来集成用户行为序列信息。而目前的很多试验结果证明,GRU可能是聚合用户行为序列效果最好又比较简单的模型。当然,RNN不能并行的低效率,那是另外一个问题。

在召回阶段,如何根据用户行为序列打embedding:

  • 可以采取有监督的模型,比如Next Item Prediction的预测方式即可
  • 也可以采用无监督的方式,比如物品只要能打出embedding,就能无监督集成用户行为序列内容,例如Sum Pooling。

而在排序侧,必然是有监督的模式,需要注意的是:排序侧表征用户特征的时候,可以只用用户行为过的物品序列,也可以混合用户其它特征,比如群体属性特征等一起来表征用户兴趣,方式比较灵活。比如DIEN,就是典型的采用混合模式的方法。

典型工作:

GRU:Recurrent Neural Networks with Top-k Gains for Session-based Recommendations

CNN:Personalized Top-N Sequential Recommendation via Convolutional Sequence Embedding

Transformer: Self-Attentive Sequential Recommendation

 

2.3 用户多兴趣拆分

上文讲了利用用户行为物品序列,打出用户兴趣Embedding的做法。但是,另外一个现实是:用户往往是多兴趣的,比如可能同时对娱乐、体育、收藏感兴趣。这些不同的兴趣也能从用户行为序列的物品构成上看出来,比如行为序列中大部分是娱乐类,一部分体育类,少部分收藏类等。那么能否把用户行为序列物品中,这种不同类型的用户兴趣细分,而不是都笼统地打到一个用户兴趣Embedding里呢?用户多兴趣拆分就是解决这类更细致刻画用户兴趣的方向。

用户多兴趣拆分,本质上是上文所叙述的用户行为序列打embedding方向的一个细化,无非上文说的是:以用户行为序列物品作为输入,通过一些能体现时序特点的模型,映射成一个用户兴趣embedding。

而用户多兴趣拆分,依然是以用户行为序列物品作为输入,输出是多个用户兴趣embedding。虽说道理如此,但是在具体技术使用方向上却不太一样,对于单用户兴趣embedding来说,只需要考虑信息有效集成即可;而对于多用户兴趣拆分来说,需要多做些事情,多做什么事情呢?本质上,把用户行为序列打到多个embedding上,实际它是个类似聚类的过程,就是把不同的Item,聚类到不同的兴趣类别里去。目前常用的拆分用户兴趣embedding的方法,主要是胶囊网络和Memory Network,但是理论上,很多类似聚类的方法应该都是有效的,所以完全可以在这块替换成你自己的能产生聚类效果的方法来做。

说到这里,有人会问了:把用户行为序列拆分到不同的embedding里,有这个必要吗?反正不论怎样,即使是一个embedding,信息都已经包含到里面了,并未有什么信息损失问题呀。这个问题很好。我的个人感觉是:在召回阶段,把用户兴趣拆分成多个embedding是有直接价值和意义的,前面我们说过,召回阶段有时候容易碰到头部问题,就是比如通过用户兴趣embedding拉回来的物料,可能集中在头部优势领域中,造成弱势兴趣不太能体现出来的问题。而如果把用户兴趣进行拆分,每个兴趣embedding各自拉回部分相关的物料,则可以很大程度缓解召回的头部问题。

所以这种兴趣拆分在召回阶段是很合适的,可以定向解决它面临的一些实际问题。对于排序环节,可以不把兴趣进行拆分,而是只提供一个用户的embedding;但是有一点排序环节使用多兴趣Embedding能发生:因为我们在计算user对某个item是否感兴趣的时候,对于用户行为序列物品,往往计算目标item和行为序列物品的Attention是有帮助的,因为用户兴趣是多样的,物品Item的类型归属往往是唯一的,所以行为序列里面只有一部分物品和当前要判断的Item是类型相关的,这会对判断有作用,其它的无关物品其实没啥用,于是Attention就是必要的,可以减少那些无关物品对当前物品判断的影响。而当行为序列物品太多的时候,我们知道,Attention计算是非常耗时的操作,如果我们把这种Attention计算,放到聚类完的几个兴趣embedding维度计算,无疑能极大提升训练和预测的速度。

典型工作:

召回:Multi-Interest Network with Dynamic Routing for Recommendation at Tmall

排序:Practice on Long Sequential User Behavior Modeling for Click-Through Rate Prediction

3. 排序模型技术演进趋势

见 https://blog.csdn.net/weixin_41332009/article/details/113759427


4. 一点思考

跟我妈聊天突然想到一个问题:据我所知,目前JD用的排序算法应该是用用户近180天的点击/加购/下单行为来做训练集进行CTR预估的。但是,这里似乎没有考虑到“时效性”这个问题。比如,一个用户在180天前疯狂点击和购买了一大堆小猪佩奇,但是他/她后来再也没有购买过小猪佩奇,那么在推荐的时候小猪佩奇还应该排在较靠前的位置吗?显然不应该这样的。如果不按照时间做一个衰减的话,180天前购买和1天前购买是等权重的,这显然是不合理的。

想到的最简单的解决办法:

假如这是一个用户的行为序列,包括一个用户最近180天购买/浏览的商品序列。现在我们要预测用户购买粉色羽绒服的概率。如果按照之前的做法,我们会一碗水端平的考虑所有行为记录的影响,对应到模型中就是我们会用一个average pooling层把用户交互过的所有商品的embedding vector平均一下形成这个用户的user vector。但是这里可以加一个time decay,让最近的行为产生的影响大一些,那就是在做average pooling的时候按时间调整一下权重。

更复杂的方法:使用RNN类神经网络来捕捉时序信息给用户做embedding(使用next item prediction这种有监督方法)。


参考资料:https://cloud.tencent.com/developer/article/1575564

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值