CT (In-Batch Negatives)

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

背景

在训练过程中,CT 构建了两个独立的编码器('Model1' 和 'Model2'),它们共享初始参数来编码一对句子。如果 Model1 和 Model2 编码相同的句子,那么两个句子嵌入的点积应该很大。如果 Model1 和 Model2 编码不同的句子,那么它们的点积应该很小。

在原始的 CT 论文中,使用了特别创建的批次。我们实现了一个改进版本,使用批次内负采样:Model1 和 Model2 都编码同一组句子。我们最大化匹配索引的得分(即 Model1(S_i) 和 Model2(S_i)),同时最小化不同索引的得分(即 Model1(S_i) 和 Model2(S_j) 对于 i != j)。

使用批次内负采样比 Carlsson 等人提出的原始损失函数提供了更强的训练信号。

CT 工作原理

训练后,通常会使用模型 2 进行推理,它通常具有更好的性能。

性能

在一些初步实验中,我们比较了在 STSbenchmark 数据集(使用来自维基百科的 100 万句子训练)和 Quora 重复问题数据集(使用 Quora 的问题训练)上的性能。

方法 STSb (Spearman) Quora-Duplicate-Question (平均精度)
CT 75.7 36.5
CT (In-Batch Negatives) 78.5 40.1

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

从句子文件中提取 CT

train_ct-improved_from_file.py 从提供的文本文件中加载句子。预期文本文件中每行有一个句子。

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

进一步的训练示例