增强型 SBERT

动机

双编码器(也称为句子嵌入模型)需要大量的训练数据和针对目标任务的微调才能实现具有竞争力的性能。然而,在许多情况下,只有很少的训练数据可用。

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

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

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

扩展到您自己的数据集

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

场景 2:无已标注数据集(只有未标注的句对)
如果您公司或研究中拥有只包含未标记句子对的专业数据集。您可以扩展增强型 SBERT(域迁移)策略的思想,通过在已标注的源数据集(例如 QQP)上训练一个交叉编码器。使用此交叉编码器标记您的专业未标记数据集,即目标数据集。最后,如 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 问题对(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",
}