これは、ACL 2023調査結果のコードリポジトリです。
更新:コードを使用した最近のプリプリントで大規模な言語モデルを使用してRegenを改善する方法をチェックアウトしてください!
python 3.8
transformers==4.2.0
pytorch==1.8.0
scikit-learn
faiss-cpu==1.6.4
tqdm>=4.62.2
nltk
コーパスは:でダウンロードできます。
{ag News、dbpedia、yahoo、imdb}のテストセットは、Huggingfaceデータハブで簡単に見つけることができます。他のデータセットのテストセットは、 testフォルダーに設立できます。
_idクラスIDの略で、 textドキュメントの内容です。
例(SST-2データセットの場合):
{
{"_id": 0, "text": "It seems to me the film is about the art of ripping people off without ever letting them consciously know you have done so."}
{"_id": 0, "text": "In the end , the movie collapses on its shaky foundation despite the best efforts of director joe carnahan."}
{"_id": 1, "text": "Despite its title , punch-drunk love is never heavy-handed ."}
{"_id": 1, "text": "Though only 60 minutes long , the film is packed with information and impressions."}
...
}
COCO-DRのコードを前脱線に適応させます。詳細については、元の実装を確認してください。
2023年9月7日に更新:事前に守られたモデルは、ハギングフェイスでリリースされました。
詳細については、 retrievalフォルダーのコード、 gen_embedding.shを参照してください。
詳細については、 retrieval/retrieve.pyのコードを参照してください。
いくつかのキーハイパーパラメーター:
args.target :実験で使用されるターゲットデータセット。args.model :この研究で使用されている検索モデル。args.corpus_folder/args.corpus_name :実験で使用されているコーパスのフォルダー/名前(ニュース、wikiなど)。args.topN :KNN検索で使用されるTOPN(通常は50-100に設定)。args.round :検索ラウンド。最初のラウンド(検索のみにラベル名/テンプレートを使用)と1,2、...の後のラウンドで0に設定します。注:原則として、私たちのモデルは、適切にトレーニングした後)の密なレトリバーと互換性があります。独自の密な検索モデルを使用する場合は、密な検索モデルに[CLS]トークンの埋め込みもシーケンスの埋め込みとして使用していることを確認してください。それ以外の場合は、生成部品の埋め込みでコードを変更して、生成された埋め込みが正しいことを確認する必要がある場合があります。
filterフォルダーのコードを参照してください。例コマンドは次のとおりです
train_cmd="CUDA_VISIBLE_DEVICES=0 python3 inference.py --task=${task}
--unlabel_file=${unlabel_file_used_for_filtering}
--data_dir=${folder_for_data}
--cache_dir="${task}/cache" --output_dir=${output_dir} --round=${round}
--load_from_prev=1
--gpu=${gpu} --eval_batch_size=${eval_batch_size}
--max_seq_len=${max_seq_len} --auto_load=0
--model_type=${model_type}"
echo $train_cmd
eval $train_cmd
ここ
folder_for_dataは、取得したデータのフォルダーです。unlabel_file_used_for_filtering 、取得したデータのファイル名です。taskはタスクの名前です。model_type 、判別器として使用されるPLM(例:Roberta)です。classificationフォルダーのコードを参照してください。例コマンドは次のとおりです
train_cmd="CUDA_VISIBLE_DEVICES=0 python3 main.py --do_train --do_eval --task=${task}
--train_file={PATH_FOR_GENERATED_DATASET}
--dev_file={PATH_FOR_GENERATED_VALID_DATASET
--test_file={PATH_FOR_TEST_DATASET
--unlabel_file=unlabeled.json
--data_dir=../datasets/${task}-${label_per_class} --train_seed=${train_seed}
--cache_dir="../datasets/${task}-${label_per_class}/cache"
--output_dir=${output_dir}
--logging_steps=${logging_steps}
--n_gpu=${n_gpu} --num_train_epochs=6
--learning_rate=2e-5 --weight_decay=1e-8
--batch_size=32 --eval_batch_size=128
--max_seq_len=128 --auto_load=1
--model_type=${model_type}"
echo $train_cmd
eval $train_cmd
これは、以前の検索ステップと同様の方法で達成されます。詳細については、 retrieval/retrieve.pyのコードをもう一度参照してください。唯一の違いは、変数args.round 0より大きく設定する必要があることです。また、フィルタリング後に最新の検索結果を得るために、 prev_retrieve_path_nameおよびprev_retrieve_folderドキュメントのパスに設定する必要があります。
生成されたデータセットは、このリンクにあります。
あなたがあなたの研究に役立つこのレポを見つけたら、私たちの論文を親切に引用してください。ありがとう!
@inproceedings{yu2023zero,
title={ReGen: Zero-Shot Text Classification via Training Data Generation with Progressive Dense Retrieval},
author={Yu, Yue and Zhuang, Yuchen and Zhang, Rongzhi and Meng, Yu and Shen, Jiaming and Zhang, Chao},
booktitle={Findings of ACL},
year={2023}
}