CT (批内负样本)
Carlsson 等人在 Semantic Re-Tuning With Contrastive Tension (CT) 中提出了一种仅需要句子作为输入的无监督学习方法来生成句子嵌入。
背景
在训练期间,CT 构建两个独立的编码器(“Model1” 和 “Model2”),它们的初始参数共享,用于对一对句子进行编码。如果 Model1 和 Model2 编码的是相同的句子,那么这两个句子嵌入的点积应该很大。如果 Model1 和 Model2 编码的是不同的句子,那么它们之间的点积应该很小。
在原始 CT 论文中,使用了特别创建的批次。我们实现了一个改进版本,它使用批内负样本采样:Model1 和 Model2 都编码同一组句子。我们最大化匹配索引(即 Model1(S_i) 和 Model2(S_i))的分数,同时最小化不同索引(即 i != j 的 Model1(S_i) 和 Model2(S_j))的分数。
使用批内负样本采样比 Carlsson 等人提出的原始损失函数提供了更强的训练信号。

训练完成后,将使用 Model 2 进行推理,通常其性能更佳。
性能
在一些初步实验中,我们在 STSbenchmark 数据集(使用维基百科中的 100 万个句子训练)和 Quora 重复问题数据集(使用 Quora 中的问题训练)上比较了性能。
| 方法 | STSb (Spearman) | Quora-Duplicate-Question (平均精度) |
|---|---|---|
| CT | 75.7 | 36.5 |
| CT (批内负样本) | 78.5 | 40.1 |
注意:我们使用了此存储库中提供的代码,而不是作者的官方代码。
从句子文件中训练 CT
train_ct-improved_from_file.py 从提供的文本文件中加载句子。该文本文件预期每行包含一个句子。
SimCSE 将使用这些句子进行训练。检查点每 500 步保存到输出文件夹中。
其他训练示例
train_stsb_ct-improved.py:此示例使用维基百科中的 100 万个句子与 CT 进行训练。它在 STSbenchmark 数据集上评估性能。
train_askubuntu_ct-improved.py:此示例在 AskUbuntu Questions 数据集上进行训练,该数据集包含来自 AskUbuntu Stackexchange 论坛的问题。