Involution Hell
AI 知识库Recommender systems

王树森推荐系统学习笔记_重排

王树森推荐系统学习笔记_重排

重排

推荐系统中的多样性

物品相似性的度量

相似性的度量

  • 基于物品属性标签。

    • 类目、品牌、关键词……
  • 基于物品向量表征。

    • 用召回的双塔模型学到的物品向量 (不好)
    • 基于内容的向量表征 (好)

基于物品属性标签

  • 物品属性标签:类目、品牌、关键词……
  • 根据 一级类目二级类目品牌 计算相似度。
    • 物品 ii:美妆、彩妆、香奈儿。
    • 物品 jj:美妆、香水、香奈儿。
    • 相似度:sim1(i,j)=1\text{sim}_1(i, j) = 1sim2(i,j)=0\text{sim}_2(i, j) = 0sim3(i,j)=1\text{sim}_3(i, j) = 1

基于图文内容的物品表征可以提升多样性。

可以用 CNN 处理图片输出特征向量,BERT 处理文字输出特征向量。最后将两个向量拼起来即可。

如何训练 CNN 与 BERT?

  • CLIP 是当前公认最有效的预训练方法。
  • 思想:对于 图片—文本 二元组,预测图文是否匹配。
  • 优势:无需人工标注。小红书的笔记天然包含图片 + 文字,大部分笔记图文相关。

  • 一个 batch 内有 mm 对正样本。
  • 一张图片和 m1m - 1 条文本组成负样本。
  • 这个 batch 内一共有 m(m1)m(m - 1) 对负样本。

提升多样性的方法

粗排的后处理也需要多样性算法。

精排的后处理也被称为重排。

Maximal Marginal Relevance (MMR)

多样性

  • 精排给 nn 个候选物品打分,融合之后的分数为
    reward1,,rewardn\text{reward}_1, \dots, \text{reward}_n
  • 把第 iijj 个物品的相似度记作 sim(i,j)\text{sim}(i,j)
  • nn 个物品中选出 kk 个,既要有高精排分数,也要有多样性。

MMR多样性算法

  • 计算集合 R\mathcal{R} 中每个物品 ii 的 Marginal Relevance 分数:

    MRi=θrewardi(1θ)maxjSsim(i,j)\text{MR}_i = \theta \cdot \text{reward}_i - (1 - \theta) \cdot \max\limits_{j \in \mathcal{S}} \text{sim}(i, j)
  • rewardi \text{reward}_i 是物品的精排分数,maxjSsim(i,j)\max\limits_{j \in \mathcal{S}} \text{sim}(i, j) 是未选中的物品 ii 与已选中物品的相似程度。精排分数分数越高,相似程度越低,物品的 MR 分数就越高。

  • Maximal Marginal Relevance (MMR): 从未选中物品中选出 MR 分数最高的

    argmaxiRMRi\arg\max\limits_{i \in \mathcal{R}} \text{MR}_i

MMR 多样性算法

  1. 已选中的物品 S\mathcal{S} 初始化为空集,未选中的物品 R\mathcal{R} 初始化为全集 {1,,n}\{1, \dots, n\}
  2. 选择精排分数 rewardi\text{reward}_i 最高的物品,从集合 R\mathcal{R} 移到 S\mathcal{S}
  3. k1k - 1 轮循环: a. 计算集合 R\mathcal{R} 中所有物品的分数 {MRi}iR\{\text{MR}_i\}_{i \in \mathcal{R}}。 b. 选出分数最高的物品,将其从 R\mathcal{R} 移到 S\mathcal{S}

滑动窗口

  • MMR

    argmaxiR{θrewardi(1θ)maxjSsim(i,j)}\arg\max\limits_{i \in \mathcal{R}} \left\{ \theta \cdot \text{reward}_i - (1 - \theta) \cdot \max\limits_{j \in \mathcal{S}} \text{sim}(i, j) \right\}
  • 已选中的物品越多(即集合 S\mathcal{S} 越大),越难找出物品 iRi \in \mathcal{R},使得 iiS\mathcal{S} 中的物品都不相似。

  • sim\text{sim} 的取值范围是 [0,1][0,1]。当 S\mathcal{S} 很大时,多样性分数 maxjSsim(i,j)\max\limits_{j \in \mathcal{S}} \text{sim}(i, j) 总是约等于 1,导致 MMR 算法失效。

  • 解决方案:设置一个滑动窗口 W\mathcal{W},比如最近选中的 10 个物品,用 W\mathcal{W} 代替 MMR 公式中的 S\mathcal{S}

  • 标准 MMR

    argmaxiR{θrewardi(1θ)maxjSsim(i,j)}.\arg\max\limits_{i \in \mathcal{R}} \left\{ \theta \cdot \text{reward}_i - (1 - \theta) \cdot \max\limits_{j \in \mathcal{S}} \text{sim}(i, j) \right\}.
  • 用滑动窗口

    argmaxiR{θrewardi(1θ)maxjWsim(i,j)}\arg\max\limits_{i \in \mathcal{R}} \left\{ \theta \cdot \text{reward}_i - (1 - \theta) \cdot \max\limits_{j \in \mathcal{W}} \text{sim}(i, j) \right\}

重排的规则

重排的规则

规则:最多连续出现 kk 篇某种笔记

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

规则:每 kk 篇笔记最多出现 1 篇某种笔记

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

规则:前 tt 篇笔记最多出现 kk 篇某种笔记

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

MMR + 重排规则

  • MMR 每一轮选出一个物品:

    argmaxiR{θrewardi(1θ)maxjWsim(i,j)}\arg\max\limits_{i \in \mathcal{R}} \left\{ \theta \cdot \text{reward}_i - (1 - \theta) \cdot \max\limits_{j \in \mathcal{W}} \text{sim}(i, j) \right\}
  • 重排结合 MMR 与规则,在满足规则的前提下最大化 MR。

  • 每一轮先用规则排除掉 R\mathcal{R} 中的部分物品,得到子集 R\mathcal{R'}

  • MMR 公式中的 R\mathcal{R} 替换成子集 R\mathcal{R'},选中的物品符合规则。

DPP:数学基础

超平行体

  • 2 维空间的 超平行体平行四边形

  • 平行四边形中的点可以表示为:

    x=α1v1+α2v2.\mathbf{x} = \alpha_1 \mathbf{v}_1 + \alpha_2 \mathbf{v}_2.

  • 系数 α1\alpha_1α2\alpha_2 取值范围是 [0,1][0,1]

  • 3 维空间的 超平行体平行六面体

  • 平行六面体中的点可以表示为:

    x=α1v1+α2v2+α3v3.\mathbf{x} = \alpha_1 \mathbf{v}_1 + \alpha_2 \mathbf{v}_2 + \alpha_3 \mathbf{v}_3.

  • 系数 α1,α2,α3\alpha_1, \alpha_2, \alpha_3 取值范围是 [0,1][0,1]

超平行体

  • 一组向量 v1,,vkRd\mathbf{v}_1, \cdots, \mathbf{v}_k \in \mathbb{R}^d 可以确定一个 kk 维超平行体:

    P(v1,,vk)={α1v1++αkvk0α1,,αk1}.P(\mathbf{v}_1, \cdots, \mathbf{v}_k) = \{\alpha_1 \mathbf{v}_1 + \cdots + \alpha_k \mathbf{v}_k \mid 0 \leq \alpha_1, \cdots, \alpha_k \leq 1\}.

  • 要求 kdk \leq d,比如 d=3d = 3 维空间中有 k=2k = 2 维平行四边形。

  • 如果 v1,,vk\mathbf{v}_1, \cdots, \mathbf{v}_k 线性相关,则体积 vol(P)=0\text{vol}(P) = 0。(例:有 k=3k = 3 个向量,落在一个平面上,则平行六面体的体积为 0。)

平行四边形的面积

v2\mathbf{v}_2 为底,如何计算高 q1\mathbf{q}_1

  • 计算 v1\mathbf{v}_1v2\mathbf{v}_2 上的投影:

    Projv2(v1)=v1Tv2v222v2.\text{Proj}_{\mathbf{v}_2}(\mathbf{v}_1) = \frac{\mathbf{v}_1^T \mathbf{v}_2}{\|\mathbf{v}_2\|_2^2} \cdot \mathbf{v}_2.

  • 计算

    q1=v1Projv2(v1).\mathbf{q}_1 = \mathbf{v}_1 - \text{Proj}_{\mathbf{v}_2}(\mathbf{v}_1).

  • 性质:底 v2\mathbf{v}_2 与高 q1\mathbf{q}_1 正交。

平行六面体的体积

  • 体积 = 底面积 × 2\|\text{高}\|_2

  • 平行四边形 P(v1,v2)P(\mathbf{v}_1, \mathbf{v}_2) 是平行六面体 P(v1,v2,v3)P(\mathbf{v}_1, \mathbf{v}_2, \mathbf{v}_3) 的底。

  • q3\mathbf{q}_3 垂直于底 P(v1,v2)P(\mathbf{v}_1, \mathbf{v}_2)

体积何时最大化、最小化?

  • v1\mathbf{v}_1v2\mathbf{v}_2v3\mathbf{v}_3 都是单位向量。

  • 当三个向量正交时,平行六面体为正方体,体积最大化,vol=1\text{vol} = 1

  • 当三个向量线性相关时,体积最小化,vol=0\text{vol} = 0

衡量物品多样性

  • 给定 kk 个物品,把它们表征为单位向量 v1,,vkRd\mathbf{v}_1, \cdots, \mathbf{v}_k \in \mathbb{R}^d。(dkd \geq k

  • 用超平行体的体积衡量物品的多样性,体积介于 0011 之间。

  • 如果 v1,,vk\mathbf{v}_1, \cdots, \mathbf{v}_k 两两正交(多样性好),则体积最大化,vol=1\text{vol} = 1

  • 如果 v1,,vk\mathbf{v}_1, \cdots, \mathbf{v}_k 线性相关(多样性差),则体积最小化,vol=0\text{vol} = 0

  • 给定 kk 个物品,把它们表征为单位向量 v1,,vkRd\mathbf{v}_1, \cdots, \mathbf{v}_k \in \mathbb{R}^d。(dkd \geq k

  • 把它们作为矩阵 VRd×k\mathbf{V} \in \mathbb{R}^{d \times k} 的列。

  • dkd \geq k,行列式与体积满足:

    det(VTV)=vol(P(v1,,vk))2.\det(\mathbf{V}^T \mathbf{V}) = \text{vol}(P(\mathbf{v}_1, \cdots, \mathbf{v}_k))^2.

  • 因此,可以用行列式 det(VTV)\det(\mathbf{V}^T \mathbf{V}) 衡量向量 v1,,vk\mathbf{v}_1, \cdots, \mathbf{v}_k 的多样性。

DPP:多样性算法

多样性问题

  • 精排给 nn 个物品打分:reward1,,rewardn\text{reward}_1, \cdots, \text{reward}_n

  • nn 个物品的向量表征:v1,,vnRd\mathbf{v}_1, \cdots, \mathbf{v}_n \in \mathbb{R}^d

  • nn 个物品中选出 kk 个物品,组成集合 S\mathcal{S}

    • 价值大:分数之和 jSrewardj\sum_{j \in \mathcal{S}} \text{reward}_j 越大越好。
    • 多样性好S\mathcal{S}kk 个向量组成的超平行体 P(S)P(\mathcal{S}) 的体积越大越好。
  • 集合 S\mathcal{S} 中的 kk 个物品的向量作为列,组成矩阵 VSRd×k\mathbf{V}_{\mathcal{S}} \in \mathbb{R}^{d \times k}

  • 以这 kk 个向量作为边,组成超平行体 P(S)P(\mathcal{S})

  • 体积 vol(P(S))\text{vol}(P(\mathcal{S})) 可以衡量 S\mathcal{S} 中物品的多样性。

  • kdk \leq d,行列式与体积满足:

    det(VSTVS)=vol(P(S))2\det(\mathbf{V}_{\mathcal{S}}^T \mathbf{V}_{\mathcal{S}}) = \text{vol}(P(\mathcal{S}))^2

行列式点过程(DPP)

  • DPP 是一种传统的统计机器学习方法:

    argmaxS:S=klogdet(VSTVS)\arg\max_{\mathcal{S}: |\mathcal{S}|=k} \log \det(\mathbf{V}_{\mathcal{S}}^T \mathbf{V}_{\mathcal{S}})
  • Hulu 的论文将 DPP 应用在推荐系统:

    argmaxS:S=kθ(jSrewardj)+(1θ)logdet(VSTVS)\arg\max_{\mathcal{S}: |\mathcal{S}|=k} \theta \cdot \left( \sum_{j \in \mathcal{S}} \text{reward}_j \right) + (1 - \theta) \cdot \log \det(\mathbf{V}_{\mathcal{S}}^T \mathbf{V}_{\mathcal{S}})
  • DPP 应用在推荐系统

    argmaxS:S=kθ(jSrewardj)+(1θ)logdet(VSTVS)\arg\max_{\mathcal{S}: |\mathcal{S}|=k} \theta \cdot \left( \sum_{j \in \mathcal{S}} \text{reward}_j \right) + (1 - \theta) \cdot \log \det(\mathbf{V}_{\mathcal{S}}^T \mathbf{V}_{\mathcal{S}})
  • A\mathbf{A}n×nn \times n 的矩阵,它的 (i,j)(i,j) 元素为 aij=viTvja_{ij} = \mathbf{v}_i^T \mathbf{v}_j

  • 给定向量 v1,,vnRd\mathbf{v}_1, \cdots, \mathbf{v}_n \in \mathbb{R}^d,需要 O(n2d)O(n^2 d) 时间计算 A\mathbf{A}

  • AS=VSTVS\mathbf{A}_{\mathcal{S}} = \mathbf{V}_{\mathcal{S}}^T \mathbf{V}_{\mathcal{S}}A\mathbf{A} 的一个 k×kk \times k 子矩阵。如果 i,jSi, j \in \mathcal{S},则 aija_{ij}AS\mathbf{A}_{\mathcal{S}} 的一个元素。

  • DPP 应用在推荐系统

    argmaxS:S=kθ(jSrewardj)+(1θ)logdet(AS)\arg\max_{\mathcal{S}: |\mathcal{S}|=k} \theta \cdot \left( \sum_{j \in \mathcal{S}} \text{reward}_j \right) + (1 - \theta) \cdot \log \det(\mathbf{A}_{\mathcal{S}})
  • DPP 是个组合优化问题,从集合 {1,,n}\{1, \cdots, n\} 中选出一个大小为 kk 的子集 S\mathcal{S}

  • S\mathcal{S} 表示已选中的物品,用 R\mathcal{R} 表示未选中的物品,贪心算法求解:

    argmaxiRθrewardi+(1θ)logdet(AS{i})\arg\max_{i \in \mathcal{R}} \theta \cdot \text{reward}_i + (1 - \theta) \cdot \log \det(\mathbf{A}_{\mathcal{S} \cup \{i\}})

求解DPP

暴力算法

  • 贪心算法求解

    argmaxiRθrewardi+(1θ)logdet(AS{i}).\arg\max_{i \in \mathcal{R}} \theta \cdot \text{reward}_i + (1 - \theta) \cdot \log \det(\mathbf{A}_{\mathcal{S} \cup \{i\}}).
  • 计算复杂度分析

    • 对于单个 ii,计算 AS{i}\mathbf{A}_{\mathcal{S} \cup \{i\}} 的行列式需要 O(S3)O(|\mathcal{S}|^3) 时间。

    • 对于所有的 iRi \in \mathcal{R},计算行列式需要时间 O(S3R)O(|\mathcal{S}|^3 \cdot |\mathcal{R}|)

    • 需要求解上述式子 kk 次才能选出 kk 个物品。如果暴力计算行列式,那么总时间复杂度为:

      O(S3Rk)=O(nk4).O(|\mathcal{S}|^3 \cdot |\mathcal{R}| \cdot k) = O(nk^4).
  • 暴力算法的总时间复杂度为

    O(n2d+nk4).O(n^2 d + nk^4).

Hulu 的快速算法

  • Hulu 的论文设计了一种数值算法,仅需 O(n2d+nk2)O(n^2 d + nk^2) 的时间从 nn 个物品中选出 kk 个物品。

  • 给定向量 v1,,vnRd\mathbf{v}_1, \cdots, \mathbf{v}_n \in \mathbb{R}^d,需要 O(n2d)O(n^2 d) 时间计算 A\mathbf{A}

  • O(nk2)O(nk^2) 时间计算所有的行列式(利用 Cholesky 分解)。

  • Cholesky 分解 AS=LLT\mathbf{A}_{\mathcal{S}} = \mathbf{L} \mathbf{L}^T,其中 L\mathbf{L} 是下三角矩阵(对角线以上的元素全零)。

  • Cholesky 分解可供计算 AS\mathbf{A}_{\mathcal{S}} 的行列式

    • 下三角矩阵 L\mathbf{L} 的行列式 det(L)\det(\mathbf{L}) 等于 L\mathbf{L} 对角线元素乘积。

    • AS\mathbf{A}_{\mathcal{S}} 的行列式为:

      det(AS)=det(L)2=ilii2.\det(\mathbf{A}_{\mathcal{S}}) = \det(\mathbf{L})^2 = \prod_i l_{ii}^2.
  • 已知 AS=LLT\mathbf{A}_{\mathcal{S}} = \mathbf{L} \mathbf{L}^T,则可以快速求出所有 AS{i}\mathbf{A}_{\mathcal{S} \cup \{i\}} 的 Cholesky 分解,因此可以快速计算出所有 AS{i}\mathbf{A}_{\mathcal{S} \cup \{i\}} 的行列式。

  • 贪心算法求解

    argmaxiRθrewardi+(1θ)logdet(AS{i}).\arg\max_{i \in \mathcal{R}} \theta \cdot \text{reward}_i + (1 - \theta) \cdot \log \det(\mathbf{A}_{\mathcal{S} \cup \{i\}}).
  • 初始化S\mathcal{S} 中只有一个物品,AS\mathbf{A}_{\mathcal{S}}1×11 \times 1 的矩阵。

  • 每一轮循环

    • 基于上一轮算出的 AS=LLT\mathbf{A}_{\mathcal{S}} = \mathbf{L} \mathbf{L}^T,快速求出 AS{i}\mathbf{A}_{\mathcal{S} \cup \{i\}} 的 Cholesky 分解(iR\forall i \in \mathcal{R})。
    • 从而求出 logdet(AS{i})\log \det(\mathbf{A}_{\mathcal{S} \cup \{i\}})

DPP 的扩展

滑动窗口

  • S\mathbf{S} 表示已选中的物品,用 R\mathcal{R} 表示未选中的物品,DPP 的贪心算法求解:

    argmaxiRθrewardi+(1θ)logdet(AS{i}).\arg\max\limits_{i \in \mathcal{R}} \theta \cdot \text{reward}_i + (1 - \theta) \cdot \log \det (\mathbf{A}_{\mathbf{S} \cup \{i\}}).
  • 随着集合 S\mathbf{S} 增大,其中相似物品越来越多,物品向量会趋近线性相关。

  • 行列式 det(AS)\det(\mathbf{A}_{\mathbf{S}}) 会塌缩到零,对数趋于负无穷。

  • 贪心算法:

    argmaxiRθrewardi+(1θ)logdet(AS{i})\arg\max\limits_{i \in \mathcal{R}} \theta \cdot \text{reward}_i + (1 - \theta) \cdot \log \det (\mathbf{A}_{\mathbf{S} \cup \{i\}})
  • 用滑动窗口:

    argmaxiRθrewardi+(1θ)logdet(AW{i})\arg\max\limits_{i \in \mathcal{R}} \theta \cdot \text{reward}_i + (1 - \theta) \cdot \log \det (\mathbf{A}_{\mathcal{W} \cup \{i\}})

规则约束

  • 贪心算法每轮从 R\mathcal{R} 中选出一个物品:

    argmaxiRθrewardi+(1θ)logdet(AW{i})\arg\max\limits_{i \in \mathcal{R}} \theta \cdot \text{reward}_i + (1 - \theta) \cdot \log \det (\mathbf{A}_{\mathcal{W} \cup \{i\}})
  • 有很多规则约束,例如最多连续出 5 篇视频笔记(如果已经连续出了 5 篇视频笔记,下一篇必须是图文笔记)。

  • 用规则排除掉 R\mathcal{R} 中的部分物品,得到子集 R\mathcal{R'},然后求解:

    argmaxiRθrewardi+(1θ)logdet(AW{i})\arg\max\limits_{i \in \mathcal{R'}} \theta \cdot \text{reward}_i + (1 - \theta) \cdot \log \det (\mathbf{A}_{\mathcal{W} \cup \{i\}})

贡献者