Zhengxuan Wu*, Atticus Geiger*, Josh Rozner, Elisa Kreiss, Hanson Lu, Thomas Icard, Christopher Potts, Noah D. Goodman
Ini adalah implementasi dari distilasi kausal pracetak kami untuk model bahasa. Pendekatan standar untuk distilasi melatih model siswa terhadap dua tujuan: tujuan khusus tugas (misalnya, pemodelan bahasa) dan tujuan imitasi yang mendorong keadaan tersembunyi dari model siswa untuk serupa dengan model guru yang lebih besar. Dalam makalah ini, kami menunjukkan bahwa bermanfaat untuk menambah distilasi dengan tujuan ketiga yang mendorong siswa untuk meniru proses perhitungan kausal guru melalui pertukaran intervensi pelatihan (IIT). Kami menyebutkan metode kami sebagai Tujuan Pelatihan Intervensi Intervensi Distilasi (Diito) .
Kami menemukan Diito sangat membantu dalam pengaturan sumber daya rendah. Diito melakukan di-par dengan (97%) distilasi standar tetapi pelatihan dengan 97% lebih sedikit data.
Kami membayar basis kode utama kami dari antarmuka distilasi Huggingface.
✅ 12/02/2021 Makalah kami tentang Interchange Intervention Training (IIT) dirilis! Baca ini untuk definisi metode yang lebih formal.
✅ 12/06/2021 merilis basis kode distilasi kausal dengan pracetak.
✅ 12/06/2021 Hasil evaluasi yang dirilis pada suling Tiny-Bert (3 lapisan) dengan dataset 103M Wiki-Text.
✅ 01/14/2022 merilis versi Diito yang lebih baru, dan hasil evaluasinya. Anda dapat melihat pracetak yang diperbarui secara pribadi kami untuk lebih jelasnya.
✅ 02/21/2022 merilis basis kode untuk diito-xxs yang menerapkan Ditto untuk menyaring model khusus tugas di NLP dengan fokus pada pendukung distilasi model dalam pengaturan sumber daya rendah. Lihat repo untuk info lebih lanjut!
⬜️ Model Diito (6 Lapisan) yang dirilis dilatih dengan bahasa Inggris Wikipedia + BookCorpus.
Jika Anda mengalami masalah atau memiliki saran, silakan hubungi saya baik di halaman masalah atau di [email protected].
Berikut adalah hasil pada set lem dev:
| Model | # Token Pelatihan | Skor rata-rata | Cola | Mnli | Mrpc | Qnli | QQP | Rte | SST-2 | STS-B |
|---|---|---|---|---|---|---|---|---|---|---|
| Distilbert (6 lapisan) Devlin et al., 2019 | 3.3b | 79.59 | 51.30 | 82.10 | 87.50 | 89.20 | 88.50 | 59.90 | 91.30 | 86.90 |
| Distilbert (6 lapisan) | 0.1b | 75.80 | 40.43 | 78.95 | 87.45 | 84.76 | 84.96 | 60.10 | 89.38 | 80.40 |
| Diito (6 lapisan) | 0.1b | 77.14 | 45.17 | 79.68 | 88.18 | 85.83 | 85.31 | 60.94 | 90.32 | 81.69 |
| Diito (6 lapisan) | 3.3b | (-) | (-) | (-) | (-) | (-) | (-) | (-) | (-) | (-) |
Jika Anda menggunakan repositori ini, silakan kutip dua makalah berikut: kertas untuk pelatihan intervensi pertukaran, dan kertas untuk metode distilasi kami.
@article{geiger-etal-2021-iit,
title={Inducing Causal Structure for Interpretable Neural Networks},
author={Geiger, Atticus and Wu, Zhengxuan and Lu, Hanson and Rozner, Josh and Kreiss, Elisa and Icard, Thomas and Goodman, Noah D. and Potts, Christopher},
year={2021},
eprint={2112.00826},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
@article{wu-etal-2021-distill,
title={Causal Distillation for Language Models},
author={Wu, Zhengxuan and Geiger, Atticus and Rozner, Josh and Kreiss, Elisa and Lu, Hanson and Icard, Thomas and Potts, Christopher and Goodman, Noah D.},
year={2021},
eprint={2112.02505},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
Mengikuti antarmuka distilasi permukaan pelukan, kita perlu melakukan pra-proses dataset sebelum kita melakukan distilasi. Anda dapat merujuk ke repo mereka untuk detailnya. Kami menyesuaikan skrip pra-pemrosesan mereka, dan memperbarui dengan beberapa perbaikan. Misalnya, kita sekarang dapat binarize kumpulan data dari hub dataset dari Huggingface secara langsung.
# preprocessing from disk
python script/binarized_data.py
--file_path ../../bert-mid-tuning/data-files/wikitext-15M
--split train
--field_name text
--max_parsing_example 1000
--tokenizer_type bert
--tokenizer_name bert-base-uncased
--dump_file ./data/binarized_text
# preprocessing from huggingface.
python scripts/binarized_data.py
--dataset_name bookcorpus
--split train
--field_name text
--tokenizer_type bert
--tokenizer_name bert-base-uncased
--dump_file bookcorpus-dataset/binarized_text
--cache_dir ./distill_cache/
python scripts/binarized_data.py
--dataset_name wikitext
--split train
--field_name text
--tokenizer_type bert
--tokenizer_name bert-base-uncased
--dump_file wikitext-dataset/binarized_text
--cache_dir ./distill_cache/
python scripts/binarized_data.py
--dataset_name wikitext+bookcorpus
--split train
--field_name text
--tokenizer_type bert
--tokenizer_name bert-base-uncased
--dump_file wikitext+bookcorpus-dataset/binarized_text
--cache_dir ./distill_cache/
# helper scripts to combine two binarized data files
python scripts/data_combinator.py
--file_path_left ./bookcorpus-dataset/binarized_text.train.bert-base-uncased.pickle
--file_path_right ./wikitext-dataset/binarized_text.train.bert-base-uncased.pickle
--split train
--tokenizer_name bert-base-uncased
--dump_file wikitext+bookcorpus-dataset/binarized_text
# multiprocessing preprocessor.
python scripts/binarized_data.py
--dataset_name bookcorpus
--split train
--field_name text
--tokenizer_type bert
--tokenizer_name bert-base-uncased
--dump_file bookcorpus-dataset/binarized_text
--cache_dir ./distill_cache/
--fast_process
--preprocessing_num_workers 48Setelah Anda menyiapkan dataset, Anda perlu menghasilkan jumlah token juga.
python scripts/token_counts.py
--data_file data/binarized_text.train.bert-base-uncased.pickle
--token_counts_dump data/binarized_text.train.token_counts.bert-base-uncased.pickle
--vocab_size 30522Sebelum pelatihan, kami merekomendasikan Anda untuk menginisialisasi model siswa Anda dengan bobot yang diekstraksi dari model guru.
python scripts/extract_distilbert.py
--model_type bert
--model_name bert-base-uncased
--dump_checkpoint ./distillation_checkpoints/bert-base-uncased_num_layer_3.pth
--num_layers 3Sekarang, inilah contoh bagi Anda untuk menyaring dengan tujuan distilasi kausal kami atau tanpa,
CUDA_VISIBLE_DEVICES=0,1,2,3 python causal_train.py
--force
--n_gpu 4
--log_interval 10
--student_type distilbert
--student_config ./training_configs/distilbert-base-uncased-large.json
--student_pretrained_weights ./distillation_checkpoints/bert-base-uncased_num_layer_6.pth
--teacher_type bert
--teacher_name bert-base-uncased
--neuron_mapping ./training_configs/single_middle_layer_6.nm
--mlm --alpha_ce 0.25 --alpha_mlm 0.25 --alpha_cos 0.25 --alpha_clm 0.0 --alpha_causal_ce 0.25 --alpha_causal_cos 0.0
--interchange_prop 0.3 --interchange_max_token -1 --interchange_consecutive_only
--freeze_pos_embs
--dump_path ./results/
--data_file ./wikitext-dataset/binarized_text.train.bert-base-uncased.pickle
--token_counts ./wikitext-dataset/binarized_text.train.token_counts.bert-base-uncased.pickle
--seed 42
--n_epoch 3
--gradient_accumulation_steps 6
--batch_size 40 Perhatikan bahwa Anda dapat dengan mudah mengaktifkan tujuan distilasi kausal kami melalui pengaturan argumen. Misalnya, kami baru -baru ini menambahkan argumen ini --alpha_causal_cos untuk mendukung kerugian kausal pada istilah kehilangan kosinus. Perhatikan bahwa ukuran batch efektif dalam pengaturan kami diatur ke 240.
Setelah Anda mendapatkan model suling, Anda perlu menyempurnakannya dan mengevaluasinya dengan tugas hilir. Kami memberi Anda semua skrip yang perlu Anda jalankan.
CUDA_VISIBLE_DEVICES=0 python run_mlm.py
--model_name_or_path ./path_to_your_model/
--dataset_dir ../path_to_your_data/
--tokenizer_name bert-base-uncased
--do_eval
--output_dir /tmp/test-mlm
--cache_dir ./distill_cache/CUDA_VISIBLE_DEVICES=0,1,2,3 python run_glue.py
--model_name_or_path ./path_to_your_model/
--tokenizer_name bert-base-uncased
--task_name sst2
--do_train
--do_eval
--max_seq_length 128
--per_device_train_batch_size 32
--learning_rate 2e-5
--num_train_epochs 3
--output_dir ./results/
--save_total_limit 1
--cache_dir ./distill_cache/CUDA_VISIBLE_DEVICES=0,1,2,3 python run_ner.py
--model_name_or_path ./path_to_your_model/
--tokenizer_name bert-base-uncased
--dataset_name conll2003
--do_train
--do_eval
--output_dir ./ner_results/
--save_total_limit 1
--cache_dir ./distill_cache/CUDA_VISIBLE_DEVICES=0,1,2,3 python run_qa.py
--model_name_or_path ./path_to_your_model/
--tokenizer_name bert-base-uncased
--dataset_name squad
--do_train
--do_eval
--per_device_train_batch_size 12
--learning_rate 3e-5
--num_train_epochs 2
--max_seq_length 384
--doc_stride 128
--save_total_limit 1
--output_dir ./qa_results/