重排
重排 是精排后的一个阶段,主要负责在最终展示结果前对精排后的排序列表进行进一步优化和调整(微调)。重排核心目标是保证一定相关性的前提下,提高结果的多样性,从而提升用户体验,满足用户在不同方面的需求,避免搜索结果过于单一、相似和同质化,为用户提供更丰富、全面的信息。
单点估计方法
分桶
- 将搜索结果按照文档属性(如类目、来源、形态、样式等)进行分桶
- 每个桶中的文档按照精排打分降序排序后,再按照指定规则从不同桶中交替抽取结果展示
滑动窗口
- 将候选文档按精排打分从高到低降序排序
- 确定滑动窗口的大小 N(窗口大小可以是固定的,或根据实际情况动态调整)
- 选择前 N 个候选项,作为滑动窗口中的初始内容
- 根据业务需求,设置打散规则,确保滑动窗口内的内容多样化,避免相似内容集中在一起。具体的,对滑动窗口中的内容,检查其是否满足多样性约束。如果不满足,则通过交换、重排序或替换等方式调整窗口内的文档,直到满足多样性要求为止
- 窗口向右滑动一个单位,去掉窗口左边的第一个结果,并加入窗口右侧新的结果
- 逐步滑动窗口并优化多样性,直到所有搜索结果都被处理完毕,或者达到预设的多样性目标
MMR
设有一组候选文档 D = { d 1 , d 2 , … , d m } D = \{d_1, d_2, \dots, d_m\} D={d1,d2,…,dm},需要从中选择一组结果 S ⊆ D S \subseteq D S⊆D,其中每个结果 d i d_i di 都有一个与查询 Q Q Q 的相关性评分(精排模型打分) Rel ( d i ) \text{Rel}(d_i) Rel(di),在满足相关性的同时要避免选择与已选结果 S S S 中内容过于相似的文档。MMR(Maximal Marginal Relevance) 打分函数为:
MMR ( d ) = λ ⋅ Rel ( d ) − ( 1 − λ ) ⋅ max d ′ ∈ S Sim ( d , d ′ ) \text{MMR}(d) = \lambda \cdot \text{Rel}(d) - (1 - \lambda) \cdot \max_{d' \in S} \text{Sim}(d, d') MMR(d)=λ⋅Rel(d)−(1−λ)⋅d′∈SmaxSim(d,d′)
其中:
- Rel ( d ) \text{Rel}(d) Rel(d) 是文档 d d d 与查询 Q Q Q 的相关性得分
- Sim ( d , d ′ ) \text{Sim}(d, d') Sim(d,d′) 是文档 d d d 与已选结果集 S S S 中某个文档 d ′ d' d′ 的相似度(可以用余弦相似度或其它度量方法计算)
- λ \lambda λ 是一个权重参数,用于平衡相关性和多样性之间的权衡,通常 0 ≤ λ ≤ 1 0 \leq \lambda \leq 1 0≤λ≤1
- S S S 是已选结果集,即在当前选择阶段之前已经选择的结果集合
DPP
DPP(Determinantal Point Processes),行列式点过程 是一种用于选择和排序多样化子集的概率模型,其通过最大化子集的行列式来鼓励选择之间的多样性。DPP 本质是一种在给定集合中选择子集的概率分布,能够有效地避免相似项的集中出现,从而实现多样性的优化。
相似度矩阵
给定一个候选集合 X = { x 1 , x 2 , … , x n } X = \{x_1, x_2, \dots, x_n\} X={x1,x2,…,xn},每个元素 x i x_i xi 对应一个文档对象。DPP基于 相似度矩阵 来建模对象之间的关系。矩阵 K K K 是一个对称矩阵,其中每个元素 K i j K_{ij} Kij 表示对象 x i x_i xi 和 x j x_j xj 之间的相似度。
-
相似度矩阵:
K = ( K 11 K 12 … K 1 n K 21 K 22 … K 2 n ⋮ ⋮ ⋱ ⋮ K n 1 K n 2 … K n n ) K = \begin{pmatrix} K_{11} & K_{12} & \dots & K_{1n} \\ K_{21} & K_{22} & \dots & K_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ K_{n1} & K_{n2} & \dots & K_{nn} \end{pmatrix} K= K11K21⋮Kn1K12K22⋮Kn2……⋱…K1nK2n⋮Knn
其中, K i j K_{ij} Kij 是项 x i x_i xi 和项 x j x_j xj 之间的相似度。
更具体的,将 DPP 模型应用于搜索/推荐任务,需要构建核矩阵。核矩阵可以写成 Gram 矩阵 K = B ⊤ B K=B^{\top} B K=B⊤B,其中 B B B 的列是表示文档/物品的向量。将每个列向量 B i B_{i} Bi 构建为文档相关性得分 r i ≥ 0 r_{i}\geq 0 ri≥0 与一个归一化向量 f i ∈ R D f_{i}\in R^{D} fi∈RD(满足 ∥ f i ∥ 2 = 1 \left\|f_{i}\right\|_{2}=1 ∥fi∥2=1)的乘积。核矩阵 K K K 中的元素可以写成:
K i j = ⟨ B i , B j ⟩ = ⟨ r i f i , r j f j ⟩ = r i r j ⟨ f i , f j ⟩ (a) K_{i j}=\left\langle B_i, B_j\right\rangle=\left\langle r_i f_i, r_j f_j\right\rangle=r_i r_j\left\langle f_i, f_j\right\rangle \tag{a} Kij=⟨Bi,Bj⟩=⟨rifi,rjfj⟩=rirj⟨fi,fj⟩(a)
其中 ⟨ f i , f j ⟩ = S i j \left\langle f_{i}, f_{j}\right\rangle=S_{i j} ⟨fi,fj⟩=Sij 为衡量文档 i i i 和文档 j j j 之间相似性的数值。因此,用户查询 u u u 的核矩阵可以写成:
K = Diag ( r u ) ⋅ S ⋅ Diag ( r u ) K=\operatorname{Diag}\left(r_{u}\right)\cdot S\cdot\operatorname{Diag}\left(r_{u}\right) K=Diag(ru)⋅S⋅Diag(ru)
其中 Diag ( r u ) \operatorname{Diag}\left(r_{u}\right) Diag(ru) 是对角线向量为 r u r_{u} ru 的对角矩阵。
K R u K_{R_u} KRu 表示被文档子集 R u R_{u} Ru 索引的核矩阵的子矩阵,衡量文档子集 R u R_{u} Ru 的相关性和多样性的对数概率为:
log det ( K R u ) = ∑ i ∈ R u log ( r u , i 2 ) + log det ( S R u ) (b) \log\operatorname{det}\left(K_{R_u}\right)=\sum_{i\in R_u}\log\left(r_{u, i}^2\right)+\log\operatorname{det}\left(S_{R_u}\right) \tag{b} logdet(KRu)=i∈Ru∑log(ru,i2)+logdet(SRu)(b)
等式 (b) 中等号的右边两项分别衡量相关性和多样性,第二项在 R u R_{u} Ru 的文档表示正交时最大化(促进多样性)。
核矩阵(或称为Gram矩阵)是一个对称矩阵,其中的元素表示数据点对之间的相似性。给定数据集 X = { x 1 , x 2 , … , x n } X = \{ x_1, x_2, \dots, x_n \} X={x1,x2,…,xn},核矩阵 K K K 的元素 K i j K_{ij} Kij 表示数据点 x i x_i xi 和 x j x_j xj 之间的相似度,通常通过核函数(Kernel Function)计算:
K i j = k ( x i , x j ) K_{ij} = k(x_i, x_j) Kij=k(xi,xj)
其中, k ( x i , x j ) k(x_i, x_j) k(xi,xj) 是核函数,表示数据点 x i x_i xi 和 x j x_j xj 之间的相似性度量。
- 线性核: k ( x i , x j ) = x i T x j k(x_i, x_j) = x_i^T x_j k(xi,xj)=xiTxj
- 高斯核(RBF核,Radial Basis Function): k ( x i , x j ) = exp ( − ∣ x i − x j ∣ 2 2 σ 2 ) k(x_i, x_j) = \exp\left(-\frac{| x_i - x_j |^2}{2\sigma^2}\right) k(xi,xj)=exp(−2σ2∣xi−xj∣2)
- 多项式核(Polynomial Kernel): k ( x i , x j ) = ( x i T x j + c ) d k(x_i, x_j) = (x_i^T x_j + c)^d k(xi,xj)=(xiTxj+c)d
- Sigmoid核: k ( x i , x j ) = tanh ( α x i T x j + c ) k(x_i, x_j) = \tanh(\alpha x_i^T x_j + c) k(xi,xj)=tanh(αxiTxj+c)
DPP概率模型
DPP 能够将复杂的概率计算转换成简单的行列式计算,基于 DPP 的多样性算法通过计算核矩阵的行列式找到候选中相关性和多样性最大的子集。
如上给定一个候选集合 X = { x 1 , x 2 , … , x n } X = \{x_1, x_2, \dots, x_n\} X={x1,x2,…,xn},并给定一个子集 S ⊆ X S \subseteq X S⊆X。行列式点过程 P P P 是在 X X X 的所有子集的集合 2 X 2^X 2X 上的概率测度。当 P P P 对空集赋予非零概率时,存在一个矩阵 K ∈ R n × n K \in R^{n \times n} K∈Rn×n 使得每个子集 S ⊆ X S \subseteq X S⊆X, S S S 的概率为:
P ( S ) ∝ d e t ( K S ) \mathbb{P}(S)\propto d e t(K_{S}) P(S)∝det(KS)
其中 K K K 为一个实数半正定矩阵核矩阵,由 X X X 的元素索引。
将上述公式归一化后,DPP 选取的概率由以下公式给出:
P ( S ) = det ( K S ) ∑ S ′ ∈ X det ( K S ′ ) = det ( K S ) det ( K + I ) \mathbb{P}(S) = \frac{\det(K_S)}{\sum_{S^{'} \in \mathbb{X}} \det(K_{S^{'}})} = \frac{\det(K_S)}{\det(K + I)} P(S)=∑S′∈Xdet(KS′)det(KS)=det(K+I)det(KS)
- K S K_S KS:是子集 S S S 中所有项之间的相似度矩阵。即,如果 S = { x 1 , x 3 , x 4 } S = \{x_1, x_3, x_4\} S={x1,x3,x4},那么 K S K_S KS 是矩阵 K K K 的一个子矩阵,只包含 x 1 , x 3 , x 4 x_1, x_3, x_4 x1,x3,x4 之间的相似度
- X \mathbb{X} X:是 X X X 中所有子集的集合
- det ( K S ) \det(K_S) det(KS):是子集 S S S 的行列式,行列式越大,表示子集内项之间的多样性越高。即子集内的项之间越不相似,行列式的值就越大
- det ( K + I ) \det(K + I) det(K+I):是对矩阵 K K K 加上单位矩阵 I I I 之后的行列式
半正定矩阵(Positive Semi-Definite Matrix): 给定实对称矩阵 A ∈ R n × n A \in \mathbb{R}^{n \times n} A∈Rn×n ,若对于任何非零向量 x ∈ R n \mathbf{x} \in \mathbb{R}^n x∈Rn,都有:
x T A x ≥ 0 \mathbf{x}^T A \mathbf{x} \geq 0 xTAx≥0
则矩阵 A A A 为半正定矩阵。 半正定矩阵的特征值是非负的,如果矩阵 A A A 的所有特征值都是正的,那么它被称为 正定矩阵(Positive Definite Matrix)。
半正定矩阵通常与向量空间中的二次型相关联。具体地,对于矩阵 A A A 和向量 x \mathbf{x} x,二次型 x T A x \mathbf{x}^T A \mathbf{x} xTAx 代表一个标量,描述了向量 x \mathbf{x} x 在矩阵 A A A 所定义的度量空间下的 “大小”。 如果 A A A 是半正定的,意味着任何向量在该空间中都不会导致负值,因此矩阵 A A A 没有 “反向” 的作用,也就是说,它没有 “使向量反向拉伸” 的作用。半正定矩阵对应的二次型是一个凸函数,几何上可以理解为在定义该函数的空间中,每个切面都是向上的,这样的函数值总是保持非负值。
最大化行列式
在 DPP 模型中,每次选择一个子集时,选择的概率取决于该子集内元素的相似度。为了最大化多样性,DPP 会通过最大化子集的行列式来选择最优子集。即在候选文档集合中选取可以最大化后验概率的文档子集,DPP 的 最大后验概率(MAP) 推断可被描述为:
S m a p = arg max S ⊆ X det ( K S ) S_{\mathrm{map}}=\arg\max_{S \subseteq X} \det(K_S) Smap=argS⊆Xmaxdet(KS)
如上,选择子集的过程为在给定的候选集合 X X X 中,通过选择一个子集 S S S 来 最大化其行列式,即最大化 det ( K S ) \det(K_S) det(KS),确保子集的多样性尽可能高。
- 行列式的几何解释: 行列式表示由矩阵的列(或行)所张成的向量空间的体积。如果将矩阵的列向量(或行向量)看作是空间中的向量,那么行列式的大小与这些向量的排列密切相关。
- 行列式为0:如果矩阵的行列式为零,表示矩阵的列向量(或行向量)是线性相关的,即这些向量不张成一个高维空间
- 行列式大于0:如果矩阵的行列式大于零,表示矩阵的列向量在特征空间中是线性独立的,即它们占据了不同的维度,能够覆盖一个较大的空间
- 线性独立性与多样性:如果多个向量是线性独立的,那么它们无法通过线性组合来表示其他向量,意味着这些向量在空间中占据了不同的维度。
- 高行列式 → 线性独立:当矩阵的行列式较大时,意味着矩阵中的列向量(或行向量)是线性独立的,说明这些向量在特征空间中分布得较广泛
- 低行列式 → 线性相关:当行列式较小或为零时,矩阵中的列向量是线性相关的,这意味着这些向量之间的相似度很高,不能有效地覆盖多维空间,导致内容的多样性较低
MAP推断
DPP 的最大后验概率(MAP)推断是一个 NP-Hard 问题,DPP 通常使用 贪心算法 来逐步选择元素,直到达到所需的子集大小。即每次迭代中,选择文档 j j j 添加到结果集合 S g S_{g} Sg 中:
j = arg max i ∈ Z \ S g log det ( K S g ∪ { i } ) − log det ( K S g ) (1) j=\arg\max_{i\in Z\backslash S_{g}}\log\det(K_{S_{g}\cup\{i\}})-\log\det(K_{S_{g}}) \tag {1} j=argi∈Z\Sgmaxlogdet(KSg∪{i})−logdet(KSg)(1)
由于 K K K 是半正定矩阵,其所有主子矩阵也是半正定矩阵。假设 det ( K S g ) > 0 \det(K_{S_{g}}) > 0 det(KSg)>0, K S g K_{S_{g}} KSg 的Cholesky分解为 K S g = V V T K_{S_{g}}=VV^{T} KSg=VVT,其中 V V V 是可逆下三角矩阵。对于任何 i ∈ Z \ S g i \in Z\backslash S_{g} i∈Z\Sg, K S g ∪ { i } K_{S_{g}\cup\{i\}} KSg∪{i} 的Cholesky分解可以推导为:
K S g ∪ { i } = [ K S g K S g , i K i , S g K i i ] = [ V 0 c i d i ] [ V 0 c i d i ] ⊤ (2) K_{S_g \cup \{i\}} = \begin{bmatrix} K_{S_g} & K_{S_g,i} \\ K_{i,S_g} & K_{ii} \end{bmatrix} = \begin{bmatrix} V & 0 \\ c_i & d_i \end{bmatrix} \begin{bmatrix} V & 0 \\ c_i & d_i \end{bmatrix}^{\top} \tag {2} KSg∪{i}=[KSgKi,SgKSg,iKii]=[Vci0di][Vci0di]⊤(2)
其中行向量 c i c_i ci 和标量 d i ≥ 0 d_i \geq 0 di≥0 满足:
V c i ⊤ = K S g , i , (3) Vc_i^{\top} = K_{S_g,i}, \tag {3} Vci⊤=KSg,i,(3)
d i 2 = K i i − ∣ c i ∣ 2 2 (4) d_i^2 = K_{ii} - |c_i|^2_2 \tag {4} di2=Kii−∣ci∣22(4)
根据等式 (2) 可以推导出
det ( K S g ∪ { i } ) = det ( V V ⊤ ) ⋅ d i 2 = det ( K S g ) ⋅ d i 2 (5) \det(K_{S_g \cup \{i\}}) = \det(VV^{\top}) \cdot d_i^2 = \det(K_{S_g}) \cdot d_i^2 \tag {5} det(KSg∪{i})=det(VV⊤)⋅di2=det(KSg)⋅di2(5)
因此,(1) 等式可以简化为:
j = arg max i ∈ Z ∖ Y g log ( d i 2 ) (6) j = \arg\max_{i \in Z \setminus Y_g} \log(d_i^2) \tag {6} j=argi∈Z∖Ygmaxlog(di2)(6)
等式 (6) 被求解后,根据等式 (2), K S g ∪ { j } K_{S_g \cup \{j\}} KSg∪{j} 的Cholesky分解变为
L Y g ∪ { j } = [ V 0 c j d j ] [ V 0 c j d j ] ⊤ (7) L_{Y_g \cup \{j\}} = \begin{bmatrix} V & 0 \\ c_j & d_j \end{bmatrix} \begin{bmatrix} V & 0 \\ c_j & d_j \end{bmatrix}^{\top} \tag {7} LYg∪{j}=[Vcj0dj][Vcj0dj]⊤(7)
其中 c j c_j cj 和 d j d_j dj 是现成可用的。因此,可以在向 S g S_g Sg 添加新项目(文档)后有效更新 K S g K_{S_g} KSg 的Cholesky因子。
对于每个项目 i i i, c i c_i ci 和 d i d_i di 也可以增量更新。定义 c i ′ c_i' ci′ 和 d i ′ d_i' di′ 为 i ∈ Z ∖ ( S g ∪ { j } ) i \in Z \setminus (S_g \cup \{j\}) i∈Z∖(Sg∪{j}) 的新向量和标量。则有:
[ V 0 c j d j ] [ c i ′ d i ′ ] ⊤ = K S g ∪ { j } , i = [ K S g , i K j i ] (8) \begin{bmatrix} V & 0 \\ c_j & d_j \end{bmatrix} \begin{bmatrix} c_i' \\ d_i' \end{bmatrix}^{\top} = K_{S_g \cup \{j\},i} = \begin{bmatrix} K_{S_g,i} & K_{ji} \end{bmatrix} \tag {8} [Vcj0dj][ci′di′]⊤=KSg∪{j},i=[KSg,iKji](8)
结合等式 (8) 和 (3):
c i ′ = [ c i ( K j i − ⟨ c j , c i ⟩ ) / d j ] ≐ [ c i e i ] (9) c_i' = \left[ c_i \ \ \left(K_{j i}-\left\langle c_{j},c_{i}\right\rangle\right)/d_{j} \right] \doteq \left[ c_i \ \ e_i \right] \tag {9} ci′=[ci (Kji−⟨cj,ci⟩)/dj]≐[ci ei](9)
则等式(4)为:
d i ′ 2 = K i i − ∣ c i ′ ∣ 2 2 = K i i − ∣ c i ∣ 2 2 − e i 2 = d i 2 − e i 2 d_i'^2 = K_{ii} - |c_i'|^2_2 = K_{ii} - |c_i|^2_2 - e_i^2 = d_i^2 - e_i^2 di′2=Kii−∣ci′∣22=Kii−∣ci∣22−ei2=di2−ei2
最初, Y g = ∅ Y_g = \emptyset Yg=∅,并且根据等式 (5), d i 2 = det ( K i i ) = K i i d_i^2 = \det(K_{ii}) = K_{ii} di2=det(Kii)=Kii。对于无约束MAP推断,停止条件是 d 2 j < 1 d_{2j} < 1 d2j<1,或者当施加基数约束时 S g > N S_g > N Sg>N。对于后者,引入小数 ε > 0 \varepsilon > 0 ε>0 并添加 d 2 j < ε d_{2}^{j} < \varepsilon d2j<ε 到停止标准中,以计算 1 / d j 1/d_j 1/dj 的数值稳定性。
PRM
PRM(Generative Rerank Network)采用 Transformer 结构实现个性化重排。具体的,PRM 模型由输入层、编码层和输出层组成,输入层将初始列表中的所有文档/物品的特征向量进行编码,编码层使用 Transformer 结构来捕捉文档/物品间的相互影响,输出层生成每个文档/物品的点击概率。
PRM 的输入为原始特征矩阵 X ∈ R n × d feature X\in R^{n\times d_{\text{feature}}} X∈Rn×dfeature 和个性化矩阵 P V ∈ R n × d pv PV\in R^{n\times d_{\text{pv}}} PV∈Rn×dpv 拼接( P V PV PV 取精排模型的倒数第二层的输出向量),同时利用初始列表中的顺序信息,将排名的向量表示 P E ∈ R n × ( d feature + d p v ) P E\in R^{n\times\left(d_{\text{feature}}+d_{p v}\right)} PE∈Rn×(dfeature+dpv) 注入输入向量中:
E = [ x i 1 ; p v i 1 x i 2 ; p v i 2 … x i n ; p v i n ] + [ p e i 1 p e i 2 … p e i n ] E=\left[\begin{array}{c}x_{i_{1}}; p v_{i_{1}}\\ x_{i_{2}}; p v_{i_{2}}\\ \ldots\\ x_{i_{n}}; p v_{i_{n}}\end{array}\right]+\left[\begin{array}{c}p e_{i_{1}}\\ p e_{i_{2}}\\ \ldots\\ p e_{i_{n}}\end{array}\right] E= xi1;pvi1xi2;pvi2…xin;pvin + pei1pei2…pein
使用一个简单的前馈网络将特征矩阵 E ∈ R n × ( d feature + d p v ) E\in R^{n\times\left(d_{\text{feature}}+d_{p v}\right)} E∈Rn×(dfeature+dpv) 转换为 E ∈ R n × d E\in R^{n\times d} E∈Rn×d,即 E = E W E + b E E=E W^E+b^E E=EWE+bE。
PRM 的输出层使用一个线性层后接一个 softmax 层来为每个项目 i = i 1 , … , i n i=i_{1},\ldots, i_{n} i=i1,…,in 生成一个分数 Score ( i ) \operatorname{Score}(i) Score(i) 来对项目进行一步重新排序:
Score ( i ) = softmax ( F ( N x ) W F + b F ) , i ∈ S r \operatorname{Score}(i)=\operatorname{softmax}\left(F^{\left(N_x\right)} W^F+b^F\right), i\in\mathcal{S}_r Score(i)=softmax(F(Nx)WF+bF),i∈Sr
其中 F ( N x ) F^{\left(N_{x}\right)} F(Nx) 是 N x N_{x} Nx 个 Transformer 编码器块的输出。 W F W^{F} WF 是可学习的投影矩阵, b F b^{F} bF 是偏置项。
上下文感知建模
MMR、DPP 和 PRM 都属于单点估计,即假设候选内容的评分独立,通过每一步的贪心选择实现候选列表的生成,这种方式未考虑已选中内容对当前候选内容的影响。
基于上下文感知的排序模型采用 序列生成-序列评估 的架构,通过建模序列生成过程动态调整排序决策,以全局最优的视角实现重排。
miRNN
miRNN(mutual influence RNN)将排序问题视为序列生成问题,使用循环神经网络(RNN)模型来估计点击/购买概率。RNN模型通过迭代计算每个文档/商品的点击/购买概率,并使用 beam search 算法序列生成最优排序。
设 S = ( 1 , ⋯ , N ) S=(1,\cdots,N) S=(1,⋯,N) 为待排序的文档集合, O O O 表示 S S S 的所有排列集合, o = ( o 1 , . . . , o N ) ∈ O o = (o_1, ..., o_N) \in O o=(o1,...,oN)∈O 是一个排列,用户在 o o o 中点击文档 i i i 的概率表示如下:
p ( o i ∣ o 1 , . . . , o i − 1 ) = sigmoid ( W h h i ) h i = RNN ( h i − 1 , f ( o i ) ) p(o_i|o_1,...,o_{i−1}) = \text{sigmoid}(W_h h_i) \\ h_i = \text{RNN}(h_{i−1}, f(o_i)) p(oi∣o1,...,oi−1)=sigmoid(Whhi)hi=RNN(hi−1,f(oi))
其中, h i − 1 h_{i−1} hi−1 是序列 [ o 1 , . . . , i − 1 ] [o_1,...,i−1] [o1,...,i−1] 的 RNN 向量(上下文表示), f ( o i ) f(o_i) f(oi) 表示提取当前排列为 o i o_i oi 的文档特征。
Beam Search
MMR 和 DPP 都是基于贪心策略(Greedy Search),在每一步仅选择当前状态下使目标效用函数(如相关性与多样性的平衡)最大化的文档加入候选列表。贪心策略适合快速生成候选结果,但当对全局最优解有更高要求时,无法达到整体最优解。
Beam Search 是一种启发式搜索算法,用于在序列生成过程中保留多个最优候选,以避免局部最优解。在每个步骤中,算法保留 k k k 个具有最高评分的部分序列(称为 beam width 或 beam size),并基于这些部分序列扩展生成新的候选,直至达到所需的序列长度。
-
初始化
- 设定 beam size 为 k k k
- 初始化空序列集合 B 0 = { [ ] } B_0 = \{[]\} B0={[]}
-
迭代生成序列
- 对于每个时间步 t = 1 , 2 , … , L t = 1, 2, \dots, L t=1,2,…,L:
- 扩展候选序列: 对于当前的每个部分序列 s 1 : t − 1 ∈ B t − 1 s_{1:t-1} \in B_{t-1} s1:t−1∈Bt−1 和每个候选内容 x ∈ X ∖ s 1 : t − 1 x \in X \setminus s_{1:t-1} x∈X∖s1:t−1,生成新的序列 s 1 : t = [ s 1 : t − 1 , x ] s_{1:t} = [s_{1:t-1}, x] s1:t=[s1:t−1,x]
- 计算序列得分: 为每个新序列 s 1 : t s_{1:t} s1:t 计算得分函数 Score ( s 1 : t ) \text{Score}(s_{1:t}) Score(s1:t),该得分函数考虑序列的相关性和多样性
- 选择 top-k 序列: 从所有新生成的序列中选择得分最高的 k k k 个,构成新的部分序列集合 B t B_t Bt
- 对于每个时间步 t = 1 , 2 , … , L t = 1, 2, \dots, L t=1,2,…,L:
-
终止条件
- 当达到预定的序列长度 L L L 或满足其他终止条件时,停止迭代
- 从最终的序列集合 B L B_L BL 中选择得分最高的序列作为输出
Seq2slate
Seq2Slate 的核心是 Seq2Seq 架构,利用循环神经网络(RNN)实现,模型输入是候选集合列表,输出是排序后的结果。Seq2Slate 包含编码器和解码器两个部分:
- 编码器(Encoder): 将输入的项目序列编码为上下文向量
- 解码器(Decoder): 解码器则根据该上下文向量逐步生成新的项目序列。在每一步,解码器通过指针网络(Pointer Network)选择下一个最优项目,形成新的排序
Seq2Slate 流程可以描述为:
-
编码器
输入候选集合 X = { x 1 , x 2 , … , x n } X = \{x_1, x_2, \dots, x_n\} X={x1,x2,…,xn}:h i = Encoder ( x i ) , i ∈ { 1 , 2 , … , n } h_i = \text{Encoder}(x_i), \quad i \in \{1, 2, \dots, n\} hi=Encoder(xi),i∈{1,2,…,n}
生成隐藏状态序列:
H = { h 1 , h 2 , … , h n } H = \{h_1, h_2, \dots, h_n\} H={h1,h2,…,hn}
-
解码器初始化
初始化解码器的隐藏状态 s 0 s_0 s0 ,可以用编码器的全局信息初始化。 -
生成上下文向量
对于第 t t t 步解码,解码器隐藏状态更新为:s t = Decoder ( s t − 1 , y t − 1 ) s_t = \text{Decoder}(s_{t-1}, y_{t-1}) st=Decoder(st−1,yt−1)
其中 y t − 1 y_{t-1} yt−1 是上一步选中的输出内容。
-
注意力机制
解码器生成注意力权重 α t \alpha_t αt:e t , i = v ⊤ tanh ( W h h i + W s s t + b ) e_{t,i} = v^\top \tanh(W_h h_i + W_s s_t + b) et,i=v⊤tanh(Whhi+Wsst+b)
α t , i = exp ( e t , i ) ∑ j ∉ Y 1 : t − 1 exp ( e t , j ) , i ∈ { 1 , 2 , … , n } \alpha_{t,i} = \frac{\exp(e_{t,i})}{\sum_{j \notin Y_{1:t-1}} \exp(e_{t,j})}, \quad i \in \{1, 2, \dots, n\} αt,i=∑j∈/Y1:t−1exp(et,j)exp(et,i),i∈{1,2,…,n}
其中:
- v , W h , W s , b v, W_h, W_s, b v,Wh,Ws,b 是可学习的参数
- e t , i e_{t,i} et,i 表示当前状态 s t s_t st 与候选项 x i x_i xi 的相关性
- 为避免重复选择,softmax 分母只包括尚未被选中的索引
-
输出索引选择
根据注意力权重选择输出项索引:y t = arg max i α t , i y_t = \arg\max_{i} \alpha_{t,i} yt=argimaxαt,i
-
终止条件
当输出序列长度达到预定值 L L L 或其他终止条件满足时,停止解码。
GRN
GRN(Generative Rerank Network)采用评估器(Evaluator)和生成器(Generator)实现上下文感知重排序框架。
评估器(Evaluator)
评估器采用双向 LSTM 和自注意力机制来建模标注的最终排序列表中的上下文信息,其目标是更精确地预测每个文档/物品在最终排序列表中的上下文交互概率:
E ( x v t ∣ u , V ; Θ E ) = σ ( f ( f ( f ( x u ⊕ x v t ⊕ h t ⊕ a t ) ) ) ) E\left(x_v^t\mid u,\mathcal{V};\Theta^E\right)=\sigma\left(f\left(f\left(f\left(x_u\oplus x_v^t\oplus h_t\oplus a_t\right)\right)\right)\right) E(xvt∣u,V;ΘE)=σ(f(f(f(xu⊕xvt⊕ht⊕at))))
其中, x u x_{u} xu 和 x v t x_{v}^{t} xvt 分别为用户和最终排名列表 V \mathcal{V} V 中第 t t t 个物品的向量表示, h t h_{t} ht 是 LSTM 的输出状态, a t a_{t} at 是自注意力机制的输出, f ( x ) = ReLU ( W x + b ) f(x)=\operatorname{ReLU}(W x+b) f(x)=ReLU(Wx+b), σ ( ⋅ ) \sigma(\cdot) σ(⋅) 是逻辑函数。评估器的参数集为 Θ E = { W , b } \Theta^{E}= \{ W, b \} ΘE={W,b},即 Bi-LSTM 和 MLP 的参数联合。
生成器(Generator)
生成器,结合GRU、注意力机制和指针网络来逐步选择输入排序列表中的物品。生成器的目标是学习一个重排序策略,以生成最终的排序列表。生成器包含演化层、激活层、选择层:
-
演化层(Evolving Layer)
- 用户的意图或兴趣会随着时间的推移而变化,演化层采用 GRU 模块,在每一步将序列信息提炼为目标用户的状态表示,以学习目标用户在浏览历史中的动态表示。在第 t t t 步,设 S = [ x s 0 , x s 1 , … , x s t − 1 ] \mathcal{S}=\left[x_{s}^{0}, x_{s}^{1},\ldots, x_{s}^{t-1}\right] S=[xs0,xs1,…,xst−1] 是从输入排名列表 C C C 中选出的 t − 1 t-1 t−1 个项目,GRU 模块的输出可以计算如下:
z t = σ ( W z x l t − 1 + U z h t − 1 ) r t = σ ( W t x l t − 1 + U t h t − 1 ) h ~ t = tanh ( W x l t − 1 + U ( r t h t − 1 ) ) h t = ( 1 − z t ) h t − 1 + z t h ~ t \begin{aligned}z_{t}&=\sigma\left(W_{z} x_{l}^{t-1}+U_{z} h_{t-1}\right)\\ r_{t}&=\sigma\left(W_{t} x_{l}^{t-1}+U_{t} h_{t-1}\right)\\ \widetilde{h}_{t}&=\tanh\left(W x_{l}^{t-1}+U\left(r_{t} h_{t-1}\right)\right)\\ h_{t}&=\left(1-z_{t}\right) h_{t-1}+z_{t}\widetilde{h}_{t}\end{aligned} ztrth tht=σ(Wzxlt−1+Uzht−1)=σ(Wtxlt−1+Utht−1)=tanh(Wxlt−1+U(rtht−1))=(1−zt)ht−1+zth t
- 其中 W z , U z , W t , U t , W W_{z}, U_{z}, W_{t}, U_{t}, W Wz,Uz,Wt,Ut,W和 U U U 是可训练的变量, H = [ h 1 , … , h t ] H=\left[h_{1},\ldots, h_{t}\right] H=[h1,…,ht] 表示选定列表 S \mathcal{S} S 的序列编码。
-
激活层(Activating Layer)
- 激活层在选定的项目的顺序表示条件下,使用注意力机制来计算每个剩余项目的重要性权重。给定输入排名列表中第 j j j 个剩余项目的表示 x c j x_{c}^{j} xcj 和已选择列表的序列表示 H H H,采用加权和生成输入排名列表中第 j j j 个项目的新表示,相应的注意力权重如下:
a h i = exp ( h i W x c j ) ∑ i = 1 t exp ( h i W x c j ) a c j = ∑ i = 1 t a h i h i \begin{aligned} a_h^i&=\frac{\exp\left(h_i W x_c^j\right)}{\sum_{i=1}^t\exp\left(h_i W x_c^j\right)}\\ a_c^j&=\sum_{i=1}^t a_h^i h_i\end{aligned} ahiacj=∑i=1texp(hiWxcj)exp(hiWxcj)=i=1∑tahihi
-
选择层(Selector Layer)
- 在获得输入排名列表中项目的表示 a c j a_{c}^{j} acj 之后,采用指针网络选择最合适的项目加入到最终排名列表中。对于输入排名列表 C C C 中的第 j j j 个项目 x c j x_{c}^{j} xcj,在第 t t t 步采用 MLP 实现特征交互:
s ~ c j = f ( f ( f ( x u ⊕ x c j ⊕ a c j ) ) ) \tilde{s}_c^j=f\left(f\left(f\left(x_u\oplus x_c^j\oplus a_c^j\right)\right)\right) s~cj=f(f(f(xu⊕xcj⊕acj)))
- 之后采用 softmax 函数将向量 s ~ c j \tilde{s}_{c}^{j} s~cj 归一化:
s c j = exp ( s ~ c j ) ∑ j m exp ( s ~ c j ) s_c^j=\frac{\exp\left(\tilde{s}_{c}^{j}\right)}{\sum_j^m\exp\left(\tilde{s}_{c}^{j}\right)} scj=∑jmexp(s~cj)exp(s~cj)
- 其中 m m m 为 C C C 中项目的数量。随后在第 t t t 步,生成器将选择具有最高选择概率的项目(排除已选中的项目):
G t ( u , C ; Θ G ) = x c arg max j s c j s.t. x c arg max j s c j ∉ S G^t\left(u, C;\Theta^G\right)=x_c^{\operatorname{arg} \max_j s_c^j} \quad \text{ s.t.} x_c^{\operatorname{arg} \max_j s_c^j} \notin\mathcal{S} Gt(u,C;ΘG)=xcargmaxjscj s.t.xcargmaxjscj∈/S
优势奖励
GRN 采用交叉熵损失函数训练评估器,并使用策略梯度和优势奖励训练生成器。优势奖励包括自我奖励和差分奖励:
r ( x o t ∣ u , O ) = r s e l f ( x o t ∣ u , O ) + r d i f f ( x o t ∣ u , O ) r\,\bigl(x_{o}^{t}\mid u,O\bigr)=r^{\mathrm{s e l f}}\left(x_{o}^{t}\mid u,O\right)+r^{\mathrm{diff}}\left(x_{o}^{t}\mid u,O\right) r(xot∣u,O)=rself(xot∣u,O)+rdiff(xot∣u,O)
其中, r s e l f r^{\mathrm{self}} rself 是自我奖励, r d i f f r^{\mathrm{diff}} rdiff 是差分奖励, x o t x_{o}^{t} xot 为生成的最终排名列表 O = [ x o 1 , … , x o n ] O=\left[x_{o}^{1},\ldots,x_{o}^{n}\right] O=[xo1,…,xon] 中第 t t t 个项目。
-
Self reward(自奖励):
- 自奖励指项目在最终排名列表中自身的交互概率所带来的奖励,奖励由评估器(Evaluator)预测:
r self ( x o t ∣ u , O ) = E ( x o t ∣ u , O ; Θ E ) r^{\text{self}}\left(x_o^t\mid u, O\right)=E\left(x_o^t\mid u, O;\Theta^E\right) rself(xot∣u,O)=E(xot∣u,O;ΘE)
-
Differential reward(差分奖励):
- 差分奖励指一个项目在最终排名列表中对其他项目交互概率的影响所带来的额外奖励,即使其自身的交互概率较低,但如果有助于提升后续项目的选择概率,仍应给予正向奖励。差分奖励通过比较包含某个项目时和其他项目交互概率的总和与不包含该项时的概率总和之间的差异来计算
r diff ( x o t ∣ u , O ) = ∑ x o i ∈ O − E ( x o i ∣ u , O ; Θ E ) − ∑ x o i ∈ O − E ( x o i ∣ u , O − ; Θ E ) \begin{aligned} r^{\text{diff}}\left(x_o^t\mid u, O\right)=&\sum_{x_o^i\in O^{-}} E\left(x_o^i\mid u, O;\Theta^E\right)-\\ &\sum_{x_o^i\in O^{-}} E\left(x_o^i\mid u, O^{-};\Theta^E\right)\end{aligned} rdiff(xot∣u,O)=xoi∈O−∑E(xoi∣u,O;ΘE)−xoi∈O−∑E(xoi∣u,O−;ΘE)
- 其中, O − O^{-} O− 是 O O O 中不包含 x o t x_o^t xot 的集合。
训练流程
训练过程如下步骤迭代,直到生成器的参数收敛:
- 使用列表交互记录来训练评估器直到参数收敛
- 生成器为评估器生成最终的排名列表
- 通过基于评估器的优势奖励的策略梯度更新生成器参数
总结
搜索重排是信息检索中不可或缺的环节,其目标是在精排阶段生成的候选列表基础上,通过更复杂的模型和策略,进一步优化列表的质量,平衡效率与多样性并使业务价值最大化。
重排所面临的挑战有:
- 上下文一致性问题:
打分时的上下文与最终展现的上下文不一致,影响模型效用 - 多目标优化冲突:
点击率、转化率、多样性、用户满意度等目标间存在冲突,难以找到最佳平衡点 - 全局最优性难以实现:
贪心策略无法考虑后续决策对当前排序的反作用,导致全局优化受限 - 计算效率与在线部署:
重排序算法复杂度较高,需要在高效计算与实时响应间找到平衡 - 用户需求的多样化:
不同用户在不同场景下的需求千差万别,单一策略难以覆盖
在上述挑战下,重排可以从以下几个方向发展:
-
上下文感知的深度建模
- 利用 Transformer 等模型构建全局上下文,动态调整排序决策
- 考虑候选内容的历史交互、用户偏好与序列特征,提升个性化排序效果
-
生成式重排的广泛应用
- 加强序列生成-序列评估的联动,确保生成序列的全局最优性
- 引入强化学习增强生成策略,提升长期用户满意度
-
多目标协同优化
- 建立统一的多目标优化框架,综合短期和长期目标进行排序
- 动态调整权重,实现点击率与多样性、内容公平性间的有效平衡
-
高效模型设计与部署
- 利用模型压缩、知识蒸馏等技术降低计算成本
- 探索轻量化、高效的模型架构以适应实时应用场景
-
用户互动与反馈机制
- 引入用户显性或隐性反馈,构建交互式重排序优化框架
- 动态调整排序决策以适应用户需求的变化
-
长期生态建设
- 优化长尾内容的曝光,激励内容创作者积极参与
- 综合考虑用户体验与平台生态,促进系统长期健康发展
参考文献
- The Use of MMR, Diversity-Based Reranking for Reordering Documents and Producing Summaries
- Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity
- Determinantal point processes for machine learning
- k-DPPs: Fixed-size determinantal point processes
- Globally Optimized Mutual Influence Aware Ranking in E-Commerce Search
- Seq2Slate: Re-ranking and Slate Optimization with RNNs
- Personalized Re-ranking for Recommendation
- GRN: Generative Rerank Network for Context-wise Recommendation