领域适应¶
领域适应的目标是在不需要标记训练数据的情况下,将文本嵌入模型适应到特定的文本领域。
领域适应仍然是一个活跃的研究领域,目前还没有完美的解决方案。然而,在我们最近的两篇论文 TSDAE 和 GPL 中,我们评估了几种将文本嵌入模型适应到特定领域的方法。你可以在我的 无监督领域适应讲座 中找到这些方法的概述。
领域适应 vs. 无监督学习¶
虽然存在 无监督文本嵌入学习 的方法,但它们通常表现不佳:它们无法真正学习领域特定的概念。
一个更好的方法是领域适应:这里你有一个来自特定领域的未标记语料库和现有的标记语料库。你可以在这里找到许多合适的标记训练数据集:嵌入模型数据集集合。
自适应预训练¶
使用自适应预训练时,你首先在目标语料库上进行预训练,例如使用 掩码语言建模 或 TSDAE,然后在现有的训练数据集上进行微调(参见 嵌入模型数据集集合)。
在我们的论文 TSDAE 中,我们在4个领域特定的句子嵌入任务上评估了几种领域适应方法:
方法 | AskUbuntu | CQADupStack | SciDocs | 平均 | |
---|---|---|---|---|---|
Zero-Shot 模型 | 54.5 | 12.9 | 72.2 | 69.4 | 52.3 |
TSDAE | 59.4 | 14.4 | 74.5 | 77.6 | 56.5 |
MLM | 60.6 | 14.3 | 71.8 | 76.9 | 55.9 |
CT | 56.4 | 13.4 | 72.4 | 69.7 | 53.0 |
SimCSE | 56.2 | 13.1 | 71.4 | 68.9 | 52.4 |
正如我们所见,当你首先在特定语料库上进行预训练,然后在提供的标记训练数据上进行微调时,性能可以提高多达8个点。
在 GPL 中,我们评估了这些方法在语义搜索中的表现:给定一个简短的查询,找到相关的段落。在这里,性能可以提高多达10个点:
方法 | FiQA | SciFact | BioASQ | TREC-COVID | CQADupStack | Robust04 | 平均 |
---|---|---|---|---|---|---|---|
Zero-Shot 模型 | 26.7 | 57.1 | 52.9 | 66.1 | 29.6 | 39.0 | 45.2 |
TSDAE | 29.3 | 62.8 | 55.5 | 76.1 | 31.8 | 39.4 | 49.2 |
MLM | 30.2 | 60.0 | 51.3 | 69.5 | 30.4 | 38.8 | 46.7 |
ICT | 27.0 | 58.3 | 55.3 | 69.7 | 31.3 | 37.4 | 46.5 |
SimCSE | 26.7 | 55.0 | 53.2 | 68.3 | 29.0 | 37.9 | 45.0 |
CD | 27.0 | 62.7 | 47.7 | 65.4 | 30.6 | 34.5 | 44.7 |
CT | 28.3 | 55.6 | 49.9 | 63.8 | 30.5 | 35.9 | 44.0 |
自适应预训练的一个主要缺点是高计算开销,因为你必须首先在语料库上进行预训练,然后在标记训练数据集上进行监督学习。标记的训练数据集可能非常大(例如,all-*-v1
模型已经在超过10亿个训练对上进行了训练)。
GPL:生成伪标签¶
GPL 克服了上述问题:它可以应用于微调模型之上。因此,你可以使用其中一个 预训练模型 并将其适应到你的特定领域:
训练时间越长,模型表现越好。在我们的实验中,我们在 V100-GPU 上训练模型大约1天。GPL 可以与自适应预训练结合使用,这可以进一步提高性能。
GPL 步骤¶
GPL 分三个阶段工作:
查询生成:对于给定的领域文本,我们首先使用一个 T5 模型为给定的文本生成一个可能的查询。例如,当你的文本是 “Python 是一种高级的通用编程语言”,模型可能会生成一个查询如 “什么是 Python”。你可以在我们的 doc2query-hub 中找到各种查询生成器。
负采样: 接下来,对于生成的查询 "什么是Python",我们从语料库中挖掘负样本,即那些与查询相似但用户不会认为相关的段落。这样的负样本段落可以是 "Java是一种高级的、基于类的、面向对象的编程语言。"。我们使用密集检索进行这种挖掘,即使用现有的文本嵌入模型检索与给定查询相关的段落。
伪标签: 在负采样步骤中,我们可能检索到实际上对查询相关的段落(比如 "什么是Python" 的另一个定义)。为了解决这个问题,我们使用 Cross-Encoder 对所有 (查询, 段落) 对进行评分。
训练: 一旦我们有了三元组 (生成的查询, 正样本段落, 挖掘的负样本段落) 以及 (查询, 正样本) 和 (查询, 负样本) 的 Cross-Encoder 分数,我们就可以开始使用 MarginMSELoss 训练文本嵌入模型。
伪标签 步骤非常重要,并且相比于之前的方法 QGen,伪标签方法显著提高了性能,QGen 只是简单地将段落标记为正样本 (1) 或负样本 (0)。如以下图片所示,对于一个生成的查询("什么是期货合约"),负采样步骤检索到的段落部分或高度相关于生成的查询。使用 MarginMSELoss 和 Cross-Encoder,我们可以识别这些段落,并教导文本嵌入模型这些段落对于给定的查询也是相关的。
下表概述了 GPL 与自适应预训练(MLM 和 TSDAE)的比较。如前所述,GPL 可以与自适应预训练结合使用。
方法 | FiQA | SciFact | BioASQ | TREC-COVID | CQADupStack | Robust04 | 平均 |
---|---|---|---|---|---|---|---|
Zero-Shot 模型 | 26.7 | 57.1 | 52.9 | 66.1 | 29.6 | 39.0 | 45.2 |
TSDAE + GPL | 33.3 | 67.3 | 62.8 | 74.0 | 35.1 | 42.1 | 52.4 |
GPL | 33.1 | 65.2 | 61.6 | 71.7 | 34.4 | 42.1 | 51.4 |
TSDAE | 29.3 | 62.8 | 55.5 | 76.1 | 31.8 | 39.4 | 49.2 |
MLM | 30.2 | 60.0 | 51.3 | 69.5 | 30.4 | 38.8 | 46.7 |
GPL 代码¶
你可以在以下链接找到 GPL 的代码:https://github.com/UKPLab/gpl
我们编写的代码简单易用,你只需传递你的语料库,其余的训练代码都会处理。
引用¶
如果你发现这些资源有帮助,欢迎引用我们的论文。
TSDAE: 使用基于Transformer的顺序去噪自编码器进行无监督句子嵌入学习
@inproceedings{wang-2021-TSDAE,
title = "TSDAE: Using Transformer-based Sequential Denoising Auto-Encoderfor Unsupervised Sentence Embedding Learning",
author = "Wang, Kexin and Reimers, Nils and Gurevych, Iryna",
booktitle = "Findings of the Association for Computational Linguistics: EMNLP 2021",
month = nov,
year = "2021",
address = "Punta Cana, Dominican Republic",
publisher = "Association for Computational Linguistics",
pages = "671--688",
url = "https://arxiv.org/abs/2104.06979",
}
@inproceedings{wang-2021-GPL,
title = "GPL: Generative Pseudo Labeling for Unsupervised Domain Adaptation of Dense Retrieval",
author = "Wang, Kexin and Thakur, Nandan and Reimers, Nils and Gurevych, Iryna",
journal= "arXiv preprint arXiv:2112.07577",
month = "12",
year = "2021",
url = "https://arxiv.org/abs/2112.07577",
}