Специалист по машинному обучению и известный ИИ-блогер Янник Килчер (Yannic Kilcher) представил практическое руководство по созданию классификатора тональности текста (sentiment classifier) на базе PyTorch и новых библиотек от Hugging Face. В ходе часового урока автор в режиме реального времени пишет код «с нуля», демонстрируя процесс интеграции современных NLP-инструментов и фреймворка PyTorch Lightning.
🛠️ Введение в стек технологий: Hugging Face и PyTorch Lightning 0:00
Янник Килчер начинает туториал с обзора новой (на момент записи) библиотеки NLP от Hugging Face, которая предоставляет унифицированный доступ к более чем 100 наборам данных и 10 метрикам оценки . Основная цель видео — показать, как быстро собрать рабочий прототип нейросети, используя:
- PyTorch Lightning — обертка над PyTorch, которая берет на себя рутину: циклы обучения, работу с GPU и логирование .
- Hugging Face Transformers — библиотека для доступа к предобученным моделям типа BERT.
- Hugging Face NLP (Datasets) — инструмент для загрузки и манипуляции данными.
Автор подчеркивает, что намеренно не готовился заранее, чтобы показать «живой» процесс разработки, включая чтение документации и исправление ошибок .
🏗️ Создание архитектуры модели в PyTorch Lightning 3:20
Работа начинается с написания «бойлерплейта» (шаблонного кода). Янник использует редактор NeoVim с движком автодополнения TabNine . Для управления конфигурацией он выбирает библиотеку absl-py (флаги командной строки).
Класс модели IMDBSentimentClassifier наследуется от pl.LightningModule. Килчер выделяет ключевые методы, которые необходимо реализовать :
__init__: определение слоев и архитектуры.prepare_data: загрузка и предобработка данных (вызывается один раз).forward: прямой проход данных через сеть.training_step: логика одного шага обучения, возвращающая значение потерь (loss).train_dataloader: создание загрузчика данных.configure_optimizers: настройка оптимизатора (выбран SGD с параметрами learning rate и momentum) .
📊 Работа с данными: библиотека NLP и токенизация 9:30
Ключевым этапом является загрузка датасета IMDB. Килчер демонстрирует удобство библиотеки Hugging Face NLP: данные загружаются одной командой load_dataset('imdb') . Для экономии ресурсов ноутбука автор использует синтаксис срезов, загружая только 5% обучающей выборки: split='train[:5%]' .
Для превращения текста в числа используется BertTokenizerFast . Процесс обработки выглядит так:
- Функция
tokenize: принимает текстовый образец, дополняет его специальными токенами (типа[CLS]) и обрезает или дополняет нулями до фиксированной длины (max_length=32) . - Метод
map: библиотека NLP позволяет применить функцию токенизации ко всему датасету параллельно. Янник сталкивается с проблемой сериализации (pickle) объекта токенайзера при мультипроцессинге, что является типичной сложностью при разработке . - Форматирование: с помощью
set_format(type='torch')данные переводятся в тензоры PyTorch, готовые для подачи в нейросеть .
🧠 Интеграция BERT и процесс обучения 28:08
Вместо того чтобы строить классификатор поверх «голого» BERT вручную, Килчер использует специализированный класс BertForSequenceClassification из библиотеки Transformers . Эта модель уже содержит слой классификации над выходным вектором BERT.
В методе forward автор формирует маску внимания (attention_mask), чтобы модель игнорировала паддинг (нулевые токены) . В качестве функции потерь используется кросс-энтропия (CrossEntropyLoss), причем Янник предпочитает отключать автоматическое усреднение (reduction='none') на этапе расчета, чтобы иметь больше контроля над метриками в ходе валидации .
Для мониторинга обучения настраивается TensorBoardLogger . Янник отмечает, что предпочитает автоматически удалять папку с логами перед каждым запуском, чтобы избежать путаницы в графиках .
📈 Проблемы с данными и результаты 50:20
При попытке обучить модель на 50% данных IMDB Килчер обнаруживает странную аномалию: ошибка обучения (train loss) мгновенно падает до нуля .
Его выводы и наблюдения:
- Датсет IMDB в библиотеке, вероятно, не перемешан (shuffled) по умолчанию. Все примеры с положительными метками могут идти в начале, а с отрицательными — в конце .
- При использовании малых срезов данных (вроде первых 5%) модель переобучается или получает нерепрезентативную выборку.
- Для исправления ситуации требуется явный вызов функции перемешивания или загрузка полного объема данных.
В финале Янник демонстрирует, как ускорить обработку текста с помощью массовой токенизации (batch_encode_plus), что значительно эффективнее, чем обработка по одному предложению . Несмотря на возникшие трудности с перемешиванием данных, автор подчеркивает, что инструменты от Hugging Face сделали NLP-разработку максимально доступной по сравнению с тем, как это выглядело всего год назад .