自然语言推断

自然语言推理 (NLI) 任务是给定两个句子(前提和假设),判断前提是否蕴含假设、两者是否矛盾,或者两者是否中立。常用的 NLI 数据集有 SNLIMultiNLI

Conneau 等人的研究表明,NLI 数据在训练句子嵌入方法时非常有用。我们在我们的Sentence-BERT论文中也发现了这一点,并经常将 NLI 作为稀疏编码器方法的第一个微调步骤。

要基于 NLI 进行训练,请参阅以下示例文件

  • train_splade_nli.py:

    该脚本训练一个SparseEncoder(具体来说是一个类似 SPLADE 的模型,微调例如 naver/splade-cocondenser-ensembledistil)用于 NLI。它使用 SpladeLoss。此损失函数专为训练 SPLADE 风格的模型而设计,并结合了两个主要部分:1. 一个排序损失,通常是 SparseMultipleNegativesRankingLoss,以确保相关(例如,蕴含)对的相似度得分高于不相关(批内负例)的对。2. 正则化项(由 document_regularizer_weight 和损失中的其他潜在参数控制),以鼓励稀疏向量中学习到的词权重具有稀疏性。这是 SPLADE 模型的一个关键特性,能够产生高效且有效的稀疏表示。

    该脚本使用 AllNLI 数据集,很可能采用“pair-score”或“pair”配置来提取(锚点,正例)对(例如,前提和蕴含假设),用于损失的排序部分。

数据

我们将 SNLIMultiNLI 合并成一个我们称之为 AllNLI 的数据集。这两个数据集包含句子对和三个标签之一:蕴含 (entailment)、中立 (neutral)、矛盾 (contradiction)。

句子 A (前提) 句子 B (假设) 标签
一场有多个男性参与的足球比赛。 一些男人在进行一项运动。 蕴含
一个年长和一个年轻的男人在微笑。 两个男人在笑着看地板上玩的猫。 中立
一个男人在某个东亚国家检查一个人物的制服。 那个男人在睡觉。 矛盾

我们将 AllNLI 格式化为几个不同的子集,以兼容不同的损失函数。对于 train_splade_nli.py 脚本,数据通常被处理成 (锚点, 正例) 对,用于排序损失部分。例如,NLI 中的蕴含对可以作为 (锚点, 正例) 对。

  • AllNLI 的 pair 子集直接提供 (锚点, 正例) 对。

  • AllNLI 的 triplet 子集提供 (锚点, 正例, 负例) 三元组,其中负例是困难负例(矛盾关系)。虽然 SpladeLoss 主要使用正例对进行其排序部分,但根据具体的 SparseMultipleNegativesRankingLoss 配置,困难负例也可能被纳入其中。

SpladeLoss

SpladeLosstrain_splade_nli.py 中使用。它专为训练 SPLADE (稀疏词汇与扩展) 模型而设计。它包装了一个排序损失,例如 SparseMultipleNegativesRankingLoss,并添加了正则化项以促进输出向量的稀疏性。

排序组件:SparseMultipleNegativesRankingLoss

底层的排序损失作用于句子对 [(a1, b1), …, (an, bn)],其中 (ai, bi) 是相似的句子(例如,前提及其蕴含的假设),而 i != j 时的 (ai, bj) 被视为不相似的句子(批内负例)。该损失最小化 (ai, bi) 之间的距离(或最大化相似度),同时最大化所有 i != j 的 (ai, bj) 之间的距离(或最小化相似度)。

SBERT MultipleNegativeRankingLoss

将此与 NLI 数据一起使用意味着将蕴含对定义为正例对。例如,(“一场有多个男性在踢的足球比赛。”, “一些男人在进行一项运动。”) 在稀疏向量空间中应该距离很近。

稀疏性正则化

SpladeLoss 的一个关键部分是应用于稀疏输出向量中词权重的正则化(例如,通过 document_regularizer_weight 实现的 FLOPS 正则化)。这鼓励模型仅选择最重要的词来进行表示,从而产生非常稀疏的向量,这对于高效检索非常有利。