推荐系统论文拾遗之1——DPP多样性控制

背景

推荐系统大多会经过召回、粗排、精排和策略层后展示给用户,精排中大多数是以CTR为基础目标的。当给一个用户推荐内容时,往往可能造成某一个兴趣点的内容比较集中,虽然预估CTR会比较高,但未必能得到用户的青睐,主要原因在于用户的兴趣往往不是单峰的。比如一个用户可能会有综艺、美食、体育这三大类兴趣,但是在整个推荐系统中,综艺类的内容无论从先验还是后验,效果可能均优于美食和体育,系统给该用户推荐内容时,就容易导致经过排序模型后,Top内容大多都是综艺内容,美食或者体育会非常少。虽然用户有很强的综艺兴趣,但是只推综艺内容容易越推兴趣越窄,用户也容易产生审美疲劳。因此,在满足推荐准确性的同时,推荐结果的多样性也非常重要

解决方案

为了提升推荐结果的多样性,目前主要有这么几种方式:

  1. 启发式规则控制
    规则控制应该是最简单,最直接的控制手段。即我们可以规定每一次推荐结果中,某个类目的展示内容不超过多少、相邻两个item之间没有共有的标签和作者信息、不通刷次之间收尾衔接的内容不能有相同的标签和作者信息等。这种手段的实现方式也比较简单,可以直接根据排序的结果,从前往后进行贪婪式放置即可。但是只靠规则控制,规则较硬,一方面不太能做到预测准确性和多样性的有效折中,另一方面规则考虑的因素仅限于item的某几个属性,不能很好地衡量item之间的相似度。

  2. 算法控制
    我们的目标是在推荐结果准确性的基础上提升多样性,此时2个因素比较重要:user和item之间和相关性以及item与item之间的相似度。当我们只考虑准确性时,只需考虑user与item之间的相似度即可;当我们只考虑多样性时,只需要根据item与item之间的相似度,将推出结果尽量打散即可。一个优秀的推荐系统,给出的应该是一种折中手段,综合考虑u-i相关性及i-i相似度,MMR算法是比较直观的解决方式,其公式为:
    MMR:=argmaxDiR\S(λSim1(Di,Q)(1λ)(argmaxDjSSim2(Di,Dj)))MMR: =arg\max\limits_{D_i\in R \backslash S}(\lambda Sim_1(D_i, Q) - (1 - \lambda)(arg \max\limits_{D_j \in S} Sim_2(D_i, D_j)))
    公式中:SS 为已经筛选出的集合,R{R}为全部候选集合, Q{Q}可以理解为User,Sim(D,Q)Sim(D, Q)表示的是u-i相关性,Sim(Di,Dj){Sim(D_i, D_j)}表示的是i-i相似度,即贪心地在R\SR \backslash S中找到满足上述结果最大的 DiD_i
    除了MMR算法外,本文的主角DPP(Determinantal Point process)也是另外一种算法控制多样性的常用手段。

DPP多样性控制

DPP,即行列式点过程,是以最大化后验估计为目的,评估最有可能被点击的item集合。我们可以将每个item看成一个空间下的一维向量,使用向量张成的多边立方体体积衡量item集合出现的概率,而行列式的物理意义是每个向量围成的多边立方体体积,因此可以将MAP(最大后验概率估计)问题转化为求解行列式最大的问题。那么问题来了,这个行列式要怎么构建呢?
由于我们要综合考虑u-i相关性和i-i相似度,因此一种比较直接的方式是这样处理:L=Diag(ru)SDiag(ru)L = Diag(r_u) \cdot S \cdot Diag(r_u),其中rur_u表示u-i相关性,SS为i-i相似度矩阵。在实际的应用中,rur_u可以直接使用CTR预估的结果,或者经过多目标变换后的结果,SS用于度量item之间的相似度,视不同场景而定,比如可以使用文本相似度、图片相似度等一系列特征。
那接下来为了求解这个最大的LL,我们应该怎么做呢?常规可以想到的应该就是贪心算法了,遍历每一个没有被选中的item,选择增加这个item后新组成的LL行列式最大的item,添加到候选队列中,然后再进行下一轮的遍历。
Hulu在2018年发表的论文:Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity1,属于一种计算优化,根据LL矩阵的半正定性,通过Cholesky变换,每次都候选集中选择一个item,使得整个取top k都过程可以增量进行更新,降低了计算复杂度。具体的公式不做详细推导,只是截图过来:
伪代码如下:
推荐系统论文拾遗之1——行列式点过程(DPP)多样性控制
至于为啥可以这么迭代求解,推导如下(下次在找时间写个手工详细推导版的,先占个坑):
我们的目标是找到这样的jj推荐系统论文拾遗之1——行列式点过程(DPP)多样性控制
LL由于是个半正定型矩阵,因此可以做Cholesky分解:
LYg=VVTL_{Y_g} = VV^T
如果新增一个item i{i},则LL可以写为:
LYgi=[LYgLYg,iLi,YgLi,i]=[V0cidi][V0cidi]TL_{Y_g \cup i} = \left[ \begin{matrix} L_{Y_g} & L_{Y_g, i} \\ L_{i, Y_g} & L_{i, i} \end{matrix}\right] = \left[ \begin{matrix} V & 0 \\ c_i & d_i \end{matrix} \right] {\left[ \begin{matrix} V & 0 \\ c_i & d_i \end{matrix} \right]} ^ T
接下来就开始截图了哈。。。。
推荐系统论文拾遗之1——行列式点过程(DPP)多样性控制

工程实践

根据上面的伪代码还是比较容易写出真实代码的,网上也有很多开源代码,这边就不赘述了,但是我还是想说一下实际应用时的几个比较trick的点。

  1. ru{r_u}的选择
    正常情况下,我们能想到的就是使用精排得分表征useruseritemitem之间的关系,论文中提到,可以将ru{r_u}做一下平滑操作,即使用exp(αru)exp(\alpha {r_u})替代ru{r_u},此时L{L}变为:
    L=Diag(αru)SDiag(αru)L = Diag(\alpha r_u) \cdot S \cdot Diag(\alpha r_u)
    其中α=θ2(1θ)\alpha = \frac{\theta}{2(1 - \theta)}θ\theta作为一个超参数,可以手动权衡u-i相关性及i-i相似度。在我司的推荐场景中,这种做法也是优于直接使用rur_u的。
  2. SS的选择
    SS用于描述i-i之间的相似度,在不同的推荐场景中,相似度的衡量方式不一样。如果是新闻推荐,文本相似度会非常重要,但是在视频推荐场景中,封面图相对会更重要一些,这两种当然都可以使用embedding进行cos距离计算来衡量。还有一种比较简单但是很有效的方法,使用Jaccard距离,这种算法泛化能力较差,也就意味着可以拉大item之间的相似度。比如我们可以将item的一些属性放到一个集合,计算该集合与其他item属性集合的共现量,作为相似度的衡量标准。具体使用哪种embedding效果更好,也是需要在自家产品上多实验的。
  3. 如何协同其他规则?
    一般情况下,DPP贪心筛选出的top k是可以直接作为推荐结果给用户展示的,但是实际应用中可能会有很多问题,比如会有强制运营的策略,会有扶植或保量的需求,这种情况下的解决方法可以有两种:一种是先产出DPP的列表,然后在此基础上直接执行规则;另一种是先执行规则,然后再填充DPP列表。第一种方法明显更简单一些,但是会造成运营位与常规推荐位衔接不太自然;第二种方法相对更软,只是处理逻辑会比较复杂。具体怎么实施,还是需要视场景各自选择。

  1. Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity ↩︎

相关文章: