Создание классификатора тональности на PyTorch и Hugging Face: туториал Янника Килчера

Yannic Kilcher 40,4 тыс. 1 ч 2 мин 3 мин 18.05.2020
Главное

Специалист по машинному обучению и известный ИИ-блогер Янник Килчер (Yannic Kilcher) представил практическое руководство по созданию классификатора тональности текста (sentiment classifier) на базе PyTorch и новых библиотек от Hugging Face. В ходе часового урока автор в режиме реального времени пишет код «с нуля», демонстрируя процесс интеграции современных NLP-инструментов и фреймворка PyTorch Lightning.

🛠️ Введение в стек технологий: Hugging Face и PyTorch Lightning 0:00

Янник Килчер начинает туториал с обзора новой (на момент записи) библиотеки NLP от Hugging Face, которая предоставляет унифицированный доступ к более чем 100 наборам данных и 10 метрикам оценки . Основная цель видео — показать, как быстро собрать рабочий прототип нейросети, используя:

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

🏗️ Создание архитектуры модели в PyTorch Lightning 3:20

Работа начинается с написания «бойлерплейта» (шаблонного кода). Янник использует редактор NeoVim с движком автодополнения TabNine . Для управления конфигурацией он выбирает библиотеку absl-py (флаги командной строки).

Класс модели IMDBSentimentClassifier наследуется от pl.LightningModule. Килчер выделяет ключевые методы, которые необходимо реализовать :

  1. __init__: определение слоев и архитектуры.
  2. prepare_data: загрузка и предобработка данных (вызывается один раз).
  3. forward: прямой проход данных через сеть.
  4. training_step: логика одного шага обучения, возвращающая значение потерь (loss).
  5. train_dataloader: создание загрузчика данных.
  6. configure_optimizers: настройка оптимизатора (выбран SGD с параметрами learning rate и momentum) .

📊 Работа с данными: библиотека NLP и токенизация 9:30

Ключевым этапом является загрузка датасета IMDB. Килчер демонстрирует удобство библиотеки Hugging Face NLP: данные загружаются одной командой load_dataset('imdb') . Для экономии ресурсов ноутбука автор использует синтаксис срезов, загружая только 5% обучающей выборки: split='train[:5%]' .

Для превращения текста в числа используется BertTokenizerFast . Процесс обработки выглядит так:

🧠 Интеграция BERT и процесс обучения 28:08

Вместо того чтобы строить классификатор поверх «голого» BERT вручную, Килчер использует специализированный класс BertForSequenceClassification из библиотеки Transformers . Эта модель уже содержит слой классификации над выходным вектором BERT.

В методе forward автор формирует маску внимания (attention_mask), чтобы модель игнорировала паддинг (нулевые токены) . В качестве функции потерь используется кросс-энтропия (CrossEntropyLoss), причем Янник предпочитает отключать автоматическое усреднение (reduction='none') на этапе расчета, чтобы иметь больше контроля над метриками в ходе валидации .

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

📈 Проблемы с данными и результаты 50:20

При попытке обучить модель на 50% данных IMDB Килчер обнаруживает странную аномалию: ошибка обучения (train loss) мгновенно падает до нуля .

Его выводы и наблюдения:

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

💬 Цитаты

«Если я смогу это сделать, то и вы сможете. Мы совершим несколько ошибок, заглянем в документацию — это и есть процесс.»

Янник Килчер 00:41

«Только неудачникам нужна помощь. Если вы вставляете строку 'help' в описание флага, значит, вам нужна помощь.»

Янник Килчер 08:49

«Как вообще это стало настолько просто? Всего год назад это было безумно сложно.»

Янник Килчер 48:35
👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
Logits (Логиты)
Сырые предсказания модели перед применением функции активации (например, Softmax), отражающие уверенность сети в классах.
Tokenizer (Токенизатор)
Инструмент, который разбивает текст на мелкие части (токены) и сопоставляет их с числовыми идентификаторами в словаре нейросети.
Padding (Паддинг)
Дополнение коротких предложений нулевыми токенами до максимальной длины, чтобы объединить их в пакеты (батчи) фиксированного размера.
Transformer
Архитектура нейросетей, основанная на механизме внимания, ставшая стандартом в обработке естественного языка.
📊 Цифры
⚖️ Другая сторона
Искусственный интеллект Yannic Kilcher PyTorch Lightning Hugging Face BERT NLP