作者 | Chilia 哥伦比亚大学 nlp搜索推荐 整理 | NewBeeNLP
上一篇中,我们介绍了预训练模型在建立倒排索引中的应用:总结!语义信息检索中的预训练模型
这一篇将介绍预训练模型在深度召回和精排中的应用。
4. 预训练模型在深度召回中的应用
在深度召回中,我们使用Siamese网络生成query/doc的embedding,然后用ANN(approximate nearest neighbor)进行召回。
4.1 基本模型结构
对于query/doc,可以用一个、或者多个embedding表示。
query和doc均用一个embedding表示的代表模型:
DPR (Deep Passage Retrieval For Open Domain Question Answering[1])。DPR使用两个 不同的 BERT-base encoder来对question和海量的document进行表征。在训练时使用正doc和n个负doc,其中n个负doc的采样方法可以是:
- random:从doc库中随机采样
- BM25: 取BM25最高,但不是正样本的doc。即那些虽然有exact-match,但并不是answer的document,作为难负例。
- in-batch负采样:取batch中其他B-1个doc作为负样本。
之后计算交叉熵损失:
query和document均使用多个embedding的代表模型:
1.1) ColBERT:https://zhuanlan.zhihu.com/p/449967507
1.2) COIL (Contextualized Inverted List):
和ColBERT类似,只不过只对那些 精确匹配 的词做交互,而不用对所有的token都做交互,这样进一步提升了效率,且效果和ColBERT几乎等同。同时,为了能够进行semantic匹配,还对query和document的[CLS]计算相似度,最终的相似度即为[CLS]相似度和token匹配的maxsim之和。
只对精确匹配的部分计算maxsim
此方法可以自然的融入倒排索引架构,只需要对每个document都存储一个[CLS] embedding;对所有的token都存储下来包含此token的document id,以及此token在该doc中的上下文表示。
此外一个常见的做法是,用一个embedding去表示query(因为query通常较短、意思集中),用多个embedding去捕捉document的不同子空间的信息。<q,d>相似度即是query和document的每个embedding的点积最大值。
4.2 预训练任务
我们知道,预训练任务和下游任务越相似,模型在下游任务上的表现就越好。所以,应该设计专门针对检索任务的预训练任务。文章Pre-training Tasks for Embedding-based Large-scale Retrieval提出了三个针对检索设计的预训练任务,都是使用Wikipedia的大量无标注数据进行自监督训练。训练数据是都是<query,doc >样本对,这些样本对的获取方式有三个:
- Inverse Cloze Task(ICT): 从一段话中随机取一句话作为query,其余句子作为document
- Body First Selection(BFS): 从一个wiki page中的第一段随机取一句话作为query,再随机取该页中的任意一段作为document
- Wiki Link Prediction (WLP): 从一个wiki page中的第一段随机取一句话作为query,再随机取另一个 链接 到该页的页中任意一段作为document.
4.3 负采样技术
和精排阶段不同,召回阶段需要人工来做负采样。精排阶段我们只需要以召回但不相关(曝光未点击)作为负例,而召回阶段怎么构造负样本则直接影响着模型性能。
代表论文:ANCE (Approximate Nearest Neighbor Negative Contrastive Learning for dense text retrieval[2])
文中指出,端到端训练的深度检索模型有时效果甚至不如基于exact-match的稀疏检索模型,这是因为过多的使用简单负例(random或者in-batch负采样)没有提供很多信息量,其 梯度范数较小、收敛速度慢 。因此,需要从 全局 找到难负例。
同时,ANN查找的索引是 异步更新 的(asynchronously updated)。如果我们不用难负例采样,那么只需要在训练完成之后建立一次索引,来存储每个document的表征。
但是,由于我们要进行难负例采样,所以每次训练的时候我们都需要找到根据当前模型的表征结果去找到最接近的负例。所以,每次在试图找难负例时,都使用最近的一个模型checkpoint来建立索引,然后找到和query最相近的负例作为难负例。这样找到的难负例更加informative,loss更大、梯度也更大,因此可以加速收敛。
思考:为什么要异步更新呢?更新索引需要模型的inference 存储所有document索引,虽然存索引相对效率高一些,但是inference需要在整个document库中全部经过模型的forward pass,这样的计算成本很高。训每个batch都更新一遍索引是不可接受的。所以,只需要隔一段时间用最近的checkpoint更新一下索引即可。(当然了,一种更简单的做法是用另一个训好的模型来选择难负例,但是由于这另一个模型毕竟和我们要训练的模型不同,所以不免要牺牲一些准确率。)
具体的,是用Roberta-base预训练模型来初始化双塔模型,然后先是用BM25做warm-up(用BM25做难负例采样),之后再通过异步方法更新索引,用正在训练的模型的checkpoint进行难负例采样。
5. 预训练模型在精排中的应用
精排阶段可以是多个cascading模型级联构成,数据量越来越少、模型越来越复杂。
5.1 判别模型 (discriminative ranking models)
召回阶段使用的是基于表示的双塔模型,而在精排阶段我们可以使用更为复杂的基于交互的金字塔模型,来让query和document进行交互。代表模型有:
1)MonoBERT (https://arxiv.org/pdf/1910.14424.pdf[3])
将query和document拼在一起,然后把[CLS]的embedding经过MLP得到relevance score。使用point-wise损失(交叉熵损失),即为简单的分类问题。
2)DuoBERT (https://arxiv.org/pdf/1910.14424.pdf[4])
把query和正负document同时输入模型(
), 然后和MonoBERT一样用[CLS]对应的embedding进行预测,预测的label是0,意为
比
更为相关。此为pair-wise损失。
3) CEDR (CEDR: Contextualized Embeddings for Document Ranking[5] )
先使用BERT获得query和document中每个词的上下文表征,为了把握不同层的信息,对 L层 都计算相似度矩阵:
然后对相似度矩阵采用DRMM或者KNRM的方法来提取交互信息。
长文本处理方法:
由于BERT可接受的最长token长度为512,那么对于特别长的句子该如何解决呢?有两种简单的解决方法:段落分数聚合和段落表示聚合。
1)段落分数聚合
使用一个滑窗来得到不同段的句子,然后对每个段都计算匹配得分。最后的得分聚合可以是first/max/avg. 在训练时也使用一篇文章的不同段落进行训练,在标注label的时候,如果这篇文章为相关,那么其所有段落都标记为相关。当然这样会引入噪声,因为一篇文章虽然相关,但未必其每一段都是相关的。
2)段落表示聚合
将一个长文本拆分成若干<512token的段落之后,对每一段都求其[CLS]表征。那么,长文本的整体表征就是每一段[CLS]表征的聚合。这个聚合方法可以是mean/max/sum等数学方法求得的,也可以是再经过深度模型(FFN/CNN/Transformer)得到的。
注意,在召回阶段对于长文本,一般只能使用max方式进行聚合,因为ANN索引查找(如Faiss)是天然支持max-pooling的。其他聚合方法不适合ANN查找,不能提高召回的效率。在精排阶段,无论使用多么复杂的聚合方法都是可以的。
注:把长文本拆成若干段,就都失去了长距离的依赖。可以使用TransformerXL的思想,缓存上一个segment的隐藏层表示,然后当前segment可以通过自注意力关注到上一个segment的隐藏层。
5.2 生成模型
生成模型假定query和document之间有着随机生成过程(stochastic generative process), 例如query-likelihood model就是评估的query有多大可能被document生成出来。
本文参考资料
[1]
Deep Passage Retrieval For Open Domain Question Answering: https://arxiv.org/pdf/2004.04906.pdf
[2]
Approximate Nearest Neighbor Negative Contrastive Learning for dense text retrieval: https://arxiv.org/pdf/2007.00808.pdf
[3]
https://arxiv.org/pdf/1910.14424.pdf: https://arxiv.org/pdf/1910.14424.pdf
[4]
https://arxiv.org/pdf/1910.14424.pdf: https://arxiv.org/pdf/1910.14424.pdf
[5]
CEDR: Contextualized Embeddings for Document Ranking: https://link.zhihu.com/?target=https://arxiv.org/abs/1904.07094