背景
推荐系统大多会经过召回、粗排、精排和策略层后展示给用户,精排中大多数是以CTR为基础目标的。当给一个用户推荐内容时,往往可能造成某一个兴趣点的内容比较集中,虽然预估CTR会比较高,但未必能得到用户的青睐,主要原因在于用户的兴趣往往不是单峰的。比如一个用户可能会有综艺、美食、体育这三大类兴趣,但是在整个推荐系统中,综艺类的内容无论从先验还是后验,效果可能均优于美食和体育,系统给该用户推荐内容时,就容易导致经过排序模型后,Top内容大多都是综艺内容,美食或者体育会非常少。虽然用户有很强的综艺兴趣,但是只推综艺内容容易越推兴趣越窄,用户也容易产生审美疲劳。因此,在满足推荐准确性的同时,推荐结果的多样性也非常重要。
解决方案
为了提升推荐结果的多样性,目前主要有这么几种方式:
-
启发式规则控制
规则控制应该是最简单,最直接的控制手段。即我们可以规定每一次推荐结果中,某个类目的展示内容不超过多少、相邻两个item之间没有共有的标签和作者信息、不通刷次之间收尾衔接的内容不能有相同的标签和作者信息等。这种手段的实现方式也比较简单,可以直接根据排序的结果,从前往后进行贪婪式放置即可。但是只靠规则控制,规则较硬,一方面不太能做到预测准确性和多样性的有效折中,另一方面规则考虑的因素仅限于item的某几个属性,不能很好地衡量item之间的相似度。 -
算法控制
我们的目标是在推荐结果准确性的基础上提升多样性,此时2个因素比较重要:user和item之间和相关性以及item与item之间的相似度。当我们只考虑准确性时,只需考虑user与item之间的相似度即可;当我们只考虑多样性时,只需要根据item与item之间的相似度,将推出结果尽量打散即可。一个优秀的推荐系统,给出的应该是一种折中手段,综合考虑u-i相关性及i-i相似度,MMR算法是比较直观的解决方式,其公式为:
公式中: 为已经筛选出的集合,为全部候选集合, 可以理解为User,表示的是u-i相关性,表示的是i-i相似度,即贪心地在中找到满足上述结果最大的
除了MMR算法外,本文的主角DPP(Determinantal Point process)也是另外一种算法控制多样性的常用手段。
DPP多样性控制
DPP,即行列式点过程,是以最大化后验估计为目的,评估最有可能被点击的item集合。我们可以将每个item看成一个空间下的一维向量,使用向量张成的多边立方体体积衡量item集合出现的概率,而行列式的物理意义是每个向量围成的多边立方体体积,因此可以将MAP(最大后验概率估计)问题转化为求解行列式最大的问题。那么问题来了,这个行列式要怎么构建呢?
由于我们要综合考虑u-i相关性和i-i相似度,因此一种比较直接的方式是这样处理:,其中表示u-i相关性,为i-i相似度矩阵。在实际的应用中,可以直接使用CTR预估的结果,或者经过多目标变换后的结果,用于度量item之间的相似度,视不同场景而定,比如可以使用文本相似度、图片相似度等一系列特征。
那接下来为了求解这个最大的,我们应该怎么做呢?常规可以想到的应该就是贪心算法了,遍历每一个没有被选中的item,选择增加这个item后新组成的行列式最大的item,添加到候选队列中,然后再进行下一轮的遍历。
Hulu在2018年发表的论文:Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity1,属于一种计算优化,根据矩阵的半正定性,通过Cholesky变换,每次都候选集中选择一个item,使得整个取top k都过程可以增量进行更新,降低了计算复杂度。具体的公式不做详细推导,只是截图过来:
伪代码如下:
至于为啥可以这么迭代求解,推导如下(下次在找时间写个手工详细推导版的,先占个坑):
我们的目标是找到这样的:
由于是个半正定型矩阵,因此可以做Cholesky分解:
如果新增一个item ,则可以写为:
接下来就开始截图了哈。。。。
工程实践
根据上面的伪代码还是比较容易写出真实代码的,网上也有很多开源代码,这边就不赘述了,但是我还是想说一下实际应用时的几个比较trick的点。
-
的选择
正常情况下,我们能想到的就是使用精排得分表征和之间的关系,论文中提到,可以将做一下平滑操作,即使用替代,此时变为:
其中,作为一个超参数,可以手动权衡u-i相关性及i-i相似度。在我司的推荐场景中,这种做法也是优于直接使用的。 -
的选择
用于描述i-i之间的相似度,在不同的推荐场景中,相似度的衡量方式不一样。如果是新闻推荐,文本相似度会非常重要,但是在视频推荐场景中,封面图相对会更重要一些,这两种当然都可以使用embedding进行cos距离计算来衡量。还有一种比较简单但是很有效的方法,使用Jaccard距离,这种算法泛化能力较差,也就意味着可以拉大item之间的相似度。比如我们可以将item的一些属性放到一个集合,计算该集合与其他item属性集合的共现量,作为相似度的衡量标准。具体使用哪种embedding效果更好,也是需要在自家产品上多实验的。 - 如何协同其他规则?
一般情况下,DPP贪心筛选出的top k是可以直接作为推荐结果给用户展示的,但是实际应用中可能会有很多问题,比如会有强制运营的策略,会有扶植或保量的需求,这种情况下的解决方法可以有两种:一种是先产出DPP的列表,然后在此基础上直接执行规则;另一种是先执行规则,然后再填充DPP列表。第一种方法明显更简单一些,但是会造成运营位与常规推荐位衔接不太自然;第二种方法相对更软,只是处理逻辑会比较复杂。具体怎么实施,还是需要视场景各自选择。