Шуткое название кликбейта задумано, но все же остается простой концепцией.

Это Часть III Построения А.И. Музыкальный генератор . Я расскажу об основах многозадачного обучения с помощью музыкальных моделей, которые мы будем использовать, чтобы делать действительно крутые вещи, такие как гармонизация, генерация мелодии и создание ремиксов песен. Мы будем строить на Части I и Части II.

Фон

Как вы знаете, Трансформеры недавно произвели революцию в пространстве НЛП. Как вы, наверное, знаете, существует несколько различных вариантов трансформатора. Все они имеют одинаковые базовые уровни внимания, но некоторые из них предназначены для разных задач. Вот 3 самых крутых:

Seq2Seq (перевод из последовательности в последовательность) - использует архитектуру кодировщика-декодера для перевода между языками. Это трансформатор OG, который начал революцию.

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

BERT - двунаправленный кодировщик, производящий результаты SOTA для ответов на вопросы и заполнения пропусков. Маскирование токенов и двунаправленность позволяют создавать исключительный контекст.

Черт, все эти вариации такие классные! Вместо того чтобы выбирать одно, почему бы просто не объединить их?

Чего ждать?!?

Потерпи меня на секунду.

Многозадачная модель, чтобы управлять ими всеми

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

TransformerXL отлично подходит для создания текста. Seq2Seq отлично подходит для языковых переводов. BERT отлично заполняет пробелы. Нет причин, по которым вам когда-либо захочется делать все три сразу.

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

Давайте рассмотрим несколько сценариев, когда вы думаете о сочинении песни:

Задача 1. У меня есть пара заметок, которые я хочу превратить в песню.

TransformerXL отлично подходит для создания последовательностей. Давайте воспользуемся им для автозаполнения идеи вашей песни.

Задача 2а. Моя мелодия требует гармонии.
Задача 2б. У меня есть аккордовая прогрессия. Теперь мне нужен крючок.

Seq2Seq отлично подходит для задач перевода. Мы можем использовать это для перевода мелодии в аккорды. Или наоборот.

Задача 3а. У меня есть песня, но что-то не так.
Задача 3б. Этой песне нужен лучший ритм.

BERT отлично подходит для заполнения пробелов. Мы можем стереть определенные части песни и использовать BERT для создания нового варианта.

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

Играй в первую очередь, понимай позже

Чтобы понять, что мы здесь пытаемся сделать, может быть полезно поиграть с моделью многозадачности, которую мы пытаемся создать.

Каждая демонстрация создана для решения конкретной задачи. Переключайтесь между предсказанием (красные ноты) и исходным (зеленые ноты), чтобы услышать разницу.

Задача 1. Создание песни
Канон в реале Пахельбеля

Задача 2а. Гармонизация мелодии
Где любовь Black Eyed Peas »

Задача 2б. Новая мелодия с существующей последовательностью аккордов
Scary Monsters and Nice Sprites от Skrillex »

Задача 3а. Тот же ритм, другая песня
Уровни от Avicii »

Задание 3b. Та же песня, ремикс бит
Fur Elise Бетховена »

Строительство монстра

Ты вернулся. А теперь давайте построим эту штуку.

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

Я предполагаю, что вы уже знаете, как работает перевод Seq2Seq. Если нет, посетите эту невероятную иллюстрацию трансформера.

Seq2Seq

Хорошо, теперь давайте представим, как Seq2Seq Transformer может работать с музыкой.

Очень похоже на то, как вы переводите язык. Аккорды (язык ввода) переводятся в мелодии (целевой язык).

«Предыдущий вывод» возвращается в декодер, поэтому он знает, что уже было переведено.

Кодировщик против декодера

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

Блоки синего кодировщика представляют собой отдельные двунаправленные уровни внимания. Они могут видеть как предыдущие, так и будущие токены.

Красные блоки декодера - это двойные слои прямого внимания. Блоки с двойным стеком используют как вывод кодировщика, так и «предыдущий вывод» в качестве контекста для предсказания мелодии. Прямые слои не могут видеть будущие токены - только предыдущие токены.

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

Давайте взглянем.

БЕРТ

Сотрите несколько заметок, и BERT заполнит пробелы:

Мы обучаем кодировщик предсказывать правильные ноты (красным) всякий раз, когда он видит замаскированный токен (синий).

TransformerXL - Следующее слово

Вы узнаете эту диаграмму из предыдущих сообщений.

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

Собираем все вместе

Как видите, модель Seq2Seq представляет собой комбинацию кодировщика BERT и декодера TransformerXL. Это означает, что мы можем повторно использовать кодировщик и декодер из модели Seq2Seq для обучения задачам BERT и TransformerXL. Единственное, что меняется, - это вход и цель.

Напоминаем о трех наших предыдущих задачах:

Задача 1. Создание музыки с помощью TransformerXL

Задача 2a / 2b. Преобразование мелодии в аккорды / аккорды в мелодию с помощью Seq2Seq

Задача 3a / 3b. ремикс песни с BERT

Решение многозадачности №2.

Ранее вы видели, как переводить мелодию в аккорды (2а.). Задача «Аккорды в мелодию» (2b.) Точно такая же, но с перевернутыми входом и целью.

Многозадачность №1 и №3

Поскольку BERT использует только слои кодера, а TransformerXL использует только слои декодера, задача №1 и задача №3 могут быть обучены одновременно. На стороне BERT мы маскируем ввод и отправляем его через кодировщик. Параллельно мы подадим сдвинутый вход в декодер для обучения TransformerXL.

Вот как это выглядит:

  • Кодировщик обучен маскированной задаче.
  • Отдельно и параллельно декодер обучается следующей задаче токена.

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

Вуаля! Вот наша модель в коде

Надеюсь, эта модель понятна тем из вас, кто использовал PyTorch.

Model architecture:
Encoder - Bi-directional attention layers
Decoder - Uni-directional double-stacked attention layers
Head - Dense layer for token decoding
Forward Prop:
1. If the input is masked ('msk'), train the encoder.
2. If the input is shifted ('lm'), train the decoder.
3. If the input contains both translation input ('enc') and previous tokens ('dec'), use both encoder and decoder.

Запустите этот блокнот для реального обучения.

Вот и все, что нужно для обучения многозадачной модели.

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

Маскированные токены обучают кодировщик (BERT). Сдвинутые токены обучают декодер (TransformerXL). Парные последовательности тренируют оба (Seq2Seq).

К результатам

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

Чтобы включить Задачу 1, 2a, 2b, 3a, 3b, просто переключите этот переключатель:

Альтернативная площадка площадка

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

Еще больше результатов

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

Часть IV. Использование музыкального бота для ремикса The Chainsmokers - мы подошли к моему последнему и любимому посту из серии!

Спасибо за терпение!

Особая благодарность Kenneth, Jeremy Howard, SPC и PalapaVC за поддержку.