Repositori ini berisi kode untuk mengeksploitasi pertanyaan cloze untuk klasifikasi teks beberapa shot dan inferensi bahasa alami dan bukan hanya ukuran yang penting: model bahasa kecil juga beberapa pelajar shot. Makalah memperkenalkan pelatihan eksploitasi pola (PET), prosedur pelatihan semi-diawasi yang merumuskan kembali contoh input sebagai frasa bergaya cloze. Dalam pengaturan sumber daya rendah, PET dan IPET secara signifikan mengungguli pelatihan yang diawasi secara teratur, berbagai garis dasar semi-diawasi dan bahkan GPT-3 meskipun membutuhkan 99,9% lebih sedikit parameter. Varian iteratif dari PET (IPET) melatih beberapa generasi model dan bahkan dapat digunakan tanpa data pelatihan apa pun.
| #Kampuran | Mode pelatihan | Yelp (penuh) | Berita Ag | Pertanyaan Yahoo | Mnli |
|---|---|---|---|---|---|
| 0 | tanpa pengawasan | 33.8 | 69.5 | 44.0 | 39.1 |
| iPet | 56.7 | 87.5 | 70.7 | 53.6 | |
| 100 | diawasi | 53.0 | 86.0 | 62.9 | 47.9 |
| PELIHARAAN | 61.9 | 88.3 | 69.2 | 74.7 | |
| iPet | 62.9 | 89.6 | 71.2 | 78.4 |
Catatan : Untuk mereproduksi hasil di atas secara tepat, pastikan untuk menggunakan v1.1.0 ( --branch v1.1.0 ).
? Pengaturan
Penggunaan CLI
Penggunaan API
? Latih hewan peliharaan Anda sendiri
Kutipan
Semua persyaratan untuk PET dapat ditemukan di requirements.txt . Anda dapat menginstal semua paket yang diperlukan dengan pip install -r requirements.txt .
Antarmuka baris perintah cli.py dalam repositori ini saat ini mendukung tiga mode pelatihan yang berbeda (PET, IPET, pelatihan yang diawasi), dua metode evaluasi tambahan (tidak diawasi dan priming) dan 13 tugas berbeda. Untuk ulasan Yelp, berita AG, pertanyaan Yahoo, MNLI dan X-Stance, lihat koran asli untuk perincian lebih lanjut. Untuk 8 tugas superglue, lihat makalah ini.
Untuk melatih dan mengevaluasi model PET untuk salah satu tugas yang didukung, cukup jalankan perintah berikut:
python3 cli.py
--method pet
--pattern_ids $PATTERN_IDS
--data_dir $DATA_DIR
--model_type $MODEL_TYPE
--model_name_or_path $MODEL_NAME_OR_PATH
--task_name $TASK
--output_dir $OUTPUT_DIR
--do_train
--do_eval
Di mana
$PATTERN_IDS Menentukan PVP untuk digunakan. Misalnya, jika Anda ingin menggunakan semua pola, tentukan PATTERN_IDS 0 1 2 3 4 untuk berita AG dan pertanyaan yahoo atau PATTERN_IDS 0 1 2 3 untuk ulasan yelp dan mnli.$DATA_DIR adalah direktori yang berisi file kereta dan uji (periksa tasks.py untuk melihat bagaimana file -file ini harus dinamai dan diformat untuk setiap tugas).$MODEL_TYPE adalah nama model yang digunakan, misalnya albert , bert atau roberta .$MODEL_NAME adalah nama model pretrained (misalnya, roberta-large atau albert-xxlarge-v2 ) atau jalan menuju model pretrained.$TASK_NAME adalah nama tugas untuk melatih dan mengevaluasi.$OUTPUT_DIR adalah nama direktori di mana model terlatih dan hasil evaluasi disimpan. Anda juga dapat menentukan berbagai parameter pelatihan untuk kedua ansambel model PET yang sesuai dengan PvP individu (awalan --pet_ ) dan untuk model klasifikasi urutan akhir (awalan --sc_ ). Misalnya, parameter default yang digunakan untuk evaluasi superglue kami adalah:
--pet_per_gpu_eval_batch_size 8
--pet_per_gpu_train_batch_size 2
--pet_gradient_accumulation_steps 8
--pet_max_steps 250
--pet_max_seq_length 256
--pet_repetitions 3
--sc_per_gpu_train_batch_size 2
--sc_per_gpu_unlabeled_batch_size 2
--sc_gradient_accumulation_steps 8
--sc_max_steps 5000
--sc_max_seq_length 256
--sc_repetitions 1
Untuk setiap pola $P dan pengulangan $I , menjalankan perintah di atas membuat direktori $OUTPUT_DIR/p$Pi$I yang berisi file -file berikut:
pytorch_model.bin : Model finetuned, mungkin bersama dengan beberapa file khusus model (mis. spiece.model , special_tokens_map.json )wrapper_config.json : Konfigurasi model yang digunakantrain_config.json : Konfigurasi yang digunakan untuk pelatihaneval_config.json : Konfigurasi yang digunakan untuk evaluasilogits.txt : Prediksi model pada data yang tidak berlabeleval_logits.txt : Prediksi model pada data evaluasiresults.json : File JSON yang berisi hasil seperti akurasi akhir modelpredictions.jsonl : File prediksi untuk evaluasi yang ditetapkan dalam format superglue Model final (suling) untuk setiap pengulangan $I dapat ditemukan di $OUTPUT_DIR/final/p0-i$I , yang berisi file yang sama seperti dijelaskan di atas.
Jika GPU Anda kehabisan memori selama pelatihan, Anda dapat mencoba mengurangi kedua pet_per_gpu_train_batch_size dan sc_per_gpu_unlabeled_batch_size sambil meningkatkan kedua pet_gradient_accumulation_steps dan sc_gradient_accumulation_steps .
Untuk melatih dan mengevaluasi model IPET untuk salah satu tugas yang didukung, cukup jalankan perintah yang sama seperti di atas, tetapi ganti --method pet dengan --method ipet . Ada berbagai parameter iPet tambahan yang dapat Anda modifikasi; Semuanya diawali dengan --ipet_ .
Untuk setiap generasi $G , pola $P dan iterasi $I , ini membuat direktori $OUTPUT_DIR/g$G/p$Pi$I yang terstruktur untuk hewan peliharaan biasa. Model final (suling) dapat ditemukan lagi di $OUTPUT_DIR/final/p0-i$I .
Jika Anda menggunakan IPET dengan contoh pelatihan nol, Anda perlu menentukan berapa banyak contoh untuk setiap label yang harus dipilih pada generasi pertama dan Anda perlu mengubah strategi reduksi menjadi berarti: --ipet_n_most_likely 100 --reduction mean .
Untuk melatih dan mengevaluasi classifier urutan reguler dengan cara yang diawasi, cukup jalankan perintah yang sama seperti di atas, tetapi ganti --method pet dengan --method sequence_classifier . Ada berbagai parameter tambahan untuk pengklasifikasi urutan yang dapat Anda modifikasi; Semuanya diawali dengan --sc_ .
Untuk mengevaluasi model bahasa pretrained dengan pola PET dan verbalizer default, tetapi tanpa penyetelan fine, hapus argumen --do_train dan tambahkan --no_distillation sehingga tidak ada distilasi akhir yang dilakukan.
Jika Anda ingin menggunakan priming, hapus argumen --do_train dan tambahkan argumen --priming --no_distillation sehingga semua contoh pelatihan digunakan untuk priming dan tidak ada distilasi akhir yang dilakukan.
Ingatlah bahwa Anda mungkin perlu meningkatkan panjang urutan maksimum ke nilai yang jauh lebih besar, misalnya --pet_max_seq_length 5000 . Ini hanya berfungsi dengan model bahasa yang mendukung urutan panjang, misalnya XLNET. Untuk menggunakan XLNET, Anda dapat menentukan --model_type xlnet --model_name_or_path xlnet-large-cased --wrapper_type plm .
Alih -alih menggunakan antarmuka baris perintah, Anda juga dapat secara langsung menggunakan API PET, yang sebagian besar didefinisikan dalam pet.modeling . Dengan memasukkan import pet , Anda dapat mengakses metode seperti train_pet , train_ipet dan train_classifier . Lihat dokumentasi mereka untuk informasi lebih lanjut.
Untuk menggunakan PET untuk tugas khusus, Anda perlu mendefinisikan dua hal:
examples/custom_task_processor.py untuk contoh.examples/custom_task_pvp.py untuk contoh.Setelah mengimplementasikan Dataprocessor dan PvP, Anda dapat melatih model PET menggunakan baris perintah seperti dijelaskan di atas. Di bawah ini, Anda dapat menemukan informasi tambahan tentang cara mendefinisikan dua komponen PvP, verbalizer dan pola .
Verbalizer digunakan untuk memetakan label tugas ke kata -kata dalam bahasa alami. Misalnya, dalam tugas klasifikasi sentimen biner, Anda dapat memetakan label positif ( +1 ) dengan kata good dan label negatif ( -1 ) ke kata bad . Verbalizer direalisasikan melalui metode verbalize() PvP. Cara paling sederhana untuk mendefinisikan verbalizer adalah dengan menggunakan kamus:
VERBALIZER = { "+1" : [ "good" ], "-1" : [ "bad" ]}
def verbalize ( self , label ) -> List [ str ]:
return self . VERBALIZER [ label ] Yang penting, dalam versi PET saat ini, verbalizer secara default terbatas pada token tunggal dalam kosakata LMS yang mendasarinya (untuk menggunakan lebih dari satu token, lihat di bawah). Diberikan tokenizer model bahasa, Anda dapat dengan mudah memeriksa apakah sebuah kata sesuai dengan satu token dengan memverifikasi bahwa len(tokenizer.tokenize(word)) == 1 .
Anda juga dapat mendefinisikan beberapa verbalisasi untuk satu label. Misalnya, jika Anda tidak yakin kata mana yang paling mewakili label dalam tugas klasifikasi sentimen biner, Anda dapat mendefinisikan verbalizer Anda sebagai berikut:
VERBALIZER = { "+1" : [ "great" , "good" , "wonderful" , "perfect" ], "-1" : [ "bad" , "terrible" , "horrible" ]} Pola digunakan untuk membuat model bahasa memahami tugas yang diberikan; Mereka harus berisi tepat satu token <MASK> yang akan diisi menggunakan verbalizer. Untuk klasifikasi sentimen biner berdasarkan ringkasan ulasan ( <A> ) dan tubuh ( <B> ), pola yang sesuai mungkin <A>. <B>. Overall, it was <MASK>. Pola direalisasikan melalui metode get_parts() PVP, yang mengembalikan sepasang urutan teks (di mana setiap urutan diwakili oleh daftar string):
def get_parts ( self , example : InputExample ):
return [ example . text_a , '.' , example . text_b , '.' ], [ 'Overall, it was ' , self . mask ]Jika Anda tidak ingin menggunakan sepasang urutan, Anda dapat membiarkan urutan kedua kosong:
def get_parts ( self , example : InputExample ):
return [ example . text_a , '.' , example . text_b , '. Overall, it was ' , self . mask ], [] Jika Anda ingin mendefinisikan beberapa pola, cukup gunakan atribut PVP S pattern_id :
def get_parts ( self , example : InputExample ):
if self . pattern_id == 1 :
return [ example . text_a , '.' , example . text_b , '.' ], [ 'Overall, it was ' , self . mask ]
elif self . pattern_id == 2 :
return [ 'It was just ' , self . mask , '!' , example . text_a , '.' , example . text_b , '.' ], [] Saat melatih model menggunakan baris perintah, tentukan semua pola yang akan digunakan (misalnya, --pattern_ids 1 2 ).
Yang penting, jika urutan lebih panjang dari panjang urutan maksimum yang ditentukan dari LM yang mendasari, PET harus tahu bagian input mana yang dapat dipersingkat dan mana yang tidak dapat (misalnya, token topeng harus selalu ada). Oleh karena itu, PVP menyediakan metode shortenable() untuk menunjukkan bahwa sepotong teks dapat dipersingkat:
def get_parts ( self , example : InputExample ):
text_a = self . shortenable ( example . text_a )
text_b = self . shortenable ( example . text_b )
return [ text_a , '.' , text_b , '. Overall, it was ' , self . mask ], []Secara default, implementasi PET dan IPET saat ini hanya mendukung set label tetap yang dibagikan di semua contoh dan verbalizer yang sesuai dengan satu token. Namun, untuk beberapa tugas mungkin perlu menggunakan verbalizer yang sesuai dengan banyak token (seperti yang dijelaskan di sini). Untuk melakukannya, Anda hanya perlu dua modifikasi berikut:
Tambahkan baris berikut di dataprocessor tugas Anda (lihat examples/custom_task_processor.py ):
from pet . tasks import TASK_HELPERS
from pet . task_helpers import MultiMaskTaskHelper
TASK_HELPERS [ 'my_task' ] = MultiMaskTaskHelper Di mana 'my_task' adalah nama tugas Anda.
Dalam PvP Anda, pastikan bahwa metode get_parts() selalu memasukkan jumlah maksimum token mask yang diperlukan untuk verbalisasi apa pun. Misalnya, jika verbalizer Anda memetakan +1 ke "benar -benar luar biasa" dan -1 hingga "mengerikan" dan jika itu ditopkenisasi sebagai ["really", "awe", "##some"] dan ["terrible"] , masing -masing, metode get_parts() Anda harus selalu mengembalikan urutan yang berisi persis 3 token topeng.
Dengan modifikasi ini, Anda sekarang dapat menggunakan verbalizer yang terdiri dari beberapa token:
VERBALIZER = { "+1" : [ "really good" ], "-1" : [ "just bad" ]}Namun, ada beberapa batasan yang perlu dipertimbangkan:
MultiMaskTaskHelper , ukuran batch maksimum untuk evaluasi adalah 1.MultiMaskTaskHelper adalah fitur eksperimental yang tidak diuji secara menyeluruh. Secara khusus, fitur ini hanya diuji untuk PET dan bukan untuk iPet. Jika Anda mengamati sesuatu yang aneh, silakan angkat masalah. Untuk lebih banyak fleksibilitas, Anda juga dapat menulis TaskHelper khusus. Sebagai titik awal, Anda dapat memeriksa kelas CopaTaskHelper , WscTaskHelper dan RecordTaskHelper di pet/task_helpers.py .
Jika Anda menggunakan kode di repositori ini, silakan kutip makalah berikut:
@article{schick2020exploiting,
title={Exploiting Cloze Questions for Few-Shot Text Classification and Natural Language Inference},
author={Timo Schick and Hinrich Schütze},
journal={Computing Research Repository},
volume={arXiv:2001.07676},
url={http://arxiv.org/abs/2001.07676},
year={2020}
}
@article{schick2020small,
title={It's Not Just Size That Matters: Small Language Models Are Also Few-Shot Learners},
author={Timo Schick and Hinrich Schütze},
journal={Computing Research Repository},
volume={arXiv:2009.07118},
url={http://arxiv.org/abs/2009.07118},
year={2020}
}