自然语言推理

给定两个句子(前提和假设),自然语言推理(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 的数据集。这两个数据集包含句子对和以下三个标签之一:蕴含、中立、矛盾

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

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

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

  • AllNLI 的 triplet 子集提供(锚点,正样本,负样本)三元组,其中负样本是困难负样本(矛盾)。虽然 SpladeLoss 主要使用正样本对作为其排序组件,但困难负样本也可以根据具体的 SparseMultipleNegativesRankingLoss 配置进行整合。

SpladeLoss

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

排序组件:SparseMultipleNegativesRankingLoss

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

SBERT MultipleNegativeRankingLoss

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

稀疏性正则化

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