模型简介
模型特点
模型能力
使用案例
🚀 DiffCSE:基于差异的句子嵌入对比学习
DiffCSE是一种无监督对比学习框架,用于学习句子嵌入。它能学习对原句子和编辑后句子之间差异敏感的句子嵌入,在语义文本相似度任务上表现出色,超越了无监督的SimCSE方法。
🚀 快速开始
本项目代码主要基于SimCSE的代码。更多详细信息请参考其仓库。
✨ 主要特性
- 提出DiffCSE,一种无监督对比学习框架,用于学习句子嵌入。
- DiffCSE学习的句子嵌入对原句子和编辑后句子之间的差异敏感。
- 是等变对比学习的一个实例,能学习对某些类型的增强不敏感,而对其他“有害”类型的增强敏感的表示。
- 在无监督句子表示学习方法中取得了最先进的结果,在语义文本相似度任务上比无监督的SimCSE高出2.3个绝对百分点。
📦 安装指南
环境要求
- Python 3.9.5
安装定制的Transformers包
cd transformers-4.2.1
pip install .
⚠️ 重要提示
如果你已经通过pip安装了
transformers==4.2.1
,你需要将modeling_bert.py
放入<your_python_env>/site-packages/transformers/models/bert/modeling_bert.py
,将modeling_roberta.py
放入<your_python_env>/site-packages/transformers/models/bert/modeling_roberta.py
。我们修改了包中的这两个文件,以便使用BERT/RoBERTa执行_条件_预训练任务。如果可能,请直接使用pip安装我们定制的Transformers包。
安装其他包
pip install -r requirements.txt
下载预训练数据集
cd data
bash download_wiki.sh
下载下游数据集
cd SentEval/data/downstream/
bash download_dataset.sh
💻 使用示例
训练
(与run_diffcse.sh
相同)
python train.py \
--model_name_or_path bert-base-uncased \
--generator_name distilbert-base-uncased \
--train_file data/wiki1m_for_simcse.txt \
--output_dir <your_output_model_dir> \
--num_train_epochs 2 \
--per_device_train_batch_size 64 \
--learning_rate 7e-6 \
--max_seq_length 32 \
--evaluation_strategy steps \
--metric_for_best_model stsb_spearman \
--load_best_model_at_end \
--eval_steps 125 \
--pooler_type cls \
--mlp_only_train \
--overwrite_output_dir \
--logging_first_step \
--logging_dir <your_logging_dir> \
--temp 0.05 \
--do_train \
--do_eval \
--batchnorm \
--lambda_weight 0.005 \
--fp16 --masking_ratio 0.30
新参数说明
--lambda_weight
:论文第3节中提到的lambda系数。--masking_ratio
:MLM生成器随机替换标记的掩码比率。--generator_name
:生成器的模型名称。对于bert-base-uncased
,我们使用distilbert-base-uncased
。对于roberta-base
,我们使用distilroberta-base
。
来自SimCSE的参数说明
--train_file
:训练文件路径(data/wiki1m_for_simcse.txt
)。--model_name_or_path
:预训练检查点,如基于BERT的模型(bert-base-uncased
、bert-large-uncased
等)和基于RoBERTa的模型(RoBERTa-base
、RoBERTa-large
)。--temp
:对比损失的温度。我们始终使用0.05
。--pooler_type
:池化方法。--mlp_only_train
:对于无监督的SimCSE或DiffCSE,使用MLP层训练模型但不使用它进行测试效果更好。在训练无监督的SimCSE/DiffCSE模型时应使用此参数。
⚠️ 重要提示
论文中的结果是使用配备CUDA 11.2的NVidia 2080Ti GPU得到的。使用不同类型的设备或不同版本的CUDA/Python/PyTorch可能会导致性能略有不同。
评估
我们提供了一个简单的Colab笔记本,可轻松复现我们的结果。也可以运行以下命令进行评估:
python evaluation.py \
--model_name_or_path <your_output_model_dir> \
--pooler cls_before_pooler \
--task_set <sts|transfer|full> \
--mode test
评估预训练的DiffCSE检查点
BERT
STS
python evaluation.py \
--model_name_or_path voidism/diffcse-bert-base-uncased-sts \
--pooler cls_before_pooler \
--task_set sts \
--mode test
迁移任务
python evaluation.py \
--model_name_or_path voidism/diffcse-bert-base-uncased-trans \
--pooler cls_before_pooler \
--task_set transfer \
--mode test
RoBERTa
STS
python evaluation.py \
--model_name_or_path voidism/diffcse-roberta-base-sts \
--pooler cls_before_pooler \
--task_set sts \
--mode test
迁移任务
python evaluation.py \
--model_name_or_path voidism/diffcse-roberta-base-trans \
--pooler cls_before_pooler \
--task_set transfer \
--mode test
更多详细信息,请查看SimCSE的GitHub仓库。
📚 详细文档
预训练模型
- DiffCSE-BERT-base (STS): https://huggingface.co/voidism/diffcse-bert-base-uncased-sts
- DiffCSE-BERT-base (迁移任务): https://huggingface.co/voidism/diffcse-bert-base-uncased-trans
- DiffCSE-RoBERTa-base (STS): https://huggingface.co/voidism/diffcse-roberta-base-sts
- DiffCSE-RoBERTa-base (迁移任务): https://huggingface.co/voidism/diffcse-roberta-base-trans
可以使用SimCSE提供的API加载模型。更多信息请参阅入门指南。
from diffcse import DiffCSE
model_bert_sts = DiffCSE("voidism/diffcse-bert-base-uncased-sts")
model_bert_trans = DiffCSE("voidism/diffcse-bert-base-uncased-trans")
model_roberta_sts = DiffCSE("voidism/diffcse-roberta-base-sts")
model_roberta_trans = DiffCSE("voidism/diffcse-roberta-base-trans")
🔧 技术细节
我们提出的DiffCSE是一种无监督对比学习框架,用于学习句子嵌入。它学习的句子嵌入对原句子和编辑后句子之间的差异敏感,其中编辑后的句子是通过随机掩盖原句子,然后从掩码语言模型中采样得到的。我们证明了DiffSCE是等变对比学习(Dangovski et al., 2021)的一个实例,它推广了对比学习,并学习对某些类型的增强不敏感,而对其他“有害”类型的增强敏感的表示。实验表明,DiffCSE在无监督句子表示学习方法中取得了最先进的结果,在语义文本相似度任务上比无监督的SimCSE高出2.3个绝对百分点。
📄 许可证
本项目采用Apache-2.0许可证。
📖 引用
如果本文和SimCSE的论文对你的工作有帮助,请引用:
@inproceedings{chuang2022diffcse,
title={{DiffCSE}: Difference-based Contrastive Learning for Sentence Embeddings},
author={Chuang, Yung-Sung and Dangovski, Rumen and Luo, Hongyin and Zhang, Yang and Chang, Shiyu and Soljacic, Marin and Li, Shang-Wen and Yih, Wen-tau and Kim, Yoon and Glass, James},
booktitle={Annual Conference of the North American Chapter of the Association for Computational Linguistics (NAACL)},
year={2022}
}
@inproceedings{gao2021simcse,
title={{SimCSE}: Simple Contrastive Learning of Sentence Embeddings},
author={Gao, Tianyu and Yao, Xingcheng and Chen, Danqi},
booktitle={Empirical Methods in Natural Language Processing (EMNLP)},
year={2021}
}







