NLP 论文领读|缺少有标注的数据集怎么训练文本检索模型?来看看 LaPraDoR 怎么做的吧
欢迎来到「澜舟 NLP 论文领读」专栏!快乐研究,当然从研读 paper 开始——澜舟科技团队注重欢乐的前沿技术探索,希望通过全新专栏和大家共同探索人工智能奥秘、交流 NLP「黑科技」,踩在「巨人」肩上触碰星辰!
本期分享者:澜舟科技研究实习生韦松伟,首都师范大学信息工程学院二年级研究生。三人行,必有我师焉。兴趣广泛,爱好学习,欢迎大家一起探讨交流~ email: weisongwei@interns.chuangxin.com
写在前面
如果你想训练一个文本检索模型,但是缺少有标注的数据集,那不妨来看看这篇论文《LaPraDoR: Unsupervised Pretrained Dense Retriever for Zero-Shot Text Retrieval 》,LaPraDoR 是一个无监督的文本检索模型,不依赖人工标注的数据集,可以在通用领域的大型数据集上进行训练,语义模型的基础上又用传统的 BM25 算法做了增强,在 BEIR 评测集上达到了 SOTA 水平,该论文发表在 ACL 2022 上。
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/AI 领域的前沿技术~
澜舟科技是一家认知智能公司,由 NLP/AI 领域领军人物周明博士创立,针对商业场景数字化转型、以自然语言处理为基础提供商业洞见类产品。2021 年 7 月开源了孟子预训练模型。
版权声明: 本文为 InfoQ 作者【澜舟孟子开源社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/f69112503ab203e5cd94f17a4】。文章转载请联系作者。
评论