Впервые это было опубликовано в моем блоге в августе 2017 года. Я учился (и все еще учусь), поэтому, пожалуйста, простите - или, еще лучше, укажите - ошибки, которые я мог допустить.

Глубокий Рапспир

Синтез Рэп-склоняемого Шекспира с использованием рекуррентной нейронной сети LSTM, вдохновленной Карпати

Введение - Подготовка к тренировке - изменение кода - И вот! - Заключительные замечания

«MOTH. Но проверьте это своей душой (может больше) на этом мальчике ». - краткий отрывок из окончательного результата.

Введение

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

Подготовка обучающих данных

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

Я не предоставил код для парсинга (как всегда говорил мой отец: Ты либо параноик, либо глупый), но пролистать документацию Beautiful Soup не составит большого труда. и / или посмотреть на существующие реализации. Я написал простой скрипт (Mixer.py) для чередования строк между текстом Шекспира и лирикой рэпа, чтобы RNN обучался равномерно по обоим текстам, а также потому, что предложение является наименьшей единицей выражения, которая сохраняет согласованный синтаксис и идеи. Если бы у вас, скажем, чередовались слова рэп и Шекспир, результатом была бы неинтересная путаница слов без четкого синтаксиса, характерного для рэпа или Шекспира.

Изменение существующего RNN символа

Я использовал символ RNN, вдохновленный Karpathy LSTM Я нашел на Github с использованием Lasagne и Theano. Однако при попытке повторно использовать этот код пришлось кое-что изменить.

Во-первых, эта модель фактически не сохраняла веса, поэтому была добавлена ​​функция save_weights (), которая позволяет сохранять результаты обучения и передавать их друзьям, чтобы они могли весело провести время с Rapspeare без дорогостоящего графического процессора.

Во-вторых, я уменьшил общее количество эпох до 30 с 50, потому что я не замечал никаких реальных улучшений после 20 или около того эпох (как и те дети, которые достигли пика в средней школе, я увидел, что Rapspeare в значительной степени раскрыл свой потенциал при архитектуре дизайна, которая Я выбрал, вот и решил отключить там). Не говоря уже о том, что это немного повредило моему кошельку под сервером p2 GPU, за который я платил за гигабайт-час.

Я внес другие небольшие изменения (добавив сообщения print () и т. Д.), Но, к сожалению, не дошел до реструктуризации всего этого. Если вы посмотрите на Rapspeare, вы увидите, что многие функции содержатся в большой функции main (num_epochs = NUM_EPOCHS). Это не лучшая практика, поскольку она мешает вам вызывать функции вне области действия main (), что вам может потребоваться в оболочке python, если вы хотите просто сгенерировать текст и не иметь вся сеть переквалифицировалась на время.

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

Вот!

«И вот, ибо Земля была пуста от Формы и пуста. И Тьма окутала Лик бездны. И Мы сказали: «Посмотри на этот ублюдок Танец». - Дэвид Фостер Уоллес

Наконец, после нескольких часов головокружительной отладки, чтения документации и недоумения, почему я был таким глупым, на краю экрана моего компьютера появился краткий свет, и голос сказал: «Прямо из чертовых Dungeons of Rap , Пак заставил твоих мальчиков понять, что они были / 'Бастин', как стрелок в киску, Standin Flashflook, я одет как Эмилемс '. Асиндетон в первом предложении, с' Пак, пусть твои мальчики, они были ', действительно пробуждает чувство дезориентации и спешки. У вас возникает ощущение, что говорящий пытается убежать от какой-то отвратительной силы и, возможно, он дряхлый (с болезнью Альцгеймера?). Портманто во второй строке «shooterstandin» передает это чувство невероятной спешки и, по моей оценке, сам по себе мог бы быть стихотворением.

Но этот невероятный подвиг словотворчества произошел не внезапно. Первые несколько итераций были немного менее красивыми. Обратите внимание, что исходная фраза была «Быстрые прыжки коричневой лисы».

После остановки менее чем через целую эпоху он все еще оставался в младенческой форме, бормоча в повторении:

The quick brown fox jumps and the the the the the the the the the the the the the the the the the the the the...

Подождав немного (потеря журнала = 1,60), все быстро стало немного интереснее:

The quick brown fox jumpsmO One man Lord Herry try trouch, The voloun remaintry Chife, y'all know the copligee, I cun thou: That the coppitian this But the lose word discupis in can cause I what keetin' lipen on the bast of s

Здесь Рапспир получил довольно хорошее представление о капитализации, но все еще укрепляет свое понимание паттернов, образующих слова, и поэтому в основном говорит неологизмами (если такие слова, как «Trouch» и «Coppitian» можно назвать таковыми). Предположительно «y’all» исходит из рэпа.

Затем я устал от «быстрой коричневой лисы» и хотел попробовать что-нибудь еще в качестве исходного текста, поэтому я использовал «Ромео, Ромео, зачем ты?», Чтобы посмотреть, сможет ли Рапспир придумать, как завершить фразу. Конечно, меня развлекали:

Romeo, Romeo, wherefore art thou Romeos; and so running too earshun To find so music her sisters, pretty bad good do not meet mine yourselves to death... Canatic, and my N****s... As much desires of the story Strike the tablest maid for your promises... Pale paradoles with rock, pardon: and played open bottoms... O mama gatherates, I care another day youza hig.

Некоторые части на самом деле удивительно поэтичны по-новому; Мне очень нравится выражение «найти такую ​​музыку», и оно работает с «слухом». Также аллитерация «p» с «Бледными парадолами с роком, простите: и / играл…». Кроме того, в этот момент вы можете заметить интонации разных голосов (такое ощущение, что застывшего, спотыкающегося Тупака с паршивой дикцией вызывают последняя строка «O mama gatherates, я забочусь еще раз, youza high»), и Рапспир в этом месте может заменить, по крайней мере, последнее слово, хотя и неправильно во множественном числе, цитаты Шекспира. Это было бы примерно в эпоху 7 (функция потерь журнала около 0,9).

И, после многих лет симуляции рэп-баталий, читая только лучших английских драматургов и самых оригинальных современных рэперов (украшенных Кендриком Ламаром, MF Doom, Nas, Тупаком Шакуром, Канье Уэстом, Notorious B.I.G.), Рапспир изрыгает огонь:

включить музыку

Straight out the fuckin dungeons of Rap, Pac put your boys get they were 'Bustin' like a pussy shooterstandin Flashflook, I am dressed Emilems TOUCHSTONE. Now muthat's order man what has who incressed rap made saleThey say iesa MOTH. But do check it out your soul (May more) D on this boy Sire and fire her poremanion, God forgetter me When there's a perhnect down faith intents KING HENRY. Ay, so? Cut me, Master Saturn; and *let me get me raped* outBackin' law in voiceras are -a Brok'r off! Nop

Причудливо и бессвязно, но болезненно интригующе. Вероятно, не следующий писатель-призрак Дрейка.

Все хорошо, что кончается - Заключение

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

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

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

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

Если вы хотите просмотреть более интересные результаты, я загрузил документ с некоторыми окончательными результатами обучения (Lyrical_Rapspeare.txt).

Мне нужно поблагодарить @sorenbouma за его значительную помощь и руководство в этом; Я бы не смог этого сделать без его поддержки, намеков и щедрого времени.

Найдите репозиторий github здесь.