CT(批内负样本)
Carlsson 等人在 《Semantic Re-Tuning With Contrastive Tension (CT)》 中提出了一种仅需句子的无监督句子嵌入学习方法。
背景
在训练过程中,CT 构建了两个独立的编码器(“模型1”和“模型2”),它们共享初始参数以编码一对句子。如果模型1和模型2编码相同的句子,则两个句子嵌入的点积应较大。如果模型1和模型2编码不同的句子,则它们的点积应较小。
在原始 CT 论文中,使用了专门创建的批次。我们实现了一个改进版本,它使用了批内负采样:模型1和模型2都编码同一组句子。我们最大化匹配索引(即 Model1(S_i) 和 Model2(S_i))的分数,同时最小化不同索引(即 Model1(S_i) 和 Model2(S_j),其中 i != j)的分数。
使用批内负采样比 Carlsson 等人提出的原始损失函数提供了更强的训练信号。
训练后,模型2将用于推理,其性能通常更优。
性能
在一些初步实验中,我们比较了 STSbenchmark 数据集(使用维基百科的100万句子训练)和 Quora 重复问题数据集(使用 Quora 问题训练)上的性能。
方法 | STSb (Spearman) | Quora-重复问题 (平均精度) |
---|---|---|
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 论坛的问题。