モデル概要
モデル特徴
モデル能力
使用事例
🚀 DiffCSE: Difference-based Contrastive Learning for Sentence Embeddings
本プロジェクトは、文埋め込み学習のための教師なし対照学習フレームワークDiffCSEを提案します。DiffCSEは、元の文と編集された文の差分に敏感な文埋め込みを学習し、教師なし文表現学習方法の中で最先端の結果を達成します。
arXivリンク: https://arxiv.org/abs/2204.10298
NAACL 2022に掲載予定
著者: Yung-Sung Chuang, Rumen Dangovski, Hongyin Luo, Yang Zhang, Shiyu Chang, Marin Soljačić, Shang-Wen Li, Scott Wen-tau Yih, Yoon Kim, James Glass
当社のコードは主にSimCSEのコードに基づいています。詳細な情報は、彼らのリポジトリを参照してください。
✨ 主な機能
DiffCSEは、文埋め込みを学習するための教師なし対照学習フレームワークです。DiffCSEは、元の文と編集された文の差分に敏感な文埋め込みを学習します。編集された文は、元の文を確率的にマスクし、マスク言語モデルからサンプリングすることで得られます。DiffSCEは、等変対照学習(Dangovski et al., 2021)の一例であり、対照学習を一般化し、特定のタイプの増幅に鈍感で、他の「有害な」タイプの増幅に敏感な表現を学習します。実験の結果、DiffCSEは教師なし文表現学習方法の中で最先端の結果を達成し、教師なしSimCSEを意味的テキスト類似性タスクで2.3ポイント上回っています。
📦 インストール
必要条件
- Python 3.9.5
カスタマイズされたTransformersパッケージのインストール
cd transformers-4.2.1
pip install .
もし
transformers==4.2.1
をpipを通じてすでにインストールしている場合は、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
に配置する必要があります。 このパッケージの2つのファイルを変更して、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で説明されているラムダ係数。--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レイヤーでモデルを学習し、MLPレイヤーなしでモデルをテストする方が良い結果が得られます。教師なしSimCSE/DiffCSEモデルを学習する際には、この引数を使用してください。
論文の結果については、CUDA 11.2を搭載したNVidia 2080Ti GPUを使用しています。異なるタイプのデバイスや異なるバージョンのCUDA/Python/PyTorchを使用すると、性能が若干異なる場合があります。
高度な使用法
# 評価コマンド
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を使用してモデルをロードできます。 詳細はGetting Startedを参照してください。
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")
引用
論文や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}
}
📄 ライセンス
本プロジェクトは、Apache-2.0ライセンスの下で公開されています。







