Использование GPT-J для анализа текстов песен в стиле рок-н-ролл

Вопрос. Какая тема чаще всего встречается в рок-н-ролльной лирике?

Ответ: The Beatles подытожили это в своей песне All You Need is Love.

В качестве эксперимента по тематическому моделированию я использовал новейшие системы искусственного интеллекта для анализа 12 000 песен 50 рок-групп. В этой статье будут рассмотрены процессы, которые я использовал, и объяснены все компоненты, включая бесплатную версию GPT-3, которая работает на TPU в Google Colab под названием GPT-J. Обратите внимание, что вы можете использовать эти методы для поиска и анализа тем в любом текстовом наборе данных.

Обзор RockTopics

Вот общая схема этого эксперимента, который я называю RockTopics. После краткого обсуждения основных компонентов я объясню этапы обработки более подробно в следующих разделах.

Я начал с базы данных из 128 тысяч текстов песен, которую нашел на Kaggle, и отфильтровал количество песен, найдя их пересечение со списком 100 величайших рок-групп от журнала Rolling Stone. Это дало 13 тысяч песен от 50 групп.

Сердцем системы является преобразователь GPT-J с открытым исходным кодом, обученный с помощью Mesh Transformer JAX on the Pile, большого корпуса английского текста. Я загружал каждый текст песни построчно в GPT-J, используя подсказку из нескольких кадров, чтобы найти основную тему для каждой строки.

Я использовал Google Universal Sentence Encoder, чтобы преобразовать каждую обнаруженную тему в массив из 512 чисел. Затем я проанализировал темы, используя комбинацию уменьшения размерности TSNE и кластеризации k-средних для создания графиков с использованием matplotlib.

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

Системные компоненты

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

База данных текстов песен

Для текстов я нашел хороший набор данных Андерсона Нейсса, исследователя ИИ из Бразилии. Набор данных содержит 128 083 песни 2940 групп в 6 жанрах. Он выпустил набор данных под Лицензией на содержание базы данных.

Как я упоминал выше, я отфильтровал список песен со списком 100 величайших записывающихся исполнителей журнала Rolling Stone. В итоговый список вошли 11 959 песен 50 групп, включая The Beatles, Боба Дилана, Элвиса Пресли, The Rolling Stones, Чака Берри и Джими Хендрикса. Всего в тексте 185 003 строки.

GPT-J

GPT-J — это модель ИИ для анализа и генерации текста, обученная с помощью Mesh Transformer JAX, масштабируемой системы для обучения больших моделей с использованием параллельной обработки. Модель обучалась на большом корпусе текстов под названием The Pile, 825-гигабайтном текстовом наборе данных на английском языке, предназначенном для обучения крупномасштабных языковых моделей [1].

GPT-J был создан EleutherAI, массовым коллективом исследователей, работающих над исследованиями ИИ с открытым исходным кодом. Система была смоделирована по образцу GPT-3 OpenAI, но GTP-J можно использовать бесплатно по лицензии Apache 2.0 с открытым исходным кодом.

Вы можете бесплатно попробовать GPT-J здесь, https://6b.eleuther.ai/

Как видите, он уже знает тему номер один в рок-песнях. Далее я покажу вам, как найти темы для каждой строки в тексте песни.

Поиск тем в текстах песен

Подобно другим моделям больших трансформеров, GPG-J работает, передавая подсказку, и в результате система генерирует непрерывный текст. Я использовал следующую подсказку, чтобы получить тему из каждой строки песни. Обратите внимание, что это называется выводом «несколько выстрелов», потому что дано несколько примеров.

Determine the topic for these lyrics.
Line: Ah, look at all the lonely people!
Topic: Loneliness
Line: Wiping the dirt from his hands as he walks from the grave.
Topic: Death
Line: Little darling, the smiles returning to the faces.
Topic: Happiness
Line: Every breath you take.
Topic:

Первая строка представляет собой общее описание запроса, за которым следуют три строки примера и темы. Система будет использовать эту информацию, чтобы понять суть вопроса, и укажет тему для последней строки: «Каждый вдох, который вы делаете». Выполнение этого запроса несколько раз приведет к появлению тем «Дыхание», «Здоровье», «Жизнь» и т. д.

Вот темы из первых пяти строк «Каждого вдоха, который ты делаешь» полиции.

Line                     Topic
Every breath you take    Breathing
Every move you make      Movement
Every bond you break     Leaving
Every step you take      Walking
I'll be watching you     Watching

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

Обратите внимание, что я обнаружил, что использование одних и тех же примеров для каждого запроса иногда «просачивает» примеры тем «Одиночество», «Смерть» и «Счастье» в результаты, увеличивая их количество. Чтобы свести к минимуму утечку, я выбрал список из 300 примеров из моих промежуточных результатов и написал некоторый код для случайного выбора трех примеров из обширного списка для каждого запроса. Это, по-видимому, уменьшило (или увеличило) утечку до статистически незначимых уровней.

Я обнаружил, что проблемы утечки можно вообще избежать, используя модель OpenAI GPT-3 davinci-instruct-beta с использованием нулевого запроса, то есть без примеров. Вот подсказка.

Determine the topic for this line of lyrics.
Line: Every breath you take.
Topic:

Результаты аналогичны GPT-J без каких-либо утечек, потому что нет примеров. Этот метод предпочтительнее, но он обходится дорого. Хотя выполнение этого одного запроса будет стоить всего 0,0017 доллара США с использованием платной версии GPT-3, выполнение его на 185 тыс. строк будет стоить более 300 долларов США.

Тензорный процессор

Последние 18 месяцев я использую Google Colab для проведения своих экспериментов с ИИ. Я использовал два типа процессоров: центральные процессоры (ЦП) и графические процессоры (ГП). ЦП — это компьютеры общего назначения, которые существуют с 1960-х годов. Графические процессоры были разработаны в 1980-х годах для операций с интенсивным использованием графики и использовались для искусственного интеллекта и машинного обучения, начиная с 2010-х годов.

В 2016 году Google представила свой Tensor Processing Unit (TPU), разработанный специально для обучения и запуска экземпляров моделей ИИ. Они доступны для использования в Google Colab с 2020 года. Ю Ван возглавил команду из Гарварда для тестирования скорости моделей ИИ на графических процессорах и ТПУ. Они обнаружили, что TPU превосходят GPU в 3–7 раз при работе с большими моделями [2].

Мой RockTopics Colab для запуска тематического моделирования GPT-J основан на TPU Colab от Бена Вана из EleutherAI. Чтобы получить темы для всех 185 тысяч строк текста, требуется около 1,4 секунды на строку, которая выполнялась около трех дней.

Универсальный кодировщик предложений

После того, как я собрал темы, я использовал Universal Sentence Encoder от Google, чтобы преобразовать каждую фразу темы во вложение, массив из 512 чисел с плавающей запятой. Вот пример кода, чтобы показать, как это работает.

import tensorflow_hub as hub
embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder-large/5")
embedding = embed(["love loss"])
print(embedding)

Результат здесь.

tf.Tensor( [[-2.79744454e-02 -6.52119750e-03 1.32698761e-02
4.50092048e-04 9.81796882e-04 3.18628997e-02 2.73146853e-02
-1.10505158e-02 -2.71893758e-02 -5.06720766e-02 -3.20894904e-02
...
-1.08678043e-02 7.85474479e-03 -6.44846493e-03 -3.88006195e-02]], shape=(1, 512), dtype=float32)

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

Уменьшение размерности

В каждом из вложений содержится много информации. Однако первым шагом, который я использовал, является уменьшение размерности (DR), чтобы графически показать вложения темы. Это поможет визуализировать данные, уменьшив количество измерений для каждой темы с 512 до двух, чтобы создать двумерную диаграмму.

Двумя стандартными методами для DR являются анализ основных компонентов (PCA) и T-распределенное стохастическое встраивание соседей (TSNE). Каждый метод пытается сохранить суть данных при уменьшении количества измерений.

PCA берет данные, преобразует их в матрицу, использует причудливую математику, чтобы найти наиболее значительную дисперсию, а затем преобразует их обратно в набор данных. TSNE работает путем итеративной минимизации расхождений между точками входных данных и точками данных, представляющими одни и те же точки данных, после их перевода в представление с меньшим размером. Подробнее о методах PCA и TSNE можно прочитать в посте Луука Дерксена здесь.

100 основных тем выглядят так, если их уменьшить с 512 до двух измерений с использованием PCA и TSNE. Размер каждого круга представляет собой количество раз, когда тема встречалась в строке текста. Вы можете нажать на изображения, чтобы увидеть увеличенное изображение.

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

Ориентация графиков

Глядя на графики, вы можете спросить, почему темы занимают свое пространственное положение? Хотя относительные положения имеют значение, общая пространственная ориентация произвольна. Универсальный кодировщик предложений определил позиции значений фраз в 512-мерном пространстве. И хотя алгоритмы DR пытаются поддерживать пространственную согласованность, нет никакой гарантии, что какая-то конкретная тема попадет в какое-то конкретное место.

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

После ориентации графика тема время теперь находится в положении "три часа", а тема музыки примерно в положении "12 часов". Исходный код для ориентирования графиков находится здесь.

Кластеризация K-средних

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

Чтобы объединить похожие темы, я использовал алгоритм, называемый кластеризацией k-средних. Алгоритм направлен на группировку n выборок в k кластеров, в которых каждый образец принадлежит кластеру с ближайшим средним значением.

Вот как выглядят темы после использования k-средних для уменьшения данных до 50 кластеров.

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

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

Довольно забавно видеть, где приземляются ваши любимые группы. Некоторые группировки имеют смысл, например, видеть Брюса Спрингстина рядом с Элвисом Костелло. Но каким-то образом The Beach Boys зажаты между Radiohead и Nirvana. Я этого не ожидал.

Обсуждение и следующие шаги

Использование моделей больших трансформеров для органического тематического моделирования, по-видимому, хорошо работает для больших наборов данных. Запуск GPT-J в Google Colab — это экономичный способ проведения анализа. Следующее, что я мог бы попробовать, — это настроить GPT-J для поиска тем без указания примеров, что устраняет проблему с дырявыми примерами.

Другой проект должен был бы увидеть, насколько хорошо этот метод тематического моделирования сравнивается с другими методами. Например, я мог запустить его на наборе данных 20Newsgroups и посмотреть, как он сравнивается с современной системой двунаправленного состязательного обучения (BAT)[4]. В то время как метод BAT использует меньшую модель, обученную для выполнения конкретной задачи тематического моделирования, мой подход к использованию большой модели преобразователя может использовать общие знания для получения лучших результатов.

Исходный код и Colabs

Весь исходный код этого проекта доступен на GitHub. Я выпустил исходный код под лицензией CC BY-SA.

Благодарности

Я хочу поблагодарить Дженнифер Лим и Оливера Стримпеля за помощь в этом проекте.

Рекомендации

[1] Л. Гао и др., Куча: набор данных разнородного текста объемом 800 ГБ для языкового моделирования (2020)

[2] Ю. Ван и др., Сравнение платформ TPU, GPU и CPU для глубокого обучения (2019)

[3] Д. Сер и др., Универсальный кодировщик предложений (2018).

[4] Р. Ван и др., Нейронное тематическое моделирование с двунаправленным состязательным обучением (2020)

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