Тонкая настройка предварительно обученных трансформаторов с помощью PyTorch

Благодаря обилию информации, доступной в Интернете, анализ мнений, позволяющий понять, что клиенты думают о вашем бренде, продуктах и ​​услугах, стал важным показателем успеха. Компании не сдерживаются, вкладывая средства в ИИ, чтобы получить от клиентов ценные идеи.

«Ваши самые недовольные клиенты - ваш лучший источник знаний» ~ Билл Гейтс.

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

Задача

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

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

1. Прежде чем мы будем писать код…

1а. Трансформатор НЛП

Transformer - это архитектура кодера-декодера NLP, которая использует механизм самовнимания с несколькими головками для параллельного процесса входных последовательностей.

Давайте разберем вышеприведенное предложение и выработаем интуицию для каждой части:

  • «НЛП»: обработка естественного языка или НЛП - это область машинного обучения, которая помогает машинам извлекать значение из человеческого языка. Применения НЛП варьируются от понимания языка (например, обобщение текста, мониторинг социальных сетей) до создания языка (например, создание подписей к изображениям), а иногда и того, и другого одновременно (например, языковой перевод, чат-боты).
  • «Архитектура кодировщика-декодера»: компьютер / машина не может понимать слова, поэтому мы передаем ему язык в виде чисел. Кодирование означает преобразование данных в закодированное сообщение (в нашем случае числовой вектор или скрытое состояние), а декодирование означает преобразование закодированного сообщения в понятный язык. Вывод декодера будет зависеть от цели модели, например, при переводе с английского языка на хинди декодер будет преобразовывать закодированное сообщение на язык хинди.
  • Механизм самовнимания: недостатком простой архитектуры кодировщика-декодера является то, что она не может полностью управлять последовательностями длинных предложений из-за проблемы исчезающего градиента. Чтобы решить эту проблему, был введен механизм внимания. Цель состояла в том, чтобы позволить модели НЛП больше сосредоточиться на соответствующих частях входной последовательности при декодировании каждого временного шага. Есть разные типы внимания, у трансформеров - Самовнимание. Он фиксирует контекстные отношения между словами в предложении с помощью контекстных векторов.

Внимание - одна из важнейших концепций Трансформаторов и НЛП в целом, подробнее об этом читайте здесь!

  • «Многоголовое внимание»: процесс самовнимания повторяется несколько раз параллельно, и каждый из них называется головкой, отсюда и название «многоголовое внимание». Multi-head Attention позволяет вложениям узнавать разные аспекты значений каждого слова. Можно подумать о том, что здание можно описать по его высоте, ширине, цвету, местоположению и т. Д., А наличие разных описаний делает окончательную картину богаче.
  • «Входные последовательности параллельных процессов»: предшественники Transformers кодировали входные данные последовательно (одно слово за другим, слева направо или справа налево), не позволяя моделям использовать магию Параллельные вычисления на GPU. Учитывая, что архитектура Transformer создает векторы контекста для каждого временного шага, слова не зависят друг от друга и могут обрабатываться параллельно. Это свойство также допускает двунаправленность в модели - это означает, что каждое предсказание слова учитывает контекст по обе стороны от текущего слова. (рисунок 1)

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

1b. Передача обучения на помощь

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

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

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

Трансферное обучение от BERT в 2018 году показало исключительные прогнозы по 11 различным последующим задачам.

Целью BERT было создание надежного кодировщика, который может вставлять слова, принимая во внимание контекст предложения с обоих направлений. (слова до и после текущего слова) и, увы, именно так оно и есть! Использование предварительно обученных представлений из BERT значительно увеличивает точность прогнозов модели NLP и еще более значительно снижает затраты на вычисления, которые в противном случае потребовались бы для достижения этой точности.

Предварительно обученные языковые модели стали настоящим предметом исследований в области НЛП, благодаря множеству прорывов за последние 3 года. GPT-2, GPT-3, T5, RoBERTa и XLNet - некоторые другие популярные языковые модели.

1c. Сила параллельных вычислений

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

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

Графические процессоры могут не подходить для всех, но не волнуйтесь, сообщество машинного обучения вас поддержит! В Интернете доступно несколько вариантов использования бесплатных графических процессоров! В этом блоге я буду использовать графический процессор NVIDIA компании Google Colab.

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

2. А теперь давайте код

Обсуждаемые выше концепции можно использовать для создания модели машинного обучения для анализа мнений и понимания текущих настроений клиентов. Я разбил процесс на 4 этапа:

  • Подготовка данных
  • Передача обучения
  • Тонкая настройка и обучение
  • Предсказывать!

Я буду использовать необработанный tar-файл из Multi-Domain Sentiment Dataset (версия 2.0). Этот набор данных содержит обзоры Amazon на продукты в нескольких категориях за последние несколько десятилетий.

2а. Подготовка данных

Данные представлены в формате XML, и их сначала необходимо преобразовать в фрейм данных Pandas. Мы можем сделать это с помощью Beautiful Soup.

«Beautiful Soup - это библиотека Python для извлечения данных из файлов HTML и XML. Это помогает в навигации, поиске и изменении дерева синтаксического анализа »

Теперь мы преобразуем текст в токены, используя словарь BERT. Библиотека PyTorch-Pretrained-BERT предоставляет токены для всех моделей BERT. Читайте больше о них, здесь".

Каждая модель имеет предел «максимальной последовательности», и нам нужно усечь наши токены до предела BERT - 512. Мы также добавим токен, чтобы различать предложения («CLS») и отступы («PAD»), чтобы убедитесь, что все предложения имеют одинаковую длину.

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

2b. Трансферное обучение

Для трансферного обучения я использовал предварительно обученную модель из учебника Трансферное обучение NAACL 2019.

Поверх модели мы добавим заголовок классификатора для бизнес-задачи. В нашем случае мы хотим спрогнозировать «положительную» или «отрицательную» реакцию клиентов - следовательно, наша модель будет иметь 2 выходных класса.

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

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

Библиотеки PyTorch’s Ignite делают обучение и оценку очень удобными с помощью всего лишь нескольких строк кода.

Точность модели можно проверить с помощью определенного оценщика. Предварительно обученная модель позволила нам достичь точности 92% на нескольких тысячах примеров.

2г. Предсказывать!

Для прогнозирования выборок мы сначала токенизируем данные, аналогичные блоку кода 2, а затем введем их в модель.

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

Заключение

Напомним, мы научились читать XML-файлы с помощью Beautiful Soup, использовали загрузчики данных PyTorch для создания итераторов, токенизировали текст с помощью BERT и использовали трансферное обучение на предварительно обученной модели, чтобы создать основу для нашего анализа настроений. К базовой модели также был добавлен классификатор, позволяющий прогнозировать положительные и отрицательные настроения.

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

Во второй части этого блога я создам интерактивную приборную панель, которая будет отображать тенденции в реальном времени на основе прогнозов модели трансформатора!