Здесь, в Shazam, мы можем распознать миллионы и миллионы песен за считанные секунды - даже в шумной или сложной обстановке. Вы можете спросить, можем ли мы использовать этот опыт в распознавании музыки, чтобы автоматически отвечать на такие вопросы, как:

  • В каком жанре эта песня?
  • Какая радиостанция может это проиграть?
  • Какие инструменты представлены?
  • Какое настроение можно было бы описать?
  • Я бы хотел?
  • Какие еще песни похожи?

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

Фон

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

Было бы чрезвычайно полезно автоматически помечать песни этими музыкально значимыми ярлыками. Это потому, что мы не видим длинный хвост мировой музыки. Подавляющее большинство из них остается незамеченным для большинства людей, а связанные метаданные, метки и теги имеют тенденцию быть несовместимыми или несуществующими. Автоматизированные процессы могут охарактеризовать каждый из десятков миллионов треков в нашей базе данных - при наличии достаточных исходных данных, опыта, вычислений и времени. Такая система позволила бы нам рекомендовать еще более интересный контент в Discover (на фото выше; проведите пальцем вправо в своем приложении Shazam, чтобы проверить это). Когда вы Shazam песня, мы рекомендуем похожие треки. Если у нас есть модели, которые понимают в некотором абстрактном смысле такие музыкальные особенности, как жанр и настроение, то рекомендуемые треки могут стать еще более актуальными, интересными и неожиданными. Мы уже создаем интересные диаграммы и плейлисты, в том числе наши эксклюзивные хиты будущего, но автоматическая классификация музыки означает, что мы можем найти глубокие сокращения в плейлистах, созданных специально для вас.

Плохие новости: задачи автоматической пометки сложны. Возьмем для примера жанр. Жанр песни по своей сути субъективен. Разумные люди могут не согласиться с тем, принадлежит ли конкретная песня к определенному жанру. Например, я люблю металл, поэтому моя оценка того, является ли песня металлической, является более осознанной и более предвзятой. Я слушал много металла, поэтому мне хорошо известны конкретные характеристики, которые обычно означают металличность: свирепые гитарные риффы, энергичный вокал, громкие барабаны, агрессивный и часто мрачный. тексты, и т. д. Однако у меня есть личные отношения с этой музыкой, и поэтому я предвзято отношусь к той разновидности металла, которую люблю. Например, мне нравится Metallica, но я очень люблю их более ранние альбомы (Ride the Lightning, Master of Puppets, … И справедливость для всех). На мой слух, более коммерчески успешная Metallica середины-конца 90-х больше склоняется к року с точки зрения основного жанра. Однако разумные люди сочли бы все свое творчество металлом.

И наоборот, я относительно менее знаком с танцами, EDM и поп-музыкой, и это лишь некоторые из них. Я знаю, что границы, которые я провожу вокруг этих категорий, и их пересечение будут отличаться от других. От незнания, беспристрастной объективности или чего-то еще, кто знает? Что еще более важно, кто скажет, кто прав? Мы не можем избежать некоторой двусмысленности и непоследовательности.

Количество и глубина жанровых ярлыков еще больше усугубляют наши беды. Сколько существует музыкальных жанров? Достаточно, скажем, пятнадцати? Практически любой жанр можно разделить на поджанры. Металл состоит из разных семейств: блэк-метал, дэт-метал, трэш-метал, слэдж, джент, пост-дум-метал… Я мог бы продолжить (и многие сделали)! Та же двусмысленность и непоследовательность более широких жанровых категорий применима, возможно, даже в большей степени.

Вы можете сказать, что мы должны полностью обойти проблему и полагаться на чью-то категоризацию. Например, наши различные отраслевые партнеры предоставляют нам метаданные вместе с подписями треков, часто включая теги какого-то жанра. Часто это хорошая стратегия, в зависимости от ваших целей. Однако в идеале мы хотим полностью охватить наш огромный каталог. Нам нужна видимость тех треков, у которых есть неполные метаданные и мало Shazam'ов, если таковые имеются. В этом длинном хвосте может быть потрясающая музыка! Кроме того, если бы мы попытались объединить потоки метаданных от различных поставщиков для максимального охвата, мы бы построили конвейер в стиле Руба Голдберга, чтобы обрабатывать различные наборы жанровых меток от переменного числа поставщиков, не говоря уже о том, как работать с лейблами на уровне трека vs. на уровне альбома vs. на уровне исполнителя (привет, Тейлор Свифт!), и мы все равно не стали бы Нет полного покрытия.

Эти причины побудили нас задуматься о создании нашей собственной системы, которая автоматически помечала бы песни музыкально значимыми ярлыками. Отметим, что это популярная задача в академическом музыкальном информационном сообществе (МИР). В частности, эти проекты MIR включают алгоритмы, которые вводят звук песни и выводят некую классификацию, например, одну из нескольких жанровых категорий или, возможно, дескриптор настроения. Например, в задании на смешанную жанровую классификацию конкурса MIREX 2016 года наивысшая точность составила 76%. Неплохо, конечно, но это определенно не решенная проблема.

К счастью, команда исследований и разработок Shazam (называемая командой rad) дает нам время, гибкость и доверие, чтобы попытаться сделать что-то подобное. Мы также обратились к экспертам из нашей музыкальной команды, которые вручную составили около 800 000 лейблов жанров на уровне треков, с помощью которых мы могли оценить некоторые модели.

Общий / генеративный подход

Давайте сначала сформулируем наши цели. Мы стремимся автоматически помечать песни такими ярлыками, как жанр, настроение и, возможно, другими дескрипторами, которые мы еще даже не рассматривали. (Эта цель маркировки привела к тому, что мы назвали проект Граффити). Наша интуиция подсказывает нам, что если наша модель должна «понимать» песни в достаточной степени для выполнения этих задач, она должна включать большой объем входных данных из различных источников. Под «пониманием» мы подразумеваем некоторое приблизительное представление о том, как мы, люди, можем слышать, интерпретировать песни и реагировать на них. Безусловно, я не думаю, что мы воспроизводим человеческое восприятие и познание - не в долгосрочной перспективе - скорее, модель, надеюсь, усвоит некоторые важные и полезные особенности, которые помогут нам продвинуться к этой цели. Нам нужен не только «первичный» материал, полученный из записанного звука (как в задачах MIR), но и вторичные сигналы о том, как мы, слушатели музыки, взаимодействуем с этими песнями. На схеме ниже показаны различные возможные входы.

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

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

У генеративных моделей есть несколько преимуществ. Как правило, обучение - это неконтролируемый процесс: нам не нужны никакие ярлыки, только сами треки. Что ж, у нас уже есть миллионы подписей треков, которые мы используем в нашем обычном алгоритме распознавания! Хотя нам не нужно синтезировать новые сигнатуры треков в Shazam - люди-исполнители генерируют достаточно, чтобы занять нас, - мы можем использовать внутренние представления треков этих моделей, чтобы быстро и эффективно научиться автоматической пометке.

В самом деле, как только мы закончим процесс обучения без учителя, мы перейдем к так называемому полу-контролируемому обучению с меньшим, помеченным вручную обучающим набором для каждого конкретного набора тегов (жанр, настроение , и т. д.). Если мы уже обучили достаточно сложную неконтролируемую модель, чтобы дать нам полезные представления треков, последний шаг от выученного абстрактного представления до музыкально значимой метки должен быть относительно простым. То есть мы надеемся выполнить самую сложную часть только один раз и поделиться ею с несколькими различными моделями классификации.

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

Неконтролируемый стажер!

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

Во-первых, вы можете спросить: что такое подпись? В Shazam мы вычисляем подпись песни как самый первый шаг к распознаванию запроса (т.е. то, что ваш телефон слышит). Высокоуровневое (и упрощенное) описание процесса генерации подписей можно найти в белой книге 2003 года, опубликованной Эйвери Ван, нашим соучредителем, главным ученым и изобретателем алгоритма распознавания Shazam. Вкратце, мы вычисляем сигнатуру, беря входящий звук, вычисляя его частотно-временное представление (или спектрограмму) с помощью кратковременного преобразования Фурье, а затем выбирая большие пики амплитуды в пределах этого частотно-временного ландшафта. Это все равно что собирать местоположения самых высоких горных вершин в регионе; вместо (широта, долгота, высота) у нас есть (время, частота, амплитуда) для этих выступающих пиков.

Итак, зачем переходить от подписи к другому представлению? В конце концов, эта подпись является очень компактным и эффективным представлением, которое по замыслу может быть использовано в нашем алгоритме распознавания. Четырехминутная песня может быть представлена ​​подписью 10–20 КБ, тогда как для mp3 со средним качеством битрейта это будет более 3 МБ. (Это много данных, о которых нам не нужно беспокоиться!)

Однако длина этих сигнатур (т.е. количество пиков, которые мы выбираем в песне) варьируется. Намного проще использовать представление одинакового размера для каждой дорожки. Таким образом, нам будет легче сравнивать «яблоки с яблоками» и строить на их основе более простые модели. Кроме того, с более компактным представлением фиксированной длины наша модель может быть вынуждена изучить высокоуровневые абстрактные функции, которые отражают некоторую комбинацию основных музыкальных функций, которые мы хотим раскрыть.

Вы также можете спросить: почему мы думаем, что подписи здесь будут работать? В конце концов, мы выбрасываем большую часть информации, содержащейся в аудио. Как мы узнаем, что в сигнале еще достаточно информации? Короткий ответ: мы не точно знаем. Мы знаем только, что подпись очень хорошо работает в нашем алгоритме распознавания. Нет никаких гарантий, но мы надеемся, что подпись сохранит «правильные» или «важные» части сигнала для наших целей. Если это так, то мы получаем большую выгоду от того факта, что можем иметь дело с гораздо меньшим объемом информации, что приводит к более быстрому и эффективному обучению модели.

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

Генеративные модели могут принимать разные формы. Вышеупомянутый WaveNet является примером полностью видимой сети убеждений (FVBN). Недавнее и очень популярное изобретение - генеративная состязательная сеть (GAN; см., Например, этот учебник 2016 года изобретателя GAN Яна Гудфеллоу). Я не буду описывать их, так как я не использовал их для этого проекта, но они очень интересны и появляются в некоторых передовых исследованиях.

Мы выбрали для изучения вариант вариационного автокодировщика (ВАЭ). VAE похож на традиционный автокодировщик (AE), изображенный ниже. AE учится реконструировать заданный вход как можно ближе к совершенству, учитывая тот факт, что он должен быть преобразован в сжатое представление посередине. Кодер и декодер могут быть чем угодно, от простых линейных преобразований до глубоких, полностью связанных, сверточных и / или рекуррентных нейронных сетей. (Вы можете сразу промочить ноги с онлайн-демонстрацией Андрея Карпати и почти сразу с this tutorial, Python и Keras.) Во время тренировки проигрыш или стоимость рассчитывается как среднеквадратичная разница между входными данными и восстановленными выходными данными (или иногда средняя абсолютная разница или какая-либо другая разумная функция). Затем каждый параметр кодера и декодера обновляется пропорционально его вкладу в значение потерь (процесс, известный как обратное распространение, или обратное распространение).

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

Чтобы учесть переменную длину последовательности наших входных сигнатур, мы реализовали вариационную рекуррентную нейронную сеть (VRNN), описанную Джунён Чанг и др.. По сути, у нас есть вариационный автоэнкодер на каждом этапе последовательность, с дополнительной зависимостью от повторяющегося скрытого состояния. Он показался нам новым и многообещающим, а его повторяющийся характер хорошо подходит для наших входных данных, которые сильно различаются по длине.

Полученные результаты

Визуализация пространства признаков, оцененного по нескольким тысячам треков, для одной конкретной модели показана ниже. Несмотря на то, что это от одной модели, это указывает на те особенности, которые усвоили большинство наших моделей. В целях визуализации мы используем t-SNE для преобразования многомерного набора функций всего в два для каждого трека (представленные осями x и y на график). Таким образом, каждая дорожка будет представлена ​​одной точкой на графике. Чтобы показать распределение этих функций для многих дорожек, мы используем цвет для представления областей графика с относительно небольшим количеством дорожек (фиолетовый, фиолетовый, синий) в области с множеством представлений дорожек, расположенных близко друг к другу (оранжевый, красный, белый).

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

Ниже представлены те же данные, но с разбивкой по их жанрам (с аннотациями людей). Анимированный gif вращается по каждому жанру; под ним все они расположены рядом. Конечно, модель не обучалась ни на одном из этих треков, и ей не давали никакого представления о жанре. Мы просто смотрим на различные распределения наших выученных репрезентаций, сегментированных по песням, которые, как мы уже знаем, принадлежат к разным жанрам. Если бы нам действительно повезло, разные жанры могли бы выскочить как неперекрывающиеся четко определенные капли. Однако это не является необходимым для того, чтобы эти представления были полезными. Пока существует некоторая структура, которая отличает один жанр от другого, мы можем обучить другую модель, чтобы выявить это (часть частично контролируемая). Приведенные ниже графики, кажется, предполагают различие между жанрами, даже несмотря на то, что они частично совпадают.

Время для наблюдения

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

Я попробовал простую нейронную сеть, состоящую из пары полностью связанных слоев и конечного слоя вывода классификации. Поскольку входные данные представляют собой характеристики трека фиксированной длины, которые мы извлекаем из нашей модели без учителя, а выходы - это жанровые ярлыки, это напоминает очень «ванильную» модель мультиклассового классификатора. Как мы и ожидали, он тренируется невероятно быстро. Мы говорим на много порядков быстрее, чем предполагала неконтролируемая модель, даже несмотря на то, что наш помеченный набор данных был относительно большим. Результаты также были многообещающими: точность испытаний находилась на уровне 90%. Однако я настоятельно предупреждаю, что это не сравнение яблок с яблоками с результатами конкурса MIREX - наборы данных и метки различаются как по размеру, так и по содержанию. Однако результаты нас воодушевляют!

Я также поискал другой набор представлений от Шарата Пингулы, талантливого специалиста по данным из нашей команды. Он обучил модель для создания функций совместной фильтрации (CF) на уровне трека на основе взаимодействий с пользователем Shazam. (Конечно, это всегда анонимное взаимодействие с пользователем.) Учитывая эти входные функции для тех же маркированных треков и ту же простую, полностью подключенную архитектуру, мы смогли обучить еще более эффективную модель!

Я считаю, что это отличный результат по нескольким причинам. И мои черты, и черты Шарата очень хороши сами по себе. У них также есть разные сильные и слабые стороны. Функции CF полагаются на треки, которые взаимодействуют с пользователем - совершенно новые и малоизвестные треки не фиксируются, в то время как мои функции охватывают весь длинный хвост. Система, в которой используются и те, и другие, должна иметь еще лучшую производительность. Действительно, мы объединили обе функции для каждого трека и обучили другую простую модель классификации жанров и заметили небольшое улучшение. Как ни странно, мы видели некоторые иллюстративные примеры, когда эта модель правильно классифицировала следы, чего не делали две другие. CF обеспечивает групповое взаимодействие с пользователем, поэтому, если многим людям нравятся несколько жанров (возможно, хип-хоп, танец и поп; или, может быть, рок, блюз и альтернатива), можно ожидать различительной силы CF- основанная модель должна быть меньше при выборе между ними. В этих случаях функции, основанные на сигнатуре (и, следовательно, на основе звука), могут склонить чашу весов в правильном направлении для модели, которая включает оба входа.

Жду с нетерпением

Пока мы продолжаем работать над этими моделями, мы можем задуматься о направлениях, в которых должен двигаться весь проект автоматической пометки. Тот факт, что мы достигаем лучших результатов при объединении разных потоков данных, имеет смысл. Человеческие представления о таких ярлыках, как жанр, являются результатом не только музыкального звука, но и нашего восприятия его. Включение функций, основанных как на звуке, так и на взаимодействии с ним разных людей, начинает двигать нас в правильном направлении. А как насчет других источников, таких как тексты песен, обзоры или сообщения в блогах? Какими способами мы, слушатели, взаимодействуем с нашей музыкой, и можем (должны) мы включить их в общую модель автоматической пометки? Если да, то какой способ лучше? Мы просто используем подход ансамбля моделей или что-то еще? Это лишь некоторые из интересных вопросов, на которые мы будем отвечать в Shazam в будущем!

Благодарности

Я должен с энтузиазмом поблагодарить Shazam за предоставленную мне гибкость в определении интересующего меня проекта, а также инфраструктуру для его реализации и экспериментов. Вся команда «рад» оправдывает своего тезку и обладает богатым опытом, знаниями и советами. В частности, Хорхе Эррера, Шарат Пингула и Кейси Бейкер были невероятными партнерами в более широкой инициативе автоматической пометки, а Кейси - отличный начальник!

Наконец, я благодарю весь офис Редвуд-Сити за помощь мне в улучшении моей игры в пинг-понг!