重排解决的问题:精排排序后的排序靠前的候选物料被选定推荐给用户,然后由于相似的物料会因得分相似排在相邻的位置,这很容易造成用户的视觉疲劳。
因此主要采用以下三种方式进行重排。
一、利用启发式规则
小型推荐系统需要通过一些打散规则,将排列在相邻位置的相似物料打散,来实现局部和全局的多样性。但是也应当保证与初始精排排序序列的改动尽可能小,保证局部和全局的用户相关性。
(一)滑窗打散
滑窗打散就是规定一个长度为K的窗口,假如在这个滑动窗口内有相似物料,那么调换其中某个物料的位置到滑动窗口外,来实现局部的多样性。

(二)分桶打散
比如电商场景中,推荐用户商品的目标是最大化交易额,因此排在前面的一般是价格较高的物料。分桶打散就是按照价格排序的高低位次分成高、中、低三个桶。每个桶内根据精排排序进行降序排列,从每个桶中取出头部的物料依次组成新的序列推送给用户。

(三)基于贪心算法的MMR
基于贪心算法的MMR(Maximal Marginal Revelance)。每一步都在现有的重排序列基础上加上能够实现最大边际收益的物料,帮助整个序列实现用户相关性和物料多样性。
其中R是整个精排排序返回的物料序列,S是已经加入重排序列的物料集合。第一项表示当前物料与用户相关性,第二项表明当前重排物料集合与当前物料的相似性(越小越好,能反映出多样性)。
其中Sim_2的实现可以采用标签定义,再通过熵增的最大化实现多样性。Sim_2也可以采用当前物料向量和当前重排序列集合的embedding做点积得到。
Airbnb在MMR的基础上进行了改动,提出了MLR。因此后面加入重排序列的物料,在重排序列中的位置也靠后。因此MLR考虑的是物料t加入位置p的最大边际效益。
二、基于行列式点过程
(一)行列式点过程简介
1、点过程Point Process
从一个集合Z中抽取出任意子集的概率分布被叫做点过程。

2、行列式点过程DPP
将复杂的概率运算转换为矩阵行列式运算,只要集合Z抽取出空集子集的概率不为0,就可以实现。
其中P(Y)为抽取出子集Y的概率,det(L_Y)是抽取出相应的行列构成的子矩阵行列式(L是一个半正定矩阵,被称为核矩阵,L_Y是从L中抽取相应的行列构成的子矩阵)。

将公式归一化,进一步得到:
3、在推荐系统中的DPP应用
在推荐系统中,将候选物料集当做集合Z,用户选择心仪物料就相当于进行随机点过程。并且用户对候选物料都不满意,选择空集的概率不为0。
4、DPP关键问题
- 如何构建核矩阵L。
- 如何最大化det(L_Y)。
(二)启发式构建核矩阵L
按照启发式规则设计核矩阵L,Y中的物料与用户兴趣越相关越好,Y中物料差异度越大越好。
1、公式
①公式1:其中r_i是第i个物料与用户兴趣的匹配度,E_i是第i个物料的embedding。
②公式2:其中S_ij表示物料i和物料j的相似度,可以由E_i和E_j的点积得到。
③公式3:Diag(R)是候选物料精排打分r_i组成的数组,S=EE^T,体现物料之间的相似度。
2、构建L的实操方法
①L的特点
应该使得L对角线上的元素(衡量相关性)与非对角线元素(衡量多样性)区别对待。
其中α是引入的超参数,通过调整α来实现相关性和多样性的偏向。
②华为的pDPP
①中提到的α是对于用户无差别的,因此华为的pDPP提出了一种不同用户拥有不同α的方法。主要实现思路如下:每个用户的α_u是在全体用户共享的α基础上,根据熵调整实现的。求出整个系统中用户交互过的物料的熵最大值和最小值还有每个用户的熵值(熵越大,交互物料的多样性越强),归一化后得到一个数值f_u可表示该用户在全体用户中交互物料多样化偏向程度。
③修正S_ij
由于S_ij=EE^T,但是可能点积结果出现负值,导致L不再正定,因此采用以下两种方式进行修正:
3、监督学习核矩阵L
上述构建L的方式存在的缺点:(1)需要人工设置的超参数量较多。(2)没有利用到用户的曝光、点击率等数据。
①如何构建L
构建L需要获得两个方面的信息:(1)精排打分(表示相关性)。(2)粗排向量距离(体现多样性)。
因此构建L采用两种类型的dnn实现:(1)浅层网络转换精排打分。(2)深层网络转换粗排向量。
②如何设置优化目标
由于我们的数据来源于曝光和点击,由重排请求q的一条样本可以由下面公式描述:[物料精排打分集合,粗排物料向量,针对请求q曝光的物料中被点击的物料]。
其中物料精排打分集合,粗排物料向量都是曝光物料的集合。对于每个重排请求q,都要构建一个核矩阵L_q。
因此可以得到Loss:
4、找到行列式最大子集
①贪心算法实现
每加入一个物料j,都能使得行列式增加最多。这种方法的时间复杂度太大。
②Fast Greedy MAP实现
- 化简优化目标:cholesky分解当前子矩阵L_Y,再加入物料j后对新矩阵L_Y∪{j}再进行cholesky分解。
- 快速贪心求解:对于任何没有加入子集Y的物料,都需要计算c_i和d_i;每轮只需要找到最大d_i²所在的物料j加入集合,此时剩下没加入的物料需要更新子集的c_i和d_i。
5、基于DPP的重排流程
- 精排筛选出来的N个物料传递给重排,请求中包括精排打分和粗排向量。
- 根据打分和向量构建出L。
- 每次从候选物料中调出K个相关且多样的物料加入重排结果集。
三、基于上下文感知的排序学习
(一)基于上下文感知的排序学习
1、定义
建立一个重排模型,输入的是整个精排筛选出的N个物料,评估的是物料在其上下文环境中被用户选中的概率。这被称为基于上下文感知的排序学习(Context-aware Learning-To-Rank)。
2、优化目标
其中(S,Y)是一个batch中的样本,S是曝光的物料序列,Y是用户对曝光物料的反馈。F_rr是重排模型。
3、重排模型的两个关键点
①物料序列的表达
- 表达物料的个性化信息,比如精排打分体现用户兴趣与物料的匹配程度。
- 物料在整个候选集中的排序和位置信息。
②重排模型
最笨的方法是获取候选集的所有排列组合,找出收益最大的那个排列组合。但是这样代价太大,不适合在线部署。因此常见的方式是从空集开始使用贪心算法,在剩下的物料中找出能够得到最大收益的那个。
(二)阿里巴巴的miRNN模型
1、miRNN(mutual influence RNN)的基本公式
阿里巴巴的miRNN模型关注的物料i的上下文只包含排在物料i前面的。
h_i-1是物料i前面的i-1个物料压缩成的向量,Fe(S_i)是物料属性。通过RNN得到h_i后,再通过待学习的权重映射矩阵W_h转换成交互概率。
2、miRNN的feature类型
- local feature: 物料属性。
- global feature: 关键指标的排名信息。比如说基于价格的global feature,公式如下所示。
其中price_max和price_min是基于曝光序列S的。
3、miRNN的集束搜索beam search
集束搜索beam search也属于贪心算法,都是在当前重排序列的基础上,选择一个物料j加入实现收益最大化。
集束搜索同时保持一组候选解(称为“束”),而不是只关注单一路径。在每一步中,它从所有可能的扩展路径中选择得分最高的几个(束宽),并继续对这些路径进行扩展。
使用最大堆数据结构,来快速提取值最大的前K个元素。
需要记住的beam、stepbeam、candidates存储的分别是前i-1个全局最优序列(比如说第三步的时候AE就是,当前的全局最优序列,长度为i的将前i-1个全局最优序列作为前缀的局部最优序列。

(三)阿里巴巴的PRM模型Personalized Reranking Model
1、如何表达物料S_i
E_S_i是喂给模型的物料向量,X_i表示的是物料属性组成的特征向量。PV_i表示的是用户对物料i的个性化信息,PRM是将精排倒数第二层的输出向量提取出来作为PV_i,这样的向量不仅包含了用户信息、物料信息还包含了两者的交叉信息。PE_i是物料i在精排排序中排名的embedding,能体现出位置信息。
2、如何对候选集中的物料相互关系进行建模
PRM用Transformer代替RNN。
①利用Transformer优点
- 上下文不再像RNN那样局限于物料i之前的序列。
- Transformer没有RNN随着序列增长而建模能力下降的缺点。
- RNN只能由前向后计算,而transformer可以在各个位置上并发计算。
②利用Transformer缺点
计算复杂,耗时太长。
3、如何利用transformer后的结果排序
先计算出每个位置上被用户交互的概率scores,再按照scores降序排序。

