Dies ist das Code-Repo für unsere ACL 2023-Befunde Papier Regen: Zero-Shot-Textklassifizierung über Trainingsdatengenerierung mit progressivem dichter Abruf.
UPDATE : Checkout So verbessern Sie Regen mit großer Sprachmodellen in unserem letzten Vordruck mit Code!
python 3.8
transformers==4.2.0
pytorch==1.8.0
scikit-learn
faiss-cpu==1.6.4
tqdm>=4.62.2
nltk
Der Korpus kann heruntergeladen werden unter:
Der Testsatz von {Ag News, dbpedia, yahoo, IMDB} kann bei HuggingFace -Daten Hub leicht finden. Die Testsätze für andere Datensätze können im test gegründet werden.
Der _id steht für die Klassen -ID, und text ist der Inhalt des Dokuments.
Beispiel (für SST-2-Datensatz):
{
{"_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."}
...
}
Wir passen den Code von Coco-DR für die Vorabbildung an. Bitte überprüfen Sie die ursprüngliche Implementierung für Details.
Aktualisiert am 7. September 2023 : Das vorbereitete Modell wurde auf dem Huggingface veröffentlicht:
Weitere Informationen finden Sie im Code aus dem retrieval gen_embedding.sh .
Weitere Informationen finden Sie im Code von retrieval/retrieve.py .
Einige wichtige Hyperparameter:
args.target : Der im Experiment verwendete Zieldatensatz.args.model : Das in dieser Studie verwendete Abrufmodell.args.corpus_folder/args.corpus_name : Der Ordner/Name des verwendeten Korpus (z. B. Nachrichten, Wiki) in den Experimenten.args.topN : Das Topn, das bei der KNN-Suche verwendet wird (normalerweise auf 50-100).args.round : Die Abrufrunden. Setzen Sie auf 0 für die ersten Runden (nur für das Abrufen von Etikettenname/Vorlage) und 1,2 für spätere Runden.HINWEIS : Grundsätzlich ist unser Modell mit allen dichten Retriever kompatibel (nach ordnungsgemäßem Training). Wenn Sie Ihr eigenes dichtes Abrufmodell verwenden möchten, stellen Sie bitte sicher, dass das dichte Retrieval -Modell auch die Einbettung von [CLS] -Token als Sequenzeinbettung verwendet. Andernfalls müssen Sie den Code möglicherweise bei Einbettungsgenerierenteilen ändern, um sicherzustellen, dass die generierte Einbettung korrekt ist.
Siehe den Code aus dem filter . Der Beispielbefehl sollte sein
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
Hier
folder_for_data ist der Ordner der abgerufenen Daten.unlabel_file_used_for_filtering ist der Dateiname der abgerufenen Daten.task ist der Name der Aufgabe.model_type ist der PLM, der als Diskriminator (z. B. Roberta) verwendet wird. Siehe den Code aus dem classification . Der Beispielbefehl sollte sein
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
Es wird mit einem ähnlichen Weg dem vorherigen Abrufschritt erreicht. Weitere Informationen finden Sie im Code von retrieval/retrieve.py erneut. Der einzige Unterschied besteht darin, dass Sie die variable args.round auf mehr als 0 einstellen müssen. Sie müssen außerdem die prev_retrieve_path_name und prev_retrieve_folder auf den Pfad der Dokumente für die neuesten Abrufergebnisse nach der Filterung festlegen.
Der generierte Datensatz finden Sie in diesem Link.
Bitte zitieren Sie unser Papier, wenn Sie dieses Repo für Ihre Forschung nützlich finden. Danke!
@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}
}