Как обучить модель BERT с нуля

Исходный узел: 1013329

Как обучить модель BERT с нуля

Познакомьтесь с итальянским двоюродным братом BERT, FiliBERTo.


By Джеймс Бриггс, Ученый данных



BERT, но в Италии — изображение автора

 

Многие из моих статей были посвящены BERT — модели, которая пришла и доминировала в мире обработки естественного языка (NLP) и ознаменовала собой новую эру языковых моделей.

Для тех из вас, кто, возможно, раньше не использовал модели трансформаторов (например, что такое BERT), процесс выглядит примерно так:

  • pip install transformers
  • Инициализируйте предварительно обученную модель трансформаторов — from_pretrained.
  • Проверьте это на некоторых данных.
  • Может быть настроить модель (обучить ее еще немного).

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

И, если мы не можем создавать свои собственные модели трансформатора — мы должны полагаться на наличие предварительно обученной модели, которая подходит для нашей задачи, это не всегда так:



Несколько комментариев с вопросами о неанглоязычных моделях BERT.

 

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

В обзоре

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

  • Получение данных
  • Создание токенизатора
  • Создание входного конвейера
  • Обучение модели

После того, как мы проработаем каждый из этих разделов, мы возьмем созданный нами токенизатор и модель и сохраним их оба, чтобы затем использовать их так же, как обычно. from_pretrained.

Получение данных

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



Пошаговое видео для загрузки набора данных OSCAR с использованием библиотеки наборов данных HuggingFace

 

И если есть что-то, чего у нас много в Интернете, — это неструктурированные текстовые данные.

Одним из крупнейших наборов данных в области текста, извлеченного из Интернета, является набор данных OSCAR.

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

К сожалению, единственный язык, на котором я хоть сколько-нибудь владею, — это английский, но моя девушка — итальянка, и поэтому она — Лора — будет оценивать результаты нашей италоязычной модели BERT — FiliBERTo.

Итак, для загрузки итальянского сегмента набора данных OSCAR мы будем использовать HuggingFace. datasets библиотека, которую мы можем установить с помощью pip install datasets. Затем мы загружаем OSCAR_IT с помощью:

Давайте посмотрим на dataset объект.

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

В нашем data/text/oscar_it каталог, который мы найдем:


Снимок экрана, показывающий окно проводника Windows, полное файлов .txt, представляющих данные OSCAR в виде открытого текста.
Каталог, содержащий наши файлы OSCAR с открытым текстом.

 

Создание токенизатора

 
 
Далее идет токенизатор! При использовании преобразователей мы обычно загружаем токенизатор вместе с соответствующей моделью преобразователя — токенизатор является ключевым компонентом в этом процессе.



Пошаговое видео для создания нашего пользовательского токенизатора

 

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

Теперь специальные жетоны RoBERTa выглядят так:

Таким образом, мы обязательно включаем их в special_tokens параметр нашего токенизатора train вызов метода.

Теперь наш токенизатор готов, и мы можем сохранить его файл для дальнейшего использования:

Теперь у нас есть два файла, которые определяют наш новый ФилиБЕРТо токенизатор:

  • слияния.txt — выполняет начальное сопоставление текста с токенами
  • vocab.json — сопоставляет токены с идентификаторами токенов

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

Инициализация токенизатора

 
 
Сначала мы инициализируем токенизатор, используя два файла, которые мы создали ранее — используя простой from_pretrained:

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

Из объекта кодировки tokens мы будем извлекать input_ids и attention_mask тензоры для использования с FiliBERTo.

Создание входного конвейера

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



Видеопрохождение входного пайплайна MLM

 

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

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

Во-первых, нам нужно открыть наш файл — те самые файлы, которые мы сохранили как .текст файлы ранее. Мы разделяем каждый на основе символов новой строки n поскольку это указывает на отдельные образцы.

Затем мы кодируем наши данные, используя tokenizer — убедитесь, что вы включили ключевые параметры, такие как max_lengthpaddingи truncation.

И теперь мы можем перейти к созданию наших тензоров — мы будем обучать нашу модель с помощью моделирования на языке масок (MLM). Итак, нам нужны три тензора:

  • input_ids - наш token_ids с ~ 15% токенов, замаскированных с помощью токена маски <mask>.
  • маска_внимания - тензор 1s и 0s, обозначающие положение «настоящих» токенов/заполняющих токенов — используются при расчете внимания.
  • этикетки - наш token_ids   нет маскировка.

Если вы не знакомы с MLM, я объяснил это здесь.

Наши attention_mask и labels тензоры просто извлекаются из нашего batch,  input_ids однако тензоры требуют большего внимания, для этого тензора мы маскируем ~ 15% токенов — присваивая им идентификатор токена 3.

В финальном выводе мы видим часть закодированного input_ids тензор. Самый первый идентификатор токена 1 - [CLS] токен. Вокруг тензора мы имеем несколько 3 идентификаторы токенов — это наши недавно добавленные [MASK] жетоны.

Создание загрузчика данных

 
 
Далее мы определяем нашу Dataset класс, который мы используем для инициализации наших трех закодированных тензоров как PyTorch torch.utils.data.Dataset объекты.

И, наконец, наша dataset загружается в PyTorch DataLoader объект — который мы используем для загрузки наших данных в нашу модель во время обучения.

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

 
 
Нам нужны две вещи для тренировки, наша DataLoader и модель.  DataLoader у нас есть — но нет модели.



Инициализация модели

 
 
Для обучения нам нужен сырой (не предварительно обученный) BERTLMHeadModel. Чтобы создать это, нам сначала нужно создать объект конфигурации RoBERTa, чтобы описать параметры, с которыми мы хотели бы инициализировать FiliBERTo.

Затем мы импортируем и инициализируем нашу модель RoBERTa с головкой языкового моделирования (LM).

Подготовка к тренировке

 
 
Прежде чем перейти к нашему тренировочному циклу, нам нужно настроить несколько вещей. Во-первых, мы настраиваем использование GPU/CPU. Затем мы активируем режим обучения нашей модели — и, наконец, инициализируем наш оптимизатор.

Обучение

 
 
Наконец — время тренировки! Мы тренируемся так же, как обычно при обучении через PyTorch.

Если мы перейдем к Tensorboard, то со временем найдем нашу потерю — это выглядит многообещающе.



Потери/время — на этой диаграмме объединены несколько тренировок.

 

Настоящее испытание

 
 
Теперь пришло время для настоящего теста. Мы настраиваем конвейер МЛМ и просим Лауру оценить результаты. Видеообзор в 22:44 можно посмотреть здесь:



Сначала мы инициализируем pipeline объект, используя 'fill-mask' аргумент. Затем начните тестирование нашей модели следующим образом:

"Чао как ва? это правильный ответ! Это настолько продвинуто, насколько мой итальянский — так что давайте передадим это Лоре.

Начнем с — buongiorno, пришел ва? - или же "Добрый день. Как поживаешь?":

Первый ответ «buongiorno, chi va?» означает «добрый день, кто там?» — например, бессмысленный. Но наш второй ответ правильный!

Далее, немного более сложная фраза, «Чао, голубь си incontriamo oggi pomeriggio?» - или же «Привет, где мы встретимся сегодня днем?»:

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

✅ "hi, where do we see each other this afternoon?"
✅ "hi, where do we meet this afternoon?"
❌ "hi, where here we are this afternoon?"
✅ "hi, where are we meeting this afternoon?"
✅ "hi, where do we meet this afternoon?"

Наконец, еще одно, более жесткое предложение, «cosa sarebbe successo se avessimo scelto un altro giorno?» — или «что было бы, если бы мы выбрали другой день?»:

Мы также возвращаем еще несколько хороших хороших ответов:

✅ "what would have happened if we had chosen another day?"
✅ "what would have happened if I had chosen another day?"
✅ "what would have happened if they had chosen another day?"
✅ "what would have happened if you had chosen another day?"
❌ "what would have happened if another day was chosen?"

В целом, похоже, что наша модель прошла тесты Лауры — и теперь у нас есть компетентная модель на итальянском языке под названием FiliBERTo!

Это пошаговое руководство по обучению модели BERT с нуля!

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

Надеюсь, вам понравилась эта статья! Если у вас есть какие-либо вопросы, дайте мне знать через Twitter или в комментариях ниже. Если вы хотите больше подобного контента, я публикую на YouTube тоже.

Спасибо за чтение!

 

Скидка 70%! Обработка естественного языка: НЛП с преобразователями в Python

Модели-трансформеры являются стандартом де-факто в современном НЛП. Они зарекомендовали себя как наиболее выразительные…
 

* Все изображения принадлежат автору, если не указано иное

 
Bio: Джеймс Бриггс Специалист по обработке данных, специализирующийся на обработке естественного языка и работающий в финансовом секторе, базируется в Лондоне, Великобритания. Он также является внештатным наставником, писателем и создателем контента. Вы можете связаться с автором по электронной почте (jamescalam94@gmail.com).

Оригинал, Перемещено с разрешения.

Связанный:

Источник: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Отметка времени:

Больше от КДнаггетс