Музикалното поколение е в челните редици на машинното обучение. Към 2018 г. The Independent отчита, че рапът е най-популярният музикален жанр в Съединените щати. Поради голямото присъствие на рапа в нашето общество, ние решихме да създадем генератор на рап песни, използвайки машинно обучение.

За да се постигне това, има два генератора, които трябва да бъдат създадени: текстове и ритъм.

Генерация на текстове

Експериментирахме с три различни вида модела за писане на текстове, всеки по-успешен от предишния. Първо, опитахме модел, базиран на LSTM на ниво символ. Второ, внедрихме модел, базиран на LSTM на ниво дума. И накрая, използвахме трансферно обучение, за да обучим базирания на трансформатор GPT-2 на OpenAI за генериране на рап текстове. За всички тези модели използвахме „библиотека на Python“, за да изтрием текстове от Genius API. Можете да намерите текстовете, които генерирахме, в тази папка на устройството.

За да даде малко предистория, Крис Ола обяснява концепцията за мрежи с дългосрочна краткосрочна памет (LSTM), както и вниманието (отнасящо се до трансформаторите) в голяма дълбочина „тук“ и „тук“. Накратко, LSTM се основават на повтарящи се невронни мрежи (RNN). В основата си RNN е различен от нормалния NN, тъй като има вериги, които картографират изхода обратно във входа, което позволява на информацията да се запази в модела. За генериране на текст обаче трябва да се използва предварителна информация, въведена доста рано. Помислете за изречението: „Израснал съм в Германия, следователно владея немски.“ Би било трудно за RNN да познае немски, поради разстоянието в изречението между Германия и немски. LSTM обаче пренасят през мрежата разбиране на състоянието, което ги улеснява да отгатват информация, базирана на миналото. Transformers използват механизъм, базиран на вниманието, за да подчертаят минали ключови думи, за да подобрят точността на отгатването на следващата дума.

Генериране на текстове: LSTM модел на ниво символ с Keras

В нашето изследване открихме основен модел за генериране на текст „тук“, който възпроизведохме и експериментирахме с него. Моделът използва последователен модел на Keras с LSTM слоеве за генериране на текст символ по знак.

Избрахме Genius за 20 песни на Кендрик Ламар, на които да тренираме. Това възлиза на около 80 000 знака. След като получихме тези необработени данни и добавихме песните заедно, създадохме поредици от 100 знака. Те са генерирани чрез плъзгане на прозорец през набора от данни, а не чрез разделянето му. Всяка една от тези последователности представлява входно-изходна двойка, като първите 99 знака са входът на модела, а правилният изход е 100-ият знак. Както е посочено в източника по-горе, моделите на ниво дума обикновено са по-точни от тези на ниво знак. Въпреки това, тъй като общият брой уникални знаци в дадена част от текста обикновено е по-малък от броя на уникалните думи, обучението върху по-малък набор от данни може да бъде по-лесно, тъй като думите може да не се повтарят много пъти. В нашия случай обаче, ако използвате обучаващ текст с фиксиран размер, има много повече генерирани последователности от знаци, отколкото думи. Това води до голям брой параметри за обучение, което увеличава трудността на обучението.

След като получихме данни, ние настроихме и обучихме нашия модел. Използвахме последователния модел на Keras със следните слоеве:

Ние обучихме този модел с оптимизатора ADAM и категорична функция за загуба на кръстосана ентропия. Когато тренирате само с една епоха, резултатът е безсмислен – само една дума, повтаряна отново и отново. Когато се обучихме за повече епохи, успяхме да създадем разумни текстове. Открихме обаче, че това просто възпроизвежда сегменти от текст, които се намират в текстовете на обучението. Това очевидно е неидеално поведение. Искаме текстове, които имат някакъв смисъл (граматически), но също така са оригинални и не са откраднати от други изпълнители. На този етап решихме вместо това да проучим модел на ниво дума.

Генериране на текстове: LSTM модел на ниво дума с Keras

След като видяхме, че моделът на ниво герой просто възпроизвежда данните от обучението, ние започнахме да изследваме НЛП моделите на ниво дума. Отново използвахме последователния модел на Keras с множество LSTM слоеве. Този път се вдъхновихме от статията на Джейсън Браунли по темата. Ние също експериментирахме с добавяне на внимание към този модел, но производителността изглежда се влоши от това допълнение.

За разлика от модела на ниво знаци, трябваше да направим доста предварителна обработка на данни, преди да бъде готов за обучение. Отново изчерпахме Genius API за текстове на песни. Опитахме да тренираме както само с песни на Kendrick Lamar, така и с общо 52 песни от Drake, Kendrick Lamar, Jay-Z, Migos, Logic и Snoop Dogg. Премахнахме повечето препинателни знаци от текстовете и разделихме въведения текст на интервали. Тъй като искахме моделът да се научи да отваря/затваря скоби, крайни редове и крайни песни, всички те бяха кодирани като думи. За да позволим на невронната мрежа да работи с думи, ние използвахме токенизатор на Keras, за да картографираме думите в цели числа. Точно както по-горе с предишния модел, ние също генерирахме последователности от текстовете, които да използваме като данни за обучение. Вместо да са дълги 100 знака, те бяха дълги 50 думи. Когато тренирахме с множество артисти, създадохме общо 41 446 такива поредици и имахме 4 254 уникални думи.

Архитектурата на мрежата отново съдържаше два LSTM слоя:

След като настроихме тази невронна мрежа, ние обучихме ADAM с категорична кръстосана загуба на ентропия за 100 епохи с размер на партидата 128. Ние генерираме песни, като първо предоставим начален текст, за да може моделът да продължи. Това е произволно избрано от данните за песента. Реших да не включвам това първо семе в песента, тъй като не е произведено от модела. След като имате генерирания текст, можете да го подадете като ново семе и да произвеждате изход, докато невронната мрежа генерира текст, съдържащ думата, която маркира края на песен.

„Резултатите от този модел“ бяха смесени. За съжаление, обучението на множество изпълнители, а не само на Кендрик Ламар, влоши резултатите, тъй като няколко части от генерираната песен бяха взети от данните за обучение директно за опита с множество изпълнители. Моделът, генериран от текстове на Кендрик Ламар, обаче не просто копира данните за обучението. Това поставя модела на ниво на думата над модела на ниво на символ, който опитахме по-горе. За съжаление, текстовете не са много граматически правилни или последователни. За щастие, моделът GPT-2, който изследваме по-долу, подобрява драстично тази загриженост за граматиката и съгласуваността.

Генериране на текстове: GPT-2

GPT-2 е трансформаторен модел. Първоначално той беше обучен на 40 GB текст, извлечен от интернет с над 1,5 B параметри. Този модел обаче не беше пуснат поради съображения за сигурност. Бяха пуснати обаче по-малки версии — една със 774M параметри и една с 345M параметри. Избрахме да използваме модела с 345M параметри, тъй като моделът с параметри 774M изчерпа паметта, когато се опитахме да обучим с него. Въз основа на генерираните текстове, това изглеждаше най-успешният модел от трите, които опитахме. Изглежда, че има по-добро разбиране на граматиката и контекста от двата предишни модела. Тази производителност има смисъл, защото GPT-2 вече беше обучен на огромно количество данни, които просто не можахме да съпоставим в моделите, които обучихме сами поради ограничените ни ресурси. Тези резултати демонстрират силата на трансферното обучение. За съжаление, GPT-2 също от време на време репликира текстове, намерени в данните за обучение. Въпреки това оригиналните текстове, които генерира, обикновено са с по-високо качество от тези, написани от модела LSTM.

Ако искате да видите кода за скрепера, той е тук.

За да създадете проект като този, първо се нуждаете от набор от данни. В нашия случай ние изтрихме Genius.com за текстове. Първо, трябва да получите API ключ, като използвате инструкциите тук. Използвахме библиотеката LyricsGenius, за да съберем текстове на различни рапъри.

Ако искате да видите кода на модела, той е тук. Текстовете, които генерирахме, могат да бъдат намерени тук.

След получаване на данни, човек може да използва предварително обучен модел (в нашия случай GPT-2), за да генерира текст. Актуализирах това репо, за да използвам модела 345M вместо модела 117M.

Музикален модел LSTM

Рап ритъмът е съставен от различни слоеве, включително барабанна линия, основна линия и мелодия. Докато първоначално обучихме „модел на класическа музика“ с midi файлове, които компресираха всички инструменти в един инструмент, открихме, че е необходимо да изолираме различните слоеве на песента, да изградим отделни модели и да ги комбинираме отново, за да създадем най-ефективния ритъм . Това обаче се оказа трудно поради липсата на данни в мрежата и препоръчваме да създадете свои собствени данни за обучение за оптимални резултати.

За действителното генериране на ритъм и „песен“ открихме модел, който използва Music21 и Keras за генериране на музика с помощта на LSTM. Както при модела за генериране на текст, музикалният модел също използва последователен модел на Keras с LSTM слоеве. Този модел Keras използва слоевете, изброени по-долу:

Моделът използва Music21, за да трансформира песен (в midi файлов формат) в поредица от ноти и акорди. От тук моделът се създава със слоевете, изброени по-горе. Повече подробности за модела можете да намерите тук. Нашият източник за midi файлове е тук (и YouTube).

Първоначално генеративният модел LSTM се използва за класическа музика. За нашите цели ние тренирахме на 30 рап midi файла. Открихме, че генерираната музика е привидно изкривена и има много малка, ако изобщо има връзка със структурата на рап музиката. След като се запознахме с модела и слушахме рап midi файлове, които създадохме, разбрахме, че класическата музика, използвана от оригиналния модел, използва само един инструмент (пианото).

Успяхме да създадем това „извадково произведение“ с 10 епохи.

Успяхме да създадем това „извадково произведение“ с 20 епохи.

При следващия ни опит създадохме модел, който използва само удари на барабани и контролира темпо и стил. С помощта на GarageBand изолирахме барабанната линия на някои от оригиналните midi файлове, върху които бяхме тренирали. Оказа се трудно да се намерят данни онлайн за барабанни линии за рап ритми. В крайна сметка имахме само 10 песни в тренировъчния комплект. За оптимални резултати ви препоръчваме да генерирате свои собствени данни за обучение в студио. След това преквалифицирахме модела по-горе върху този модифициран „набор от данни“ и успяхме да произведем музика, която звучи като „това“.

Има две основни подобрения, които могат да бъдат направени по модела. Първо, променете модела, за да използвате бийтове вместо ноти като предсказващ фактор, тъй като темпото и продължителността на такта са определящите фактори за рап ритъма. Второ, в идеалния случай моделът би тренирал върху необработени wav файлове вместо midi файлове, така че тембърът да може да бъде взет предвид при генериране на ритъма. Това би изисквало повече изчислителна мощност и преструктуриране на модела като цяло, тъй като библиотеката Music21 работи най-добре с midi входове. По същия начин, модел, който създава wav файлове вместо midi файлове, би звучал по-точно.

Заключение

Има голям потенциал за създаване на генератор на рап песни. За генериране на текстове открихме обещаващи резултати с базирани на LSTM модели на думи, но текстовете, генерирани чрез използване на трансферно обучение с GPT-2, бяха много по-добри. За музикалното поколение установи, че моделът LSTM е най-ефективен. Успяхме да пренастроим моделите на поколение класическа музика, за да създадем барабанната линия за рап. Идеалният модел обаче би използвал wav файлове вместо midi файлове като тренировъчни и изходни данни, така че тембърът да се запази.

Допълнителни източници