Модель создания текста с использованием сетей LSTM для создания текстов песен

Авторы: Джейкоб Кларисс, Уилл Истерби, Соруш Фамили, Джей Хун Ким, Джеймс Лу и Нитан Рам

Обзор

Эта статья является кульминацией нашего исследования и работы в EE460J (Data Science Laboratory) в UT Austin. В этой статье мы обсудим и расширим наш последний проект: генератор текстов песен. Сначала мы дадим некоторый фоновый контекст и обсудим техническую основу нашего генератора текстов песен (например, рекуррентные нейронные сети, сети LSTM). Далее мы покажем наш подход к сбору данных и их предварительной обработке. Затем мы объясним, как мы построили и обучили наш генератор текстов песен. Наконец, мы обсудим наши результирующие модели и то, как они работают в тандеме с моделью BERT.

Фон

Обработка естественного языка (NLP) - это стремительно развивающаяся область в мире технологий. Поскольку уровень абстракции между людьми и компьютерными системами становится все более конкретным и узким, становится понятно, почему НЛП так популярно. Наша группа хотела изучить это направление науки о данных глубже, чем то, что мы рассмотрели в нашем классе. Выбрав НЛП в качестве темы нашего проекта, мы хотели посмотреть, с какой конкретной проблемой в рамках НЛП мы могли бы работать. Мы решили работать с музыкой, в частности, над написанием текстов песен, из-за взаимного интереса к популярной музыке. После разговора с нашим профессором о принципах генерации текста и сетей долгосрочной краткосрочной памяти (LSTM) мы поставили цель создать генератор текстов песен, состоящий из нескольких сетей LSTM для генерации текстов в разных жанрах: рок, хип-хоп, Поп и инди.

Техническое содержание

Рекуррентные нейронные сети (RNN)

RNN - это особый тип нейронной сети, который позволяет использовать прошлые выходы в качестве входов. Они используют абстрактную концепцию последовательной памяти, означающую, что последовательность элементов предоставляет больше информации и эффективность для получения выходных данных из модели (подумайте об алфавите). Последовательностям присуще качество структуры и информации. RNN способны понимать последовательности и закономерности и использовать их для прогнозирования. Они делают это, создавая в сети цикл обратной связи, который берет предыдущую информацию и применяется в качестве следующей итерации входных данных. Этот цикл обратной связи известен как скрытое состояние; векторное представление предыдущих входных данных. Это позволяет информации сохраняться на протяжении всей модели, чего не могут сделать традиционные сети с прямой связью.

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

Сети с долгосрочной краткосрочной памятью (LSTM)

Как упоминалось выше, одним из критических недостатков RNN является то, что они испытывают трудности с изучением зависимостей на больших расстояниях между временными шагами. По сути, у них кратковременная память: RNN не могут получить доступ к информации, полученной в давние времена. Введите проблему V изменения градиента - градиент функции потерь (значения, используемые для обновления весов) экспоненциально сжимается во время обратного распространения и постепенно спадает до нуля. Если градиент становится слишком маленьким (и в конечном итоге нулевым), мало способствует обучению. Более ранние слои нейронной сети не могут обучаться из-за очень незначительной корректировки весов с помощью невероятно малых градиентов.

Чтобы решить эту проблему, мы можем использовать LSTM. LSTM - это специализированный тип RNN, который способен изучать долгосрочные зависимости. LSTM обладают способностью сохранять ошибку, которая может распространяться в обратном направлении во времени и слоях. Удерживая более постоянное значение ошибки, они улучшают RNN, позволяя им продолжать обучение в течение многих временных шагов.

LSTM могут выполнять это с помощью вентилей - тензорных операций, которые могут узнать, какую информацию добавить или удалить из скрытого состояния. Каждый блок в сети LSTM имеет входной вентиль, вентиль «забыть» и выходной вентиль. Входной вентиль имеет возможность оценивать ценность данной информации. «Шлюз забывания» может решить, следует ли удалить информацию или сохранить ее для использования в будущем. Выходной вентиль по существу решает, будет ли информация полезна на определенном этапе. Во время каждого шага ворота принимают входные данные как параметр сигмоидной функции. Сигмоид возвращает значение от 0 (ничего не пропускать через ворота) и 1 (пропускать все через ворота). Эта концепция применяется во время обратного распространения (обновления значений слоев).

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

Набор данных

Данные

Первым шагом, который мы сделали для создания нашего генератора текстов, был поиск набора данных, который можно было передать в сеть LSTM. Сначала мы подумали о том, чтобы скопировать тексты песен из репозитория песен Spotify, но, к счастью, нашли довольно надежный набор данных на Kaggle. Набор данных (взятый из MetroLyrics) содержит более 380 000 текстов песен разных жанров и разных исполнителей в этих жанрах, начиная с 1960-х годов. Наша основная задача с набором данных заключалась в извлечении его подмножества, которое было достаточным, но не слишком большим, поскольку при первоначальной сборке нашего генератора текстов мы несколько раз сталкивались с проблемами памяти. Мы смогли обойти эти проблемы, очистив наш набор данных от пустых точек данных (метаданные, но без слов), отфильтровав данные по годам, чтобы использовать только песни текущего десятилетия, и ограничив каждого исполнителя в жанре до десяти песен. Набор данных содержит название песни, год выпуска, имя исполнителя, жанр и текст для каждой отдельной записи данных. Мы создали отдельные файлы CSV для каждого жанра, чтобы обучить наши модели на основе этого набора данных (проверьте ссылки внизу, если вы хотите изучить этот набор данных).

Предварительная обработка

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

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

Конструкция модели

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

Наша модель использует 5 слоев LSTM с 256 узлами в каждом, 1 входной слой со 100 последовательностями символов, которые мы сгенерировали во время предварительной обработки данных, 1 слой сглаживания, 1 плотный слой и, наконец, 1 слой активации с функцией активации softmax, поскольку мы пытаемся посмотрите, какой символ наиболее вероятен для предыдущего символа. Мы решили использовать слои CuDNNLSTM (быстрая реализация LSTM с использованием библиотеки CuDNN, предоставленной Keras), поскольку мы обнаружили через другие источники, что слои CuDNNLSTM используют GPU, а не CPU, и могут работать примерно в десять раз быстрее. Мы решили пойти по этому пути, чтобы ускорить построение наших моделей из-за ограничения времени. Для компиляции функции потерь мы использовали «категориальную перекрестную энтропию», потому что мы заметили, что несколько предшествующих уровней техники, относящихся к этому проекту, также использовали ту же функцию потерь и оптимизатор. Мы использовали оптимизатор adam, потому что он эффективен с вычислительной точки зрения и не требует слишком много памяти.

После настройки архитектуры нашей модели мы продолжили обучение моделей с учетом 100 последовательностей символов во входном слое.

После того, как модели были обучены и соответствовали предоставленным данным, мы смогли ввести последовательность из 100 или более символов и посмотреть, как модель выводит столько строк песни, сколько указано пользователем. Мы также добавили модуль для предотвращения появления каких-либо ругательств на консоли (очевидно, для поддержания профессионализма) из проекта, известного как «Лучшая ненормативная лексика» (ссылка приведена в ссылках).

Интеграция с BERT

Двунаправленные представления кодировщика от трансформаторов (BERT) - это недавний метод НЛП, открытый исследователями Google. С точки зрения высокого уровня, BERT функционирует с помощью преобразователей (техника НЛП, использующая внимание), чтобы понимать и изучать отношения между словами. Он работает как двунаправленный метод, поэтому он может понять контекст или отношение слова к соседним с ним словам в данном корпусе. Самым большим преимуществом модели BERT является то, что она позволяет передавать обучение, значительно ускоряя процесс обучения, но при этом сохраняя точность.

Модель BERT имеет множество языковых приложений. Одно из таких приложений - классификация. Мы решили реализовать модель BERT как функцию нашего генератора текстов. Когда пользователь не указывает жанр ввода в генератор текста, BERT может анализировать входную последовательность слов и классифицировать, к какому жанру он принадлежит. Он может выбрать, какую нашу модель запустить, чтобы создать нужный жанр текстов. Используя репозиторий Google BERT Github (ссылка на который есть в ссылках), мы обучили BERT, используя 100 образцов из каждого жанра, причем каждый образец был разбит на 100 последовательностей символов. После обучения BERT на графическом процессоре Google мы получили точность оценки 0,897 и смогли успешно интегрировать ее с нашим генератором текстов песен.

Полученные результаты

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

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

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

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

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

Глядя на категориальные потери кросс-энтропии на эпоху для модели Indie, мы можем увидеть, как постепенное увеличение количества эпох приводит к гораздо более приемлемому значению потерь, а также к лучшему выходу (как показано выше с текстовыми результатами). Это было тенденцией для всех других наших моделей, и мы могли видеть, насколько хорошо они работают с растущим числом эпох. Однако в какой-то момент после 10 эпох модель просто сходилась к постоянному решению. Итак, мы увидели, что нет линейной зависимости между количеством эпох и производительностью нашей модели.

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

Обнаруженные проблемы

Определенно, были некоторые проблемы, с которыми мы столкнулись во время выполнения этого проекта. Самым большим препятствием, которое нам пришлось преодолеть, было время. Имея больше времени, можно было бы более агрессивно тренировать и настраивать модели генерации текстов, а также BERT. Было бы идеально для каждой модели видеть, какова оптимальная скорость обучения или сколько эпох требуется для максимальной потери. К сожалению, даже при использовании графического процессора Google на обучение некоторых моделей все равно уходило около 6–9 часов. Если бы для настройки использовался GridSearchCV или RandomizedSearchCV, трудно сказать точно, сколько времени это могло занять, учитывая сложность структуры нашей сети LSTM.

Другим ограничением, с которым мы столкнулись, была память. Потребовалось много проб и ошибок, чтобы определить размер надлежащего подмножества данных, на котором сеть LSTM могла бы тренироваться. Если бы у нас было больше места в памяти, мы потенциально могли бы создать еще более надежную модель генерации текста благодаря большему количеству генерируемых последовательностей пар вход-цель. Мы также могли бы потенциально уменьшить дисперсию данных, используя больше песен для каждого исполнителя, а не только 10. Переполнение памяти было довольно распространенной проблемой, которая приводила к сбоям на протяжении всего процесса разработки, что побудило нас решить ее на очень раннем этапе. Чтобы решить эту проблему и при этом сохранить набор данных, нам нужно либо больше ОЗУ (для нас это невозможно!), Либо обучать партиями (Keras.fit_generator). Это заняло слишком много времени и было сочтено невозможным.

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

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

Заключение и дальнейшая работа

В заключение, мы смогли создать четыре рабочих генератора текста для четырех жанров, для которых мы намеревались создать модели. Лучше всего работает поп-модель, за ней следует хип-хоп, затем рок, затем инди. Мы также смогли интегрировать BERT с нашим набором моделей, чтобы создать компонент классификатора текста в начальной точке нашего генератора текстов. Теперь мы можем создавать свои собственные микстейпы! Созданный нами генератор текстов важен и интересен для нас, потому что мы смогли глубже погрузиться в НЛП и нейронные сети, чтобы увидеть, какие у них есть абстрактные приложения. В наши дни, когда все автоматизируется и улучшается благодаря машинному обучению, наш проект, похоже, согласуется с идеей о том, что приложения НЛП и науки о данных могут распространяться на любую область, которую только можно вообразить. Интересно видеть, насколько на самом деле является междисциплинарной наукой о данных и как она может преодолеть разрыв между STEM и другими отдельными областями (в данном случае музыкой).

Есть множество способов улучшить и расширить этот проект в будущем. Прежде всего, мы определенно могли бы решить некоторые из вопросов, обсуждаемых в разделе выше. Агрессивная настройка гиперпараметров - это один из способов, который можно предпринять в будущем, чтобы увидеть, можно ли улучшить производительность модели как со стороны LSTM, так и со стороны приложения BERT. Мы могли бы также применить эту модель к другим литературным формам и средствам, таким как поэзия. При правильном наборе данных генератор текстов может превратиться в генератор стихотворений. Одно сложное приложение, над которым задумалась наша группа, - это добавление большего количества слоев или создание параллельного LSTM, чтобы добавить высоту и ритм к текстам, которые он генерирует. Поступив так, мы могли бы получить более всеобъемлющий и полезный движок для создания музыки.

использованная литература

Цифры:

Рисунок 1: https://towardsdatascience.com/illustrated-guide-to-recurrent-neural-networks-79e5eb8049c9

Рисунок 2: https://towardsdatascience.com/illustrated-guide-to-recurrent-neural-networks-79e5eb8049c9

Рисунок 3: https://pathmind.com/wiki/lstm

Рисунок 4: https://colah.github.io/posts/2015-08-Understanding-LSTMs/

Рисунок 5: https://medium.com/mlreview/understanding-lstm-and-its-diagrams-37e2f46f1714

Рисунок 9: https://towardsdatascience.com/text-predictor-generating-rap-lyrics-with-recurrent-neural-networks-lstms-c3a1acbbda79

Набор данных:

Https://www.kaggle.com/gyani95/380000-lyrics-from-metrolyrics

Другое:

Https://medium.com/@shivambansal36/language-modelling-text-generation-using-lstms-deep-learning-for-nlp-ed36b224b275

Https://www.youtube.com/watch?v=BSpXCRTOLJA

Https://towardsdatascience.com/ai-generates-taylor-swifts-song-lyrics-6fd92a03ef7e

Https://datascience.stackexchange.com/questions/43176/recurrent-neural-network-lstm-not-converging-during-optimization

Https://blog.floydhub.com/a-beginners-guide-on-recurrent-neural-networks-with-pytorch/

Https://www.youtube.com/watch?v=xfuVcfwtEyw

Https://medium.com/huggingface/multi-label-text-classification-using-bert-the-mighty-transformer-69714fa3fb3d

Https://towardsdatascience.com/how-to-do-text-binary-classification-with-bert-f1348a25d905

Https://towardsdatascience.com/beginners-guide-to-bert-for-multi-classification-task-92f5445c2d7c

Https://datascience.stackexchange.com/questions/28210/keras-callback-example-for-saving-a-model-after-every-epoch

Https://towardsdatascience.com/simple-guide-to-hyperparameter-tuning-in-neural-networks-3fe03dad8594

Https://machinelearningmastery.com/adam-optimization-algorithm-for-deep-learning/

Используемые пакеты:

Https://pypi.org/project/better-profanity/

Https://github.com/google-research/bert

Https://keras.io/

Ссылка на записные книжки кода:

Https://colab.research.google.com/drive/1FYEOKlW88Ir8KSM0hrHp0KwRLA0iZdmd?usp=sharing

Https://drive.google.com/a/utexas.edu/file/d/1hM8oOYQDcEp_fbruwrv2VXOMxPygEojG/view?usp=sharing

Https://colab.research.google.com/drive/1tk6BIc_DC0zBBN-QX0bMrSjFe8GnM32k?usp=sharing