SetFit 文档

SetFit 采样策略

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

SetFit 采样策略

SetFit 在 TrainingArguments 中支持各种对比对采样策略。在本概念指南中,我们将学习以下四种采样策略:

  1. "oversampling"(默认)
  2. "undersampling"
  3. "unique"
  4. "num_iterations"

建议先阅读 SetFit 概念指南,了解对比学习和正负对的背景知识。

运行示例

在本概念指南中,我们将使用以下示例场景:

  • 3 个类别:“happy”、“content” 和 “sad”。
  • 共 20 个样本:8 个“happy”样本、4 个“content”样本和 8 个“sad”样本。

考虑到句子对 (X, Y)(Y, X) 会产生相同的嵌入距离/损失,我们只想考虑这两种情况中的一种。此外,我们不希望出现两个句子相同的情况,例如没有 (X, X)

最终的正负对可以在下表中可视化。+- 分别表示正对和负对。此外,h-n 表示第 n 个“happy”句子,c-n 表示第 n 个“content”句子,s-n 表示第 n 个“sad”句子。请注意,对角线以下区域未使用,因为 (X, Y)(Y, X) 会产生相同的嵌入距离,并且对角线未使用,因为我们对两个句子相同的对不感兴趣。

h-1 h-2 h-3 h-4 h-5 h-6 h-7 h-8 c-1 c-2 c-3 c-4 s-1 s-2 s-3 s-4 s-5 s-6 s-7 s-8
h-1 + + + + + + + - - - - - - - - - - - -
h-2 + + + + + + - - - - - - - - - - - -
h-3 + + + + + - - - - - - - - - - - -
h-4 + + + + - - - - - - - - - - - -
h-5 + + + - - - - - - - - - - - -
h-6 + + - - - - - - - - - - - -
h-7 + - - - - - - - - - - - -
h-8 - - - - - - - - - - - -
c-1 + + + - - - - - - - -
c-2 + + - - - - - - - -
c-3 + - - - - - - - -
c-4 - - - - - - - -
s-1 + + + + + + +
s-2 + + + + + +
s-3 + + + + +
s-4 + + + +
s-5 + + +
s-6 + +
s-7 +
s-8

如前表所示,我们有 28 个“happy”的正对,6 个“content”的正对,以及另外 28 个“sad”的正对。总共有 62 个正对。此外,我们有“happy”和“content”之间的 32 个负对,“happy”和“sad”之间的 64 个负对,以及“content”和“sad”之间的 32 个负对。总共有 128 个负对。

过采样

默认情况下,SetFit 对其对比对应用过采样策略。此策略会采样相等数量的正训练对和负训练对,过采样少数对类型以匹配多数对类型。由于负对的数量通常大于正对的数量,因此这通常涉及过采样正对。

在我们的运行示例中,这将涉及将 62 个正对过采样到 128 个,从而在一个 epoch 中产生 128 + 128 = 256 对。总而言之:

  • ✅ 采样了相等数量的正对和负对。
  • ✅ 使用了所有可能的对。
  • ❌ 存在一些数据重复。

欠采样

与过采样类似,此策略也采样相等数量的正训练对和负训练对。但是,它欠采样多数对类型以匹配少数对类型。这通常涉及欠采样负对以匹配正对。

在我们的运行示例中,这将涉及将 128 个负对欠采样到 62 个,从而在一个 epoch 中产生 62 + 62 = 124 对。总而言之:

  • ✅ 采样了相等数量的正对和负对。
  • 并非所有可能的对都已使用。
  • 没有数据重复。

唯一

第三,唯一策略不会采样等量的正负训练对。相反,它只是精确地采样所有可能的对一次。这里不使用任何形式的过采样或欠采样。

在我们的运行示例中,这将涉及对所有负对和正对进行采样,从而在一个 epoch 中产生 62 + 128 = 190 对。总而言之:

  • 采样等量的正对和负对。
  • ✅ 使用了所有可能的对。
  • 没有数据重复。

num_iterations

最后,SetFit 仍可与涉及 num_iterations 训练参数的已弃用采样策略一起使用。与其他采样策略不同,此策略不涉及可能对的数量。相反,它为每个训练样本采样 num_iterations 个正对和 num_iterations 个负对。

在我们的运行示例中,如果假设 num_iterations=20,那么我们将为每个训练样本采样 20 个正对和 20 个负对。由于有 20 个样本,这将涉及 (20 + 20) * 20 = 800 对。由于只有 190 个唯一对,这肯定会涉及一些数据重复。但是,它不保证使用了所有可能的对。总而言之:

  • 采样等量的正对和负对。
  • ❌ 未必使用所有可能的对。
  • ❌ 存在一些数据重复。
< > 在 GitHub 上更新