CT

Carlsson 等人在《使用对比张量(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 数据集(使用维基百科的 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