Як навчити модель 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
виклик методу.
Наш токенізер готовий, і ми можемо зберегти його файл для подальшого використання:
Тепер у нас є два файли, які визначають наш новий 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_length
, padding
та 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
- "
- &
- ВСІ
- аналітика
- навколо
- стаття
- статті
- автоматичний
- будувати
- Створюємо
- call
- коментарі
- компонент
- зміст
- створення
- творець
- дані
- наука про дані
- вчений даних
- день
- глибоке навчання
- Директор
- інженер
- Інженери
- англійська
- особливість
- в кінці кінців
- фінансування
- Перший
- формат
- позаштатний
- Повний
- добре
- Графічні процесори
- великий
- голова
- тут
- Як
- How To
- HTTPS
- величезний
- зображення
- інтернет
- IT
- Італія
- ключ
- мова
- мови
- УЧИТЬСЯ
- вивчення
- бібліотека
- загрузка
- Лондон
- навчання за допомогою машини
- Робить
- карти
- маска
- ML
- модель
- моделювання
- рухатися
- Природна мова
- Обробка природних мов
- nlp
- онлайн
- відкрити
- з відкритим вихідним кодом
- Інше
- Простий текст
- гравець
- Plenty
- проект
- піторх
- Сировина
- результати
- огляд
- наука
- Вчені
- комплект
- Розмір
- So
- розкол
- старт
- зберігати
- історії
- тест
- Тестування
- Тести
- час
- знак
- Жетони
- топ
- Навчання
- перетворення
- Uk
- UN
- us
- випадки використання
- Відео
- годинник
- ВООЗ
- windows
- в
- Work
- світ
- письменник
- X
- YouTube