Как обучить модель 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
каталог, который мы найдем:
Каталог, содержащий наши файлы 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_length
, padding
и 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
- "
- &
- Все
- аналитика
- около
- гайд
- статьи
- автоматический
- строить
- Строительство
- призывают
- Комментарии
- компонент
- содержание
- Создающий
- создатель
- данным
- наука о данных
- ученый данных
- день
- глубокое обучение
- директор
- инженер
- Инженеры
- Английский
- Особенность
- в заключение
- финансы
- Во-первых,
- формат
- внештатно
- полный
- хорошо
- Графические процессоры
- большой
- здесь
- Как
- How To
- HTTPS
- огромный
- изображение
- Интернет
- IT
- Италии
- Основные
- язык
- Языки
- УЧИТЬСЯ
- изучение
- Библиотека
- загрузка
- Лондон
- обучение с помощью машины
- Создание
- Карты
- маска
- ML
- модель
- моделирование
- двигаться
- Естественный язык
- Обработка естественного языка
- НЛП
- онлайн
- открытый
- с открытым исходным кодом
- Другое
- Простой текст
- игрок
- Много
- Проект
- pytorch
- Сырье
- Итоги
- обзоре
- Наука
- Ученые
- набор
- Размер
- So
- раскол
- Начало
- магазин
- Истории
- тестXNUMX
- Тестирование
- тестов
- время
- знак
- Лексемы
- топ
- Обучение
- превращение
- Uk
- UN
- us
- случаи использования
- Видео
- Смотреть
- КТО
- окна
- в
- Работа
- Мир
- писатель
- X
- YouTube