Обучение трех моделей глубокого обучения и сравнение их эффективности при анализе тональности твитов: пошаговое руководство

1. Введение в проект

а. Знакомство с моделями, использованными в проекте
б. Набор данных Sentiment140
c. Визуализация положительных и отрицательных твитов

2. Подготовка твитов для наших моделей

а. Выбор метода предварительной обработки твитов
б. Вложения слов: Wiki2Vec и GloVe

3. Построение, обучение и сравнение наших моделей

а. Простая модель Keras
б. Модель Keras со слоем BiLSTM
c. ДистильБЕРТ
д. "Сравнение"

4. Вывод"

1. Введение в проект

Цель этой статьи (которая оказалась моей первой статьей на Medium 😊) — поделиться с вами тем, что я узнал, сравнивая производительность трех разных моделей глубокого обучения в печально известной задаче анализа настроений НЛП.

Мы попросим наши модели предсказать положительное (1) или отрицательное (0) настроение в этой задаче бинарной классификации и сравним точность, потери и время обучения для каждой модели.

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

а. Знакомство с моделями, использованными в проекте

Первые две модели будут базовыми моделями Keras Sequential. Первая модель будет иметь слой Embedding, слой Flatten и слой Dense. Вторая модель будет иметь слой внедрения, двунаправленный слой LSTM и плотный слой. Ниже я более подробно опишу слои и различия между этими моделями.

Третьей моделью станет DistilBERT, более легкая версия модели Google BERT.

б. Набор данных Sentiment140

Мы будем использовать набор данных Sentiment140 для обучения различных моделей точному прогнозированию настроения (положительного или отрицательного) твита. Набор данных содержит 1,6 миллиона твитов, из них 800 000 положительных и 800 000 отрицательных.

Поскольку классы или метки сбалансированы, мы сможем использовать точность в качестве предпочтительной метрики. Если бы мы работали с очень несбалансированным набором данных, например, с 1% отрицательных твитов и 99% положительных твитов, наша модель могла бы предсказывать только положительные настроения и иметь точность 99%, при этом будучи совершенно бесполезной!

Чтобы избежать длительного времени обучения, мы возьмем образец исходного набора данных (20 000 положительных отзывов и 20 000 отрицательных отзывов), имея в виду, что мы могли бы улучшить нашу точность, если бы мы увеличили эти числа.

Вот наш набор данных с настроением в столбце «цель»:

в. Визуализация положительных и отрицательных твитов

Чтобы не видеть стоп-слова в WordClouds ниже, я использовал простую функцию предварительной обработки текста, которую мы увидим позже в статье. Вот слова, которые чаще всего встречаются в наших позитивных и негативных твитах:

2. Подготовка твитов для наших моделей

Прежде чем просить наши модели Keras предсказать настроение наших твитов, у нас есть возможность предварительно обработать твиты, и мы должны создать матрицы внедрения для наших слоев внедрения, поскольку этот слой является неотъемлемой частью нейронных сетей.

а. Выбор метода предварительной обработки твитов

Первым подходом к предварительной обработке текста была функция очистки текста, которую я написал сам: она демонизирует смайлики (например, превращает 🔥 в огонь), преобразует в нижний регистр, токенизирует (разбивает на список слов) , удаляет стоп-слова, сохраняет только английские слова, лемматизирует и, наконец, сохраняет только слова длиннее 2 символов.

Второй подход к предварительной обработке текста — это просто библиотека tweet-preprocessor Python.

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

б. Встраивание слов: Wikipedia2Vec и GloVe

Теперь пришло время выбрать алгоритм, который позволит нам представлять наши слова в виде векторов в векторном пространстве слов в формате, который может обрабатывать наша модель. Существует множество существующих алгоритмов, которые могут справиться с этой задачей, например, GloVe (от Стэнфорда), Word2vec (от Google) или fastText (от Facebook).

Мы будем сравнивать два метода Wikipedia2Vec:

Wikipedia2Vec — это инструмент, используемый для получения вложений (или векторных представлений) слов и сущностей (то есть понятий, которым есть соответствующие страницы в Википедии) из Википедии. Он разработан и поддерживается Studio Ousia.
Этот инструмент позволяет одновременно изучать вложения слов и сущностей и размещать похожие слова и сущности близко друг к другу в непрерывном векторном пространстве.
- https://wikipedia2vec.github.io/wikipedia2vec/

… и GloVe (глобальные векторы для представления слов), чей алгоритм вычисляет статистику совпадений слов, чтобы установить отношения между словами и определить, какие слова с большей вероятностью будут встречаться вместе.

Мы будем использовать предварительно обученные векторы слов (в случае GloVe векторы Twitter были предварительно обучены на 2 миллиардах твитов! 😮). Их можно найти и легко загрузить на соответствующих веб-сайтах. .

Последний шаг — применить предварительно обученные векторы слов к нашим твитам, чтобы создать матрицу встраивания: матрицу всех слов, которые появляются в наших твитах, и соответствующих им векторов. Код, который создает матрицы встраивания, почти идентичен, и в большинстве случаев его можно найти на веб-сайте выбранного вами встраивания слов. Вот пример с GloVe:

3. Построение, обучение и сравнение наших моделей

а. Простая модель Кераса

Первая модель представляет собой простую последовательную модель глубокого обучения. Входными данными этой модели будет твит или массив твитов, и каждый твит будет проходить через слой Embedding, Flatten и Dense. Слой Embedding применит матрицу внедрения к нашему твиту, слой Flatten сгладит наш массив 100x100 до плоского вектора размером 10000, а наш слой Dense обработает выходные данные слоя Flatten и просто даст нам результат размера 1: настроение твита положительное (1) или отрицательное (0)?

б. Модель Keras со слоем BiLSTM

Мы начинаем с того же слоя встраивания, что и наша простая модель, разница будет заключаться в том, что второй слой представляет собой двунаправленный слой LSTM (долгосрочная кратковременная память):

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

Двунаправленный LSTM или BiLSTM имеет немного другую архитектуру, которая позволяет ему не только хранить прошлую информацию, но и путешествовать как в «прошлое», так и в «будущее» (от точки зрения текущего токена), что позволяет извлекать еще более значимую информацию.

в. БЕРТ и ДистильБЕРТ

BERT, или представления двунаправленного кодировщика от Transformers, представляет собой большую языковую модель ИИ (база BERT имеет 110 миллионов параметров, а BERT Large — 340 миллионов) и стала революционной разработкой Google в 2018 году.

Наши последние две модели были ограничены встраиванием слов, что имеет некоторые ограничения, например игнорирование таких нюансов, как одно и то же слово, возможно, означающее разные вещи в разных предложениях, потому что модели с трудом понимают контекст предложения.

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

Мы будем использовать уменьшенную версию BERT под названием DistilBERT:

DistilBERT — это маленькая, быстрая, дешевая и легкая модель Transformer, обученная на перегонной базе BERT. Он имеет на 40 % меньше параметров, чем bert-base-uncased, работает на 60 % быстрее, сохраняя при этом более 95 % производительности BERT, измеренной в тесте понимания языка GLUE.

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

д. Сравнение

Всего мы сравниваем 11 моделей: простая модель и BiLSTM, встраивание GloVe и Wiki2Vec, препроцессор твитов, наша функция и отсутствие очистки и, наконец, DistilBERT.

Чтобы сравнить производительность двух моделей Keras и избежать избыточного кода, я написал простую функцию, которая принимает в качестве входных данных кадр данных (с двумя столбцами: текст и метка), функцию предварительной обработки текста, тип внедрения, тип модели и имя выходного файла (для сохранения модели в формате .h5), а также выводит производительность и токенизатор (полезно, если мы хотим где-то развернуть модель).

Я также добавил производительность модели логистической регрессии в качестве основы, которую я не обсуждал в этой статье. Если вам интересно, я приглашаю вас ознакомиться с кодом в репозитории GitHub.

DistilBERT был настроен в отдельном блокноте, а результаты впоследствии добавлены в сравнительную таблицу. Вот наши результаты:

4. Вывод

В заключение, несмотря на самое высокое время обучения, DistilBERT является нашей самой эффективной моделью с впечатляющей точностью 94% всего за 3 эпохи! Вероятно, мы могли бы немного приблизиться к 100%, позволив ему тренироваться еще несколько эпох (около 7 минут на эпоху) или отправив ему больше твитов для обучения.

Вы можете, например, развернуть API с помощью FastAPI или создать панель мониторинга для своей модели. Вот простая панель инструментов, которую я разместил на Streamlit (фреймворк приложений с открытым исходным кодом для машинного обучения и науки о данных), чтобы протестировать DistilBERT, который мы только что настроили:

https://distilbert.streamlit.app/