模型概述
模型特點
模型能力
使用案例
🚀 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}
}







