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

Зачем использовать аудиовстраивания для рекомендаций музыки?
Стриминговые платформы (Spotify, Apple Music и др.) должны иметь возможность рекомендовать пользователям новые песни. Чем лучше рекомендации, тем лучше качество прослушивания.
Существует множество способов построения рекомендательных систем на этих платформах. Современные системы объединяют различные методы рекомендаций в гибридную структуру.
Вспомните, как вы впервые подключились к Spotify: вас наверняка спросили, какие жанры вам нравятся. На основе выбранных вами жанров Spotify порекомендовал несколько песен. Рекомендации, основанные на метаданных песен, называются контентной фильтрацией. Также используется коллаборативная фильтрация, которая группирует пользователей со схожим поведением, а затем предложения передаются между ними.

Два описанных выше метода в значительной степени опираются на поведение пользователей. Другой метод, который все чаще используется крупными стриминговыми сервисами, заключается в использовании глубокого обучения для представления песен в обученных пространствах встраивания. Это позволяет представлять песни в многомерном пространстве встраивания, которое отражает ритм, тембр, текстуру и стиль продакшена. Затем можно легко вычислить сходство между песнями, что масштабируется лучше, чем использование классических подходов коллаборативной фильтрации, при рассмотрении сотен миллионов пользователей и десятков миллионов треков.
Благодаря развитию LLM-моделей, векторные представления слов и фраз стали широко распространены и относительно хорошо изучены. Но как работают векторные представления для песен и какую проблему они решают? В оставшейся части статьи мы рассмотрим, как аудио становится входными данными для модели, какие архитектурные решения кодируют музыкальные характеристики, как контрастное обучение формирует геометрию пространства векторных представлений и как система рекомендаций песен, использующая векторные представления, может работать на практике.
Как аудиосигнал становится входными данными для нейронной сети?
Исходные аудиофайлы, такие как MP3, по сути представляют собой волновую форму — быстро меняющийся временной ряд. Обучение на основе таких файлов возможно, но обычно требует больших объемов данных и больших вычислительных затрат. Мы можем преобразовать файлы .mp3 в мел-спектрограммы, которые гораздо лучше подходят в качестве входных данных для нейронной сети.
Мел-спектрограммы — это способ представления частотного содержимого аудиофайла во времени, адаптированный к тому, как человек воспринимает звук. Это двумерное представление, где ось x соответствует времени, ось y — частотным полосам, масштабированным по мелу, а каждое значение представляет собой логарифмически масштабированную энергию в этой полосе в данный момент времени.

Цвета и формы, которые мы видим на мел-спектрограмме, могут содержать важную музыкальную информацию. Более яркие цвета указывают на более высокую энергию на данной частоте и во времени, а более темные — на более низкую. Тонкие горизонтальные полосы обозначают продолжительные звуки и часто соответствуют продолжительным нотам (вокал, струнные, синтезаторные пэды). Высокие вертикальные полосы указывают на энергию, распределенную одновременно по многим частотам и сконцентрированную во времени. Они могут представлять собой звуки ударных инструментов и хлопки.
Теперь мы можем начать думать о том, как сверточные нейронные сети могут научиться распознавать особенности этих аудиопредставлений. На этом этапе ключевая задача сводится к следующему: как обучить модель распознавать, что два коротких аудиофрагмента принадлежат одной и той же песне, без каких-либо меток?
Группировка информации и контрастивное обучение
Прежде чем перейти к архитектуре используемой нами сверточной нейронной сети, мы немного поговорим о том, как мы загружаем данные спектрограммы в сеть и как настраиваем функцию потерь сети без меток.
На самом высоком уровне мы подаем спектрограммы на вход сверточной нейронной сети, внутри происходит множество матричных умножений, и в результате мы получаем 128-мерный вектор, который представляет собой скрытое отображение физических характеристик аудиофайла. Но как настроить пакетную обработку и функцию потерь, чтобы сеть могла оценивать похожие песни?
Начнём с пакетной обработки. У нас есть набор данных песен (из небольшого набора данных FMA), который мы преобразовали в спектрограммы. Мы используем класс tensorflow.keras.utils.Sequence для случайного выбора 8 песен из набора данных. Затем мы случайным образом «разбиваем» каждую спектрограмму на фрагменты, выбирая прямоугольник размером 128 x 129, который представляет собой небольшую часть каждой песни, как показано ниже.

Это означает, что каждый пакет данных, подаваемый в сеть, имеет форму (8, 128, 129, 1) (размер пакета, размерность мел-частоты, временной фрагмент, размерность канала). Подавая в сеть фрагменты песен вместо целых композиций, модель будет видеть разные части одних и тех же песен на протяжении эпох обучения. Это предотвращает переобучение модели на определенный момент в каждом треке. Использование коротких сэмплов из каждой песни побуждает сеть изучать локальную музыкальную текстуру (тембр, ритмическую плотность), а не дальнюю структуру.
Далее мы используем функцию контрастного обучения. Функция потерь контраста была предложена в 2005 году Чопрой и др. для обучения пространства встраивания, где похожие пары (положительные пары) имеют низкое евклидово расстояние, а непохожие пары (отрицательные пары) разделены как минимум определенным отступом. Мы используем аналогичную концепцию, применяя функцию потерь InfoNCE.
Мы создаём два стохастических «представления» каждого пакета данных. По сути, это означает, что мы создаём два дополнения к пакету, в каждое из которых добавлен случайный, нормально распределённый шум. Это делается просто с помощью следующей функции:
@tf.function def augment(x): «»»Крошечный временной частотный шум.»»» noise = tf.random.normal(shape=tf.shape(x), mean=0.0, stddev=0.05) return tf.clip_by_value(x + noise, -80.0, 0.0) # диапазон мел-дБ обычно от -80 до 0
Встраивания одного и того же аудиосэмпла должны быть более похожи друг на друга, чем на встраивания любых других сэмплов в пакете.
Таким образом, для пакета размером 8 мы вычисляем сходство каждого векторного представления из первого представления и каждого векторного представления из второго представления, в результате чего получаем матрицу сходства 8×8.
Мы определяем два L2-нормализованных расширенных пакета как [z_i, z_j in mathbb{R}^{N times d} ]
Каждая строка (в нашем случае 128-мерное векторное представление) двух пакетов нормализована по L2-критерию, то есть
[ Vert z_i^{(k)} Vert_2 = 1 ]
Затем мы можем вычислить сходство каждого векторного представления из первого представления и каждого векторного представления из второго представления, в результате чего получим матрицу сходства размером NxN. Эта матрица определяется следующим образом:
[ S = frac{1}{tau} z_i z_j^T ]
Где каждый элемент S представляет собой сходство между векторным представлением песни k и векторным представлением песни l в обоих вариантах аугментации. Это можно определить поэлементно следующим образом:
[
S_{kl} = frac{1}{tau} langle z_i^{(k)}, z_j^{(l)} rangle
= frac{1}{tau} cos(z_i^{(k)}, z_j^{(l)})
[
Где тау — параметр температуры. Это означает, что диагональные элементы (сходство между фрагментами одной и той же песни) будут представлять собой положительные пары, а недиагональные элементы — отрицательные пары.
Затем для каждой строки k матрицы сходства мы вычисляем:
[
ell_k =log
frac{exp(S_{kk})}{sum_{l=1}^{N} exp(S_{kl})}
[
Это функция потерь кросс-энтропии softmax, где числитель представляет собой сходство между положительными фрагментами, а знаменатель — сумму всех значений сходства в строке.
В итоге мы усредняем потери по всей партии, получая таким образом полную целевую функцию потерь:
[
Л =
frac{1}{N}
sum_{k=1}^{N}
left( log
frac{
expleft(
frac{1}{tau}
langle z_i^{(k)}, z_j^{(k)} rangle
верно)
}{
sum_{l=1}^{N}
expleft(
frac{1}{tau}
langle z_i^{(k)}, z_j^{(l)} rangle
верно)
}
верно)
[
Минимизация контрастной потери побуждает модель присваивать наибольшее сходство соответствующим дополненным представлениям, подавляя при этом сходство со всеми остальными образцами в пакете. Это одновременно сближает представления одного и того же аудио и отдаляет представления разных аудио от друг друга, формируя структурированное пространство встраивания без необходимости явного указания меток.
Эта функция потерь наглядно описывается следующей функцией Python:
def contrastive_loss(z_i, z_j, temperature=0.1): «»» Вычисляет функцию потерь InfoNCE между двумя пакетами эмбеддингов. z_i, z_j: (batch_size, embedding_dim) «»» z_i = tf.math.l2_normalize(z_i, axis=1) z_j = tf.math.l2_normalize(z_j, axis=1) logits = tf.matmul(z_i, z_j, transpose_b=True) / temperature labels = tf.range(tf.shape(logits)[0]) loss = tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True) return tf.reduce_mean(loss)
Теперь, когда мы получили некоторое представление о том, как загружать пакеты данных в модель и как минимизация функции потерь группирует похожие звуки, мы можем углубиться в структуру сверточной нейронной сети.
Простая архитектура сверточной нейронной сети
Для этой задачи мы выбрали довольно простую архитектуру сверточной нейронной сети. Сверточные нейронные сети впервые появились благодаря Яну Лекуну и его команде, которые создали LeNet для распознавания рукописных цифр. Сверточные нейронные сети отлично справляются с обучением распознаванию изображений, и мы преобразовали каждую песню в формат, похожий на изображение, который работает с сверточными нейронными сетями.
Первый сверточный слой применяет 32 небольших фильтра к спектрограмме. На этом этапе сеть в основном изучает очень локальные закономерности: такие как короткие всплески энергии, гармонические линии или внезапные изменения, которые часто соответствуют началу нот или перкуссии. Пакетная нормализация обеспечивает корректное поведение активаций во время обучения, а максимальное пулинг немного снижает разрешение, чтобы модель не слишком реагировала на крошечные сдвиги во времени или частоте.
Второй блок увеличивает количество фильтров до 64 и начинает объединять эти низкоуровневые паттерны в более осмысленные структуры. Здесь сеть начинает улавливать более широкие текстуры, повторяющиеся ритмические паттерны и устойчивые тембровые характеристики. Объединение (пулинг) снова сжимает представление, сохраняя при этом наиболее важные активации.
К третьему сверточному слою модель работает со 128 каналами. Эти карты признаков, как правило, отражают более высокоуровневые аспекты звука, такие как общий спектральный баланс или инструментальные текстуры. На этом этапе точное положение признака имеет меньшее значение, чем то, появляется ли он вообще.

Глобальное усредняющее пулинг устраняет оставшуюся временную частотную структуру, усредняя каждую карту признаков до одного значения. Это заставляет сеть суммировать, какие паттерны присутствуют в фрагменте, а не где они встречаются, и создает вектор фиксированного размера независимо от длины входных данных.
Затем плотный слой преобразует это резюме в 128-мерное векторное представление. Именно в этом пространстве происходит обучение определению сходства: фрагменты, звучащие одинаково, должны располагаться близко друг к другу, а несхожие звуки — раздвигаться.
Наконец, векторное представление нормализуется по L2-критерию, так что все векторы лежат на единичной сфере. Это упрощает вычисление косинусного сходства и обеспечивает согласованность расстояний в пространстве векторного представления во время контрастивного обучения.
В общих чертах, эта модель обучается музыке примерно так же, как сверточная нейронная сеть обучается изображениям. Вместо пикселей, расположенных по высоте и ширине, входными данными здесь является мел-спектрограмма, упорядоченная по частоте и времени.
Как мы можем убедиться в том, что модель действительно хороша?
Всё, о чём мы говорили до сих пор, было довольно абстрактным. Как же нам на самом деле узнать, что представления мел-спектрограмм, архитектура модели и контрастивное обучение достаточно хорошо справились с созданием осмысленных эмбеддингов?
Один из распространенных способов понимания созданного нами пространства вложений — это визуализация этого пространства в менее размерном формате, доступном для человеческого восприятия. Этот метод называется уменьшением размерности и полезен при попытке понять данные высокой размерности.

Можно использовать два метода: метод главных компонент (PCA) и стохастическое встраивание соседей с t-распределением (t-distributed Stochastic Neighbor Embedding). PCA — это линейный метод, сохраняющий глобальную структуру, что делает его полезным для понимания общей формы и основных направлений вариации в пространстве встраивания. t-SNE — это нелинейный метод, который отдает приоритет локальным соседним связям, что делает его лучше для выявления небольших кластеров похожих точек, но менее надежным для интерпретации глобальных расстояний. В результате PCA лучше подходит для оценки общей согласованности пространства встраивания, в то время как t-SNE лучше подходит для проверки того, имеют ли похожие элементы тенденцию группироваться локально.
Как упоминалось выше, я обучил эту сверточную нейронную сеть, используя небольшой набор данных FMA, который содержит метки жанров для каждой песни. При визуализации пространства встраивания мы можем группировать жанры вместе, что помогает нам делать выводы о качестве пространства встраивания.
Двумерные проекции дают разные, но взаимодополняющие представления изученного пространства вложений. Ни на одном из графиков не показаны идеально разделенные кластеры жанров, что ожидаемо и даже желательно для модели сходства музыки.
В проекции PCA жанры сильно смешаны и образуют плавную, непрерывную форму, а не отдельные группы. Это говорит о том, что векторные представления отражают постепенные различия в музыкальных характеристиках, таких как тембр и ритм, а не запоминают жанровые обозначения. Поскольку PCA сохраняет глобальную структуру, это указывает на то, что пространство векторных представлений является согласованным и организованным осмысленным образом.
Проекция t-SNE фокусируется на локальных взаимосвязях. Здесь треки одного жанра с большей вероятностью появляются рядом друг с другом, образуя небольшие, разрозненные кластеры. В то же время, сохраняется значительное совпадение между жанрами, отражающее тот факт, что многие песни имеют общие характеристики, выходящие за рамки жанровых границ.

В целом, эти визуализации показывают, что эмбеддинги хорошо работают для задач, основанных на сходстве. PCA показывает, что пространство в целом хорошо структурировано, а t-SNE показывает, что локально похожие песни, как правило, группируются вместе — оба эти свойства важны для системы рекомендаций музыки. Для дальнейшей оценки качества эмбеддингов мы также можем рассмотреть метрики оценки, связанные с рекомендациями, такие как NDCG и recall@k.
Превращение проекта в удобное приложение для рекомендаций музыки.
Наконец, мы немного поговорим о том, как на самом деле превратить эту обученную модель в нечто полезное. Чтобы проиллюстрировать, как подобная сверточная нейронная сеть может использоваться на практике, я создал очень простое веб-приложение для рекомендаций песен. Это приложение принимает загруженный MP3-файл, вычисляет его эмбеддинг и возвращает список наиболее похожих треков на основе косинусного сходства. Вместо того чтобы рассматривать модель изолированно, я разработал сквозной конвейер: предварительная обработка аудио, генерация спектрограммы, вывод эмбеддинга, поиск сходства и представление результатов. Это отражает то, как такая система будет использоваться на практике, где модели должны надежно работать с неизвестными входными данными, а не с тщательно отобранными наборами данных.
Эмбеддинги из небольшого набора данных FMA предварительно вычисляются и хранятся в автономном режиме, что позволяет быстро генерировать рекомендации, используя косинусное сходство, вместо многократного запуска модели. Эмбеддинги на уровне фрагментов объединяются в единое представление на уровне песни, обеспечивая согласованное поведение для треков разной длины.
В итоге получилось легковесное веб-приложение, демонстрирующее, как обученное представление может быть интегрировано в реальный рабочий процесс рекомендаций.
Это очень упрощенное представление того, как встраивания могут использоваться в реальной системе рекомендаций, но оно не отражает всей картины. Современные системы рекомендаций будут сочетать в себе как аудиовстраивания, так и коллаборативную фильтрацию, как упоминалось в начале этой статьи.
Встраивание аудиоданных позволяет определить, как звучат те или иные объекты, а коллаборативная фильтрация позволяет выявить, кому что нравится. Сочетание этих двух методов, наряду с дополнительными моделями ранжирования, может создать гибридную систему, которая уравновешивает акустическое сходство и личные предпочтения.
Источники данных и изображения
В этом проекте используется набор данных FMA Small, общедоступное подмножество набора данных Free Music Archive (FMA), представленного Дефферраром и др. Этот набор данных состоит из коротких музыкальных фрагментов, распространяемых под лицензиями Creative Commons, и широко используется в академических исследованиях в области поиска музыкальной информации.
Все схематические диаграммы в этой статье были созданы автором с использованием инструментов генерации изображений с помощью искусственного интеллекта и используются в соответствии с условиями использования этих инструментов, которые разрешают коммерческое использование. Изображения созданы на основе оригинальных запросов и не содержат ссылок на произведения, защищенные авторским правом, вымышленных персонажей или реальных людей.
Источник: towardsdatascience.com



























