Repositori ini berisi kode dan data untuk makalah berikut:
Mixce: Melatih Model Bahasa Autoregresif Dengan Mencampur Maju dan Reverse Cross-Entropies
@inproceedings{zhang2023mixce,
title={MixCE: Training Autoregressive Language Models by Mixing Forward and Reverse Cross-Entropies},
author={Zhang, Shiyue and Wu, Shijie and İrsoy, Ozan and Lu, Steven and Bansal, Mohit and Dredze, Mark and Rosenberg, David},
booktitle={Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics},
year={2023}
}
Kode Penulis: Shiyue Zhang
python -m pip install -r requirements.txtOpsional: Untuk menghindari bentrokan versi apa pun dengan paket yang ada, Anda mungkin ingin melakukan instalasi di bawah lingkungan virtual:
python -m venv yourenv
. yourenv/bin/activate # for bash, might be something else for your particular shell
python -m pip install -r requirements.txtSintetis.py adalah skrip untuk menjalankan eksperimen sintetis. Eksperimen menjalankan sangat sederhana, jalankan saja:
python synthetic.py
Konfigurasi (seperti seed, ukuran vocab, dll.) Dapat ditentukan dan diubah dalam skrip dan di bawah if __name__ == '__main__': .
Ada beberapa konfigurasi penting dalam sintetis.py yang menentukan jenis eksperimen sintetis apa yang dapat Anda jalankan:
Real_dataset : Jika None , matriks transisi akan diinisialisasi secara acak; Atau jika 'webtext' , matriks transisi akan diinisialisasi dari matriks transisi yang telah dikomputasi di WebText.
Zero_percent : Menentukan berapa banyak nilai dalam matriks transisi adalah 0. Misalnya, jika zero_percent==0.5 , maka probabilitas 50% dalam matriks transisi adalah 0.
VOCAB_SIZE : Ukuran kosa kata. Kami menguji 21, 51, 101, 501, atau 1001. Perhatikan bahwa 21 berarti kami memiliki 20 token normal (termasuk EOS) dan 1 token pad.
Benih : Kami menjalankan 5 biji (7, 42, 777, 4222, 99999) untuk setiap percobaan.
Loss_func : Kami menguji 4 fungsi kerugian: (1) 'two_xens' : itu dilambangkan sebagai mixce* dalam makalah kami dan menggunakan distribusi data emas P dan gumbel softmax; (2) 'qlogq_mix' : Ini adalah fungsi kehilangan mixce kami yang diperkirakan; (3) 'two_kls' : campuran dua divergensi KL; (4) 'js' : JS Divergence.
Train_eta : Rasio pencampuran untuk fungsi kerugian tersebut. Jika train_eta==1.0 untuk 'two_xens' , itu adalah MLE. Jika train_eta==1.0 untuk 'two_kls' , itu adalah KL ke depan (juga sama dengan MLE). Jika train_eta==0.0 untuk 'two_kls' , itu adalah KL terbalik. Kami menggunakan definisi umum JS (lihat makalah ini untuk detail lebih lanjut), dan JS menyatu dengan 0 ketika train_eta semakin dekat ke 0,0 atau 1.0. Ketika train_eta = 0,5, itu adalah definisi normal divergensi JS.
Kami mengevaluasi bigram lms yang dilatih secara sintetis dengan membandingkan matriks transisi yang dipelajari dengan matriks transisi emas. Kami menggunakan dua metrik:
(1) Rata -rata. JS : Kami menghitung perbedaan JS antara setiap baris emas dan matriks transisi yang dipelajari dan rata -rata di seluruh baris.
(2) rata -rata. 0s : Kami mendapatkan nilai dari matriks yang dipelajari pada probabilitas emas = 0 posisi dan kemudian rata -rata.
Fungsi compare_parameters() dalam sintetis.py digunakan untuk menghitung kedua metrik ini.
Semua model akan disimpan di bawah synthetic_logs/ direktori. Setiap nama direktori model dimulai dengan datetime bahwa percobaan dijalankan. Di bawah Direktori Model, Anda juga akan menemukan file acara Tensorboard, serta all_best_metrics.json yang menyimpan skor metrik terbaik untuk setiap rasio pencampuran. Lihat contoh di bawah sintetis_logs/.
Evaluasi model dilakukan setelah setiap zaman, dan pos pemeriksaan terbaik dipilih berdasarkan kerugian pada set dev.
Akhirnya, untuk setiap percobaan, kami rata -rata hasil dari 5 biji; Dan untuk setiap tujuan, kami memilih rasio pencampuran terbaik berdasarkan AVG. JS.
get_synthetic_results() di results.py adalah fungsi yang digunakan untuk hasil rata -rata dari 5 biji dan mengurutkan hasil rasio pencampuran yang berbeda sesuai dengan rata -rata. JS.
Untuk menggunakan get_synthetic_results() , Anda harus terlebih dahulu menyiapkan sintetis_models.json untuk menentukan direktori model. Contoh ditampilkan dalam sintetis_models.json. Maka Anda bisa mendapatkan hasil dari eksperimen yang menggunakan matriks transisi yang diinisialisasi webtext, vocab = 20 dan objektif = dua_kls dengan menjalankan get_synthetic_results('webtext', '20', 'two_kls') .
Detokenizer. Pertama -tama Anda perlu mengunduh detokenizer.perl dari Musa di sini, dan menempatkannya di bawah Path data/detokenizer.perl karena skrip Python berikut bergantung padanya.
Kemudian:
cd data
python wikitext_data.py
python webtext_data.py
curl https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz | tar xvzf -
python writingprompts_data.py
Data preproses akan disimpan di bawah data/wikitext , data/webtext , dan data/writingPrompts .
Model klon GPT-2 menggunakan git lfs mengikuti instruksi yang disediakan dengan memeluk wajah.
git lfs install
git clone https://huggingface.co/gpt2
GPT2 adalah model GPT-2 terkecil. Kami juga bereksperimen dengan GPT2-Medium dan GPT2-Large. GPT2-Large digunakan dalam komputasi lembu, jadi silakan unduh juga:
git clone https://huggingface.co/gpt2-medium
git clone https://huggingface.co/gpt2-large
Buat salinan GPT2-Large for Mauve:
cp -r gpt2-large gpt2-large-mauve
Karena kami akan langsung menulis ke GPT2-Large, yang akan mempengaruhi perhitungan lemba.
Anda bisa mulai menjalankan eksperimen dengan melakukan:
python run.py
Konfigurasi dapat ditentukan secara manual dalam run.py Lihat contoh di bawah if __name__ == '__main__' .
Ada beberapa konfigurasi penting di run.py :
pelatihan_size : ukuran data pelatihan, kami menguji '10K' , '25K' , '50K' , dan '100K' ; Secara default kami menggunakan '50K' .
Model : Ini bisa menjadi 'gpt2' , 'gpt2-meidum' , atau 'gpt2-large' .
Dataset : Ini bisa "wikitext" , "webtext" , atau "writingPrompts" .
Mixing_ratio : Kami mencari melalui [0.0, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 1.0] dan pilih mixing_ratio terbaik berdasarkan skor Dev Set Mauve.
train_batch_size, akumulasi, eval_batch_size : Konfigurasi ini harus ditentukan oleh platform yang Anda gunakan. Kami menggunakan satu GPU Tesla V100 tunggal (memori 32G), dan konfigurasi yang disarankan dalam pengaturan ini ada di run.py
Ada satu dikt dan tiga fungsi di run.py :
Data_sets {} : Ini menyimpan jalur file data.
run_no_trainer () : Fungsi yang digunakan untuk pelatihan dan evaluasi model.
run_no_trainer_eval () : Fungsi yang digunakan hanya untuk evaluasi model.
Run_NO_TRAINER_TURN_TOPP () : Fungsi yang digunakan untuk menyetel Top-P Sampling P.
Selain run.py , saya perkenalkan di sini skrip Python penting lainnya untuk pelatihan model dan evaluasi:
gpt2.py (file paling penting) berisi kelas model GPT2MixModel yang mengimplementasikan fungsi kehilangan Mixce kami .
run_clm_no_trainer.py adalah skrip untuk melatih dan mengevaluasi model GPT-2.
run_clm_no_trainer_tune_topp.py mirip dengan run_clm_no_trainer.py , kecuali bahwa itu hanya digunakan untuk menyetel hiperparameter p dari sampling top-p.
metircs.py berisi metrik yang kami gunakan untuk mengevaluasi generasi model.
Model akan disimpan di bawah train/ direktori.
Setiap nama direktori model dimulai dengan datetime bahwa percobaan dijalankan. Di bawah Direktori Model, kami menyimpan pos pemeriksaan terbaik (dipilih berdasarkan kehilangan dev).
dev/test.sample , dev/test.sample1 , dev/test.sample2 , dan dev/test.human adalah 3 generasi pengambilan sampel yang tidak memihak dan teks manusia.
dev/test_results.json Simpan hasil kebingungan, keragaman, dan pengulangan.
Setelah tuning P untuk pengambilan sampel Top-P, dev/test.topp(p=*) adalah generasi pengambilan sampel top-p dengan nilai P yang berbeda.
Setelah menghitung ungu muda dan koherensi (lihat bagian selanjutnya untuk detailnya), dev/test_mauve_coherence_*.json memiliki skor unguap dan koherensi dengan panjang maksimal yang berbeda.
Setelah menghitung ungu muda yang dikendalikan dan koherensi (lihat bagian selanjutnya untuk detailnya), dev/test_controlled_mauve_coherence_*.json dikontrol skor ungu muda dan koherensi dengan panjang maksimal yang berbeda.
Kami melaporkan skor 6 metrik dalam makalah kami:
Perplexity dihitung bersama dengan pelatihan/evaluasi model (lihat run_clm_no_trainer.py ).
Keragaman diimplementasikan oleh fungsi diversity() dalam metircs.py , dan juga dihitung bersama dengan pelatihan/evaluasi model dengan memanggil fungsi compute_diversity_repetition() di run_clm_no_trainer.py . Perhatikan bahwa pengulangan adalah metrik lain yang kami terapkan tetapi tidak melaporkan dalam makalah kami; Ini memeriksa berapa persen dari teks yang merupakan loop pengulangan dan juga mengembalikan panjang frasa berulang.
Mauve dan koherensi dihitung dengan cara post-hoc dengan menggunakan file pembuatan yang disimpan. compute_mauve() dan compute_coherence() di metrics.py adalah dua fungsi pembantu untuk menghitung lembah dan koherensi. Mereka dipanggil oleh fungsi compute_mauve_coherence() di results.py . Untuk menggunakan compute_mauve_coherence() , Anda harus terlebih dahulu menyiapkan model.json untuk menentukan nama direktori model untuk evaluasi.
Demikian pula, koherensi -terkontrol dan koherensi terkontrol juga dapat dihitung dengan cara post-hoc dengan fungsi compute_controlled_mauve_coherence() di results.py .
| Dataset | Ukuran model | Ukuran data pelatihan | Tujuan | Memeluk nama hub wajah |
|---|---|---|---|---|
| wikuxt | GPT2-Large | 50K | Mle | SHIYUE/WIKITEXT_TRAIN50K_GPT2-LARGE_MIX1.0 |
| wikuxt | GPT2-Large | 50K | Mixce (eta = 0,1) | SHIYUE/WIKITEXT_TRAIN50K_GPT2-LARGE_MIX0.1 |
| Webtext | GPT2-Large | 50K | Mle | SHIYUE/WEBTEXT_TRAIN50K_GPT2-LARGE_MIX1.0 |
| Webtext | GPT2-Large | 50K | Mixce (eta = 0,3) | SHIYUE/WEBTEXT_TRAIN50K_GPT2-LARGE_MIX0.3 |
| Menulis Prompt | GPT2-Large | 50K | Mle | SHIYUE/WRITINGPROMPTS_TRAIN50K_GPT2-LARGE_MIX1.0 |
| Menulis Prompt | GPT2-Large | 50K | Mixce (ETA = 0,7) | SHIYUE/WRITINGPROMPTS_TRAIN50K_GPT2-LARGE_MIX0.7 |
Coba model pretrained dengan cara berikut:
>>> from gpt2 import GPT2MIXModel
>>> from transformers import GPT2Tokenizer
>>> model = GPT2MIXModel.from_pretrained("shiyue/wikitext_train50K_gpt2-large_mix1.0")
>>> tokenizer = GPT2Tokenizer.from_pretrained('shiyue/wikitext_train50K_gpt2-large_mix1.0')
>>> text = "Hey, how are you?"
>>> encoded_input = tokenizer(text, return_tensors='pt')
>>> model.eval()
>>> out_ids = model.lm.generate(inputs=encoded_input["input_ids"], max_length=50, do_sample=True)
>>> print(tokenizer.batch_decode(out_ids, skip_special_tokens=True))
Kami ❤️ Kontribusi.
Apakah Anda memiliki pengalaman yang baik dengan proyek ini? Mengapa tidak membagikan beberapa cinta dan berkontribusi kode, atau beri tahu kami tentang masalah yang Anda miliki dengannya?
Kami menyambut laporan edisi di sini; Pastikan untuk memilih templat masalah yang tepat untuk masalah Anda, sehingga kami dapat yakin Anda memberi kami informasi yang diperlukan.
Sebelum mengirim permintaan tarik, pastikan Anda membaca pedoman kontribusi kami.
Dua file berikut dipinjam dan diadopsi dari repositori transformers , dan karenanya mempertahankan hak cipta aslinya.
Ini awalnya diambil dari https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm_no_trainer.py. Selain itu, kami telah menerapkan modifikasi berikut:
--test_file--reduction--mixing_ratio--max_length--prompt_length--eval_prompt_length--cache_dir--do_train--do_evalpush_to_hub ".DataCollatorWithPadding alih -alih kolator default.do_eval ", yang sebagian besar masuk ke fungsi baru ' evaluate() '. File ini selanjutnya dimodifikasi dari run_clm_no_trainer.py (lihat di atas) dengan mengubah bagaimana fungsi generate() dipanggil untuk mengaktifkan tuning untuk opsi top_p .
Proyek ini telah mengadopsi kode etik. Jika Anda memiliki kekhawatiran tentang kode, atau perilaku yang telah Anda alami dalam proyek, silakan hubungi kami di [email protected].