欢迎来到「澜舟NLP论文领读」专栏!快乐研究,当然从研读 paper 开始——澜舟科技团队注重欢乐的前沿技术探索,希望通过全新专栏和大家共同探索人工智能奥秘、交流 NLP「黑科技」,踩在「巨人」肩上触碰星辰!
本期分享者:澜舟科技研究实习生韦松伟,首都师范大学信息工程学院二年级研究生。三人行,必有我师焉。兴趣广泛,爱好学习,欢迎大家一起探讨交流~
email: weisongwei@interns.chuangxin.com
写在前面
如果你想训练一个文本检索模型,但是缺少有标注的数据集,那不妨来看看这篇论文《LaPraDoR: Unsupervised Pretrained Dense Retriever for Zero-Shot Text Retrieval 》,LaPraDoR 是一个无监督的文本检索模型,不依赖人工标注的数据集,可以在通用领域的大型数据集上进行训练,语义模型的基础上又用传统的 BM25 算法做了增强,在 BEIR 评测集上达到了 SOTA 水平,该论文发表在 ACL 2022 上。
论文链接:https://arxiv.org/abs/2203.06169
Text Retrieval 简单介绍
在介绍 LaPraDoR 之前,我们先来回顾一下文本检索的两个主流模型。目前文本检索(Text Retrieval)主要有两种模型,一种是双塔模型也叫 Dense Retrieval。稠密检索 (Dense Retrieval) 任务旨在通过给定的 query,在一个庞大的 document 语料库中召回与 query 高度相关的 document(document 泛指语料库中的文本内容,可以是句子,段落,文章等),其中 query 和 document 的语义相关性通常建模为 query 和 document 表示向量的点积或余弦相似度。其结构如下图所示:
还有一种是 对每一个 query-document 对计算匹配得分,这种方法一般在准确率上有优势但是需要耗费大量的计算时间,一般多用于重排阶段。而双塔模型在 ANN(an approximate nearest neighbor retrieval library,近邻搜索)等这种技术的帮助下速度非常快,如 faiss。
当前训练检索模型都有哪些问题呢?
Dense Retrieval 往往需要大量的人工标注的数据集,而且还有个大问题,模型有 out-of-domain 问题,就是你在这个领域训练的模型换到另一个领域效果会大大降低。人工标注本来就是件耗时耗力的工作,更别提一些领域内数据集的资源都很少的情况。训练文本检索模型基本都是基于对比学习来训练,一般来说增大负样本的数量对比学习的效果就会越好,但同时会导致占用的 GPU 内存增加,GPU 的内存会限制负例的数量,这也是一个比较普遍的问题。当前的 Dense Retrievers 模型总体优于传统的词典匹配算法 如 BM25,但 BM25 算法仍有一定的优点,在某些数据集上效果不亚于 Dense Retrievers 模型。
LaPraDoR 介绍
针对上面的问题,论文提出了 LaPraDoR(Large-scale Pretrained Dense Zero-shot Retriever)。LaPraDoR 是一种无监督预训练模型,用于文本的召回、匹配。不需要任何标注数据就可以进行训练。由于是在大型的通用领域数据集上进行训练,因此基本没有 out-of-domain 问题。
论文主要提出了两点创新 Iterative Contrastive Learning (ICoL) 和 Lexicon- Enhanced Dense Retrieval (LEDR)。ICoL 中引入缓存队列机制可以在 GPU 内存不变的情况下加入更多的负例。LEDR 在语义匹配模型的基础上又用传统的 BM25 算法做了增强,其做法是语义的得分乘以 BM25 的得分。在只进行无监督训练的情况下,不仅优于其他无监督模型,速度还快了很多。如果进一步 fintune 的话,在 re-rank 方面也表现十分优秀。
训练 LaPraDoR 有两个挑战:
1. Training Efficiency,如何更有效的训练。在对比学习中,往往更多的负样本会有更好的效果。但是增大 batch 会导致 GPU 的内存吃不消。论文提出的 Iterative Contrastive Learning (ICoL) 就能很好地解决该问题,其做法是构建一个缓存队列,训练过的负样本会加入到队列中,参与下一轮的损失计算。
2. Versatility,领域多样性。采用大语料库包含多个领域的语料库 c4 来进行训练。同时训练时不仅将 query-document 作为训练目标,还包括 document-query, query-query, 和 document-document。论文中 query 与 document 的 encoder 是共享权重的,意味着只有一个 encoder,许多论文中 query 与 document 的 encoder 是分开的,也就是两个 encoder。也有些论文中 query 与 document 的 encoder 共享部分参数。
接下来看一下到底是如何训练的吧!
模型结构与表征提取
首先 query 与 document 的 encoder 均是 BERT 形式的结构,论文中使用的是 DistilBERT。需要注意的是虽然 query 与 document 的 encoder 在最后是同一个,但训练的时候是分两个,每隔一段时间权重会从其中一个复制到另一个。
模型的输入是 [CLS] t1,t2,t3…[SEP] , 表征采用的是最后一层 layer 的 mean pool。也有些模型是用 [CLS]token 作为表征,论文中说有研究指出使用 meanpool 效果会优于 [CLS]token。但是其他一些 SOTA 论文中不少是使用 [CLS] token 的,所以哪种方式更好,并没有一个准确的答案。当得到 query 与 document 的表征后,以他们的余弦相似度作为匹配得分。
训练样本的构建
结构有了,接下来是数据了,论文有两种构建训练数据的方式 Inverse Cloze Task (ICT) 和 Dropout as Positive Instance (DaPI).
Inverse Cloze Task (ICT) :给定一段文本,随机挑出其中一个句子作为 query,剩下的作为文档也就是正样本,主要是用来做短文本去召回长文本。其优点是不需要一定格式的数据集,有大量的数据可以训练。
Dropout as Positive Instance (DaPI):其思想来源于 simcse 这篇论文,就是使用不同的 dropout 来得到正样本。与 simcse 不同点在于,计算梯度时只对其中的一个样本进行计算,这样占用的 GPU 的内存几乎不会增加。
训练过程
有了样本如何进行训练呢?Iterative Contrastive Learning,大体过程如图所示:
先说一下这个缓存队列,为什么要有这个设置呢?其目的是增加负样本的数量。首先设置一个固定的最大容量 m,每次训练过后,当前样本的 embedding 就会加入到队列中作为下一轮的负样本参与损失计算,当容量到达 m 时,最先加入的会被移除。其训练方式是一种迭代的方式,当训练 query encoder 时,冻住 document encoder,就是保持 documentencoder 参数不变,为的是使其表征在同一个语义空间。此时训练包括两个部分,第一部分是 query-query,同一个 query 通过不同的 dropout 得到正样本,负样本是随机的其他 query。训练时的损失函数就是经典的对比学习损失函数,如下:
第二部分就是 query-document,其构建方式为上面说的 ICT。首先会随机选取一些 document 作为负样本,为了加速训练,这些负样本是 batch 内的其他样本。随后这些样本的 embedding 会加入到缓存队列中,参与下一轮的损失计算。于是,损失函数中就带上了队列里的 embedding。其损失函数如下:
可以看到与 query-query 相比,多了一项,该项就是计算队列里的负样本的损失。其最后的损失就是两者之和,注意的是 query 只需 encoder 一次就可以参与这两个的损失计算。
在经过一定的 steps 后,将 query encoder 冻住,并将其权重复制到 document encoder 中。将缓存队列清空开始训练 document encoder。训练的方法与训练 query encoder 类似,包括 document-document 和 document-query,其损失与上面的类似。
为了加速训练,随机的负样本是采用的 in-batch negatives,就是训练 batch 内的其他样本作为负样本。
得到语义模型后,作者又用词典匹配技术对其进行增强,也就是 Lexicon-Enhanced Dense Retrieval (LEDR)。具体是使用 BM25 算法增强,其 BM25 算法的实现是用 Elastic Search,为了节约计算成本,只计算 BM25 算法的 top1000,剩下的得分全为 0。
当得到两者的得分后,最后的得分是两者的得分的乘积。
训练的细节
优化器采用 adam 学习率为 2e-4,使用了 16 块 v100 训练,每个 GPU 的训练 batch 为 256,query 与 document 的最大长度分别为 64 与 350。训练 query 与 document 迭代的步数为 100 步,缓存队列的最大长度为 100k,损失函数中的权重值为 1。大家可以根据自己的 GPU 情况进行调整。
实验结果
LaPraDoR 有两个版本,一个是仅进行无监督训练,另一个是在无监督训练后在 MS-MARCO 上进行微调。下面看其在 BEIR 上评测的表现,评测指标用的是 nDCG。
其中 LaPraDoR FT 是 LaPraDoR 用 BEIR 官方训练脚本在 MS-MARCO 上微调的模型。可以看到 LaPraDoR 不仅效果好,检索速度还快。
接下来作者还对几种不同的对比学习的方法做了评测,其中包括 In-Batch(shared 表示 query 与 document 共用 一个 encoder),In-Batch 就是负样本就是 batch 内其他样本作为负样本。还有 MoCo 与 xMoCo 为动量对比学习,其思想也是增大负例数量,将对比学习作为字典查询过程的角度来看,构建了一个由队列和移动平均编码器组成的动态字典。结果如下图所示:
作者使用这几种不同的训练方式训练 LaPraDoR, ICoL 总体性能最优,可以发现 shared ICoL 与 ICoL 性能基本差不多,说明共用一个 encoder 并未导致性能下降。
作者还实验验证了词典增强以及无监督训练的重要性,如下图所示:
本文这里不再做赘述,感兴趣的可以去读论文看一下细节。
总结
本文带领大家阅读了 ACL 2022 的一篇论文,论文提出了 LaPraDoR——一种无监督预训练模型,在 BEIR 评测集上达到了 SOTA 水平。论文提出了 Iterative Contrastive Learning (ICoL) 和 Lexicon-Enhanced Dense Retrieval (LEDR) 两种方法,实验分别验证了其有效性。通过无监督训练,可以减缓标注数据不足导致模型性能较低的问题,有大量通用领域的数据可以用于模型训练,可以避免出现领域迁移效果大幅度降低的情况,并且其缓存队列的机制可以缓解 GPU 内存不足导致负例少的问题。总之,很推荐大家去读一读。
欢迎关注澜舟科技官方网站,了解更多 NLP 前沿知识:langboat.com
联系我们:bd@langboat.com