CT (批内负样本)
Carlsson 等人在 Semantic Re-Tuning With Contrastive Tension (CT) 中提出了一种仅需句子的句子嵌入无监督学习方法。
背景
在训练期间,CT 构建两个独立的编码器(“Model1”和“Model2”),初始参数共享,用于编码一对句子。如果 Model1 和 Model2 编码相同的句子,则两个句子嵌入的点积应该很大。如果 Model1 和 Model2 编码不同的句子,那么它们的点积应该很小。
在原始 CT 论文中,使用了专门创建的批次。我们实现了一个改进版本,它使用批内负采样:Model1 和 Model2 都编码相同的句子集。我们最大化匹配索引的分数(即 Model1(S_i) 和 Model2(S_i)),同时我们最小化不同索引的分数(即 Model1(S_i) 和 Model2(S_j) 对于 i != j)。
与 Carlsson 等人提出的原始损失函数相比,使用批内负采样提供了更强的训练信号。
训练后,模型 2 将用于推理,通常具有更好的性能。
性能
在一些初步实验中,我们比较了在 STSbenchmark 数据集(使用来自维基百科的 100 万个句子训练)和 Quora 重复问题数据集(使用来自 Quora 的问题训练)上的性能。
方法 | STSb (Spearman) | Quora-重复问题(平均精度) |
---|---|---|
CT | 75.7 | 36.5 |
CT (批内负样本) | 78.5 | 40.1 |
注意:我们使用了此存储库中提供的代码,而不是作者的官方代码。
从句子文件进行 CT 训练
train_ct-improved_from_file.py 从提供的文本文件加载句子。预计文本文件中每行有一个句子。
SimCSE 将使用这些句子进行训练。检查点每 500 步存储到输出文件夹。
更多训练示例
train_stsb_ct-improved.py:此示例使用来自维基百科的 100 万个句子进行 CT 训练。它评估 STSbenchmark 数据集 的性能。
train_askubuntu_ct-improved.py:此示例在 AskUbuntu Questions 数据集 上进行训练,该数据集包含来自 AskUbuntu Stackexchange 论坛的问题。