2024(GenRT)List-aware Reranking-Truncation Joint Model for Search and Retrieval-augmented Generation
期刊会议:WWW 2024
github: https://github.com/xsc1234/GenRT/
1 Introduction
列表感知检索通过捕获列表级的上下文特征以返回更好的列表,主要包括 重排序 和 截断。
• 重排序 会对列表中的文档进行精细重新评分。
• 截断 动态地确定排名列表的截止点,用于提高整体相关性和避免无关文档的错误信息。

存在的问题:
问题一:重排序 和 截断 应该是相互依赖的任务,拆分的流程使得难以利用二者共享的信息。
- 重排序 建模的文档相关性,可以为 截断 提供重要基础。
- 截断 建模的文档相关性和位置之间的权衡,可以提供为 重排序 重要的上下文交互信息。
问题二:拆分的流程通常存在误差累计问题,重排序 的误差会影响到 截断,这在训练期间无法直接优化。
- 两个阶段的文档相关性判断标准不一致。
- 两个阶段的关注点不同。
- 截断 对排在前面的文档较为敏感。因为如果有太多不相关的文档排在列表前面的话,会导致列表在这些文档处截断,从而丢失了排在它后面的相关文档。
- 重排序 更加关注整个列表的排名情况,对不相关的文档排在列表的前面的情况并不敏感。
- 图1中(a)和(b)有相似的重排序性能表现(0.89和0.90)。在(b)中有两个不相关的文档排在前面(B和E),这就导致了(b)的截断性能差于(a)(19.4<25.8)。
本文需要解决的问题:
- C1:如何共享 重排序 和 截断 任务的建模信息?
- C2:重排序 是一个动态改变排名列表的过程,但 截断 的决策需要基于一个静态列表,如何同时执行?
- C3:如何设计联合学习的损失函数?

如图2所示,本文提出GenRT,它是一个通过序列生成实现的重排序-截断联合模型。
C1:如何共享 重排序 和 截断 任务的建模信息?
GenRT设计了一个全局依赖编码器(global dependency encoder),提供 全局的列表级别上下文特征,以在重排序和截断之中共享。
C2:重排序 是一个动态改变排名列表的过程,但 截断 的决策需要基于一个静态列表,如何同时执行?
GenRT采用了序列生成范式,逐步输出最终的重排序列表。在每一步,根据前一个状态选择处于当前排名的文档,并同时做出局部最优的截断决策。截断被转换为一个分类任务,它根据列表的(排名)前后双向信息进行解决。序列生成范式记录了前向信息,我们还引入了局部后向窗口来提供后向信息。这样,我们的模型可以将动态重排序与静态截断结合起来。
C3:如何设计联合学习的损失函数?
GenRT设计了步骤自适应注意力损失(step-adaptive attention loss)和逐步lambda损失(step-by-step lambda loss),将它们作为重排序的目标函数。GenRT还引入了奖励增强最大似然(reward augmented maximum likelihood,RAML),设计了每一步截断的 基于RAML的软损失。
2 Related Work
2.1 Reranking in List-aware Retrieval
在列表感知检索中的重新排序利用列表级别的上下文特征来重新评分和排名列表中的每个文档。
- DLCM[1]
- GSF[2]
- SetRank[28]
- PRM[29]
- IRGPR[25]
- DASALC[32]
- SRGA[30]
- MIR[42]
- Seq2Slate[5]
- Globalrerank[48]
2.2 Truncation in List-aware Retrieval
截断的目标是确定输入排名列表的最佳截止点,以实现整体相关性和排除无关文档之间的最佳权衡。
- BiCut[23]
- Choppy[4]
- AttnCut[40]
- LeCut[26]
3 Method


3.1 Global Dependency Encoder
文档特征表示
全局依赖编码器捕获 列表级别的上下文特征。
文档编码成embedding后,作为 编码器的输入。
给定一个查询 q q q,文档列表 D = [ d 1 , d 2 , . . . , d N ] D=[d_1, d_2, ..., d_N] D=[d1,d2,...,dN] 和 初始排名分数列表 L = [ l 1 , l 2 , . . . , l N ] L = [l_1, l_2, ..., l_N] L=[l1,l2,...,lN],文档 d i d_i di的embedding表示为:
u d i = f ( q , d i , l i ) , u d i ∈ R Z , i ∈ [ 1 , N ] (1) u_{d_i} = f(q, d_i, l_i), ~ u_{d_i} \in \mathbb{R}^Z, ~ i \in [1, N] \tag{1} udi=f(q,di,li), udi∈RZ, i∈[1,N](1)
其中, N N N是输入列表中文档的数量, f f f用于融合 q q q, d i d_i di和 l i l_i li特征。
特别地,
对于基于特征排名任务(feature-based ranking tasks),例如MSLR(输入数据是LTR特征)。作者跟随SetRank,采用了传统的LTR方法来提取特征(matching,pagerank等),然后拼接上初始排名分数 l i l_i li得到 u d i \bold{u}_{d_i} udi。
对于基于文本的排序任务,例如Natural Questions(输入数据是文本)。作者使用基于交互的排序模型(interaction-based ranking model)输出的[CLS]词元作为查询 q q q和文档 d i d_i di特征表示,然后将初始排名分数映射到 可学习的位置编码(learnable position embedding) l p i ∈ R Z \bold{lp}_i \in \mathbb{R}^Z lpi∈RZ上,并将其按元素相加 得到 u d i \bold{u}_{d_i} udi。
这样,我们就得到了整个文档特征矩阵 U ∈ R N × Z \bold{U} \in \mathbb{R}^{N \times Z} U∈RN×Z
U = [ u d 1 , u d 2 , . . . , u d N ] T (2) \bold{U} = [\bold{u}_{d_1}, \bold{u}_{d_2}, ..., \bold{u}_{d_N}]^T \tag{2} U=[ud1,ud2,...,udN]T(2)
Transfer Layer
传递层(Transfer Layer)的作用是将 U U U映射到特定的维度(对齐维度)。
X = Swish ( MLP ( U ) ) , X ∈ R N × E (3) \bold{X} = \text{Swish}(\text{MLP}(\bold{U})), ~ \bold{X} \in \mathbb{R}^{N\times E} \tag{3} X=Swish(MLP(U)), X∈RN×E(3)
笔者注:
Swish ( x ) = x ⋅ Sigmoid ( x ) \text{Swish}(x) = x \cdot \text{Sigmoid}(x) Swish(x)=x⋅Sigmoid(x)
其中, MLP \text{MLP} MLP是多层感知机, Swish \text{Swish} Swish为激活函数。
Multi-head Self Attention
O = X + MHSA ( LN ( X ) ) (4) \bold{O} = \bold{X} + \text{MHSA}(\text{LN}(\bold{X})) \tag{4} O=X+MHSA(LN(X))(4)
3.2 Sequential Dependency Decoder
序列依赖解码器遵循序列生成范式,逐步生成按相关性从高到低的序列,并在每一步中基于双向的序列信息进行截断决策。在图4中展示了第T步的解码器操作。
交叉排序FFN(Cross Ranking FFN)和 动态排序模块(Dynamic Ranking Module)确定动态排名列表,并在每个步中选择最佳输出文档。同时,截断模块(Truncation Module)根据动态排名模块和 局部后向窗口(Local Backward Window)获得序列的双向信息 进行截断决策。
给定输入文档列表 D ′ = { r 1 1 , r 1 2 , . . . , r 1 T − 1 } D' = \{r_1^1, r_1^2, ..., r_1^{T-1}\} D′={ r11,r12,...,r1T−1}( r 1 t r_1^t <