TextBrewer — это набор инструментов для дистилляции моделей на основе PyTorch для обработки естественного языка. Он включает в себя различные методы дистилляции из областей NLP и CV и предоставляет простую в использовании структуру для дистилляции, которая позволяет пользователям быстро экспериментировать с современными методами дистилляции для сжатия модели с относительно небольшими потерями в производительности, увеличения скорости вывода и снижения использования памяти.
Ознакомьтесь с нашей статьёй через ACL Anthology или препринт arXiv.
1 марта 2021 года
11 ноября 2020 года
Подробности о вышеуказанных функциях см. в разделе «Подача разных пакетов ученику и учителю, подача значений из кэша» (Feed Different batches to Student and Teacher, Feed Cached Values).
MultiTaskDistiller теперь поддерживает потерю соответствия промежуточных признаков. Tensorboard теперь записывает более подробные потери (потери KD, потери жёстких меток, потери соответствия...).
Подробности см. в релизах.
27 августа 2020 года Мы рады сообщить, что наша модель находится на вершине GLUE benchmark, проверьте таблицу лидеров.
24 августа 2020 года
29 июля 2020 года
14 июля 2020 года
обновлён до версии 0.1.10:
fp16
в значение True
в TrainingConfig
. Подробнее см. документацию по TrainingConfig
.Добавлена опция data_parallel
в TrainingConfig
, чтобы обеспечить совместную работу параллельного обучения данных и смешанного обучения точности.
26 апреля 2020 г.
22 апреля 2020 г.
17 марта 2020 г.
11 марта 2020 г.
02 марта 2020 г.
Раздел | Содержание |
---|---|
Введение | Введение в TextBrewer |
Установка | Как установить |
Рабочий процесс | Два этапа рабочего процесса TextBrewer |
Быстрый старт | Пример: дистилляция BERT-base до трёхслойного BERT |
Эксперименты | Эксперименты по дистилляции на типичных английских и китайских наборах данных |
Основные концепции | Краткое объяснение основных концепций в TextBrewer |
Часто задаваемые вопросы | Часто задаваемые вопросы |
Известные проблемы | Известные проблемы |
Цитирование | Цитирование TextBrewer |
Следуйте за нами | - |
Textbrewer предназначен для дистилляции знаний моделей НЛП. Он предоставляет различные методы дистилляции и предлагает структуру дистилляции для быстрой настройки экспериментов.
Основные функции TextBrewer:
В настоящее время TextBrewer поставляется со следующими методами дистилляции:
TextBrewer включает в себя:
Чтобы начать дистилляцию, пользователям необходимо предоставить:
TextBrewer достиг впечатляющих результатов в нескольких типичных задачах НЛП. Смотрите Эксперименты.
Смотрите Полную Документацию для подробного использования.
Требования
NumPy
tqdm
Transformers >= 2.0 (необязательно, используется в некоторых примерах)
Apex == 0.1.0 (необязательно, обучение со смешанной точностью)
Установка из PyPI
pip install textbrewer
Установка из исходного кода на Github
git clone https://github.com/airaria/TextBrewer.git
pip install ./textbrewer
Этап 1: Подготовка:
Этап 2: Дистилляция с помощью TextBrewer:
Здесь мы показываем использование TextBrewer путём дистилляции BERT-base в 3-слойный BERT.
Перед дистилляцией предположим, что пользователи предоставили:
Дистиллируйте с помощью TextBrewer:
import textbrewer
from textbrewer import GeneralDistiller
from textbrewer import TrainingConfig, DistillationConfig
# Показать статистику параметров модели
print("\nteacher_model's parametrers:")
result, _ = textbrewer.utils.display_parameters(teacher_model,max_level=3)
print (result)
print("student_model's parametrers:")
result, _ = textbrewer.utils.display_parameters(student_model,max_level=3)
print (result)
# Определить адаптор для интерпретации входных и выходных данных модели
def simple_adaptor(batch, model_outputs):
# Второй и третий элементы model outputs — это логиты и скрытые состояния
return {'logits': model_outputs[1],
'hidden': model_outputs[2]}
# Конфигурация обучения
train_config = TrainingConfig()
# Конфигурация дистилляции
# Соответствие различных слоёв ученика и учителя
distill_config = DistillationConfig(
intermediate_matches=[
{'layer_T':0, 'layer_S':0, 'feature':'hidden', 'loss': 'hidden_mse','weight' : 1},
{'layer_T':8, 'layer_S':2, 'feature':'hidden', 'loss': 'hidden_mse','weight' : 1}])
# Создать дистиллятор
distiller = GeneralDistiller(
train_config=train_config, distill_config = distill_config,
model_T = teacher_model, model_S = student_model,
adaptor_T = simple_adaptor, adaptor_S = simple_adaptor)
# Начать!
with distiller:
distiller.train(optimizer, dataloader, num_epochs=1, scheduler_class=scheduler_class, scheduler_args = scheduler_args, callback=None)
Примеры можно найти в каталоге examples
:
Мы провели эксперименты по дистилляции на нескольких типичных англоязычных и китайских наборах данных NLP. Списки настроек и конфигураций приведены ниже.
Для китайских задач модели учителя — это RoBERTa-wwm-ext (https://github.com/ymcui/Chinese-BERT-wwm) и Electra-base (https://github.com/ymcui/Chinese-ELECTRA), выпущенные Объединённой лабораторией исследований HIT и iFLYTEK.
Мы протестировали различные студенческие модели. Чтобы сравнить с публичными результатами, студенческие модели построены со стандартными трансформационными блоками, за исключением BiGRU, который представляет собой однослойный двунаправленный GRU. Архитектура приведена ниже. Обратите внимание, что количество параметров включает слой внедрения, но не включает выходной слой для каждой конкретной задачи.
Модель | Количество слоёв | Размер скрытого слоя | Размер прямого распространения | Количество параметров | Относительный размер |
---|---|---|---|---|---|
BERT-base-cased (учитель) | 12 | 768 | 3072 | 108M | 100% |
T6 (студент) | 6 | 768 | 3072 | 65M | 60% |
T3 (студент) | 3 | 768 | 3072 | 44M | 41% |
T3-small (студент) | 3 | 384 | 1536 | 17M | 16% |
T4-Tiny (студент) | 4 | 312 | 1200 | 14M | 13% |
T12-nano (студент) | 12 | 256 | 1024 | 17M | 16% |
BiGRU (студент) | - | 768 | - | 31M | 29% |
Модель | Количество слоёв | Размер скрытого слоя | Размер прямого распространения | Количество параметров | Относительный размер |
---|---|---|---|---|---|
RoBERTa-wwm-ext (учитель) | 12 | 768 | 3072 | 102M | 100% |
Electra-base (учитель) | 12 | 768 | 3072 | 102M | 100% |
T3 (студент) | 3 | 768 | 3072 | 38M | 37% |
T3-small (студент) | 3 | 384 | 1536 | 14M | 14% |
T4-Tiny (студент) | 4 | 312 | 1200 | 11M | 11% |
Electra-small (студент) | 12 | 256 | 1024 | 12M | 12% |
distill_config = DistillationConfig(temperature = 8, intermediate_matches = matches)
# Другие аргументы принимают значения по умолчанию
matches
различаются для разных моделей:
Модель | matches |
---|---|
BiGRU | Нет |
T6 | L6_hidden_mse + L6_скрытый_smmd |
T3 | L3_hidden_mse + L3_скрытый_smmd |
T3-small | L3n_hidden_mse + L3_скрытый_smmd |
T4-Tiny | L4t_hidden_mse + L4_скрытый_smmd |
T12-nano | small_hidden_mse + small_скрытый_smmd |
Electra-small | small_hidden_mse + small_скрытый_smmd |
Определения matches
находятся в файле examples/matches/matches.py.
Во всех экспериментах по дистилляции мы используем GeneralDistiller.
Набор данных | Тип задачи | Метрики | #Train | #Dev | Примечание |
---|---|---|---|---|---|
MNLI (https://www.nyu.edu/projects/bowman/multinli/) | Классификация текста | m/mm Acc | 393K | 20K | Трёхклассовая классификация пар предложений |
SQuAD 1.1 (https://rajpurkar.github.io/SQuAD-explorer/) | Понимание прочитанного | EM/F1 | 88K | 11K | Распознавание сущностей в тексте |
CoNLL-2003 (https://www.clips.uantwerpen.be/conll2003/ner) | Маркировка последовательности | F1 | 23K | 6K | Распознавание именованных сущностей |
Мы приводим ниже результаты для моделей DistilBERT, BERT-PKD, BERT-of-Theseus, TinyBERT и наши результаты для сравнения.
Результаты публичных моделей:
Модель (публичная) | MNLI | SQuAD | CoNLL-2003 |
---|---|---|---|
DistilBERT (T6) | 81.6 / 81.1 | 78.1 / 86.2 | - |
BERT6-PKD (T6) | 81.5 / 81.0 | 77.1 / 85.3 | - |
BERT-of-Theseus (T6) | 82.4 / 82.1 | - | - |
BERT3-PKD (T3) | 76.7 / 76.3 | - | - |
TinyBERT (T4-tiny) | 82.8 / 82.9 | 72.7 / 82.1 | - |
Наши результаты:
Модель (наша) | MNLI | SQuAD | CoNLL-2003 |
---|---|---|---|
BERT-base-cased (учитель) | 83.7 / 84.0 | 81.5 / 88.6 | 91.1 |
BiGRU | - | - | 85.3 |
T6 | 83.5 / 84.0 | 80.8 / 88.1 | 90.7 |
T3 | 81.8 / 82.7 | 76.4 / 84.9 | 87.5 |
T3-small | 81.3 / 81.7 | 72.3 / 81.4 | 78.6 |
T4-tiny | 82.0 / 82.6 | 75.2 / 84.0 | 89.1 |
T12-nano | 83.2 / 83.9 | 79.0 / 86.6 | 89.6 |
Примечание:
Мы экспериментируем со следующими типичными китайскими наборами данных:
Набор данных | Тип задачи | Метрики | #Train | #Dev | Примечание |
---|---|---|---|---|---|
XNLI (https://github.com/google-research/bert/blob/master/multilingual.md) | Классификация текста | Acc | 393K | 2.5K | Китайская версия MNLI |
LCQMC (http://icrc.hitsz.edu.cn/info/1037/1146.htm) | Классификация текста | Acc | 239K | 8.8K | Сопоставление пар предложений, двоичная классификация |
CMRC 2018 (https://github.com/ymcui/cmrc2018) | Понимание прочитанного | EM/F1 | 10K | 3.4K | Извлечение сущности из текста, машинное понимание прочитанного |
DRCD (https://github.com/DRCKnowledgeTeam/DRCD) | Понимание прочитанного | EM/F1 | 27K | 3.5K | Извлечение сущности из текста (традиционный китайский), машинное понимание прочитанного |
MSRA NER (https://faculty.washington.edu/levow/papers/sighan06.pdf) | Маркировка последовательностей | F1 | 45K | 3.4K (#Test) | Распознавание именованных сущностей китайского языка |
Результаты приведены ниже.
Модель | XNLI | LCQMC | CMRC 2018 | DRCD |
---|---|---|---|---|
RoBERTa-wwm-ext (учитель) | 79.9 | 89.4 | 68.8 / 86.4 | 86.5 / 92.5 |
T3 | 78.4 | 89.0 | 66.4 / 84.2 | 78.2 / 86.4 |
T3-small | 76.0 | 88.1 | 58.0 / 79.3 | 75.8 / 84.8 |
T4-tiny | 76.2 | 88.4 | 61.8 / 81.8 | 77.3 / 86.1 |
Модель | XNLI | LCQMC | CMRC 2018 | DRCD | MSRA NER |
---|---|---|---|---|---|
Electra-base | |||||
--- | --- | --- | --- | --- | --- |
Electra-small | 77,7 | 89,3 | 66,5 / 84,9 | 85,5 / 91,3 | 93,48 |
Примечание:
TrainingConfig
: конфигурация, связанная с обучением общей модели глубокого обучения.DistillationConfig
: конфигурация, связанная с методами дистилляции.Дистилляторы отвечают за проведение реальных экспериментов. Доступны следующие дистилляторы:
BasicDistiller
: дистилляция один учитель — одна задача, предоставляет базовые стратегии дистилляции.GeneralDistiller
(рекомендуется): дистилляция один учитель — одна задача, поддерживает сопоставление промежуточных признаков. Рекомендуется в большинстве случаев.MultiTeacherDistiller
: дистилляция несколько учителей, которая объединяет несколько моделей учителей (одной задачи) в одну модель ученика. Этот класс не поддерживает сопоставление промежуточных признаков.MultiTaskDistiller
: дистилляция многозадачности, которая объединяет несколько моделей учителей (разных задач) в одного ученика.BasicTrainer
: обучение одной модели под наблюдением на размеченном наборе данных, не для дистилляции. Может использоваться для обучения модели учителя.В TextBrewer есть две функции, которые должны быть реализованы пользователями: обратный вызов и адаптер.
На каждом контрольном этапе после сохранения модели ученика вызывается функция обратного вызова дистиллятором. Обратный вызов можно использовать для оценки производительности модели ученика на каждом контрольном этапе.
Он преобразует входные данные и выходные данные модели в указанный формат, чтобы они могли быть распознаны дистиллятором, и могут быть вычислены потери дистилляции. На каждом этапе обучения пакетные и модельные выходные данные передаются адаптеру; адаптер реорганизует данные и возвращает словарь.
Более подробную информацию см. в объяснениях в Полной документации.
Вопрос: Как инициализировать модель ученика?
Ответ: Модель ученика может быть инициализирована случайным образом (т. е. без предварительных знаний) или с использованием предварительно обученных весов. Например, при дистилляции модели BERT-base в 3-слойную модель BERT вы можете инициализировать модель ученика с помощью RBT3 (для китайских задач) или первых трёх слоёв BERT (для английских задач), чтобы избежать проблемы холодного старта. Мы рекомендуем пользователям по возможности использовать предварительно обученные модели учеников, чтобы в полной мере воспользоваться преимуществами крупномасштабного предварительного обучения.
Вопрос: Как установить гиперпараметры обучения для экспериментов по дистилляции?
Ответ: Дистилляция знаний обычно требует большего количества эпох обучения и большей скорости обучения, чем обучение на размеченном наборе данных. Например, обучение SQuAD на BERT-базе обычно занимает 3 эпохи со скоростью обучения lr=3e-5; однако дистилляция занимает 30–50 эпох со скоростью обучения lr=1e-4. Выводы основаны на наших экспериментах, и мы рекомендуем вам попробовать их на своих собственных данных.
Вопрос: Моя модель учителя и модель ученика принимают разные входные данные (у них нет общих словарей), так как же я могу провести дистилляцию?
Ответ: Вам нужно подавать разные пакеты учителю и ученику. См. раздел Подача разных пакетов ученику и учителю, подача кэшированных значений в полной документации.
Вопрос: Я сохранил логиты из моей модели учителя. Могу ли я использовать их в дистилляции, чтобы сэкономить время прямого прохода?
Ответ: Да, см. раздел [Подача разных пакетов ученику и учителю, подача кэшированных значений]. Известные проблемы:
DataParallel
.Цитирование: Если вы считаете TextBrewer полезным, пожалуйста, процитируйте нашу статью:
@InProceedings{textbrewer-acl2020-demo,
title = «TextBrewer: An Open-Source Knowledge Distillation Toolkit for Natural Language Processing»,
author = «Yang, Ziqing and Cui, Yiming and Chen, Zhipeng and Che, Wanxiang and Liu, Ting and Wang, Shijin and Hu, Guoping»,
booktitle = «Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics: System Demonstrations»,
year = «2020»,
publisher = «Association for Computational Linguistics»,
url = «https://www.aclweb.org/anthology/2020.acl-demos.2»,
pages = «9–16»,
}
Подписывайтесь на нас: Следите за нашими обновлениями в официальном аккаунте WeChat!
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )