CT

Carlsson 等人在 Semantic Re-Tuning With Contrastive Tension (CT) (Github) 中提出了一种仅需要句子的句子嵌入无监督学习方法。

背景

在训练期间,CT 构建两个独立的编码器(“Model1”和“Model2”),初始参数共享,用于编码一对句子。如果 Model1 和 Model2 编码相同的句子,则两个句子嵌入的点积应该很大。如果 Model1 和 Model2 编码不同的句子,则它们的点积应该很小。

原始 CT 论文使用包含多个 mini-batches 的 batches。对于 K=7 的示例,每个 mini-batch 由句子对 (S_A, S_A), (S_A, S_B), (S_A, S_C), …, (S_A, S_H) 组成,相应的标签为 1, 0, 0, …, 0。换句话说,一对相同的句子被视为正例,其他不同的句子对被视为负例(即 1 个正例 + K 个负例对)。训练目标是生成的相似度分数和标签之间的二元交叉熵。下图(来自 CT 论文的附录 A.1)说明了这个例子

CT working

训练后,模型 2 将用于推理,通常具有更好的性能。

CT_改进 中,我们提出了通过使用 in-batch 负采样来改进 CT。

性能

在一些初步实验中,我们比较了在 STSbenchmark 数据集(使用来自 Wikipedia 的 100 万个句子训练)和 Quora 重复问题数据集的释义挖掘任务中的性能(使用来自 Quora 的问题训练)。

方法 STSb (Spearman) Quora-Duplicate-Question (平均精度)
CT 75.7 36.5
CT-改进 78.5 40.1

注意:我们使用了此存储库中提供的代码,而不是作者的官方代码。

从句子文件运行 CT

train_ct_from_file.py 从提供的文本文件加载句子。预计文本文件中每行有一个句子。

SimCSE 将使用这些句子进行训练。检查点每 500 步存储到输出文件夹。

更多训练示例

注意: 这是 sentence-transformers 中 CT 的重新实现。有关官方 CT 代码,请参阅:FreddeFrallan/Contrastive-Tension