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

Поскольку мы люди с врожденной лингвистической интуицией, задача разделения чего-то вроде обзоров фильмов/телепередач на положительные и отрицательные может показаться легкой, а может быть, даже тривиальной. Учитывая его тривиальную природу, представьте, что вам поручили классифицировать миллионы обзоров фильмов. Теперь некогда исключительно простая задача стала неуправляемой и непослушной. Компьютеры не обладают такой же врожденной лингвистической интуицией, так как же мы можем использовать современные достижения в области искусственного интеллекта, особенно в обработке естественного языка, чтобы выполнить эту тяжелую работу за нас?

Задание

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

Эта задача требует, чтобы вы разделили эти отзывы на три категории:

  • Не обзор телепередач/фильмов (обозначается 0)
  • Позитивный обзор телепередач/фильмов (обозначен цифрой 1)
  • Отрицательный обзор ТВ/фильма (обозначен цифрой 2)

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

В частности, у нас есть CSV-файл (train.csv), содержащий 3 столбца:

  • ID: уникальный идентификатор, связанный с обзором фильма.
  • ТЕКСТ: фактический текст отзыва.
  • LABEL: метка категории (0,1,2 соответствует категориям, упомянутым выше).

Кроме того, у нас есть еще один CSV-файл (test.csv), содержащий только 2 столбца: идентификатор и текст. Концептуально это представляет задачу самостоятельной классификации отзывов.

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

Эти данные являются модифицированной версией этого набора данных:

@inproceedings{pang-lee-2004-sentimental,
 title = “A Sentimental Education: Sentiment Analysis Using Subjectivity Summarization Based on Minimum Cuts”,
 author = “Pang, Bo and Lee, Lillian”,
 booktitle = “Proceedings of the 42nd Annual Meeting of the Association for Computational Linguistics ({ACL}-04)”,
 month = jul,
 year = “2004”,
 address = “Barcelona, Spain”,
 url = “https://aclanthology.org/P04-1035",
 doi = “10.3115/1218955.1218990”,
 pages = “271–278”,
}

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

Исследовательский анализ данных

Для начала нам нужен способ работы с этими данными.

Мы можем использовать библиотеку python pandas для чтения train.csv в пригодный для использования формат, называемый DataFrame.

Затем мы можем начать некоторый исследовательский анализ.

Начнем с наблюдения за некоторыми ключевыми свойствами:

Выход:

Total rows: 70187
Empty values in column ID: 0
Empty values in column TEXT: 7
Empty values in column LABEL: 0
Number of Irrelevant Reviews 35000
Number of Positive Reviews 17645
Number of Negative Reviews 17542
Avg Length of Irrelevant Reviews 426.21105714285716
Avg Length of Positive Reviews 1332.3479739302918
Avg Length of Positive Reviews 1298.990822027135

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

У нас есть семь пустых значений в столбце TEXT. Это довольно небольшая часть, но на всякий случай давайте заполним их пустыми строками, которые мы все еще можем передавать в наши модели.

Мы также должны взять несколько случайных выборок из каждого класса.
Здесь я выделю несколько:

Неактуальные:

Это была довольно хорошая книга. Я только хочу, чтобы мне не пришлось покупать еще 2, чтобы закончить…

Нерелевантные обзоры часто упоминают другие продукты, помимо фильмов/телепередач. В данном случае в этом обзоре упоминались книги.

Положительное:

Нет музыки. Никакой дурацкой масала. Достаточно реалистичное изображение полицейской системы в Индии, основанное на реальном индийском специалисте по «встречам» Дайе Наяке. Это Аб Так 56 (56 символизирует, сколько преступников убил главный герой «Садху Агаше» — ну, это вы уже знаете) Блеск источает Нан Патекар в роли раскованной и расчетливой индийской полицейской. Один вкладыши просто веселые. Сюжет хоть и немного предсказуем на обзор, но все же интригует. Еще один из фильмов Рама Гопала Вермаса «Фабрика». Фильмы, которые либо приличные, либо действительно хорошие, Аб Так Чаппан извивается близко к очень хорошему. Но все же остается одним из 70 лучших фильмов, выпущенных в Индии, включая коммерческие и вычурные.

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

Сделано режиссером-дебютантом Шамитом Аманом (кажется, это его имя).

… продолжение …

Несоответствие длины, которое мы наблюдали ранее, сразу становится очевидным (и я специально выбрал более короткий образец, чтобы поделиться им и обрезать свой выбор).

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

Отрицательное:

Я дал этому 3 из возможных 10 звезд.

Если вам не нравится тратить время на просмотр актрисы с анорексией, в этом фильме Карли Поуп ведет себя как стерва, не беспокойтесь.

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

В фильме есть разные интриги.

… продолжение …

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

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

Кроме того, как положительные, так и отрицательные образцы содержат рейтинги, и поэтому я утверждаю, что более высокие числа, такие как 7, могут склоняться к классификации чего-либо как положительного, в то время как наличие числа, такого как 3 можно отнести к разряду отрицательных. Это, конечно, зависит от нашей стратегии токенизации и от того, включаем ли мы даже однозначные числа.

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

Однако положительные и отрицательные качества длины, формата и содержания одинаковы. Вместо этого нам придется полагаться на поиск этих характерных положительных и отрицательных слов или фраз.

научный подход:

Для начала нам нужно разделить данные обучения на две части: данные обучения и данные разработки.

Это позволит нам оценить наши модели, сравнив наши прогнозы с фактическими значениями в наборе для разработки.

Затем мы можем подогнать текст к TfidfVectorizer scikit-learn и получить разреженную матрицу значений TF-IDF для каждого слова для каждого документа.

Для этой задачи я собираюсь попробовать три популярные классические модели машинного обучения, включенные в библиотеки машинного обучения scikit-learn:

  • Логистическая регрессия
  • Полиномиальный наивный байесовский метод
  • Линейная машина опорных векторов

Я настрою еще один класс для обучения и подгонки всех этих моделей:

scikit-learn Оценка:

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

Linear Regression : -------------------
          precision    recall  f1-score   support
Not Movie      0.98      0.99      0.98      5247
Positive       0.88      0.87      0.88      2710
Negative       0.89      0.88      0.89      2572
accuracy                           0.93     10529
macro avg      0.92      0.91      0.92     10529
weighted avg   0.93      0.93      0.93     10529
Multinomial NB : -------------------
           precision    recall  f1-score   support
Not Movie      0.96      0.98      0.97      5247
Positive       0.86      0.78      0.82      2710
Negative       0.83      0.88      0.85      2572
accuracy                           0.90     10529
macro avg      0.88      0.88      0.88     10529
weighted avg   0.90      0.90      0.90     10529
Linear Support Vector Machine : -------------------
           precision    recall  f1-score   support
Not Movie      0.98      0.99      0.99      5247
Positive       0.88      0.88      0.88      2710
Negative       0.89      0.88      0.89      2572
accuracy                           0.93     10529
macro avg      0.92      0.92      0.92     10529
weighted avg   0.93      0.93      0.93     10529

Выполнив оценку метрик, мы видим, что модель Машина опорных векторов превосходитлишь немного модель логистической регрессии.

Huggingface 🤗 Трансформеры Подход:

Теперь, когда мы опробовали классический подход к машинному обучению с использованием scikit-learn, пришло время насладиться современными технологиями обработки естественного языка: моделями-трансформерами!

Используя библиотеку transformers от Huggingface🤗, мы можем добиться невероятных результатов с минимальными усилиями!

Для этого подхода я собираюсь импортировать и настроить дистиллированную версию BERT, доступную в центре Huggingface, DistilBERT.

В частности, я буду использовать distilbert-base-uncased. Пожалуйста, обратитесь к странице концентраторов Huggingface для distilbert-base-uncased для получения более подробной информации о модели, включая ее предполагаемое использование, проблемы со смещением и оценку необработанной модели.



Мы должны начать с упорядочивания наших данных. Мы можем повторно использовать те кадры данных pandas, которые мы разделили ранее, и преобразовать их в наборы данных Huggingface.

Хотя примечательно, что попытка запустить пустые строки через модель преобразователя вызовет некоторые ошибки, поэтому давайте изменим нашу стратегию и добавим текст-заполнитель:

Нам также понадобятся некоторые шаги предварительной обработки, чтобы подготовить все для модели:

Итак, здесь мы импортировали токенизатор, связанный с предварительно обученной моделью DistilBERT. Мы также настроили подборщик данных для обработки отступов.

Затем мы можем использовать функцию предварительной обработки и Dataset.map для токенизации наших наборов данных.

Теперь, когда мы привели наши данные в порядок, нам просто нужно импортировать нашу модель для обучения:

Это загрузит предварительно обученную модель DistilBERT и настроит ее на 3 метки для дальнейшего обучения! Мы также отправляем модель на первое устройство cuda. Для простоты я обучил эту модель в Google Colaboratory и установил для своей среды выполнения GPU для повышения производительности.

Теперь, наконец, мы можем точно настроить нашу модель на наших тренировочных данных!

Это также очень легко сделать с помощью трансформеров Huggingface🤗 версии pyTorch. Все, что нам нужно сделать, это инициализировать объекты Trainer и TrainerArguments с нашими желаемыми гиперпараметрами, а затем запустить их.

Теперь я нетерпелив (и беспокоюсь, что Google Colab отключится от меня), поэтому я запускал свой трейнер менее чем на полную эпоху с тактовой частотой 1 час 15 минут.

Но теперь мы можем сохранить текущую контрольную точку нашей модели:

Оценка трансформатора:

И это все для обучения! Теперь нам просто нужно оценить модель и сравнить ее с нашим подходом scikit-learn.

Выход:

Distilbert Finetuned Transformer Evaluation : -------------------
           precision    recall  f1-score   support
Not Movie      1.00      0.99      0.99      5267
Positive       0.93      0.91      0.92      2768
Negative       0.90      0.93      0.92      2494
accuracy                           0.95     10529
macro avg      0.94      0.94      0.94     10529
weighted avg   0.95      0.95      0.95     10529

Это определенно немного лучше, чем подход scikit-learn — нам удалось получить значение 0,90 или выше для каждой метрики!

Заключение:

Наша доработанная модель DistilBERT определенно превосходит наши классические модели машинного обучения scikit-learn. Однако для этой задачи, если вы сравните модель трансформаторов конкретно с моделью машины опорных векторов, мы действительно увидим лишь незначительную разницу.

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

Для машины линейных опорных векторов мы, скорее всего, могли бы увидеть значительные улучшения с некоторыми умными инженерными функциями. В настоящее время мы просто передаем ему невероятно разреженную матрицу оценок TFIDF для каждого документа. Можно было бы приложить дополнительные усилия для уменьшения размерности этой матрицы, исключив неинформативные слова и, возможно, применив к ней технику уменьшения размерности, такую ​​как скрытый семантический анализ. Кроме того, мы потенциально могли бы предоставить больше информации, дополнив нашу матрицу функциями, созданными из векторов слов, таким образом инкапсулируя больше семантической информации.

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

Step | Training Loss
500    0.333200
1000   0.213200
1500   0.199800
2000   0.193000
2500   0.192600
3000   0.189900
3500   0.187600
4000   0.193100
4500   0.189700
5000   0.173800
5500   0.178900
6000   0.181100
6500 ***0.169900***
7000   0.176900

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

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

Исходный код и воспроизводимость:

Вы можете найти мой код здесь!: https://github.com/jayyydyyy/ling-539-sentiment-analysis-competition

Если вы хотите воспроизвести мои результаты, обязательно установите все зависимости, перечисленные в файле requirements.txt.

Однако для ноутбуков-трансформеров я бы рекомендовал запускать их в Google Colaboratory или какой-либо другой удаленной среде с ускорением GPU. Вы всегда можете установить и настроить поддержку CUDA на своем локальном компьютере, если у вас есть поддерживаемая видеокарта, но не у всех это получается! 😊

По этим причинам я включил блокнот Jupyter и ссылку на блокнот Google Colab для каждого подхода!