Riff

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

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

Какие данные участвуют?

Модель учитывает Arousal (A) — степень возбуждённости музыки, Valence (V) — эмоциональную окраску и PTE — воспринимаемую скорость музыки, отдельную характеристику, не число ударов в минуту. Также участвуют оценки пользователя для трека, его папок, альбома, исполнителей и жанров и история запусков воспроизведения.

Пользователь задаёт желаемую точку (A*, V*), при необходимости выбирает медленную, среднюю или быструю музыку и указывает размер очереди: 10, 20 или 50 записей. Характеристики и уверенность в них уже подготовлены Indexer. Player использует готовые результаты; новое распознавание аудио не запускается.

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

До расчётов исключаются автоматически распознанные и назначенные пользователем аудиокниги, записи с действующим Ban, недоступные или технически невоспроизводимые источники, а также треки без полного набора A/V и соответствующих значений уверенности. При выборе диапазона PTE дополнительно требуется полная оценка PTE с уверенностью.

Копии одного содержимого с одинаковым Media.ID представляют одного кандидата. Несколько физических файлов не увеличивают число шансов на выбор. Исключения не ослабляются ради заполнения очереди: при недостатке кандидатов результат будет короче.

Как измеряется соответствие настроению?

Значения A, V и PTE находятся в диапазоне от −1 до +1, уверенность — от 0 до 1. Для A определяется масштаб по допустимой коллекции:

sA=max(Amax−Amin,smin)s_A=\max(A_{\max}-A_{\min},s_{\min})

Минимальный размах s_min равен 0,10 по умолчанию. Он предотвращает деление на ноль и чрезмерное усиление маленьких различий. Для трека m координата несоответствия равна:

xA(m)=cA(m)·min(1,|A(m)−A∗|sA)x_A(m)=c_A(m)\min\left(1,\frac{|A(m)-A_*|}{s_A}\right)

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

Уверенность c_A уменьшает силу воздействия характеристики. При низкой уверенности модель слабее наказывает трек за предполагаемое несоответствие. Далее координата возводится в квадрат: уверенность 0,5 уменьшает этот вклад в четыре раза относительно уверенности 1. Отсутствующая оценка не заменяется нулём: такой трек не допускается.

Как учитывается воспринимаемая скорость?

Треки с полной оценкой PTE и положительной уверенностью сортируются по PTE и делятся на три почти равные группы: Slow, Medium и Fast. Центром каждой группы становится её медиана — центральное значение упорядоченной группы, а при чётном числе записей среднее двух центральных значений.

По умолчанию в каждой группе требуется не менее 42 записей: всего не менее 126 подходящих наблюдений. Если данных недостаточно, выбор PTE недоступен и его вклад равен нулю. Можно выбрать одну или две группы; три выбранные группы не допускаются. Модель вычисляет расстояние до ближайшей выбранной медианы:

xPTE(m)=cPTE(m)·min(1,minb∈B|PTE(m)−μb|sPTE)x_{PTE}(m)=c_{PTE}(m)\min\left(1,\frac{\min_{b\in B}|PTE(m)-\mu_b|}{s_{PTE}}\right)

Здесь B — выбранные группы, μ_b — их медианы. Масштаб PTE — наблюдаемый размах положительно уверенных PTE-значений с тем же минимальным размахом. Выбор Slow повышает относительный шанс близких к нему записей, но не вводит жёсткий запрет на быстрые треки. Если ни одна группа не выбрана, PTE не влияет на подбор.

Как действуют Like, Dislike и Ban?

Для собственной оценки трека используются две координаты: отсутствие Like и наличие Dislike.

ОценкаОтсутствие LikeШтраф Dislike
Like00
Neutral10
Dislike11

Like уменьшает итоговое несоответствие, Dislike увеличивает его. Ban действует отдельно: полностью исключает запись из автоматического подбора.

Оценки альбома, исполнителей и жанров учитываются аналогично. Для нескольких прямо относящихся к треку исполнителей или жанров используются доли положительных и отрицательных оценок. Если доля Like равна L, а доля Dislike равна U, координаты составляют √(1−L) и √U. Поэтому после возведения в квадрат в итоговую оценку входят именно доли. Например, один понравившийся исполнитель из двух уменьшает соответствующий дефицит наполовину. Число участников само по себе не усиливает влияние. Отсутствие принадлежности даёт нейтральную пару (1, 0).

Оценки папок распространяются по реальному пути к файлу. Для содержащей папки d=0, для её родителя d=1 и далее:

α(d)=(1−qD)qDd\alpha(d)=(1-q_D)q_D^d

При стандартном q_D=0,5 влияния равны 0,5; 0,25; 0,125 и далее. Для одного пути дефицит Like равен 1 минус сумма влияний понравившихся папок, штраф Dislike — сумме влияний не понравившихся. Координаты — квадратные корни этих величин. Влияния не перенормируются по длине пути. Нейтральная оценка не отменяет оценок предков. Для нескольких доступных копий значения путей усредняются до извлечения корня.

Как история уменьшает повторы?

Для каждого трека суммируются сохранённые события начала воспроизведения активного профиля:

F(m)=∑e∈Starts(m)(1−qH)qHg−geF(m)=\sum_{e\in Starts(m)}(1-q_H)q_H^{g-g_e}

Здесь g — текущее поколение истории, g_e — поколение события, q_H=0,5 по умолчанию. Возраст измеряется в поколениях истории, не в часах. Недавние запуски дают больший вклад, старые — меньший. Повторные запуски накапливаются. Координата равна √F(m), поэтому в итоговую оценку входит w_H·F(m), снижающая относительный шанс повторного выбора.

Появление среди кандидатов, построение очереди, открытие экрана и пауза с продолжением не считаются новым запуском. Модель использует только сохранённое окно истории, по умолчанию 128 поколений; более старая несохранённая история не восстанавливается предположениями.

Как оценка превращается в вероятность?

Координаты объединяются в одну величину:

D2(m)=∑iwi·xi(m)2D^2(m)=\sum_i w_i x_i(m)^2

Меньшее D² означает более благоприятную оценку. Веса задают относительную важность факторов:

ФакторСтандартный вес
A, V и PTE — каждый1
Like и Dislike трека — каждый1
Like и Dislike папок, альбома, исполнителей — каждый0,5
Like и Dislike жанров — каждый0,25
История1

Затем рассчитываются относительный вес W(m) и вероятность следующего выбора P(m):

W(m)=exp(−D2(m)T)W(m)=\exp(-D^2(m)/T)
P(m)=W(m)∑j∈CW(j)P(m)=\frac{W(m)}{\sum_{j\in C}W(j)}

C — оставшиеся кандидаты. Положительная температура T, по умолчанию 1, регулирует выраженность предпочтений. Низкая температура сильнее выделяет кандидатов с меньшим несоответствием; высокая приближает распределение к равномерному.

Для трёх кандидатов с D²=0,2; 1,2; 2,2 при T=1 вероятности первого выбора составляют примерно 66,5%, 24,5% и 9%. Третий кандидат остаётся возможным. Вероятности относительные: они зависят от остальных кандидатов. Одинаковый вклад для всех кандидатов сокращается при нормировании и не меняет распределения.

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

Как получается готовая очередь?

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

Это взвешенный выбор без возвращения: повторов одного Media.ID внутри результата нет. Если требуется больше записей, чем доступно, попадут все допустимые кандидаты; веса тогда влияют прежде всего на порядок.

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

Правила определяет контракт автоматического подбора. Стандартные параметры принадлежат контракту конфигурации; отдельного редактора этих весов и температуры в Settings нет.