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 工作原理

训练后,通常性能更好的 Model2 将被用于推理。

CT_Improved 中,我们通过使用批次内负采样对 CT 进行了改进。

性能

在一些初步实验中,我们在 STSbenchmark 数据集(使用维基百科的 100 万句子进行训练)和 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 步将检查点存储到输出文件夹中。

进一步的训练示例

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