Как нейронные сети создали музыку по мотивам Скрябина

13.06.2017

Свою конференцию Yac-2017 Яндекс начали с музыки, написанной нейронной сетью на основе произведений Александра Скрябина, давайте разберемся как это возможно, и почему это работает.

Совсем недавно я публиковал свою статью об искуственном интеллекте и искусстве. Где рассказывал про такой проект "Нейронная оборона" - нейронная сеть, составившая стихи на основе произведений Егора Летова. (Если вы не знали ничего об этом, советую прочитать предыдущую статью.)

Яндекс не стали останавливаться и в этом году создали нейронную сеть, способную генерировать музыку в стиле композитора Александра Скрябина.

Александр Скрябин
Александр Скрябин

Скрябин знаменит тем, что впервые использовал свет при исполнении музыки, тем самым введя понятие "Светомузыка".

Рекуррентные сети

Ранее для нейронных сетей способных создавать использовали так называемую архитектуру рекурретных нейронных сетей.

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

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

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

Автоэнкодер

Однако программисты из Яндекса нашли новый метод для создания произведений машинного искусства. Для этого они использовали модель автоэнкодера.

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

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

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

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

Но какой в этом смысл?
- Смысл есть!

Представим, что мы подали на фход енкодера изображение собаки, и он нам сказал, что это: Собака, рыжего цвета, с черным носом, белой грудкой и лапами

Далее передадим эту информацию декодеру, которы нам нарисует собаку по этим характеристикам.

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

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

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

Не забудь поставить лайк и подписаться на канал :D