Тяжелый BERT

BERT стал неотъемлемой частью многих конвейеров глубокого обучения НЛП. Это считается важной вехой в НЛП, поскольку ResNet находится в области компьютерного зрения.

Единственная проблема с BERT - его размер.

BERT-база - модель содержит 110M параметров. Большой вариант BERT-large содержит 340M параметров. Трудно развернуть модель такого размера во многих средах с ограниченными ресурсами, таких как мобильные или встроенные системы.

Время обучения и вывода огромно.

Обучение BERT-базы было выполнено на 4 Cloud TPU в конфигурации Pod (всего 16 чипов TPU), а обучение BERT-large было выполнено на 16 Cloud TPU (всего 64 чипа TPU). Каждое предварительное обучение длилось 4 дня.

Время обучения обычно не является проблемой для конечного пользователя, поскольку обычно это единовременное вложение (на самом деле многократное вложение, потому что вам, вероятно, придется несколько раз переобучать модель, пока вы не получите удовлетворительный результат). Тем не менее, если есть возможность, стоит улучшить скорость тренировки. Чем быстрее вы выполните итерацию, тем быстрее решите проблему.

Время вывода BERT варьируется в зависимости от модели и доступного оборудования, но во многих случаях оно значительно ограничивает вас в том, сколько, насколько быстро и насколько дешево вы хотите обрабатывать свои данные. Для некоторых приложений реального времени это может быть недопустимо.

Оптимизация нейронных сетей

Этот набор проблем не нов для нейронных сетей. В других областях (например, компьютерное зрение) раньше были те же проблемы, и было разработано несколько подходов к сжатию и ускорению моделей NN.

Эти подходы можно условно разделить на несколько групп:

  1. Улучшения архитектуры (измените архитектуру на более быструю, скажем, замените RNN на Transformer или CNN; используйте уровни, требующие меньшего количества вычислений и т. д.) или более умную оптимизацию (скорость обучения и политика, количество шагов разогрева, большего размера партии и т. д.).
  2. Сжатие модели (обычно выполняется с помощью квантования и / или сокращения, что сокращает общий объем вычислений, сохраняя неизменной архитектуру. Хорошо, в основном без изменений).
  3. Модельная дистилляция (обучите меньшую модель, которая будет повторять поведение исходной модели)

Давайте посмотрим, что можно сделать с помощью BERT в отношении этих подходов.

1. Улучшения в архитектуре и оптимизации.

Масштабное распределенное обучение

Первое (или даже нулевое) ускорение обучения BERT - это его распределение в более крупном кластере. Хотя исходный BERT уже был обучен на нескольких машинах, есть несколько оптимизированных решений для распределенного обучения BERT (например, от Alibaba или NVIDIA).

Недавний рекорд был установлен NVIDIA: обучил BERT-large за 53 минуты с использованием (очень дорогого) NVIDIA DGX SuperPOD с 92 узлами DGX-2H с общим количеством графических процессоров 1472 V100 (что теоретически может доставить до 190 PFLOPS).

Другим примером более умной оптимизации (и использования сверхмощного оборудования) является новый послойный метод адаптивной крупно-пакетной оптимизации под названием LAMB, который позволил сократить время обучения BERT с 3 дней до всего лишь 76 минут на (к тому же очень дорогом) TPUv3 Pod (1024 чипа TPUv3, которые могут обеспечить производительность более 100 PFLOPS для вычислений со смешанной точностью).

Архитектура

Что касается большего количества архитектурных решений и меньшего количества аппаратных решений, существует метод прогрессивного стекирования для обучения BERT, основанный на наблюдении за поведением слоев самовнимания, показывающим, что его распределение концентрируется локально вокруг его положения и начала. лексемы предложения и что распределение внимания в поверхностной модели аналогично распределению внимания в глубокой модели. Руководствуясь этим, авторы предложили алгоритм суммирования для передачи знаний от мелкой модели к глубокой модели; и постепенно применяет стекинг для ускорения обучения BERT. Авторы добились того, что время обучения примерно на 25% короче, чем у оригинального BERT. Это в основном связано с тем, что для того же количества шагов обучение небольшой модели требует меньше вычислений.

Другими архитектурными улучшениями, сокращающими общий объем памяти и / или вычислений, являются разреженные факторизации матрицы внимания (также известные как Разреженный преобразователь от OpenAI) и блокировка внимания .

АЛЬБЕРТ

И, наконец, есть возможный архитектурный потомок BERT под названием ALBERT (A Lite BERT), представленный на конференции ICLR 2020.

ALBERT использует два метода уменьшения параметров.

Первый - это факторизованная параметризация встраивания, отделяющая размер скрытых слоев от размера встраивания словаря. Это разделение упрощает увеличение скрытого размера без значительного увеличения размера параметра словарных вложений.

Второй метод - это межуровневое разделение параметров. Этот метод предотвращает рост параметра с увеличением глубины сети.

Оба метода значительно сокращают количество параметров для BERT без серьезного снижения производительности, тем самым повышая эффективность параметров.

Конфигурация ALBERT, аналогичная BERT-large, имеет в 18 раз меньше параметров и ее можно обучать примерно в 1,7 раза быстрее.

Он даже превосходит сильно настроенную Роберту!

2. Квантование и обрезка

Квантование снижает числовую точность весов модели.

Обычно модели обучаются с использованием FP32 (32-битная плавающая точка), затем их можно квантовать в FP16 (16-битную плавающую точку), INT8 (8-битное целое число) или даже больше в INT4 или INT1, таким образом уменьшая размер модели в 2 раза, 4x, 8x или 32x соответственно. Это называется квантованием после обучения.

Другой (более сложный и менее зрелый) вариант - это обучение с учетом квантования. Обучение FP16 сейчас становится обычным явлением. На ICLR 2020 есть интересная информация о самых современных результатах обучения с использованием 8-битного представления с плавающей запятой через Resnet, GNMT, Transformer.

Отсечение удаляет некоторые (не менее важные) веса (или иногда нейроны) из модели, создавая разреженные матрицы весов (или более мелкие слои). Также проводятся исследования по удалению целых матриц, соответствующих головкам внимания трансформатора.

Квантование может быть выполнено с помощью Tensorflow Lite, части Tensorflow для вывода на устройстве. TensorFlow Lite предоставляет инструменты для преобразования и запуска моделей TensorFlow на мобильных, встроенных устройствах и устройствах Интернета вещей. TensorFlow Lite поддерживает квантование после обучения и обучение с учетом квантования.

Другой вариант - использовать фреймворк TensorRT от NVIDIA. NVIDIA TensorRT - это платформа для высокопроизводительного вывода данных глубокого обучения. Он включает оптимизатор вывода глубокого обучения и среду выполнения, которая обеспечивает низкую задержку и высокую пропускную способность для приложений вывода глубокого обучения.

Недавно NVIDIA анонсировала TensorRT 6 с новыми оптимизациями, которые обеспечивают вывод для BERT-Large всего за 5,8 мс на графических процессорах T4 и 4,2 мс на V100. Для Titan RTX это должно быть быстрее, грубая оценка с использованием пиковой производительности (цифры можно найти здесь) этих карт дает двукратное ускорение, но на самом деле оно, вероятно, будет меньше.

5,84 мс для модели BERT-large с параметрами 340M и 2,07 мс для BERT-базы 110M с размером пакета, равным единице, - отличные цифры. При большем размере пакета (128) вы можете обрабатывать до 250 предложений в секунду, используя BERT-large.

Больше номеров можно найти здесь.

PyTorch недавно объявил о поддержке квантования, начиная с версии 1.3. Сейчас это экспериментально, но вы уже можете начать использовать его благодаря руководству, в котором динамическое квантование применяется к языковой модели LSTM, конвертирующему веса модели в INT8.

Существует хорошо известное квантование BERT под названием Q-BERT (из статьи Q-BERT: квантование BERT со сверхнизкой точностью на основе гессиана). Авторы могут достичь производительности, сравнимой с базовой, с ухудшением производительности не более 2,3%, даже при квантовании со сверхнизкой точностью до 2 бит, что соответствует сжатию до 13-кратного размера параметров модели и 4-кратному сжатию параметров модели. таблица встраивания, а также активации.

3. Дистилляция

Другой интересный метод сжатия моделей - это дистилляция - метод, который передает знания большой сети «учителей» в меньшую сеть «учеников». Сеть «ученик» обучается имитировать поведение сети «учитель».

Вариант этой стратегии уже был предложен Ричем Каруаной и его сотрудниками. В своей важной статье они убедительно демонстрируют, что знания, полученные с помощью большого ансамбля моделей, можно перенести на одну небольшую модель.

Джеффри Хинтон и др. показали, что этот метод может быть применен к нейронным сетям в своей статье Выделение знаний в нейронной сети.

DistilBERT

С тех пор этот подход применялся к различным нейронным сетям, и вы, вероятно, слышали о дистилляции BERT под названием DistilBERT by HuggingFace.

Наконец, 2 октября появилась статья о DistilBERT под названием DistilBERT, дистиллированная версия BERT: меньше, быстрее, дешевле и легче », которая была представлена ​​на NeurIPS 2019.

DistilBERT - это меньшая языковая модель, обученная под наблюдением BERT, в которой авторы удалили вложения типа токена и пулер (используемый для следующей задачи классификации предложений) и сохранили остальную архитектуру идентичной, уменьшив количество слоев на фактор два.

Вы можете использовать DistilBERT в готовом виде с помощью пакета Python transformers от HuggingFace (ранее известного как pytorch-transformers и pytorch- предварительно обученный-причал). Версия 2.0.0 пакета поддерживает взаимодействие TensorFlow 2.0 / PyTorch.

Авторы DistilBERT также использовали несколько обучающих приемов из недавней статьи RoBERTa, которая показала, что способ обучения BERT имеет решающее значение для его конечной производительности.

DistilBERT на удивление хорошо сравнивается с BERT: авторам удалось сохранить более 95% производительности, имея на 40% меньше параметров.

Что касается времени вывода, DistilBERT более чем на 60% быстрее и меньше, чем BERT, и на 120% быстрее и меньше, чем ELMo + BiLSTM.

TinyBERT

Несколько дней назад появилась новая дистилляция BERT - TinyBERT by Huawei.

Чтобы создать конкурентоспособный TinyBERT, авторы сначала предлагают новый метод Трансформаторная дистилляция для извлечения знаний, заложенных в BERT учителя. В частности, они разработали несколько функций потерь, чтобы соответствовать различным представлениям из слоев BERT:

  1. вывод слоя встраивания;
  2. матрицы скрытых состояний и внимания, полученные из слоя Transformer
    ;
  3. логиты, выводимые слоем прогнозирования.

Подбор на основе внимания основан на недавних открытиях, согласно которым веса внимания, полученные с помощью BERT, могут фиксировать существенные лингвистические знания, что способствует тому, что языковые знания могут быть хорошо переданы от учителя BERT к ученику TinyBERT. Однако он игнорируется в существующих методах KD BERT, таких как Distilled BiLSTM_SOFT, BERT-PKD и DistilBERT.

Затем они предложили новую двухэтапную структуру обучения, включающую общую дистилляцию и специфическую дистилляцию. На этапе общей дистилляции оригинальный BERT без точной настройки действует как модель учителя. Студент TinyBERT учится имитировать поведение учителя, выполняя предложенную дистилляцию трансформатора на крупномасштабном корпусе из общей области. Они получили общий TinyBERT, который можно настраивать для различных последующих задач. На этапе дистилляции для конкретной задачи они выполняют расширение данных, чтобы предоставить больше материалов, связанных с задачами, для обучения преподавателя и ученика, а затем повторно выполняют дистилляцию Transformer на расширенных данных.

Оба эти этапа необходимы для повышения производительности и возможностей TinyBERT по обобщению.

TinyBERT эмпирически эффективен и дает сопоставимые результаты с базой BERT в наборах данных GLUE, будучи в 7,5 раз меньше и в 9,4 раза быстрее при выводе.

Ожидание его применения к моделям BERT-large и XLNet-large и публикации кода.

Прочие дистилляции

Есть и другие известные дистилляции.

(2019/03) Преобразование специфических знаний из BERT в простые нейронные сети »превращает BERT в однослойный BiLSTM, достигая сопоставимых результатов с ELMo, используя примерно в 100 раз меньше параметров и В 15 раз меньше времени вывода.

(2019/08) В документе « Преобразование знаний пациента для сжатия модели BERT » предложен подход извлечения знаний пациента, который был одной из первых попыток использовать скрытые состояния учителя, а не только результат последний слой. Их модель ученика терпеливо училась на нескольких промежуточных уровнях модели учителя для постепенного извлечения знаний. В их структуре Patient-KD ученика поощряют имитировать представления только для токена [CLS] на промежуточных уровнях. Код здесь.

(2019/09) В недавнем документе Сжатие экстремальных языковых моделей с оптимальными подсловами и общими проекциями, представленном на ICLR 2020, основное внимание уделяется технике извлечения знаний для обучения модели учащегося со значительно меньшим словарным запасом, поскольку а также более низкие размеры встраивания и скрытого состояния. Они используют механизм двойного обучения, который обучает модели учителя и ученика одновременно, чтобы получить оптимальные вложения слов для словарного запаса ученика. Этот метод может сжимать базовую модель BERT более чем в 60 раз с незначительным падением показателей последующих задач, в результате чего языковая модель занимает менее 7 МБ.

Результаты TinyBERT выглядят лучше, но все же BERT-подобная модель в 7 Мб выглядит круто.

Описанные методы не противоречат друг другу, поэтому мы ожидаем значительной синергии с этими методами, применяемыми вместе для ускорения BERT (и других) моделей.

Примечания к выпуску

2019.10.05: добавлена ​​ссылка на статью DistilBERT.

10.10.2019: добавлен раздел о других известных дистилляциях BERT.

10.10.2019: добавлен раздел о Q-BERT.

13.10.2019: добавлен раздел о поддержке квантования PyTorch 1.3.