1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/iflytek-TextBrewer

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

TextBrewer — это набор инструментов для дистилляции моделей на основе PyTorch для обработки естественного языка. Он включает в себя различные методы дистилляции из областей NLP и CV и предоставляет простую в использовании структуру для дистилляции, которая позволяет пользователям быстро экспериментировать с современными методами дистилляции для сжатия модели с относительно небольшими потерями в производительности, увеличения скорости вывода и снижения использования памяти.

Ознакомьтесь с нашей статьёй через ACL Anthology или препринт arXiv.

Полная документация.

Новости

1 марта 2021 года

  • BERT-EMD и пользовательский дистиллятор:
    • Мы добавили эксперимент с BERT-EMD в примере MNLI (examples/mnli_example/). BERT-EMD позволяет каждому промежуточному слою студента учиться у любых промежуточных слоёв учителя адаптивно, основываясь на оптимизации расстояния перемещения Земли. Поэтому нет необходимости указывать схему сопоставления.
    • Мы написали новый EMDDistiller (examples/mnli_example/distiller_emd.py), чтобы выполнить BERT-EMD. Это демонстрирует, как написать собственный дистиллятор.
  • Обновлённый пример MNLI:
    • Мы удалили pretrained_pytorch_bert и вместо этого использовали библиотеку transformers во всех примерах MNLI.

11 ноября 2020 года

  • Обновление до версии 0.2.1:
    • Более гибкая дистилляция: поддерживает подачу разных пакетов студенту и учителю. Это означает, что пакеты для студента и учителя больше не должны быть одинаковыми. Его можно использовать для дистилляции моделей с разными словарями (например, от RoBERTa до BERT).
    • Ускоренная дистилляция: теперь пользователи могут предварительно вычислять и кэшировать выходные данные учителя, а затем подавать кэш дистиллятору, чтобы сэкономить время прямого прохода учителя.

Подробности о вышеуказанных функциях см. в разделе «Подача разных пакетов ученику и учителю, подача значений из кэша» (Feed Different batches to Student and Teacher, Feed Cached Values).

MultiTaskDistiller теперь поддерживает потерю соответствия промежуточных признаков. Tensorboard теперь записывает более подробные потери (потери KD, потери жёстких меток, потери соответствия...).

Подробности см. в релизах.

27 августа 2020 года Мы рады сообщить, что наша модель находится на вершине GLUE benchmark, проверьте таблицу лидеров.

Нажмите здесь, чтобы увидеть старые новости

24 августа 2020 года

  • Обновлено до версии 0.2.0.1:
    • исправлены ошибки в MultiTaskDistiller и циклах обучения.

29 июля 2020 года

  • обновлено до версии 0.2.0:
    • добавлена поддержка распределённого обучения с параллельным доступом к данным с помощью DistributedDataParallel: TrainingConfig теперь принимает аргумент local_rank. Подробности см. в документации TrainingConfig.
    • добавлен пример дистилляции в задаче китайского NER для демонстрации распределённого обучения с параллельным доступом к данным. См. examples/msra_ner_example.

14 июля 2020 года

  • обновлён до версии 0.1.10:

    • теперь поддерживает обучение со смешанной точностью. Апекс! Просто установите fp16 в значение True в TrainingConfig. Подробнее см. документацию по TrainingConfig.
  • Добавлена опция data_parallel в TrainingConfig, чтобы обеспечить совместную работу параллельного обучения данных и смешанного обучения точности.

26 апреля 2020 г.

  • Добавлены результаты задачи NER на китайском языке (MSRA NER).
  • Добавлены результаты дистилляции до модели T12-nano, которая имеет структуру, аналогичную Electra-small.
  • Обновлены некоторые результаты CoNLL-2003, CMRC 2018 и DRCD.

22 апреля 2020 г.

  • Обновление до версии 0.1.9 (добавлен параметр кэша, который ускоряет дистилляцию; исправлено несколько ошибок). Подробности см. в релизах.
  • Добавлены экспериментальные результаты дистилляции Electra-base в Electra-small для китайских задач.
  • TextBrewer был принят на ACL 2020 в качестве демонстрационной статьи, пожалуйста, используйте нашу новую библиографическую запись.

17 марта 2020 г.

  • Добавлен пример дистилляции CoNLL-2003 для английского языка NER. См. examples/conll2003_example.

11 марта 2020 г.

  • Обновление до 0.1.8 (Улучшения в TrainingConfig и методе train). Подробности см. в релизах.

02 марта 2020 г.

  • Выпущена первая общедоступная версия 0.1.7. Подробности см. в релизах.

Содержание

Раздел Содержание
Введение Введение в TextBrewer
Установка Как установить
Рабочий процесс Два этапа рабочего процесса TextBrewer
Быстрый старт Пример: дистилляция BERT-base до трёхслойного BERT
Эксперименты Эксперименты по дистилляции на типичных английских и китайских наборах данных
Основные концепции Краткое объяснение основных концепций в TextBrewer
Часто задаваемые вопросы Часто задаваемые вопросы
Известные проблемы Известные проблемы
Цитирование Цитирование TextBrewer
Следуйте за нами -

Введение

Textbrewer предназначен для дистилляции знаний моделей НЛП. Он предоставляет различные методы дистилляции и предлагает структуру дистилляции для быстрой настройки экспериментов.

Основные функции TextBrewer:

  • Широкая поддержка: он поддерживает различные архитектуры моделей (особенно модели на основе трансформатора);
  • Гибкость: разработайте собственную схему дистилляции, комбинируя различные техники; он также поддерживает пользовательские функции потерь, модули и т. д.;
  • Простота в использовании: пользователям не нужно изменять архитектуры моделей;
  • Создан для НЛП: подходит для широкого спектра задач НЛП: классификация текста, понимание машинного чтения, маркировка последовательностей и т.д.

В настоящее время TextBrewer поставляется со следующими методами дистилляции:

  • Смешанное обучение с мягкими и жёсткими метками;
  • Динамическая регулировка веса потерь и регулировка температуры;
  • Различные функции потерь дистилляции: MSE скрытых состояний, потери, основанные на матрице внимания, перенос селективности нейронов и т.д.;
  • Свободное добавление промежуточных функций, соответствующих потерям;
  • Многоучительская дистилляция;
  • ...

TextBrewer включает в себя:

  1. Дистилляторы: ядра дистилляции. Различные дистилляторы выполняют разные режимы дистилляции. Существуют GeneralDistiller, MultiTeacherDistiller, BasicTrainer и т.д.
  2. Конфигурации и предустановки: классы конфигурации для обучения и дистилляции, а также предопределённые функции и стратегии потерь дистилляции.
  3. Утилиты: вспомогательные инструменты, такие как анализ параметров модели.

Чтобы начать дистилляцию, пользователям необходимо предоставить:

  1. Модели (обученная модель учителя и необученная модель ученика);
  2. Наборы данных и конфигурации экспериментов.

TextBrewer достиг впечатляющих результатов в нескольких типичных задачах НЛП. Смотрите Эксперименты.

Смотрите Полную Документацию для подробного использования.

Архитектура

Установка

  • Требования

    • Python >= 3.6
    • PyTorch >= 1.1.0
    • TensorboardX или Tensorboard
  • 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: Подготовка:

    1. Обучите модель учителя.
    2. Определите и инициализируйте модель ученика.
    3. Создайте загрузчик данных, оптимизатор и планировщик скорости обучения.
  • Этап 2: Дистилляция с помощью TextBrewer:

    1. Создайте TraningConfig и DistillationConfig, инициализируйте дистиллятор.
    2. Определите адаптор и обратный вызов. Адаптор используется для адаптации входных и выходных данных модели. Обратный вызов вызывается дистиллятором во время обучения.
    3. Вызовите метод train дистиллятора.

Быстрый старт

Здесь мы показываем использование TextBrewer путём дистилляции BERT-base в 3-слойный BERT.

Перед дистилляцией предположим, что пользователи предоставили:

  • Обученную модель учителя teacher_model (BERT-base) и модель ученика, которую нужно обучить student_model (3-слойный BERT).
  • Загрузчик данных dataloader для набора данных, оптимизатор optimizer и класс scheduler_class для построения скорости обучения и его аргументы scheduler_dict.

Дистиллируйте с помощью 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:

  • examples/random_token_example — простой исполняемый игрушечный пример, демонстрирующий использование TextBrewer. Этот пример выполняет дистилляцию задачи классификации текста с использованием случайных токенов в качестве входных данных.
  • examples/cmrc2018_example (на китайском языке) — дистилляция на CMRC 2018, китайской задаче MRC, с использованием DRCD в качестве дополнения данных.
  • examples/mnli_example (на английском языке) — дистилляция на MNLI, английской задаче по классификации пар предложений, также показывает, как выполнять дистилляцию с несколькими учителями.
  • examples/conll2003_example (на английском языке) — дистилляция на CoNLL-2003, английской задаче NER, которая представляет собой маркировку последовательностей.
  • examples/msra_ner_example (на китайском языке) — этот пример дистиллирует китайскую модель ELECTRA-base на задачу MSRA NER с распределённым параллельным обучением данных (один узел, несколько GPU).

Эксперименты

Мы провели эксперименты по дистилляции на нескольких типичных англоязычных и китайских наборах данных 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%
  • Архитектура T6 такая же, как у DistilBERT, BERT6-PKD и BERT-of-Theseus.
  • Архитектура T4-tiny такая же, как у TinyBERT.
  • Архитектура T3 такая же, как у BERT3-PKD.

Конфигурации дистилляции

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.

Конфигурация обучения

  • Скорость обучения составляет 1e-4 (если не указано иное).
  • Мы обучаем все модели в течение 30–60 эпох.

Результаты на английских наборах данных Мы проводим эксперименты со следующими типичными наборами данных на английском языке:

Набор данных Тип задачи Метрики #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

Примечание:

  1. Эквивалентные структуры моделей публичных моделей показаны в скобках после их названий.
  2. При дистилляции до T4-tiny NewsQA используется для увеличения данных на SQuAD, а HotpotQA — для увеличения данных на CoNLL-2003.
  3. При дистилляции до T12-nano HotpotQA используется для увеличения данных на CoNLL-2003.

Результаты на китайских наборах данных

Мы экспериментируем со следующими типичными китайскими наборами данных:

Набор данных Тип задачи Метрики #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

Примечание:

  1. Снижение скорости обучения не используется при дистилляции для CMRC 2018 и DRCD.
  2. CMRC 2018 и DRCD используют друг друга в качестве дополняющего набора данных при дистилляции.
  3. Настройки обучения модели учителя Electra-base можно найти в Chinese-ELECTRA.
  4. Модель ученика Electra-small инициализируется с использованием предварительно обученных весов.

Основные концепции

Конфигурации

  • 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. Выводы основаны на наших экспериментах, и мы рекомендуем вам попробовать их на своих собственных данных.

Вопрос: Моя модель учителя и модель ученика принимают разные входные данные (у них нет общих словарей), так как же я могу провести дистилляцию?

Ответ: Вам нужно подавать разные пакеты учителю и ученику. См. раздел Подача разных пакетов ученику и учителю, подача кэшированных значений в полной документации.

Вопрос: Я сохранил логиты из моей модели учителя. Могу ли я использовать их в дистилляции, чтобы сэкономить время прямого прохода?

Ответ: Да, см. раздел [Подача разных пакетов ученику и учителю, подача кэшированных значений]. Известные проблемы:

  • В настоящее время поддержка обучения на нескольких GPU доступна только через 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Расширить Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/iflytek-TextBrewer.git
git@gitlife.ru:oschina-mirror/iflytek-TextBrewer.git
oschina-mirror
iflytek-TextBrewer
iflytek-TextBrewer
master