В этом выпуске я расскажу о некоторых из своих недавних экспериментов по созданию простой модели классификации текста (предсказание, связан ли твит с политикой или нет) и отладке/проверке поведения модели с использованием градиентов.

Контекст — понимание предвыборного дискурса в развивающихся странах



Анализ данных дискурса президентских выборов 2019 года в Нигерии

Я всегда увлекался применением методов машинного обучения для понимания социальных и демографических проблем, особенно касающихся малоизученных регионов (например, развивающихся стран). Некоторое время назад я собрал набор твитов (25 миллионов твитов) за 6 месяцев до всеобщих выборов в Нигерии в феврале 2019 года. Цель состояла в том, чтобы проанализировать эти данные (см. некоторые первоначальные результаты здесь) и ответить на вопросы, касающиеся участия граждан, сетевых структур, демографического распределения и даже неравенства в уровне благосостояния в стране.

Хотя темы здесь довольно широкие, одна конкретная область, в которой машинное обучение может помочь, — это понимание дискурса, связанного с выборами. Первым шагом здесь является надежное извлечение подмножества всех твитов, относящихся к политике, а затем задание дополнительных вопросов в рамках этого подмножества данных (например, настроения, связанные с твитами, изменения настроений с течением времени, настроения, связанные с событиями, хэштеги, связанные с политическим дискурсом). , настроения вокруг кандидатов и т. д.).

Чтобы решить эту задачу, я решил построить модель на основе BERT, используя библиотеку преобразования Huggingface и Tensorflow 2.0. Компетентная модель классификатора политики была бы полезна для аннотирования всех твитов в данных, что позволило бы проводить новые типы анализа.

Создание набора данных

Все 25 миллионов твитов из собранных данных в настоящее время хранятся в таблице BigQuery. Это позволяет создавать производные таблицы, которые используются для сборки обучающего набора данных. Традиционно набор данных машинного обучения обычно создается людьми-аннотаторами, которые присваивают метку каждому твиту. Однако вы можете пойти довольно далеко, написав эвристику/правила, которые назначают начальный набор меток, которые используются для обучения базовой модели. Я исследовал этот маршрут.

  • Составьте список ключевых слов, связанных с политикой (например, имена кандидатов и такие термины, как выборы, президент, президент, сенат, палата представителей и т. д.)
  • Запускайте запросы, соответствующие твитам, к регулярным выражениям, созданным с использованием указанных выше ключевых слов. Совпадениям присваивается метка «политический», эквивалентный размер твитов извлекается из остальных как класс «не политический». Следует соблюдать осторожность при выборе ключевых слов и регулярных выражений. Например, слишком общий список ключевых слов приводит к тому, что модель считает, что все связано с политикой.

Построение модели с трансформерами Huggingface

Трансформеры Huggingface делают процесс создания моделей действительно простым. Основная часть работы обычно уходит на написание эффективного конвейера данных, используемого для обучения модели и получения прогнозов.

Некоторые из шагов высокого уровня, которые я предпринял, включают:

Обучение:

  • Перетасовывайте и разбивайте большие наборы данных на более мелкие фрагменты.
  • Разметьте текст для каждого разделения и создайте объект tf.data.
  • Итеративно обучайте модель на каждом расколе. (.. зарезервируйте разделение для оценки по мере необходимости).

Прогноз:

  • Разбивайте данные на части
  • Применяйте оптимизацию пакетной обработки, чтобы ускорить прогнозирование для каждого разделения. Например, создавайте пакеты на основе текста, отсортированного по длине, чтобы текст одинакового размера находился в одном пакете.
  • Прогнозирование партий и агрегирование результатов.

Дополнительные подробности и фрагменты кода для реализации модели классификации текста в Tensorflow находятся здесь https://victordibia.com/blog/text-classification-hf-tf2/

Отладка модели — объяснение градиента

Когда у вас есть обученная модель, возникает соблазн предположить, что она хорошо работает на практике, когда ее показатель оценки высок (например, точность, разреженная категориальная точность и т. д.). В моем случае точность обучения постоянно превышала 98%. С одной стороны, это ожидаемо, поскольку задача относительно проста (как минимум, нужно научиться обращать внимание на важные ключевые слова, связанные с политикой, в наборе поездов и обобщать это на другие общие связанные ключевые слова). С другой стороны, важно убедиться, что модель не исследует ложные короткие пути.

Один из способов сделать это — изучить атрибуции на основе градиента как способ объяснить поведение модели. Глядя на градиенты выходных данных модели глубокого обучения по отношению к ее входным данным, мы можем сделать вывод о важности/вкладе каждого токена в выходные данные модели. Этот подход иногда называют ванильными градиентами или чувствительностью градиентаy.

В Tensorflow/Keras получение градиентов (посредством автоматического дифференцирования) можно реализовать с помощью API Tensorflow GradientTape. Общие шаги описаны ниже:

  • Инициализируйте GradientTape, который записывает операции для автоматического дифференцирования.
  • Создайте один горячий вектор, который представляет наш входной токен (обратите внимание, что ввод соответствует индексу токена для слов, сгенерированному токенизатором). Мы сообщим Tensorflow watch эту переменную в ленте градиента.
  • Умножить ввод путем встраивания матрицы; таким образом мы можем обратно распространять предсказание по отношению к входу
  • Получить прогноз для входных токенов
  • Получите градиент ввода относительно предсказанного класса. Для модели классификации с классами n мы обнуляем все остальные n-1 классов, кроме предсказанного класса (т. е. класса с наивысшими логитами предсказания) и получаем градиент относительно этого предсказанного класса.
  • Нормализуйте градиент (0–1) и верните их в виде пояснений.

Дополнительные подробности и фрагменты кода для реализации объяснения градиента находятся здесь https://victordibia.com/blog/explain-bert-classification/.

Изучив градиенты, я сделал несколько выводов и изменений в настройке эксперимента.

  • Добавление пользовательских токенов. Визуализация токенов и их вклада помогла мне осознать необходимость расширения словаря токенов, используемого для обучения модели. В моем наборе данных было значительное количество нигерийских имен, которых не содержал стандартный токенизатор BERT, что приводило к их представлению частичными токенами. Я использовал метод `tokenizer.add_tokens` и изменил размер встраивания модели, чтобы исправить это.
  • Стратегии информирования для улучшения модели: просмотр того, как важность назначается каждому токену, был полезен при переписывании исходной эвристики, используемой при создании обучающего набора (например, несопоставление некоторых часто встречающихся фамилий для минимизации ложных атрибуций), введение дополнительных ключевых слов, обновление моей логики предварительной обработки и т. д.

Обратите внимание, что существуют и другие методы/вариации атрибуции на основе градиента, однако ванильные градиенты особенно просты в реализации и дают довольно похожие результаты.

Выводы

Спасибо за прочтение! Надеюсь, описанные выше шаги будут полезны для любых проектов по классификации текстов или твитов, над которыми вы работаете. Обратитесь в твиттер, чтобы обсудить любые связанные темы!

Всего хорошего!

P.S. Если вам нужны такие обновления, рассмотрите возможность подписаться на мою рассылку. Это ежемесячно, и вы можете отказаться от подписки в любое время.