Як навчити модель 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 виклик методу.

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

Тепер у нас є два файли, які визначають наш новий FiliBERTo токенізатор:

  • merges.txt — виконує початкове відображення тексту в токени
  • vocab.json — зіставляє маркери з ідентифікаторами маркерів

І з цим ми можемо перейти до ініціалізації нашого токенізера, щоб ми могли використовувати його, як будь-який інший from_pretrained токенізатор.

Ініціалізація Tokenizer

 
 
Спочатку ми ініціалізуємо токенізер за допомогою двох створених раніше файлів — за допомогою простого from_pretrained:

Тепер наш токенізер готовий, ми можемо спробувати закодувати деякий текст за допомогою нього. Під час кодування ми використовуємо ті самі два методи, які зазвичай використовуємо, encode та  encode_batch.

З об'єкта кодування tokens ми будемо видобувати input_ids та  attention_mask тензори для використання з FiliBERTo.

Створення вхідного конвеєра

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



Відеоінструкція вхідного конвеєра MLM

 

Підготовка даних

 
 
Ми почнемо з одного зразка та пропрацюємо логіку підготовки.

Спочатку нам потрібно відкрити наш файл — ті самі файли, які ми зберегли . Txt файли раніше. Ми розділяємо кожен на основі символів нового рядка n оскільки це вказує на окремі зразки.

Потім ми кодуємо наші дані за допомогою tokenizer — обов’язково включити такі ключові параметри, як max_lengthpadding та  truncation.

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

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

Якщо ви не знайомі з MLM, я пояснив це тут.

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

У кінцевому результаті ми можемо побачити частину закодованого input_ids тензор. Найперший ідентифікатор маркера 1 - [CLS] жетон. Навколо тензора пунктиром ми маємо декілька 3 ідентифікатори токенів — це нещодавно додані [MASK] лексеми.

Створення DataLoader

 
 
Далі визначимо наш Dataset клас — який ми використовуємо для ініціалізації наших трьох закодованих тензорів як PyTorch torch.utils.data.Dataset об’єкти.

Нарешті, наша dataset завантажується в PyTorch DataLoader object — який ми використовуємо для завантаження наших даних у нашу модель під час навчання.

Навчання моделі

 
 
Нам потрібні дві речі для навчання, наші DataLoader і модель. The DataLoader у нас є — але немає моделі.



Ініціалізація моделі

 
 
Для навчання нам знадобиться сирий (не попередньо підготовлений) BERTLMHeadModel. Щоб створити це, нам спочатку потрібно створити конфігураційний об’єкт RoBERTa для опису параметрів, якими ми хочемо ініціалізувати FiliBERTo.

Потім ми імпортуємо та ініціалізуємо нашу модель RoBERTa за допомогою головки моделювання мови (LM).

Підготовка до навчання

 
 
Перш ніж перейти до нашого навчального циклу, нам потрібно налаштувати кілька речей. Спочатку ми налаштовуємо використання GPU/CPU. Потім ми активуємо режим навчання нашої моделі — і, нарешті, ініціалізуємо наш оптимізатор.

Навчання

 
 
Нарешті — час тренувань! Ми тренуємося так само, як зазвичай, тренуючись через PyTorch.

Якщо ми перейдемо до Tensorboard, то з часом побачимо наші втрати — це виглядає багатообіцяюче.



Втрата/час — у цій таблиці з’єднано кілька тренувань

 

Справжній тест

 
 
Тепер настав час справжнього випробування. Ми встановлюємо конвеєр MLM — і просимо Лауру оцінити результати. Переглянути відеоогляд о 22:44 можна тут:



Спочатку ми ініціалізуємо a pipeline об'єкт, використовуючи в 'fill-mask' аргумент. Потім почніть тестувати нашу модель так:

“чао Приходити ва?" це правильна відповідь! Це настільки просунуто, наскільки моя італійська – тому давайте передамо це Лаурі.

Почнемо з "buongiorno, come va?" - або «Добрий день, як справи?»:

Перша відповідь: «buongiorno, chi va?» означає «доброго дня, хто там?» — напр. безглуздий. Але наша друга відповідь правильна!

Далі трохи складніша фраза, «ciao, dove ci 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

Моделі-трансформери є стандартом де-факто в сучасному НЛП. Вони зарекомендували себе як найвиразніші...
 

*Усі зображення належать автору, якщо не вказано інше

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

Оригінал. Повідомлено з дозволу.

За темою:

Джерело: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Часова мітка:

Більше від KDnuggets