Научитесь создавать приложения НЛП производственного уровня, просто используя huggingface

Вот ссылка на живую панель управления

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

Вступление

В последние два года или около того исследования НЛП были довольно быстрыми по сравнению с другими областями прикладного глубокого обучения. Такие модели, как ELMO Аллена AI, Open-GPT OpenAI и BERT от Google, позволили исследователям превзойти несколько тестов с минимальной тонкой настройкой для конкретных задач. В результате воспроизведение и экспериментирование исследований НЛП стало более доступным.

БЕРТ

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

Мы будем использовать трансферное обучение на предварительно обученной модели BERT. Такой подход лучше, чем обучение с нуля такой глубокой модели, как GRU или LSTM:

  • предварительно обученные веса модели BERT уже кодируют много информации о нашем языке. В результате на обучение нашей отлаженной модели уходит гораздо меньше времени. Мы обучим нашу модель с помощью развертки гиперпараметров, чтобы найти лучшую комбинацию в течение часа на colab, в то время как обучение одной модели глубокой RNN с нуля займет более сотен часов на GPU!
  • Поскольку мы, по сути, выполняем трансферное обучение, нам нужно значительно меньше данных для построения точной системы. По сравнению с миллионами точек данных, необходимых для обучения модели с нуля, мы можем выполнить ту же задачу, используя всего несколько тысяч точек данных.

BERT, основанный на сети трансформаторов, представляет собой двунаправленную сеть, которая производит кодирование языка для различных задач, таких как моделирование, классификация и т. Д.

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

Давайте посмотрим на еще одно интересное применение этой модели, а именно на классификацию предложений.

Установка библиотеки Huggingface

Теперь мы быстро перейдем к обучению и экспериментам, но если вы хотите получить более подробную информацию о среде и наборах данных, ознакомьтесь с этим руководством Криса МакКормика.

Давайте сначала установим библиотеку huggingface на colab:

!pip install transformers

Эта библиотека поставляется с различными предварительно обученными современными моделями. Для классификации предложений мы будем использовать модель BertForSequenceClassification.

Набор данных COLA

Мы будем использовать набор данных The Corpus of Linguistic Acceptability (CoLA) для классификации отдельных предложений. Это набор предложений, помеченных как грамматически правильные или неправильные. Он был впервые опубликован в мае 2018 года и является одним из тестов, включенных в GLUE Benchmark, в котором конкурируют такие модели, как BERT.

Давайте загрузим и разархивируем набор данных

Если все пройдет без ошибок, вы получите следующие файлы:

Как видите, у нас уже есть токенизированная версия набора данных, но нам нужно снова токенизировать ее, потому что для применения предварительно обученного BERT мы должны использовать токенизатор, предоставленный моделью. . Это потому что:

  • модель имеет конкретный фиксированный словарный запас и
  • У токенизатора BERT есть особый способ обработки слов вне словарного запаса.

Анализ набора данных

Давайте посмотрим на формат набора данных, проанализировав его с помощью pandas.

Здесь следует отметить несколько моментов:

  • У нас есть только 8551 точка данных, с помощью которых обучается глубокая модель SOTA с использованием трансферного обучения.
  • Нас интересуют предложение и метка.
  • Оценка приемлемости, где 0 = неприемлемо и 1 = приемлемо.

Наконец, давайте составим список этих предложений.

Токенизация

Как упоминалось ранее, предложения, которые должны быть переданы в модель BERT, должны быть токенизированы с помощью токенизатора BERT. Давайте посмотрим на пример.

Using this tokenizer on a sentence would result into something like this:
Original:  Our friends won't buy this analysis, let alone the next one we propose.
Tokenized:  ['our', 'friends', 'won', "'", 't', 'buy', 'this', 'analysis', ',', 'let', 'alone', 'the', 'next', 'one', 'we', 'propose', '.']
Token IDs:  [2256, 2814, 2180, 1005, 1056, 4965, 2023, 4106, 1010, 2292, 2894, 1996, 2279, 2028, 2057, 16599, 1012]

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

  • Добавляйте специальные символы в начало и конец каждого предложения. В конце каждого предложения нам нужно добавить специальный токен [SEP], а для задач классификации мы должны добавить специальный токен [CLS] в начало каждого предложения.
  • Заполнить и усечь все предложения до единой постоянной длины
  • Явно отличите реальные токены от дополнительных с помощью «маски внимания». «Маска внимания» - это просто массив из единиц и нулей, указывающих, какие токены заполняются, а какие нет.

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

Первая задача - определить максимальную длину предложения.

Выход

Max sentence length:  47

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

Теперь мы готовы к настоящей токенизации. Но поскольку мы используем трансформаторы, мы можем использовать встроенную функцию tokenizer.encode_plus, которая автоматизирует все следующие задачи:

  1. Разделите предложение на жетоны.
  2. Добавьте специальные токены [CLS] и [SEP].
  3. Сопоставьте токены с их идентификаторами.
  4. Заполните или усеките все предложения до одинаковой длины.
  5. Создайте маски внимания, которые явно отличают настоящие токены от токенов [PAD].

Мы разделим данные на набор для обучения и тестирования. Разделите наш обучающий набор, чтобы использовать 90% для обучения и 10% для проверки.

Загрузка данных

Следующие шаги требуют от нас угадать различные значения гиперпараметров. Мы автоматизируем эти операции, проанализировав все комбинации значений всех параметров. Для этого мы инициализируем объект wandb перед запуском цикла обучения. Значение гиперпараметра для текущего запуска сохраняется в wandb.config.parameter_name.

Здесь мы используем RandomSampler для выборки набора данных и SequentialSampler для выборки набора для проверки.

Настройка модели для обучения

Мы будем использовать предварительно обученную BertForSequenceClassification. Мы добавим один плотный или полностью связанный слой для выполнения задачи двоичной классификации. Мы выделим каждую часть программы в отдельный функциональный блок.

Параметр num_labels описывает количество конечных выходных нейронов.

Мы будем использовать реализацию оптимизатора Adam со встроенным механизмом уменьшения веса, предоставляемым huggingface. Скорость обучения будет предоставлена ​​wandb.config.

Мы также инициализируем планировщик скорости обучения для уменьшения скорости обучения. Эпохи обучения также являются гиперпараметром, поэтому мы инициализируем его с помощью wandb.config.

Инициализация весов и смещений

Остался только один шаг до обучения нашей модели. Мы создадим файл конфигурации, в котором будут перечислены все значения, которые может принимать гиперпараметр. Затем мы инициализируем наш агент очистки wandb, чтобы регистрировать, сравнивать и визуализировать эффективность каждой комбинации.

Метрика, которую мы хотим максимизировать, - это val_accuracy, которую мы регистрируем в цикле обучения.

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

Теперь у нас есть идентификатор развертки, необходимый для ее выполнения. Теперь нам нужна только функция train, которая будет многократно вызываться при каждой развертке.

Обучение модели

Выбор оптимальных гиперпараметров модели

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

Некоторая наиболее важная информация о производительности модели может быть получена непосредственно из графика корреляции параметров.

Здесь мы можем увидеть, как выполнялись все прогоны с целью максимизации точности проверки. Мы можем сделать вывод, что лучшая комбинация гиперпараметров - это размер пакета 16, скорость обучения 3e-5 и обучение за 3 эпохи, что приведет к точности около 84%.

Если вам нужна более простая визуализация, которая просто сравнивает время, затраченное на каждый запуск, а также то, как он работает при оптимизации желаемой метрики, вы можете сослаться на другую полезную визуализацию на панели инструментов, которая сравнивает точность проверки и время конкретного запуска.

Теперь давайте посмотрим на визуализацию зарегистрированных показателей.

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

Этот пост демонстрирует, что с предварительно обученной моделью BERT вы можете быстро создать модель с минимальной тонкой настройкой и данными, используя интерфейс huggingface, в зависимости от конкретной интересующей вас задачи НЛП.

Я надеюсь, что это было хорошо прочитано. Все результаты в этой статье могут быть воспроизведены с помощью этой записной книжки, а визуализации, сравнивающие различные прогоны, могут быть просмотрены на этой странице wandb sweeps.