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

Источник: https://www.youtube.com/watch?v=G3pOvrKkFuk
Канал: Yannic Kilcher
Опубликовано: 18.05.2020

---

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

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

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

*   **PyTorch Lightning** — обертка над PyTorch, которая берет на себя рутину: циклы обучения, работу с GPU и логирование [0:41].
*   **Hugging Face Transformers** — библиотека для доступа к предобученным моделям типа BERT.
*   **Hugging Face NLP (Datasets)** — инструмент для загрузки и манипуляции данными.

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

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

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

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

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

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

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

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

*   **Функция `tokenize`**: принимает текстовый образец, дополняет его специальными токенами (типа `[CLS]`) и обрезает или дополняет нулями до фиксированной длины (`max_length=32`) [15:16].
*   **Метод `map`**: библиотека NLP позволяет применить функцию токенизации ко всему датасету параллельно. Янник сталкивается с проблемой сериализации (`pickle`) объекта токенайзера при мультипроцессинге, что является типичной сложностью при разработке [19:28].
*   **Форматирование**: с помощью `set_format(type='torch')` данные переводятся в тензоры PyTorch, готовые для подачи в нейросеть [21:13].

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

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

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

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

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

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

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

*   Датсет IMDB в библиотеке, вероятно, не перемешан (shuffled) по умолчанию. Все примеры с положительными метками могут идти в начале, а с отрицательными — в конце [57:39].
*   При использовании малых срезов данных (вроде первых 5%) модель переобучается или получает нерепрезентативную выборку.
*   Для исправления ситуации требуется явный вызов функции перемешивания или загрузка полного объема данных.

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