6.重排 - wolai 笔记

1.推荐系统中的多样性

推荐给用户的物品两两间不相识,则说明推荐有多样性。

1.1 物品相似性的度量

基于物品属性标签:类目、品牌、关键词......
基于物品向量表征
  • 用召回的双塔模型学到的物品向量,不适用于多样性问题(不好)
  • 基于内容的向量表征(好)(用CVNLP提取内容特征)

(1)基于物品属性标签

  • 物品属性标签:类目、品牌、关键词......
  • 标签通常是通过 CV 或 NLP 算法通过图文推算的,不一定准确
  • 根据 一级类目、二级类目、品牌 计算相似度
    • 物品 i :美妆、彩妆、香奈儿
    • 物品 j :美妆、香水、香奈儿
    • 相似度:sim1(i,j)=1sim_1(i,j)=1sim2(i,j)=0sim_2(i,j)=0sim3(i,j)=1sim_3(i,j)=1,意思是一级类目相同,二级类目不同,三级类目相同;
    • 对三个相似度求加权和,其中的权重根据经验来设置

(2)基于向量表征计算相似度

下图为双塔模型,两个向量的余弦相似度记为用户兴趣;
在多样性问题上,我们只需要物品塔的输出;如果两个向量相似,这物品向量表征的内积比较大;
如果把双塔学到的特征用在多样性问题上,也可以用,但是效果不太好。原因是推荐系统的头部效应明显,新物品 和 长尾物品 的曝光少,双塔模型学不好 新物品 和 长尾物品 的向量表征

(3)基于图文内容的物品表征

  • CNN提取图片特征,BERT提取文字特征,把这两个向量拼起来,就是一篇笔记的向量表征。但是,该如何训练CNNBERT?
  • CLIP[1] 是当前公认最有效的预训练方法
  • 思想: 对于 图片—文本 二元组,预测图文是否匹配
  • 优势:无需人工标注。小红书的笔记天然包含图片 + 文字,大部分笔记图文相关
  • 做预训练时:同一篇笔记的 图文 作为正样本,它们的向量应该高度相似;来自不同笔记的图文作为负样本(Batch内负样本)。
  • 参考文献:Radford et al. Learning transferable visual models from natural language supervision. In ICML, 2021.
  • 一个 batch 内有 m对正样本;
  • 一张图片和 和m-1条文本组成负样本;
  • 这个 batch 内一共有 m(m-1) 对负样本

1.2 提升多样性的方法

(1)粗排和精排

  • 粗排和精排用多目标模型对物品做 pointwise 打分,把每个物品作为独立的个体,准确预估交互、时长等。只考虑打分,而不考虑物品间的关联。
  • 对于物品i,模型输出点击率、交互率的预估,融合分数rewardireward_i
  • rewardireward_i表示用户对物品i的兴趣,在排序中就是物品本身的价值。

(2)后处理

后处理的主要目的就是多样性
给定n个候选物品,排序模型打分reward1reward_1,...,reward_n;
n个候选物品种选出k个,既要他们的总分高,也需要他们有多样性
  • 精排的后处理通常被称为 —— 重排,决定了那k个物品获得曝光;促排之后的多样性也是挺重要的,能显著提高指标。
  • 增加多样性可以显著提升推荐系统指标(尤其是时长、留存率)

2.Maximal Marginal Relevance (MMR)

2.1 多样性

  • 多样性给n个候选物品打分,融合之后的分数为 reward1reward_1, ..., rewardnreward_n
  • 把第ij个物品的相似度记作sim(i,j)sim(i,j),他可以是使用相似度计算或是向量表征计算得出。
  • n个物品中选出k个,既要有高精排分数,也要有多样性。即结合rewardsim这两种分数,从n个物品中选出k个作为曝光的结果。

2.2 MMR 多样性算法

给未选中的物品打分:计算集合RR中每个物品iiMarginal Relevance分数:
MRi=θrewardi(1θ)maxjSsim(i,j)\operatorname{MR}_{i}=\theta \cdot \operatorname{reward}_{i}-(1-\theta) \cdot \max _{j \in S} \operatorname{sim}(i, j)
  • ii是已选中的物品,jj是未选中的物品
  • maxjSsim(i,j) \max _{j \in S} \operatorname{sim}(i, j) :衡量j于集合s的相似度,如果相似,则这一项较大
  • θ\theta:介于0~1之间的参数,平衡价值和多样性
Maximal Marginal Relevance (MMR):
对于所有未选中物品i,计算MR分数,并选出分数最高的物品,把这个物品从集合R移到集合S。

MMR算法小结

  1. 已选中的物品SS初始化为空集,未选中的物品RR初始化为全集{1,...,n}\{1, ..., n\}
  2. 选择精排分数rewardireward_i最高的物品,从集合RR移动到SS中;
  3. k1k-1轮循环:(每次移动一个,重新算MMR分数)
    1. 计算集合RR中所有物品的的分数 {MRRi}iR\{MRR_i\}_{i \in R}
    2. 选出分数最高的物品,将其从RR移动到SS

2.3 滑动窗口

MMR:从物品集合中选出综合精排分数和多样性的物品
MMR:argmaxiR{θrewardi(1θ)maxjSsim(i,j)}MMR : \underset{i \in \mathcal{R}}{\operatorname{argmax}}\left\{\theta \cdot \operatorname{reward}_{i}-(1-\theta) \cdot \max _{j \in \mathcal{S}} \operatorname{sim}(i, j)\right\}
以这样的方式计算MMR,但存在一个缺点:
  • 已选中的物品越多(集合SS越大),越难找出物品 iRi\in R,使得iiSS中的物品都不相似
  • sim的取值范围是[0,1][0,1]。当S很大时,多样性分数 maxjSsim(i,j)\max _{j \in \mathcal{S}} \operatorname{sim}(i, j)总是等于1,导致MMR算法失效。
解决方案:设置一个滑动窗口WW,比如最近选中的10个物品,用WW代替MMR公式中的SS
用滑动窗口的可解释性给用户曝光的连续物品应该不相似,但没必要最新的物品和 30 个之前的物品还不相似

2.4小结

  • MMR 使用在精排的后处理(重排)阶段
  • 根据精排分数和多样性分数给候选物品排序
  • MMR 决定了物品的最终曝光顺序
  • 实际应用中通常带滑动窗口,这样比标准 MMR 效果更好

3.重排的规则

  • 工业界的推荐系统一般有很多业务规则,这些规则通常是为了保护用户体验,做重排时这些规则必须被满足
  • 下面举例重排中的部分规则,以及这些规则与 MMR 相结合
  • 规则的优先级高于多样性算法

3.1重排的规则

(1)规则:最多连续出现 k篇某种笔记

  • 小红书推荐系统的物品分为图文笔记、视频笔记
  • 最多连续出现 k=5k=5篇图文笔记,最多连续出现k=5篇视频笔记
  • 如果排ii+4的全都是图文笔记,那么排在i+5的必须是视频笔记。

(2)规则:每k篇笔记最多出现1篇某种笔记

  • 运营推广笔记的精排分会乘以大于 1 的系数(boost),帮助笔记获得更多曝光。
  • 为了防止 boost 影响体验,限制每k=9k=9篇笔记最多出现1篇运营推广笔记。
  • 如果排第1位的是运营推广笔记,那么排i+1i+8的不能是运营推广笔记。

(3)前t篇笔记最多出现k篇某种笔记

  • 排名前t篇笔记最容易被看到,对用户体验最重要(小红书的top4为首屏)
  • 小红书推荐系统带有电商卡片的笔记,过多可能会影响体验;
  • t=1篇笔记最多出现k=0篇带电商卡片的笔记;
  • t=4篇笔记最多出现k=1篇带电商卡片的笔记。
注:不是小红书的真实数据

3.2 MMR + 重排规则

  • MMR 每一轮选出一个物品:
  • 重排结合 MMR 与规则,在满足规则的前提下最大化 MR
  • 每一轮先用规则排除点RR中部分物品,得到子集RR'
  • MMR公式中的RR替换成子集RR',选中的物品符合规则

4.DPP:数学基础

  • DPP:行列式点过程
  • DPP 的目标是从一个集合中选出尽量多样化的物品,契合重排的目标
  • 它是目前推荐系统领域公认的最好多样性算法

4.1超平行体示例

2 维空间的超平行体为平行四边形
  • 向量v1v_1v2v_2是平行四边形的两条边,确定一个平行四边形
  • 平行四边形中的点可以表示为:x=α1v1+α2v2\boldsymbol{x}=\alpha_{1} \boldsymbol{v}_{1}+\alpha_{2} \boldsymbol{v}_{2}
  • 系数 α1\alpha_1α2\alpha_2的取值范围是[0,1][0,1]
3 维空间的超平行体为平行六面体
  • 平行六面体中的点可以表示为: x=α1v1+α2v2+α3v3\boldsymbol{x}=\alpha_{1} \boldsymbol{v}_{1}+\alpha_{2} \boldsymbol{v}_{2}+\alpha_{3} \boldsymbol{v}_{3}
  • 系数 α1\alpha_1 ,α2\alpha_2α3\alpha_3的取值范围是[0,1][0,1]

4.2 超平形体数学定义

一个向量 v1,,vkRd\boldsymbol{v}_{1}, \cdots, \boldsymbol{v}_{k} \in \mathbb{R}^{d}可以确定一个k维超平形体;这些向量是超平形体的边,都是d维向量。
P(v1,,vk)={α1v1++αkvk0α1,,αk1}\mathcal{P}\left(\boldsymbol{v}_{1}, \cdots, \boldsymbol{v}_{k}\right)=\left\{\alpha_{1} \boldsymbol{v}_{1}+\cdots+\alpha_{k} \boldsymbol{v}_{k} \mid 0 \leq \alpha_{1}, \cdots, \alpha_{k} \leq 1\right\}
要求kdk≤ d,比如d=3维空间中有k=2维平行四边形。
如果v1,,vk\boldsymbol{v}_{1}, \cdots, \boldsymbol{v}_{k} 线性相关,则体积vol(P)=0\operatorname{vol}(\mathcal{P})=0。(例:有k=3个向量,落在一个平面上,则平行六面体的体积为0)

4.3 平行四边形的面积

面积=2×2面积 =\| 底 \left\|_{2} \times\right\| 高 \|_{2}
v1v_1为底,计算高q2q_2,两个向量必须正交。
v1v_1为底,如何计算高q2q_2
  • 计算v2v_2v1v_1上的投影:
Projv1(v2)=v1Tv2v122v1\operatorname{Proj}_{v_{1}}\left(v_{2}\right)=\frac{v_{1}^{T} v_{2}}{\left\|v_{1}\right\|_{2}^{2}} \cdot v_{1}
  • 就算q2=v2Projv1(v2)\boldsymbol{q}_{2}=\boldsymbol{v}_{2}-\operatorname{Proj}_{\boldsymbol{v}_{1}}\left(\boldsymbol{v}_{2}\right)
  • 性质:低v1v_1与高q2q_2正交
v2v_2 为底,如何计算高q1q_1
  • 计算v1v_1v2v_2上的投影:
Projv2(v1)=v1Tv2v222v2\operatorname{Proj}_{v_{2}}\left(v_{1}\right)=\frac{v_{1}^{T} v_{2}}{\left\|v_{2}\right\|_{2}^{2}} \cdot v_{2}
  • 就算q1=v1Projv2(v1)\boldsymbol{q}_{1}=\boldsymbol{v}_{1}-\operatorname{Proj}_{\boldsymbol{v}_{2}}\left(\boldsymbol{v}_{1}\right)
  • 性质:低v2v_2与高q1q_1正交

4.4 平行六面体的体积

体积=底面积×2体积 = 底面积 \times \| 高 \|\left.\right|_{2}
平行四边形 P(v1,v2)\mathcal{P}\left(\boldsymbol{v}_{1}, \boldsymbol{v}_{2}\right)是平行六面体P(v1,v2,v3)\mathcal{P}\left(\boldsymbol{v}_{1}, \boldsymbol{v}_{2}, \boldsymbol{v}_{3}\right)的底。
q3q_3垂直于底P(v1,v2)\mathcal{P}\left(\boldsymbol{v}_{1}, \boldsymbol{v}_{2}\right)
体积何时最大化、最小化?
  • v1,v_1, v2v_2, v3v_3都是单位向量。
  • 当三个向量正交时,平行六面体为正方体,体积最大化,vol=1
  • 当三个向量线性相关时,体积最小化,vol=0

4.5衡量物品多样性

(1)体积衡量多样性

给定k个物品,把他们表征为单位向量 v1,,vkRd\boldsymbol{v}_{1}, \cdots, \boldsymbol{v}_{k} \in \mathbb{R}^{d}。(dkd≥k
用超平行体的体积衡量物品的多样性,体积介于 0 和 1 之间;
如果 v1,,vkv_{1}, \cdots, v_{k}两两正交(多样性好),则体积最大化,vol=1
如果 v1,,vkv_{1}, \cdots, v_{k}线性相关(多样性差),则体积最大化,vol=0

(2)行列式衡量多样性

给定k个物品,把他们表征为单位向量 v1,,vkRd\boldsymbol{v}_{1}, \cdots, \boldsymbol{v}_{k} \in \mathbb{R}^{d}。(dkd≥k
把他们作为矩阵VRd×k\boldsymbol{V} \in \mathbb{R}^{d \times k}的列;
dkd≥ k,行列式与体积满足:
det(VTV)=vol(P(v1,,vk))2\operatorname{det}\left(\boldsymbol{V}^{T} \boldsymbol{V}\right)=\operatorname{vol}\left(\mathcal{P}\left(\boldsymbol{v}_{1}, \cdots, \boldsymbol{v}_{k}\right)\right)^{2}
因此,可以用行列式 det(VTV)\operatorname{det}\left(\boldsymbol{V}^{T} \boldsymbol{V}\right)衡量向量 v1,,vkv_{1}, \cdots, v_{k}的多样性
  • 行列式和体积是等价的

5.DPP:多样性算法

5.1 多样性问题

精排给n个物品打分:reward1,...,rewardnreward_1, ..., reward_n
n个物品的向量表征:v1,,vnRd\boldsymbol{v}_{1}, \cdots, \boldsymbol{v}_{n} \in \mathbb{R}^{d}
n个物品中选出k个物品,组成集合SS
  • 价值大:分数之和jSrewardj\sum_{j \in \mathcal{S}} \operatorname{reward}_{j} 越大越好
  • 多样性好:Sk个向量组成的超平行体 P(S)\mathcal{P}(\mathcal{S})的体积越大越好
集合S中的k个物品的向量作为列,组成矩阵 VSRd×k\boldsymbol{V}_{\mathcal{S}} \in \mathbb{R}^{d \times k}
以这k个向量作为边,组成超平形体P(S)\mathcal{P}(\mathcal{S});体积vol(P(S))vol(\mathcal{P}(\mathcal{S}))可以衡量S中物品的多样性。
k≤ d,行列式与体积满足:
det(VSTVS)=vol(P(S))2\operatorname{det}\left(\boldsymbol{V}_{\mathcal{S}}^{T} \boldsymbol{V}_{\mathcal{S}}\right)=\operatorname{vol}(\mathcal{P}(\mathcal{S}))^{2}

5.2 行列式点过程(DPP)

基本思想:使用行列式衡量多样性
DPP 是一种传统的统计机器学习方法:
argmaxS:S=klogdet(VSTVS)\underset{\mathcal{S}:|\mathcal{S}|=k}{\operatorname{argmax}} \log \operatorname{det}\left(\boldsymbol{V}_{\mathcal{S}}^{T} \boldsymbol{V}_{\mathcal{S}}\right)
  • 该公式严格来说叫 k-DPP
Hulu 的论文将 DPP 应用在推荐系统
argmaxS:S=kθ(jSrewardj)+(1θ)logdet(VSTVS)\underset{\mathcal{S}:|\mathcal{S}|=k}{\operatorname{argmax}} \theta \cdot\left(\sum_{j \in \mathcal{S}} \operatorname{reward}_{j}\right)+(1-\theta) \cdot \log \operatorname{det}\left(\boldsymbol{V}_{\mathcal{S}}^{T} \boldsymbol{V}_{\mathcal{S}}\right)
  • 前半部分计算集合中物品的价值,越大表示选中的物品越符合用户的兴趣
  • 后半部分是行列式的对数,测量合集S中的多样性;物品多样性越好,这部分越大
  • Hulu 论文的主要贡献不是提出该公式,而是快速求解该公式
参考文献:Chen et al. Fast greedy map inference for determinantal point process to improve recommendation diversity. In NIPS, 2018.

5.3 DPP 应用在推荐系统:

  • An×nn\times n的矩阵,它的(i,j)元素为aij=viTvja_{i j}=\boldsymbol{v}_{i}^{T} \boldsymbol{v}_{j}
  • 给定向量 v1,,vnRd\boldsymbol{v}_{1}, \cdots, \boldsymbol{v}_{n} \in \mathbb{R}^{d},需要O(n2d)O\left(n^{2} d\right)的时间计算A
  • ASA_SA的一个k×kk\times k子矩阵。如果i,则ai,ja_{i,j}ASA_S的一个元素
DPP公式可以等价写成以下形式:
DPP是个组合优化问题,从集合{1,...,n} \{1,...,n\}中选出一个大小为k的子集S。
S表示已选中的物品,用R表示未选中的物品,贪心算法求解:
argmaxiRθrewardi+(1θ)logdet(AS{i})\underset{i \in \mathcal{R}}{\operatorname{argmax}} \theta \cdot \operatorname{reward}_{i}+(1-\theta) \cdot \log \operatorname{det}\left(\boldsymbol{A}_{\mathcal{S} \cup\{i\}}\right)
  • rewardi{reward}_{i}:是物品i的价值,希望下一个物品也有较高的价值
  • logdet(AS{i})\log \operatorname{det}\left(\boldsymbol{A}_{\mathcal{S} \cup\{i\}}\right):行列式的对数,括号中是A的一个子矩阵,这个子矩阵比ASA_S多了一行和一列,行列式会发生变化,我们希望添加的物品i能让行列式尽量大,即物品i和行列式中的物品尽量不相似,否则行列式为0.

5.4 求解 DPP

贪心算法求解:
argmaxiRθrewardi+(1θ)logdet(AS{i})\underset{i \in \mathcal{R}}{\operatorname{argmax}} \theta \cdot \operatorname{reward}_{i}+(1-\theta) \cdot \log \operatorname{det}\left(\boldsymbol{A}_{\mathcal{S} \cup\{i\}}\right)
  • 初始时SS中只有一个物品,ASA_S1×1\times1的矩阵

(1)暴力算法

  • 对于单个ii,计算AS{i}\boldsymbol{A}_{\mathcal{S} \cup\{i\}}的行列式需要O(S3)O\left(|\mathcal{S}|^{3}\right)时间,因为需要对矩阵ASA_S分解。
  • 对于所有的iRi \in \mathcal{R},计算行列式需要时间O(S3R)O\left(|\mathcal{S}|^{3} \cdot|\mathcal{R}|\right)
  • 需要求解上式k次才能选出k个物品。如果暴力计算行列式,那么总时间复杂度为:
O(S3Rk)=O(nk4)O\left(|\mathcal{S}|^{3} \cdot|\mathcal{R}| \cdot k\right)=O\left(n k^{4}\right)
  • 暴力求解的总时间复杂度为:
O(n2d+nk4)O\left(n^{2} d+n k^{4}\right)
  • 其中 ndn^d是计算矩阵ASA_S的时间复杂度,nk4nk^4是计算行列式时间
n的量级是几百,dk的量级都是几十。这个时间复杂度看起来不大,但系统留给多样新计算的时间只有十几毫秒,复杂度还是有点高。

(2)Hulu的快速算法

Hulu的论文设计了一种数值算法,仅需O(n2d+nk2)O\left(n^{2} d+n k^{2}\right)的时间从n个物品中选出k个物品。
  • 给定向量 v1,,vnRd\boldsymbol{v}_{1}, \cdots, \boldsymbol{v}_{n} \in \mathbb{R}^{d},需要O(n2d)O\left(n^{2} d\right)的时间计算A
  • O(nk2)O\left(n k^{2}\right)时间计算所有的行列式(利用Cholesky分解)。
Cholesky分解AS=LLT\boldsymbol{A}_{\mathcal{S}}=\boldsymbol{L} \boldsymbol{L}^{T},其中L是下三角矩阵(对角线以上元素全零)
Cholesky分解可供计算ASA_S的行列式:
  • 下三角矩阵LL的行列式det(L)det(L)等于LL对角线元素乘积。
  • ASA_S的行列式为det(AS)=det(L)2=ilii2\operatorname{det}\left(\boldsymbol{A}_{\mathcal{S}}\right)=\operatorname{det}(\boldsymbol{L})^{2}=\prod_{i} l_{i i}^{2}
ASA_S添加一行一列,Cholesky矩阵的变换非常小,能快速算出AS{i}\boldsymbol{A}_{\mathcal{S} \cup\{i\}}的行列式。
已知AS=LLT\boldsymbol{A}_{\mathcal{S}}=\boldsymbol{L} \boldsymbol{L}^{T},则可以快速求出所有AS{i}\boldsymbol{A}_{\mathcal{S} \cup\{i\}}Cholesky分解,因此可以快速计算出所有AS{i}\boldsymbol{A}_{\mathcal{S} \cup\{i\}}的行列式。

5.5 DPP 的扩展

(1)滑动窗口

SS表示已选中的物品,用RR表示未选中的物品,DPP的贪心算法求解:
argmaxiRθrewardi+(1θ)logdet(AS{i})\underset{i \in \mathcal{R}}{\operatorname{argmax}} \theta \cdot \operatorname{reward}_{i}+(1-\theta) \cdot \log \operatorname{det}\left(\boldsymbol{A}_{\mathcal{S} \cup\{i\}}\right)
DPP缺点:随着集合S增大,其中相似物品越来越多,物品向量会趋近线性相关;行列式det(AS)\operatorname{det}\left(\boldsymbol{A}_{\mathcal{S}}\right)会坍缩到零,对数趋于负无穷
用滑动窗口公式:
argmaxiRθrewardi+(1θ)logdet(AW{i})\underset{i \in \mathcal{R}}{\operatorname{argmax}} \theta \cdot \operatorname{reward}_{i}+(1-\theta) \cdot \log \operatorname{det}\left(\boldsymbol{A}_{\mathcal{W} \cup\{i\}}\right)

(2)规则约束

贪心算法每轮从R中选出一个物品:
argmaxiRθrewardi+(1θ)logdet(AW{i})\underset{i \in \mathcal{R}}{\operatorname{argmax}} \theta \cdot \operatorname{reward}_{i}+(1-\theta) \cdot \log \operatorname{det}\left(\boldsymbol{A}_{\mathcal{W} \cup\{i\}}\right)
有很多规则约束,例如最多连续出 5 篇视频笔记(如果已经连续出了 5 篇视频笔记,下一篇必须是图文笔记)
用规则排除掉RR中部分笔记,得到子集RR',然后求解:
argmaxiRθrewardi+(1θ)logdet(AW{i})\underset{i \in \mathcal{R}^{\prime}}{\operatorname{argmax}} \theta \cdot \operatorname{reward}_{i}+(1-\theta) \cdot \log \operatorname{det}\left(\boldsymbol{A}_{\mathcal{W} \cup\{i\}}\right)


Comment
avatar
Dongnian
A salty fish swimming in the sea of deep learning!
Follow Me
Announcement
Welcome to My Personal Blog!
If Not, Please Visit Gitee Mirror.