Коллаборативная фильтрация на основе элементов для музыкальной рекомендательной системы
Wanyin App — это сообщество для обмена музыкой на основе ИИ, цель которого — поощрять обмен музыкой и сделать сочинение музыки проще для музыкальных энтузиастов.
Библиотека Wanyin содержит огромное количество музыки, загруженной пользователями. Основная задача — отбирать интересующую музыку на основе предыдущего поведения пользователей. Мы оценили две классические модели: коллаборативную фильтрацию на основе пользователей (User-based CF) и коллаборативную фильтрацию на основе объектов (Item-based CF) — как потенциальные модели рекомендательной системы.
- User-based CF использует статистику сходства, чтобы находить соседних пользователей с похожими предпочтениями или интересами. С помощью полученного набора ближайших соседей система может предсказать интерес целевого пользователя и сформировать рекомендации.
- Представленная Amazon, item-based CF, или item-to-item (I2I) CF, является хорошо известной моделью коллаборативной фильтрации для рекомендательных систем. Она вычисляет сходство между объектами, а не пользователями, исходя из предположения, что интересующие объекты должны быть похожи на объекты с высокими оценками.
User-based CF может приводить к чрезмерно длительному времени вычислений, когда число пользователей превышает определенный порог. Учитывая характеристики нашего продукта, мы решили выбрать I2I CF для реализации музыкальной рекомендательной системы. Поскольку у нас не так много метаданных о песнях, нам приходится работать с самими песнями, извлекая из них векторы признаков (эмбеддинги). Наш подход заключается в том, чтобы преобразовать эти песни в мел-частотный кепстр (MFC), спроектировать сверточную нейронную сеть (CNN) для извлечения эмбеддингов признаков песен, а затем давать музыкальные рекомендации с помощью поиска по сходству эмбеддингов.
🔎 Выбор поискового движка для поиска по сходству эмбеддингов
Теперь, когда у нас есть векторы признаков, остается вопрос: как извлечь из большого объема векторов те, которые похожи на целевой вектор. Когда речь зашла о поисковом движке для эмбеддингов, мы выбирали между Faiss и Milvus. Я заметил Milvus, когда просматривал трендовые репозитории GitHub в ноябре 2019 года. Я взглянул на проект, и он привлек меня своими абстрактными API. (Тогда это была версия v0.5.x, а сейчас — v0.10.2.)
Мы предпочитаем Milvus вместо Faiss. С одной стороны, мы уже использовали Faiss раньше и поэтому хотели попробовать что-то новое. С другой стороны, по сравнению с Milvus, Faiss скорее является низкоуровневой библиотекой, поэтому не слишком удобен в использовании. По мере того как мы больше узнавали о Milvus, мы в итоге решили принять Milvus благодаря двум его основным особенностям:
- Milvus очень прост в использовании. Все, что нужно сделать, — загрузить его Docker image и обновить параметры в соответствии с вашим собственным сценарием.
- Он поддерживает больше индексов и имеет подробную сопроводительную документацию.
Вкратце, Milvus очень дружелюбен к пользователям, а документация достаточно подробна. Если вы столкнетесь с какой-либо проблемой, обычно можно найти решения в документации; в противном случае вы всегда можете получить поддержку от сообщества Milvus.
Кластерный сервис Milvus ☸️ ⏩
После решения использовать Milvus в качестве поискового движка для векторов признаков мы настроили standalone node в среде разработки (DEV). Он успешно работал несколько дней, поэтому мы запланировали провести тесты в среде factory acceptance test (FAT). Если standalone node выйдет из строя в production, весь сервис станет недоступен. Таким образом, нам необходимо развернуть высокодоступный поисковый сервис.
Milvus предоставляет как Mishards, middleware для шардирования кластера, так и Milvus-Helm для конфигурации. Процесс развертывания кластерного сервиса Milvus прост. Нам нужно лишь обновить некоторые параметры и упаковать их для развертывания в Kubernetes. Диаграмма ниже из документации Milvus показывает, как работает Mishards:
Диаграмма механизма работы Mishards.
Mishards каскадно передает запрос от вышестоящего уровня вниз к своим подмодулям, разделяя вышестоящий запрос, а затем собирает и возвращает результаты подслужб на вышестоящий уровень. Общая архитектура кластерного решения на базе Mishards показана ниже:
Общая архитектура Mishards.
Официальная документация предоставляет понятное введение в Mishards. Вы можете обратиться к Mishards, если вам интересно.
В нашей музыкальной рекомендательной системе мы развернули один узел с возможностью записи, два узла только для чтения и один экземпляр промежуточного ПО Mishards в Kubernetes с использованием Milvus-Helm. После того как сервис некоторое время стабильно работал в FAT-среде, мы развернули его в production. До сих пор он работает стабильно.
🎧 I2I-рекомендации музыки 🎶
Как упоминалось выше, мы создали I2I-рекомендательную систему музыки Wanyin, используя извлеченные эмбеддинги существующих песен. Сначала мы разделили вокал и BGM (разделение дорожек) новой песни, загруженной пользователем, и извлекли эмбеддинги BGM в качестве представления признаков песни. Это также помогает выявлять кавер-версии оригинальных песен. Затем мы сохранили эти эмбеддинги в Milvus, выполнили поиск похожих песен на основе песен, которые слушал пользователь, а затем отсортировали и переставили найденные песни, чтобы сформировать музыкальные рекомендации. Процесс реализации показан ниже:
Реализация I2I-рекомендательной системы музыки Wanyin.
🚫 Фильтр дубликатов песен
Еще один сценарий, в котором мы используем Milvus, — фильтрация дубликатов песен. Некоторые пользователи загружают одну и ту же песню или клип несколько раз, и эти дубликаты песен могут появляться в их списке рекомендаций. Это означает, что формирование рекомендаций без предварительной обработки ухудшило бы пользовательский опыт. Поэтому нам нужно находить дубликаты песен и гарантировать, что они не появятся в одном и том же списке благодаря предварительной обработке.
Еще один сценарий, в котором мы используем Milvus, — фильтрация дубликатов песен. Некоторые пользователи загружают одну и ту же песню или клип несколько раз, и эти дубликаты песен могут появляться в их списке рекомендаций. Это означает, что формирование рекомендаций без предварительной обработки ухудшило бы пользовательский опыт. Поэтому нам нужно находить дубликаты песен и гарантировать, что они не появятся в одном и том же списке благодаря предварительной обработке.
Как и в предыдущем сценарии, мы реализовали фильтрацию дубликатов песен посредством поиска похожих векторов признаков. Сначала мы разделили вокал и BGM и извлекли ряд похожих песен с помощью Milvus. Чтобы точно фильтровать дубликаты песен, мы извлекли аудиоотпечатки целевой песни и похожих песен (с помощью таких технологий, как Echoprint, Chromaprint и т. д.), вычислили сходство между аудиоотпечатком целевой песни и отпечатком каждой из похожих песен. Если сходство превышает порог, мы определяем песню как дубликат целевой песни. Процесс сопоставления аудиоотпечатков делает фильтрацию дубликатов песен более точной, но он также занимает много времени. Поэтому, когда речь идет о фильтрации песен в огромной музыкальной библиотеке, мы используем Milvus для предварительной фильтрации наших кандидатов в дубликаты песен.
Использование Milvus для фильтрации дубликатов песен.
Чтобы реализовать рекомендательную систему I2I для огромной музыкальной библиотеки Wanyin, наш подход заключается в извлечении эмбеддингов песен в качестве их признаков, поиске похожих эмбеддингов по эмбеддингу целевой песни, а затем сортировке и переупорядочивании результатов для формирования списков рекомендаций для пользователя. Чтобы обеспечить рекомендации в реальном времени, мы выбираем Milvus вместо Faiss в качестве движка поиска сходства векторных признаков, поскольку Milvus оказывается более удобным для пользователей и более продвинутым. По той же причине мы также применили Milvus в нашем фильтре дубликатов песен, что улучшает пользовательский опыт и эффективность.
Вы можете скачать Wanyin App 🎶 и попробовать его. (Примечание: может быть доступно не во всех магазинах приложений.)
📝 Авторы:
Jason, инженер по алгоритмам в Stepbeats Shiyu Chen, инженер данных в Zilliz
📚 Ссылки:
Mishards Docs: https://milvus.io/docs/v0.10.2/mishards.md Mishards: https://github.com/milvus-io/milvus/tree/master/shards Milvus-Helm: https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus
🤗 Не стесняйтесь, подписывайтесь на нас в Twitter или присоединяйтесь к нам в Slack!👇🏻
Читать далее

Zilliz Cloud Now Available in AWS Europe (Ireland)
Zilliz Cloud launches in AWS eu-west-1 (Ireland) — bringing low-latency vector search, EU data residency, and full GDPR-ready infrastructure to European AI teams. Now live across 30 regions on five cloud providers.

Creating Collections in Zilliz Cloud Just Got Way Easier
We've enhanced the entire collection creation experience to bring advanced capabilities directly into the interface, making it faster and easier to build production-ready schemas without switching tools.

Milvus WebUI: A Visual Management Tool for Your Vector Database
Explore Milvus WebUI to monitor, manage, and optimize your vector database with real-time insights, performance tracking, and system health monitoring.



