Zhengxuan Wu*, Atticus Geiger*, Josh Rozner, Elisa Kreiss, Hanson Lu, Thomas Icard, Christopher Поттс, Ной Д. Гудман
Это реализация нашей предварительной причинной дистилляции для языковых моделей. Стандартный подход к дистилляции обучает студенческую модель в отношении двух целей: конкретная задача цель (например, языковая моделирование) и имитационная цель, которая поощряет скрытые состояния модели студента быть похожими на то, что у более крупной модели учителя. В этой статье мы показываем, что полезно увеличить дистилляцию третьей целью, которая побуждает учащегося подражать процессу причинно -следственной вычисления учителя посредством обучения обмену вмешательством (IIT). Мы называем наш метод вмешательством дистилляции обмена вмешательством цели (DIITO) .
Мы находим, что Diito полезен в условиях низкого ресурса. DIITO выполняет неэффективность со стандартной дистилляцией (97%), но обучение с на 97% меньше данных.
Мы раскошелим нашу основную кодовую базу из интерфейса дистилляции Huggingface.
✅ 2/02/2021 Наша статья по обмену вмешательством (IIT) выпущена! Прочитайте это для более формального определения метода.
✅ 12/06/2021 выпустили кодовую базу причинной дистилляции с предварительным.
✅ 12/06/2021 Выпущенные результаты оценки на дистиллированном крошечном берте (3 уровня) с набором данных Wiki-Text 103M.
✅ 14.01.2022 выпустила более новую версию DIITO и результаты его оценки. Вы можете просмотреть наш частное обновление обновленного препринта для получения более подробной информации.
✅ 21.02.2022 Выпустил кодовую базу для DIITO-XXS , которая применяет то же самое, чтобы перебрать специфические для задачи модели в NLP с акцентом на поддержку дистилляции модели в условиях с низким содержанием ресурсов. Проверьте репо для получения дополнительной информации!
⬜ Выпущенная модель Diito (6 слоев), обученная английской Википедии + BookCorpus.
Если у вас есть какие -либо проблемы или у вас есть предложения, пожалуйста, свяжитесь со мной либо на странице проблем или по адресу [email protected].
Вот результаты на наборах Dev Glue:
| Модель | # тренировочных токенов | Средний балл | Кола | Mnli | MRPC | Qnli | QQP | Rte | SST-2 | STS-B |
|---|---|---|---|---|---|---|---|---|---|---|
| Distilbert (6 слоев) Devlin et al., 2019 | 3.3b | 79,59 | 51.30 | 82.10 | 87.50 | 89,20 | 88.50 | 59,90 | 91.30 | 86.90 |
| Дистилберт (6 слоев) | 0,1b | 75,80 | 40.43 | 78,95 | 87.45 | 84,76 | 84,96 | 60.10 | 89,38 | 80.40 |
| Diito (6 слоев) | 0,1b | 77.14 | 45,17 | 79,68 | 88.18 | 85,83 | 85,31 | 60.94 | 90.32 | 81.69 |
| Diito (6 слоев) | 3.3b | (-) | (-) | (-) | (-) | (-) | (-) | (-) | (-) | (-) |
Если вы используете этот репозиторий, пожалуйста, укажите следующие две статьи: бумага для обмена обучением вмешательства и бумагу для нашего метода дистилляции.
@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}
}
После интерфейса дистилляции Huggingface нам нужно предварительно обработать наборы данных, прежде чем мы сделаем дистилляцию. Вы можете обратиться к их репо для получения подробной информации. Мы адаптируем их предварительные сценарии и обновляемся с несколькими улучшениями. Например, теперь мы можем бинаризировать наборы данных из центра набора данных от Huggingface напрямую.
# 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 48После того, как вы подготовите наборы данных, вам также необходимо генерировать количество токенов.
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 30522Перед тренировкой мы рекомендуем вам инициализировать вашу студенческую модель с весами, извлеченными из модели учителя.
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 3Теперь вот пример для вас, чтобы перегонять с нашей целью причинно -следственной связи или без,
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 Обратите внимание, что вы можете просто повернуть нашу причинно -следственную дистилляцию в включение/выключение, установив аргументы. Например, мы недавно добавили этот аргумент --alpha_causal_cos для поддержки причинно -следственной связи на термине потери косинуса. Обратите внимание, что эффективный размер партии в нашей настройке установлен на 240.
После того, как вы получите свои дистиллированные модели, вам нужно настраивать их и оценить их с помощью нисходящих задач. Мы предоставляем вам все сценарии, которые вам нужно запустить.
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/