Использование моделирования маскированного языка для обучения BERT с нуля

Введение

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

Одно из направлений наших исследований - создание моделей для конкретной предметной области вселенной финансовых новостей, для разнообразного набора последующих задач, таких как анализ настроений, NER и т. Д., И мы планирую поделиться своими открытиями в серии статей.

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

Языковые модели

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

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

Предметно-ориентированные языковые модели

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

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

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

Наши данные

За более чем 18 лет обслуживания клиентов RavenPack мы создали обширный корпус аннотированных данных Financial News, включающий миллиарды статей.

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

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

Перевод данных

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

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

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

До этой токенизации мы предварительно обрабатывали наш корпус, удаляя акценты, нижний регистр и разделение пробелами в качестве первого шага.
Наш размер словаря составлял 50265 различных токенов, из которых 5 позиций зарезервированы для специальных токенов, таких как ‹mask› (важно для моделирования языка по маске) ​​или начало и конец предложение.

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

Создание модели

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

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

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

Мы также изменили количество головок внимания и скрытых слоев с исходных 12 на 8 и 6 соответственно.

Подготовка набора данных

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

Это заставляет модель изучать внутренние отношения внутри токенов (контекста), поскольку некоторые входные данные являются «шумом», восстанавливая истинную последовательность с использованием доступной информации.

В исходной статье BERT 15% случайных токенов были замаскированы. Большинство из них заменяется токеном ‹mask›, а небольшой процент (10%) - другим случайным токеном.

Это можно легко реализовать, но HuggingFace уже предоставляет эти функции в таблице. Мы использовали DataCollatorForLanguageModeling из библиотеки преобразователей, чтобы легко и чисто заменить токены для обучения MLM.

Более того, использование библиотеки наборов данных - это эффективный способ сохранить данные в формате .arrow и (повторно) загрузить их в случае прерывания обучения.

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

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

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

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

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

Оценка результатов

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

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

Резюме и следующие шаги

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

Вызвали ли мы ваше любопытство по поводу того, чем мы занимаемся в команде RavenPack ML? Мы нанимаем! Проверьте наши открытые позиции и свяжитесь с нами, если вы думаете, что можете внести свой вклад в команду.