参考网址
zhuanlan.zhihu.com/p/388601198
1/前言
我们都知道,整个推荐系统分成很多的环节,
比如<1>召回环节
<2>排序环节,包括粗排和精排,其中粗排又称为预截断
<3>人工干预规则环节
<4>最后的推荐环节(正式开始推荐)
为什么把排序又分成粗排和精排序?
因为如果把所有召回的item直接交给精排模型,那么对精排的算力是一个很大的考验,是很耗时的。
所以先进行一次粗排,也就是预截断,就是先过滤掉一部分。
把预截断之后的item再交给精排模型,最后产出要推荐的item。
这样既可以达到目的,又可以不对性能造成挑战。
2/多路召回
从多个角度,设计多个召回策略,
多个召回策略之间是不相关的。
<1>什么是多路召回
所谓的“多路召回策略”就是指采用不同的策略、特征或者简单模型,分别召回一部分候选集item,
然后再把这些候选集item混合在一起后供后续排序模型使用的策略。
然后我们来说说为啥需要用到多路召回策略。
我们都知道,我们在设计召回层的时候,“计算速度”与“召回率”这两个指标是相互矛盾的。
也就是说在提高计算速度的时候需要尽量简化召回策略,这就会导致召回率不尽人意.
同样的,需要提高召回率时就需要复杂的召回策略,这样计算速度肯定会相应的降低。
在权衡两者后,目前工业界普遍采用`多个简单的召回策略`叠加成一个复合的“多路召回策略”。
在多路召回中,每个策略之间毫不相关,所以一般可以写并发多线程同时进行。
例如:新闻类的推荐系统中,我们可以按文章类别(娱乐/军事/财经等类别)、作者、热度等分别进行召回,
这样召回出来的结果更贴切实际要求,同时我们可以开辟多个线程分别进行这些召回策略,提升效率。
在推荐系统的召回环节,我们一般采用的多路召回,因为单个召回模型都是有自己的不足和缺点的。
单模型召回,很难找回全面的候选item,也即是召回率会比较低。
多路召回可以互相弥补不足,效果更好,三个臭皮匠顶个诸葛亮。
我们需要通过多路召回,构成一个复合的多路召回策略模型。
多路召回之间毫不相干,一般可以编写并发的多线程执行召回。
每一路的召回的item都有自己的顺序。
<2>怎么进行多路召回
在上图中,有4种召回策略
(1)实时召回(U2I2I)
实时地根据你的最新的行为来更新你的推荐列表。
我得到你实时的行为列表,然后根据I2I进行扩展,得到你可能喜欢的其他的item。
这种召回方式可以及时的获取到用户最新的兴趣点,这是cb召回所不能做到的。
<2>离线计算好的召回
(1)基于内容(U2tag2I)
先计算好你的偏好的tag,就是用户的profile,然后根据这个tag的相似度找到你可能感兴趣的item.
(通俗讲:就是先知道你喜欢什么类型的item,然后再去找具体的item)
(2)矩阵分解(U2I)
这是协同过滤的一种(其实就是item-based)
我们提前存储好user和item之间的矩阵。
给user推荐item
(3)聚类推荐(U2U2I)
其实就是user-based
先找到和目标用户类似的用户,称为邻居用户,
然后把邻居用户喜欢的item推荐给目标用户。
这样可以扩展用户的兴趣点。
(4)热门或者流行的item的召回
(5)考虑地理位置,‘本地’,‘非本地’
4/融合排序
<1>什么是融合排序
在多路召回中,每一路的召回之间都是互不相干的。
每一路的召回的item都有自己的顺序。
但是我们整个召回环节的输出只有一个排序,
所以我们需要对这多个候选集按照一定的策略进行最终的排序。
<2>怎么进行融合排序
那么多略召回的item之间如何融合排序呢?
上图中,有3路召回x,y,z。
每一种召回策略都召回了3个item,并且每个item都有自己的权重。
(不同召回的权重对于其他的策略是没有任何意义的。)
<1>按照顺序展示
比如我们对召回策略做一个优先级的排序
比如我们认为 召回策略x的优先级>召回策略y的优先级>召回策略z的优先级
所以,x召回策略的item放在最前面,以此类推。
<2>item的权重平均法
在所有的召回策略中,对每一个item进行权重的平均
注意:分母是所有召回策略的数量,即使某个召回策略中并没有召回某个item,分母也是总的召回策略的数量。
<3>加权的item的权重平均法
我们提前给每一种召回策略赋予一个权重
这个权重是我们自己赋予的,并不一定科学
<4>`动态的`加权的item加权平均
计算xyz3种策略召回的ctr,作为每天更新的动态权重
<5>机器学习模型
采用机器学习模型,预测每个item可能被用户点击的一个概率,然后根据概率大小倒排。
常用的模型有GBDT+LR,wide&&deep(就是LR和DNN的结合)