提纲
-
什么是精排?
-
精排方法类型
-
精排方法
- 方法比较
参考文献
1. 什么是精排?
顾名思义,精排就是精确排序,就是将问答系统召回模块返回的若干答案候选项进行打上具体精确的分数从而进行排序,一般分数取值在[0,1]之间,分数越高代表该候选答案跟query的匹配程度越高。精排模型的目标就是希望能给最合适的候选答案搭上越高的分值,越匹配的候选答案打上越高的分数。如果候选答案都不匹配query就都打上较低的分值,让后续的模块去调用相应的兜底策略。
有人可能会有疑问,之前提到的召回模块其实也会计算候选答案跟query之间的相似度(例如文本召回的tfidf相似度,向量召回的余弦相似度等),那跟精排模型的打分是不是重复了?其实不然,召回跟精排的打分是不冲突的,召回主要是海量的知识库中返回一定数量的候选答案,所以它所设计的打分方法是相对简单跟粗糙,只要正确答案能位于topK候选项中即可。但是精排则不然,它要求将若干候选项按相似度精确排序,要求正确答案要排到非常前面的位置(很多情况如果top1不是正确答案就意味着没法正确回答用户的问题,因为不同于推荐系统可以展示多个候选商品,问答系统只能回复一种答案)。所以它的模型会相对更加复杂和精致,计算更加耗时。另外,召回的打分跟精排的打分是可以联合使用的,由于两者是从不同角度计算的候选答案跟query的相似度,相辅相成,所以可以通过加权等方式计算最终相似度,作为最终判断的依据。
精排模块的效果应该怎么评估或者训练呢?
召回模型看中的是召回率,而精排模型则注重准确率,也就是模型计算候选答案跟query之间的相似度。通常会有两种评估方式,常见一种是将候选答案跟query的相似度看作一个分类问题,也就是只有两种情况,0(两者不相似)和1(两者相似),精确模型会对候选答案跟query之间的相似度分到0跟1两种情况,然后计算对应的准确率即可。另外一种是将候选答案跟query的相似度看作一个回归问题,也就是相似度的取值可以是0到1之间的所有取值,这种情况下最终模型的评估的可以是相关系数等指标。另外,还有一种相对罕见可以用来辅助或进行特定提升的任务,就是对于同一个query,候选答案1跟候选答案2之间谁更匹配,前面两种的数据格式都是(query,候选答案,相似度),但是这种却是(query,候选答案1,候选答案2,true or false),其中true代表候选答案1更合适,false代表候选答案2更合适。
2.精排方法类型
根据计算相似度过程中候选答案跟query之间是否进行过特征交互可以分为双塔模型跟cross模型。什么叫做特征交互呢,可以理解为在这个计算过程中,候选答案是否能看到query,是否用到query的信息,相对的,query是否能看到候选答案并用到候选答案的信息。
图1:双塔模型跟cross模型的结构
3.精排方法
3.1 双塔模型
双塔模型的架构会分为左右两个部分,左右两边分别用于计算候选答案跟query的表征,但是两者信息不会共享,然后最后在计算两者表征之间的相似度。也就是说,对于不同的query,同一个候选答案计算得到的表征是一样的。这种方法的好处在于候选答案的表征是可以预先计算好然后存在数据库中,所以每次线上推理计算相似度只需要计算query的表征和计算表征之间的相似度(这部分计算量很小)即可。相对的,它的缺点就是效果不及cross模型,因为计算过程中query跟候选答案之间缺乏有效的特征交互,可以理解为对于不同的query,其实候选答案生成的表征应该是要有所差异的(想想汉语里面同个词语或者同个句子在不同语境下语义是有差异的),但是双塔模型忽略了这个问题。著名的sentence Bert其实非常适用于双塔模型,将同一个bert作为encoder分别获得query跟候选答案的语义表征(取最终一层transformer的隐状态的均值效果最佳),然后计算两个向量之间的相似度即可,候选答案的语义表征可以事先计算好存进数据库,线上推理的时候就不需要计算这一部分了。
图2:Bert的双塔结构
对于双塔模型而言,最重要的就是如果获取准确的语义表征,在这两年对比学习的帮助下,模型的语义表征能力得到极大增强,在部分数据集上甚至达到跟cross模型一样的效果。对这方面感兴趣的朋友们可以关注下今年的这几种方法,consert, simcse, pairsupcon, promptbert, 看完会有种对比学习yyds的强烈冲击。
3.2 cross模型
cross模型会将候选答案跟query当作一个整体,在计算相似度过程,候选答案跟query之间有一定的特征交互,对于不同的query,同一个候选答案对应的表征也会有所差异,也就是候选答案的表征跟query是强相关的,这就可以解决上面双塔模型所忽略的语境问题。Cross模型的优点在于进行了候选答案跟query之间的特征交互,效果会优于没有进行特征交互的双塔模型。相对应的缺点在于每次线上推理计算相似度都需要从头算起,没办法预先存储好某个环节结果,进而耗时相对较高。以前比较常用的cross模型有esim,re2等,现在直接用预训练模型可以实现这种结构。下面会简要讲下esim跟Bert怎么进行特征交互实现cross架构的。
图3:esim的结构
Esim(上图左边部分)主要包括三个部分,Input Encodeing是编码层,包括embedding和lstm, 主要是获得句子的向量表征。Iocal Inference Modeling是局部推理模块,主要是对齐层跟聚合层,对齐层在这里候选答案跟query之间会进行对齐,计算彼此之间基于token(词)的相似度,进而生成彼此相似度加权的新表征, 这里就是我们之前提到的query跟候选答案之间的特征交互。聚合层是将对齐层之前跟之后的表征做一些组合,加强特征输入。Inference Composition就是在一起利用lstm编码聚合层输出的特征,在通过全连接层输出query跟候选答案之间的相似度。
图4:Bert的cross结构
Bert作为cross模型计算query跟候选答案的相似度的过程并不复杂,通过句子分隔符号[SEP]将query跟一个候选答案拼接在一起作为bert的输入,然后获取bert的输出(可以是最后一层transformer的隐状态的均值,也可[CLS]位置的输出),再连接一个全连接层输出query跟候选答案之间的相似度即可。在这里query跟候选答案的特征交互是在Bert每一层transformer的self-attention进行的,因为self-attention每个token都可以看到并用到其他位置的信息,所以query跟候选答案之间彼此的信息可以相互利用。
Cross模型最大的问题在于线上推理耗时,所以可考虑把特征交互这个环节放到模型后面的层去进行,那么候选答案关于交互层之间的结果就可以预先计算存储下来了,减少线上推理的时间跟计算量。
4.方法比较
| 优点 | ||
| 缺点 | ||
| 双塔模型 | ||
| 候选答案的向量表征可以线下提前计算,线上推理耗时O(1)。 | ||
| 效果不及cross模型 | ||
| Cross模型 | ||
| 候选答案跟query有特征交互,效果更佳。 | ||
| 线上推理耗时O(N),N是候选答案数量。 | ||
参考文献
1.(sentence bert,EMNLP2019)Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
https://arxiv.org/abs/1908.10084
2.(simcse,emnlp2021)Simple Contrastive Learning of Sentence Embeddings
https://arxiv.org/pdf/2104.08821.pdf
3.(美团consert,ACL2021)ConSERT: A Contrastive Framework for Self-Supervised Sentence Representation Transfer
https://arxiv.org/abs/2105.11741
4.(pairsupcon,EMNLP2021)Pairwise Supervised Contrastive Learning of Sentence Representations
https://arxiv.org/abs/2109.00542
5.(promptbert, ACL2022审稿)PromptBERT: Improving BERT Sentence Embeddings with Prompts
https://openreview.net/forum?id=7I3KTEhKaAK
6.(esim, ACL 2017)Enhanced LSTM for Natural Language Inference
