增强型 SBERT

动机

双编码器(又称句子嵌入模型)需要大量的训练数据和对目标任务的微调才能达到有竞争力的性能。然而,在许多场景中,只有很少的可用训练数据。

为了解决这个实际问题,我们发布了一种有效的、称为增强型 SBERT的数据增强策略,我们利用高性能且慢速的交叉编码器 (BERT) 来标记更大的输入对集,以增强双编码器 (SBERT) 的训练数据。

欲了解更多详情,请参阅我们的出版物——增强型 SBERT:用于改进成对句子评分任务的双编码器的数据增强方法,这是由德国达姆施塔特工业大学 UKP 实验室的 Nandan Thakur、Nils Reimers 和 Johannes Daxenberger 共同努力的成果。

Chien Vu 也撰写了一篇关于这项技术的精彩博客文章:通过将知识从交叉编码器转移到双编码器来改进 BERT 模型

扩展到你自己的数据集

场景1:有限或小型标注数据集(少量标注句子对 (1k-3k))
如果你在公司或研究中有小型或包含少量标注句子对的专业数据集。你可以通过在小型黄金数据集上训练交叉编码器,并使用 BM25 采样生成以前未见过的组合,来扩展增强型 SBERT(域内)策略。使用交叉编码器标记这些未标注的对以创建白银数据集。最后,如train_sts_indomain_bm25.py所示,在你的扩展数据集(黄金+白银)上训练双编码器(即 SBERT)。

场景2:无标注数据集(仅有未标注句子对)
如果你在公司或研究中只有未标注的句子对的专业数据集。你可以通过在已标注的源数据集(例如 QQP)上训练交叉编码器来扩展增强型 SBERT(域迁移)策略。使用此交叉编码器标记你的专业未标注数据集,即目标数据集。最后,如train_sts_qqp_crossdomain.py所示,在你的已标注目标数据集上训练双编码器,即 SBERT。

方法论

对于成对句子回归或分类任务,增强型 SBERT 方法主要有两种场景。

场景1:有限或小型标注数据集(少量标注句子对)

我们应用增强型 SBERT(域内)策略,它包括三个步骤——

  • 步骤1:在小型(黄金或标注)数据集上训练交叉编码器 (BERT)

  • 步骤2.1:通过重组创建对,并通过 BM25 或语义搜索减少对的数量

  • 步骤2.2:使用交叉编码器 (BERT) 弱标记新对。这些是白银对或(白银)数据集

  • 步骤3:最后,在扩展的(黄金 + 白银)训练数据集上训练双编码器 (SBERT)

场景2:无标注数据集(仅有未标注句子对)

我们应用增强型 SBERT(域迁移)策略,它包括三个步骤——

  • 步骤1:从头开始在包含标注的源数据集上训练交叉编码器 (BERT)

  • 步骤2:使用此交叉编码器 (BERT) 标记你的目标数据集,即未标注句子对

  • 步骤3:最后,在已标注的目标数据集上训练双编码器 (SBERT)

训练

examples/sentence_transformer/training/data_augmentation 文件夹包含下面解释的每个场景的简单训练示例

  • train_sts_seed_optimization.py

    • 此脚本从头开始为 STS 基准数据集训练双编码器 (SBERT) 模型,并进行种子优化。

    • 种子优化技术受到(Dodge et al., 2020)的启发。

    • 对于种子优化,我们针对各种种子训练双编码器,并使用早期停止算法进行评估。

    • 最后,测量不同种子的开发性能以获得最高性能的种子。

  • train_sts_indomain_nlpaug.py

    • 此脚本从头开始为 STS 基准数据集训练双编码器 (SBERT) 模型,使用简单数据增强。

    • 数据增强策略来自流行的nlpaug包。

    • 使用(word2vec、BERT 或 WordNet)通过同义词增强单个句子。形成我们的白银数据集。

    • 在原始小型训练数据集和基于同义词的白银数据集上训练双编码器模型。

  • train_sts_indomain_bm25.py

    • 脚本最初从头开始为小型 STS 基准数据集训练交叉编码器 (BERT) 模型。

    • 从我们的小型训练数据集中重组句子并形成大量句子对。

    • 使用Elasticsearch通过 BM25 采样限制组合数量。

    • 给定一个句子检索 top-k 句子,并使用交叉编码器标记这些对(白银数据集)。

    • 在黄金 + 白银 STSb 数据集上训练双编码器 (SBERT) 模型。(增强型 SBERT (域内) 策略)。

  • train_sts_indomain_semantic.py

    • 此脚本最初从头开始为小型 STS 基准数据集训练交叉编码器 (BERT) 模型。

    • 我们从我们的小型训练数据集中重组句子并形成大量句子对。

    • 使用预训练的 SBERT 模型通过语义搜索采样限制组合数量。

    • 给定一个句子检索 top-k 句子,并使用交叉编码器标记这些对(白银数据集)。

    • 在黄金 + 白银 STSb 数据集上训练双编码器 (SBERT) 模型。(增强型 SBERT (域内) 策略)。

  • train_sts_qqp_crossdomain.py

    • 此脚本最初从头开始为 STS 基准数据集训练交叉编码器 (BERT) 模型。

    • 使用交叉编码器标记 Quora Questions Pair (QQP) 训练数据集(假设没有标签)。

    • 在 QQP 数据集上训练双编码器 (SBERT) 模型。(增强型 SBERT (域迁移) 策略)。

引用

如果您使用增强型 SBERT 的代码,请随时引用我们的出版物 增强型 SBERT:用于改进成对句子评分任务的双编码器的数据增强方法

@article{thakur-2020-AugSBERT,
    title = "Augmented SBERT: Data Augmentation Method for Improving Bi-Encoders for Pairwise Sentence Scoring Tasks",
    author = "Thakur, Nandan and Reimers, Nils and Daxenberger, Johannes and  Gurevych, Iryna", 
    journal= "arXiv preprint arXiv:2010.08240",
    month = "10",
    year = "2020",
    url = "https://arxiv.org/abs/2010.08240",
}