Augmented SBERT

动机

Bi-encoders(又名句子嵌入模型)需要大量的训练数据和在目标任务上的微调才能实现有竞争力的性能。然而,在许多场景中,可用的训练数据很少。

为了解决这个实际问题,我们发布了一种有效的数据增强策略,称为 Augmented SBERT,我们利用高性能且速度较慢的 cross-encoder (BERT) 来标记更大的输入对集合,从而增强 bi-encoder (SBERT) 的训练数据。

有关更多详细信息,请参阅我们的出版物 - Augmented SBERT:用于改进成对句子评分任务的 Bi-Encoders 的数据增强方法,这是 Nandan Thakur、Nils Reimers 和 Johannes Daxenberger (UKP Lab, TU Darmstadt) 的共同努力。

Chien Vu 也撰写了一篇关于这项技术的精彩博客文章:通过将知识从 Cross-Encoders 转移到 Bi-Encoders 来推进 BERT 模型

扩展到您自己的数据集

场景 1:有限或小型标注数据集(少量标注的句子对 (1k-3k))
如果您在公司或研究中拥有小规模或包含少量标注句子对的专业数据集。您可以通过在您的小型黄金数据集上训练 cross-encoder,并使用 BM25 采样来生成之前未见过的组合,从而扩展 Augmented SBERT(领域内)策略的想法。使用 cross-encoder 标记这些未标记的对以创建银数据集。最后,在您的扩展数据集(黄金 + 白银)数据集上训练 bi-encoder(即 SBERT),如 train_sts_indomain_bm25.py 中所示。

场景 2:无标注数据集(仅无标注的句子对)
如果您在公司或研究中拥有仅包含未标记句子对的专业数据集。您可以通过在带注释的源数据集(例如 QQP)上训练 cross-encoder,从而扩展 Augmented SBERT(领域转移)策略的想法。使用此 cross-encoder 标记您的专业未标记数据集,即目标数据集。最后,在您标记的目标数据集上训练 bi-encoder,即 SBERT,如 train_sts_qqp_crossdomain.py 中所示。

方法论

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

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

我们应用 Augmented SBERT(领域内)策略,它包括三个步骤 -

  • 步骤 1:在小型(黄金或标注)数据集上训练 cross-encoder (BERT)

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

  • 步骤 2.2:使用 cross-encoder (BERT) 弱标记新对。这些是银对或(银)数据集

  • 步骤 3:最后,在扩展的(黄金 + 白银)训练数据集上训练 bi-encoder (SBERT)

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

我们应用 Augmented SBERT(领域转移)策略,它包括三个步骤 -

  • 步骤 1:从头开始在源数据集上训练 cross-encoder (BERT),我们包含该源数据集的注释

  • 步骤 2:使用此 cross-encoder (BERT) 标记您的目标数据集,即未标记的句子对

  • 步骤 3:最后,在标记的目标数据集上训练 bi-encoder (SBERT)

训练

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

  • train_sts_seed_optimization.py

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

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

    • 对于种子优化,我们使用各种种子训练 bi-encoder,并使用提前停止算法进行评估。

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

  • train_sts_indomain_nlpaug.py

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

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

    • 使用同义词(word2vec、BERT 或 WordNet)扩充单个句子。形成我们的银数据集。

    • 在原始小型训练数据集和基于同义词的银数据集上训练 bi-encoder 模型。

  • train_sts_indomain_bm25.py

    • 脚本最初从头开始为小型 STS 基准数据集训练 cross-encoder (BERT) 模型。

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

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

    • 检索给定句子的前 k 个句子,并使用 cross-encoder(银数据集)标记这些对。

    • 在黄金 + 白银 STSb 数据集上训练 bi-encoder (SBERT) 模型。(Augmented SBERT(领域内)策略)。

  • train_sts_indomain_semantic.py

    • 此脚本最初从头开始为小型 STS 基准数据集训练 cross-encoder (BERT) 模型。

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

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

    • 检索给定句子的前 k 个句子,并使用 cross-encoder(银数据集)标记这些对。

    • 在黄金 + 白银 STSb 数据集上训练 bi-encoder (SBERT) 模型。(Augmented SBERT(领域内)策略)。

  • train_sts_qqp_crossdomain.py

    • 此脚本最初从头开始为 STS 基准数据集训练 cross-encoder (BERT) 模型。

    • 使用 cross-encoder 标记 Quora Questions Pair (QQP) 训练数据集(假设不存在标签)。

    • 在 QQP 数据集上训练 bi-encoder (SBERT) 模型。(Augmented SBERT(领域转移)策略)。

引用

如果您使用 augmented sbert 的代码,请随意引用我们的出版物 Augmented SBERT:用于改进成对句子评分任务的 Bi-Encoders 的数据增强方法

@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",
}