增强版 SBERT

动机

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

为了解决这个实际问题,我们发布了一种有效的数据增强策略,称为增强版 SBERT (Augmented SBERT),我们利用一个性能高但速度慢的交叉编码器(BERT)来标记大量的输入对,从而为双编码器(SBERT)扩充训练数据。

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

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

扩展到您自己的数据集

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

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

方法论

对于成对句子回归或分类任务,增强版 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 等人,2020)

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

    • 最后,测量所有种子的开发集性能,以找到性能最高的种子。

  • train_sts_indomain_nlpaug.py

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

    • 数据增强策略使用了流行的 nlpaug 包。

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

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

  • train_sts_indomain_bm25.py

    • 脚本首先为小规模的 STS 基准数据集从头开始训练一个交叉编码器(BERT)模型。

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

    • 使用 Elasticsearch 进行 BM25 抽样,以限制组合数量。

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

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

  • train_sts_indomain_semantic.py

    • 此脚本首先为小规模的 STS 基准数据集从头开始训练一个交叉编码器(BERT)模型。

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

    • 使用预训练的 SBERT 模型进行语义搜索抽样,以限制组合数量。

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

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

  • train_sts_qqp_crossdomain.py

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

    • 使用交叉编码器标记 Quora 问题对(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",
}