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)进行了说明:

训练完成后,模型 2 将用于推理,通常性能更好。
在 CT_Improved 中,我们通过使用批内负采样来提出对 CT 的改进。
性能
在一些初步实验中,我们在 STSbenchmark 数据集(使用维基百科中的一百万个句子进行训练)和 Quora 重复问题数据集(使用 Quora 中的问题进行训练)的释义挖掘任务上进行了性能比较。
| 方法 | STSb (Spearman) | Quora-Duplicate-Question (平均精度) |
|---|---|---|
| CT | 75.7 | 36.5 |
| CT-Improved | 78.5 | 40.1 |
注意:我们使用了本仓库中提供的代码,而不是作者的官方代码。
从句子文件加载 CT
train_ct_from_file.py 从提供的文本文件中加载句子。期望该文本文件中每行有一个句子。
SimCSE 将使用这些句子进行训练。检查点每 500 步保存到输出文件夹中。
其他训练示例
train_stsb_ct.py:此示例使用维基百科中的一百万个句子进行 CT 训练。它在 STSbenchmark 数据集 上评估性能。
train_askubuntu_ct.py:此示例在 AskUbuntu Questions 数据集 上进行训练,这是一个包含来自 AskUbuntu Stackexchange 论坛问题的 数据集。
注意: 这是在 sentence-transformers 中对 CT 的重新实现。有关官方 CT 代码,请参阅:FreddeFrallan/Contrastive-Tension