CT

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

背景

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

最初的 CT 论文使用了包含多个小批次的批次。对于 K=7 的示例,每个小批次由句子对 (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_Improved 中,我们提出了通过使用批内负采样来改进 CT 的方法。

性能

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

方法 STSb (Spearman) Quora-重复问题(平均精度)
CT 75.7 36.5
CT-Improved 78.5 40.1

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

从句子文件进行 CT

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

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

更多训练示例

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