SetRank的源代码和实验在https://github.com/pl8787/SetRank。

介绍

Learning to Rank的任务可以描述为两个步骤:

  1. 首先,在训练步骤中,构建一个排名模型,将每个查询文档对投影到一个排名分数,并从诸如用户点击和相关注释之类的标记数据中学习。
  2. 第二步是测试步骤,将学习到的排名模型应用于为新查询检索到的一组文档,并最终向用户返回经过排序的文档列表。

在实践中,搜索引擎用户通常在生成单击操作之前比较结果页上的多个文档。此外,对查询和文档相关性注释的研究表明,来自同一排名列表中的其他文档的信息可能会影响注释者对当前文档的决策,这挑战了一个基本假设,即相关性应该针对单个信息请求在每个文档上独立建模。

本文提出了一个多元排序模型,它的输入是任意大小的文档集,输出是集合上的置换。该模型被称为SetRank,它充分利用self-attention机制,学习从文档集到其排列的多元评分函数映射。首先,它接收一整套文档(编码为一组向量)作为输入。然后,使用一堆多头自我注意块作为关键组件,共同学习整套文档的嵌入。最后将排的分数作为网络的一个输出,并将其作为网络的最后一个输出进行充分的连接。

模型

Problem Formulation

查询qqq,项目集对应于查询qqq检索到的NNN个文档DDD=[d1d_1d1​,…,dnd_ndn​],DDD是所有索引文档的集合。排序的任务是在文档集DDD上找到一个置换πππ∈∈∈∏N∏_N∏N​,使某个效用最大化,其中∏N∏_N∏N​是索引{1,2,···,N}的所有排列的集合。

在Learning to rank,使用一组带标签的查询—文档对训练排名模型。对于每个查询qqq,提供其检索到的文档集合和文档—查询相应的相关性标签,并表示为ψqψ_qψq​={DDD={did_idi​},yyy={yiy_iyi​}| 111≤iii≤NNN},其中yiy_iyi​表示与did_idi​对应的相关性标签。因此,包含所有训练查询的数据集可以表示为ΨΨΨ={ψqψ_qψq​}。Learning to rank的目标是最小化训练数据的经验损失,并得到最优的评分函数FFF(·):

其中lll(·)是损失函数;FFF(·):DND^NDN→RNR^NRN是负责为文档分配分数的评分函数,以便通过对分数进行排序来生成结果排列
运算符“sort”根据FFF(DDD)指定的分数按降序对DDD中的文档进行排序。对已有的模型进行了单点学习,得到了一些特殊的模型

Requirements of Ranking Model

在文档集上定义的评分函数FFF应该满足两个关键要求。

  1. 首先,它应该能够描述检索到的文档之间的相互关系,称为跨文档交互。
  2. 其次,函数的输出在输入集中的文档的任何排列下都不应改变,称为置换不变性。
    在实际应用中,输入序列往往会传递隐藏的偏差信息,如按文档id排序、按创建时间排序或按耗时排序,这些信息可能与文档的有用性无关,并可能降低置换感知模型的鲁棒性。置换不变模型在理论上解决了这个问题。构造置换不变排序模型的一种方法是先用置换等变评分函数对文档进行相关性评分,然后根据得分进行排序。

SET-RANK

Overall Architecture


SetRank中文档排名的管道由三层组成:representation, encoding, and ranking。

  1. 首先,表示层将每个输入的文档分别表示为特征向量,此外,它还可以通过ordinal嵌入(比如BM25预先生成的排名嵌入)对特征表示中的文档进行初始排序。初始排名可以由现有的排名模型生成,如BM25或经过训练的LambdaMART模型。
  2. 第二,编码层通过涉及相关文档的其他特征向量来丰富每个查询文档对的特征向量。本文利用多头自注意块(MSAB)或Induced多头自注意块(IMSAB),以一组查询文档对表示作为输入,利用这些自注意块生成一组新的表示。MSAB或IMSAB块的多个子层堆叠在一起使用相同的结构来建模文档之间的高阶交互。第三,Ranking层接收最顶层的MSAB(或IMSAB)块的输出向量,将其传递给一个行前馈(rrrFFFFFF)函数,生成所有文档的相关性分数,最后根据这些分数对文档进行排序。

Document Representation

给定一个查询qqq及其相关文档集DDD=[d1d_1d1​,d2d_2d2​,···,dNd_NdN​],DDD中的每个文档都可以表示为一个特征向量
其中,ϕϕϕ是特征提取的函数,EEE是向量的维数。本文使用了传统学习库中提取的特征,包括PageRank的纯文档特征、TF-IDF的查询文档匹配特征、BM25等。除了传统的学习排序特征外,SetRank还可以选择包含文档序号嵌入作为输入。在实际的搜索引擎中,与查询相关联文档可能有一些由默认排名模型(如BM25或LambdaMART等)生成的预先排名,为了包含这些初始排名信息,并受Transformer中位置嵌入的启发,本文提出了一个ordinal嵌入函数PPP,它以文档的绝对排名位置作为输入,并将位置编码为与did_idi​相同维的向量:

其中rank(did_idi​)表示did_idi​在由BM25、LambdaMART等模型生成的初始排名中的绝对排名位置。
分别加入ordinal嵌入向量和Learning to rank特征向量,形成NNN个检索文档的特征矩阵XXX∈∈∈RRRN^NN×^××E^EE:

   请注意,在某些情况下,可能会有一个以上的初始排名,因为不同的排名模型(如BM25和LM4IR)可能同时应用。一个文档对应于不同排名的顺序嵌入可以相加,形成一个整体的有序嵌入向量。这样,SetRank就可以输入多个初始排名。还需要注意的是,尽管顺序嵌入机制类似于Transformer中的位置嵌入,但是它们的不同之处在于位置嵌入描述了单词在序列中的位置,而SetRank中的顺序嵌入描述了文档的秩,这是一种应用于文档集的排序算法。因此,输入到Transformer的每个字只有一个位置嵌入,而SetRank中的每个文档可以有多个顺序嵌入。

Document Encoding with (Induced)Multi-head Self Attention Block

SetRank的关键是编码组件,它以文档集合表示X0X^0X0=XXX∈∈∈RRRN^NN×^××E^EE作为为输入,将这些文档联合编码为其内部代码 XXXN^NNb_bb​∈∈∈RRRN^NN×^××E^EE,编码组件是一组结构相同的NbN_bNb​多头自我注意块(MSAB)(或Induced多头部自我注意块(IMSAB))。每个MSAB(或IMSAB)接收一组NNN个向量(打包为矩阵XtX^tXt,000≤ttt≤NNNb_bb​−1),用(Induced)多头自我注意层接着一个层规范化处理这些向量,然后通过一个行式前馈网络(rFF)层,接着是另一个层的规范化。最后,它将向量XXXt^tt+^++1^11作为输出发送到MSAB(或IMSAB)的下一层。

Multi-head self attention block

 (详细见https://blog.csdn.net/longxinchen_ml/article/details/86533005)

注意力函数:

其中QQQ∈∈∈RRRN^NNq^qq×^××E^EE表示注意查询矩阵,KKK∈∈∈RRRN^NNk^kk×^××E^EE表示key矩阵,VVV∈∈∈RRRN^NNk^kk×^××E^EE表示值矩阵。NqN_qNq​、NkN_kNk​和EEE分别表示注意查询的数目、key/value向量的个数、表示的维数。注意机制可以解释为:对于QQQ中的每个注意查询向量,它首先计算出具有所有key的注意查询的点积,以评估注意查询与每个关键字之间的相似度。然后,将其除以√E,并应用softmax函数来获得值的权重。最后,将注意力查询向量的新表示形式计算为加权值和。为了使注意功能更加灵活,通常将附加的多头策略与注意机制相结合。也就是说,多头策略不计算直接注意函数,而是首先将输入QQQ,KKK,VVV投影到hhh个不同的空间中,每个空间的维数为Eˆ^ˆˆ=EEE///hhh,并用等式(3)中定义的注意函数AAAttttttnnn(·,·,·)投影:


输出的多头(QQQ,KKK,VVV)与QQQ具有相同的形状。根据式(4)中的多头函数,多头注意块(MAB)定义为

其中,rrrFFFFFF(·)是行前馈层,LayerNorm(·)是层规范化。MAB是对Transformer编码器模块的改编,没有位置编码和dropout。理想情况下,KKK和VVV可以被视为字典的索引和上下文,而QQQ是用户的信息需求。为了简单起见,设置KKK=VVV,这意味着索引就是上下文本身。最后,MSAB中的自我注意是MAB的一个特例,当Q=K=V时,如图(a)所示。在MSAB中,模型使用输入集中的所有文档来表示每个文档:

 图2:(a)多头自我注意块(MSAB)的结构。MSAB对大小为N的任意集Xt进行编码,并输出一个N大小的集合Xt+1。(b)诱导多头部自我注意块(IMSAB)的结构,IMSAB首先将大小为N的任意集Xt编码为M大小的固定集Ht+1,然后将Ht+1编码为N大小的输出Xt+1。IMSAB可以解释为首先创建M个聚类中心,然后使用这些M个聚类中心对输入的N个文档进行编码。

Induced Multi-head Self Attention Block (IMSAB)

目的:使模型能够处理任何大小的输入文档集。

Document Ranking

将上述MSAB或IMSABM叠加并将结果传递到行前馈神经网络,本文实现了两个版本的SetRank评分函数,分别命名为SetRankM_MM​S_SS​A_AA​B_BB​和SetRankI_II​M_MM​S_SS​A_AA​B_BB​:


其中rrrffffff是一个按行的前馈网络,它将每个文档表示投影为一个实际值作为相应的排名得分。类似地,可以通过将MSAB替换为IMSAB来获得SetRankI_II​M_MM​S_SS​A_AA​B_BB​。因此,最终的文档排名可以通过根据分数对文档进行排序来实现:

Model Training

采用注意排名损失函数进行模型训练。其基本思想是测量由排名得分产生的注意分布与由关联判断产生的注意分布之间的距离。给定一个带标签的查询ψqψ_qψq​={DDD={did_idi​},yyy={yiy_iyi​}| 111≤iii≤NNN},其中yiy_iyi​是关联标签,表示文档did_idi​对于查询qqq的信息增益,文档did_idi​(iii=111,···,NNN)的最优注意分配策略为:(真实)

类似地,给定预测的排名得分{s1s_1s1​,···,sNs_NsN​}=SetRank(DDD),则文档did_idi​(iii=111,···,NNN)的预测得分为:(预测)

因此,可以根据这两种注意分布构造列表式交叉熵损失函数:(交叉熵)

注意,SetRank对输入集大小不敏感,尤其是对于基于IMSAB的SetRank。在文档表示步骤中,ordinal嵌入可以用于初始排名。但是,它阻止了模型对大于训练数据中最大集大小的输入集进行处理,因为更大的ordinal嵌入是不可用的。为了解决这一问题,在模型训练过程中提出了一种相对ordinal的嵌入抽样策略。首先,选择一个最大集合大小NNNm_mm​a_aa​x_xx​(可能是一个非常大的数字),并且ordinal嵌入的长度也被设置为NNNm_mm​a_aa​x_xx​。然后,对于每一个训练查询,对起始编号sss进行抽样,构造一个索引编号序列[sss,sss+++111,···,sss+++NNN−−−111]来代替原来的文档排序索引[1,2,···,N]。通过这个技巧,所有小于NNNm_mm​a_aa​x_xx​的位置都可以被训练并有它们的顺序嵌入。最后,在测试阶段,可以使用大于N且小于NNNm_mm​a_aa​x_xx​的顺序嵌入索引,从而可以处理小于NNNm_mm​a_aa​x_xx​的排名列表。

实验

数据集

Baselines

RankSVM4^44
RankBoost5^55
MART5^55
LambdaMART5^55
DLCM6^66
GSF7^77

 4https://www.cs.cornell.edu/people/tj/svm_light/svm_rank.html5https://sourceforge.net/p/lemur/wiki/RankLib/6https://github.com/QingyaoAi/Deep-Listwise-Context-Model-for-Ranking-Refinement7https://github.com/tensorflow/ranking/tree/master/tensorflow_ranking

所有模型都是根据它们在验证集上的性能进行调整和选择的NDCG@10。设置RankSVM参数c=200;RankBoost的训练回合数为1000。对于基于树的模型,树数设置为1000,叶数设置为20。标准化贴现累积收益(NDCG)用于评估排名模型的性能。为了显示模型在不同位置的表现,报告了1、3、5和10级的NDCG值。

SetRank设置

测试了SetRank的四种变体:

  1. SetRankMSAB/SetRankIMSAB:使用stacked MSAB/IMSAB进行文档编码,不使用顺序嵌入;
  2. SetRank init MSAB/SetRank init IMSAB:使用MSAB/IMSAB进行文档编码,并基于LambdaMART生成的初始文档排名进行顺序嵌入;
    在所有实验中,每个模型都配置了6个stacked blocks。每一个有256个隐藏单元和8个头。为了适应MSAB或IMSAB的隐藏尺寸,进一步添加了一个rrrffffff2_22​5_55​6_66​来重塑did_idi​到256的尺寸。对于SetRankIMSAB和SetRankinit IMSAB,Induced尺寸M设置为20。利用学习率为0.001的梯度下降法Adam对目标进行优化。在所有实验中,使用LambdaMart检索每个查询前40个文档。排序模型根据这些检索到的文档进行训练,然后用于对文档进行重新排序。DLCM、SetRankinit MSAB和 SetRankinit IMSAB中使用的初始文档排名由LambdaMART生成。为了公平比较,还评估了DLCM,而没有初始排名,表示为DLCM w/o init。


置换不变性分析

随机反转LambdaMart为每个查询生成的排名列表中的一些文档对。
在测试阶段,处理后的文档列表作为初始排名反馈给DLCM和SetRankinit ISMABmodel,而DLCM和SetRankinit ISMABmodel都使用干净的排名表进行训练。图3说明了性能曲线NDCG@10。可以看到,随着初始排名中反向对数量的增加(即噪声较多),SetRankinit ismaba和DLCM的表现都较差。然而,在DLCM中观察到更多的性能下降。这是因为DLCM用RNN对输入文档进行编码,RNN对输入集上的排列非常敏感。图3中演示了SetRankISMAB的性能曲线,它没有使用顺序嵌入。我们可以看到setrankISMAB的性能并没有改变反向文档对的数量。结果证实了命题1理论分析的正确性。

文档set大小的影响

在这一部分中测试ISMAB的效果,它使SetRank具有集合大小适应能力。首先在每个查询与N个文档(N=N0=N1=40,240或500)关联的数据上训练和测试DLCM和SetRank模型(没有初始排名)。

从表3所示的相应结果(训练集和测试集中“#docs associated per query”的行是相同的),我们可以看出,DLCMw/o init、SetRankM_MM​A_AA​S_SS​B_BB​和SetRankI_II​M_MM​S_SS​A_AA​B_BB​三个模型在不同的集大小上具有相似的性能。结果表明,当训练和测试阶段文档集大小相近时,模型的性能趋于不变。然而,当我们在与40个文档(N0=40)相关联的查询上训练DLCM和SetRank模型,并在与240和500个文档(N1=240或500)相关联的查询上测试模型时。从表3中报告的相应结果(训练集中“#docs associated per query”的行数为40,测试集中的“#docs associated per query”的行数为240或500),我们可以看到性能下降(见括号中的∆值).。

初始rank嵌入的影响

SetRank(2020SIGIR)相关推荐

  1. Encoding History with Context-aware Representation Learning for Personalized Search(2020SIGIR)

    预备知识:Transformer:1.https://blog.csdn.net/longxinchen_ml/article/details/865330052.苏剑林. (2018, Jan 06 ...

  2. ColBERT(2020SIGIR)

    ColBERT: Eficient and Efective Passage Search via Contextualized Late Interaction over BERT 1.介绍 预训练 ...

  3. 基于数据挖掘的旅游推荐APP(三):热门景点模块

    该模块数据来源于百度搜索风云榜之今日风景名胜排行榜(链接),通过调用托管在神箭手云上的API接口可以实现数据的实时抓取,可以参考这里. 效果图: 接着上一篇继续说,该模块对应LauchFragment ...

  4. Java实践(四)——数组

    一.实践目的 1.掌握数组的声明 2.掌握数组的创建 3.掌握数组元素的初始化 4.掌握数组的引用 5.了解多维数组 二.实践内容 1.定义一个学生类Student,它有名字name,年龄age,成绩 ...

  5. 【SSH框架】之Spring系列(一)

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.前言 前面更新过几篇关于 Struts2 框架和 Hibernate 框架的文章,但鉴于这两 ...

  6. 【AAAI 2020】全部接受论文列表(三)

    来源:AINLPer微信公众号(点击了解一下吧) 编辑: ShuYini 校稿: ShuYini 时间: 2020-01-22 最近武汉肺炎形势严峻,请小伙伴们带好口罩,做好防护,大家新年快乐~    ...

  7. 扑克牌游戏(斗地主)

    扑克牌游戏(斗地主) 文章目录 扑克牌游戏(斗地主) 题目 公共类Commons 扑克牌类Puke 操作类Operation 玩牌者Player 测试类 运行截图 题目 题目:创建一幅扑克牌(含有大小 ...

  8. Android 天气APP(三)访问天气API与数据请求

    上一篇:Android 天气APP(二)获取定位信息 访问天气API与数据请求 新版------------------- 一.和风天气 二.城市搜索接口 三.OKHttp使用 四.文章源码 旧版-- ...

  9. OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

    OpenAPI使用(swagger3) demo见Gitte 一.背景及名词解释 OpenAPI是规范的正式名称.规范的开发工作于2015年启动,当时SmartBear(负责Swagger工具开发的公 ...

最新文章

  1. C++Study 指针详解
  2. Linux 分割、合并文件
  3. android列表【android开发记录片】android下实现圆角列表布局控件
  4. 《专门替中国人写的英语语法》(四)
  5. spring之集合注入
  6. python 闭包和装饰器
  7. 山东财经大学计算机体系结构考试题,2016年山东财经大学计算机科学与技术学院数据库系统原理与程序设计复试笔试仿真模拟题...
  8. IDEA中使用SQLite数据库
  9. Linux 审计日志记录,linux日志服务器审计客户端history记录
  10. C++ OpenCV光平面标定-线激光提取
  11. windows保护无法启动修复服务器,解决使用sfc命令提示“windows 资源保护无法启动修复服务”的方法...
  12. unity漂移 unity3d教程 // WheelCollider
  13. 【读过的书】《好看的皮囊千篇一律,有趣的灵魂万里挑一》
  14. java ftp 上传下载
  15. VS2019 编译 paho-mqtt-cpp 遇到的问题
  16. 智慧工厂之化工厂人员定位系统,工厂实时定位,视频联动-新导智能
  17. 鲸发卡11.02免授权版本
  18. vue兼容IE11浏览器空白页等一系列问题之踩坑全过程
  19. step7注释乱码问题解决
  20. ARM架构与编程--基于STM32F103 (1)LED原理图

热门文章

  1. 许永鑫 南京理工大学计算机学院,南京理工大学计算机科学与技术学院研究生导师简介-付安民...
  2. 千岛酱行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  3. OSI七层协议模型、TCP/IP四层模型和五层协议体系结构之间的关系
  4. 实现Windows XP自动登录的两种方法
  5. 软骨病——成年人的缺钙病
  6. vm虚拟机安装教程及注意事项
  7. WordPress主题/两栏响应式博客主题:翠竹林CUI v2.06
  8. 消防工程师 2.1 自动喷水灭火系统-湿式
  9. [凯立德]2013.12.17凯立德发布秋季版(2F21J0E)最新增量包SP1_我是亲民_新浪博客...
  10. Leetcode刷题100天—378. 有序矩阵中第 K 小的元素(优先队列)—day16