Skip to content
LLuka Piplica
algorithmsmachine-learningdata-scienceaudio-analysisai

Spotify 的推荐算法是如何真正读懂你的灵魂的

对 Spotify 背后机器学习架构的技术剖析:矩阵分解、LinUCB 上下文老虎机算法以及高维向量搜索。

L

Luka Piplica

4 分钟阅读
深色背景上 Spotify 品牌字样的动态排版动画,带有弹跳的字母,标志性的绿色波浪徽标从字母“O”上弹开并落入其左侧的最终位置。

如果你曾觉得 Spotify 的“每周新发现”(Discover Weekly)运行起来精准得有些诡异,甚至像有未卜先知的能力,你绝非个例。你可能会在某个周二的傍晚打开 App,任由它自动播放,然后突然被一首完美契合你当下心境的歌曲击中,以至于你开始怀疑手机是不是在偷听你说话。

这个系统并没有读心术,也没有窃听你的对话。在“每周新发现”时代主导 Spotify 探索推荐功能的 Matthew Ogle 曾有一句名言,他将这一目标形容为制作*“一张来自挚友的混音带”*。然而,在这一充满人情味的愿景背后,潜藏着一个具有惊人数学精确度的系统。

这种看似数字心灵感应的体验,实际上是冷酷、高维数学的优雅执行。Spotify 的推荐架构是现代数据科学的杰作:它并不依赖于单一的庞大模型,而是将一系列同步运行的不同机器学习范式编排在一起。让我们拆解这个引擎,一探底层的数学架构。

Spotify “每周新发现”推荐架构信息图,展示了用户-物品交互矩阵、矩阵分解以及高维向量空间。 图 1:Spotify 推荐引擎的宏观编排,展示了从原始用户-物品交互矩阵到高维隐式向量嵌入的流水线。


核心架构:三大提取支柱

要理解 Spotify,我们首先必须将其与确定性的音频匹配算法区分开来。例如,Shazam 依赖于声学谱图和局部组合哈希 来在静态数据库中识别已知的音频指纹。然而,Spotify 解决的是一个从根本上更难的概率问题:基于其从未直接观察到的抽象人类行为来预测未来的偏好。

为此,它同时提取了三个完全不同的数据源——行为、语言和原始声音。

支柱 1:基于交替最小二乘法 (ALS) 的协同过滤

Spotify 引擎的基石是协同过滤(Collaborative Filtering)。它不分析音乐本身,而是分析人类在文明尺度上的行为元数据。

Spotify 将其生态系统概念化为一个庞大的交互矩阵 RR,其中行代表用户 (uu),列代表物品/歌曲 (ii)。每个单元格中的值 ruir_{ui} 编码了一个隐式信号——播放次数、一首曲目被完整播放的次数、是否被收藏,或者是否在最初的 30 秒内被跳过。由于用户群体总共只听了超过 1 亿首可用歌曲中极少的一部分,因此这个矩阵极其稀疏。

其目标是矩阵分解(Matrix Factorization):将 RR 分解为两个稠密的低维矩阵——用户矩阵 UU 和物品矩阵 VV——使其点积接近原始矩阵:

RUVTR \approx U V^T

矩阵 UU 的每一行都是一个隐式特征向量,代表用户在某个抽象的 kk 维空间中的音乐品味。矩阵 VV 的每一行则是歌曲对应的向量。按照标准的机器学习符号,我们将用户 uu 的隐式向量表示为 pup_u,将物品 ii 的隐式向量表示为 qiq_i。它们的点积 puTqip_u^T q_i 预测了用户 uu 对歌曲 ii 的反应会有多强烈。

为了在大规模场景下学习这些向量,Spotify 在历史上使用了 交替最小二乘法 (ALS) 算法。其目标是最小化以下加权损失函数:

J=minP,Qu,icui(ruipuTqi)2+λ(pu2+qi2)J = \min_{P, Q} \sum_{u, i} c_{ui} (r_{ui} - p_u^T q_i)^2 + \lambda (\|p_u\|^2 + \|q_i\|^2)

其中:

  • ruir_{ui}:用户 uu 与物品 ii 之间观察到的隐式交互。
  • puTqip_u^T q_i:预测的亲和度——用户和物品隐式向量的点积。
  • cuic_{ui}:置信度权重。由于流媒体数据是隐式的(不听某首歌并不一定意味着不喜欢它——也许你只是还没遇到它),cuic_{ui} 按比例缩放了已观察到的交互的重要性。一首被播放了 50 次的歌曲在优化过程中获得的权重,远高于只播放过一次的歌曲。
  • λ\lambda:L2 正则化参数,用于惩罚过大的权重并防止过拟合。

由于同时求解 UUVV 会导致非凸优化问题,ALS 算法通过线性最小二乘法固定其中一个矩阵来求解另一个矩阵,然后交替进行。这个技巧使得计算在分布式集群中高度可并行化——这在处理拥有 6 亿用户的矩阵时至关重要。

实际的直觉是:如果你的听歌行为与东京的某个用户高度相似,该算法就会推断你们是“音乐上的灵魂伴侣”,并向你推荐他们钟爱但你尚未遇到的曲目。从本质上讲,你的“每周新发现”就是一份精选合辑,汇集了你数学上的最近邻居们本周正在循环播放的歌曲。

Spotify 协同过滤流水线信息图,展示了矩阵分解、ALS 损失函数的数学优化、ALS 迭代过程,以及通过 Twine 平台集成的图神经网络。 图 2:Spotify 协同过滤框架的架构,阐明了稀疏用户-物品交互矩阵向隐式特征向量的分解、数学损失函数的优化,以及交替最小二乘法 (ALS) 算法的迭代执行。

支柱 2:自然语言处理——将播放列表视作句子

协同过滤虽然强大,但它饱受冷启动问题(Cold Start Problem)的困扰:如何推荐一首历史播放数据为零的曲目?独立艺人刚上传的全新作品完全没有行为信号。因此,需要第二个互补的系统。

Spotify 通过转向更广泛的互联网文化内容来弥补这一差距。其网络爬虫持续抓取网页内容——音乐博客、编辑文章——最关键的是,数百万用户生成的播放列表的标题和描述。Ogle 的著名观察在这里同样适用:系统的真正智能*“站在人类巨人的肩膀上”*——数百万普通用户在每次为播放列表命名时,都在不知不觉中为音乐贴上了标签。

自然语言处理(NLP)流水线将播放列表视为句子,将歌曲视为单词,应用了在架构上类似于 Word2Vec 的模型(特别是 Skip-gram 或 CBOW 变体)。通过对播放列表中的曲目序列进行训练,该模型旨在最大化在给定核心曲目的情况下预测周围曲目的概率——这一目标通常通过负采样(Negative Sampling,全 Softmax 交叉熵损失的一种高效计算近似)来优化。这迫使模型学习稠密的向量嵌入,使得在相同播放列表中共同出现的歌曲在几何空间上彼此接近。

这与 Word2Vec 著名特性背后的直觉相同:正如在词嵌入空间中 “King” − “Man” + “Woman” ≈ “Queen”(国王 − 男人 + 女人 ≈ 女王)一样,一首介于 “lo-fi hip hop”“late night study” 播放列表之间的曲目,也会在音乐嵌入空间中进行相应的聚类。

一旦学习到这些嵌入,系统就会使用余弦相似度(Cosine Similarity)来评估候选曲目与用户偏好档案之间的文化接近度:

cos(θ)=ABAB\cos(\theta) = \frac{A \cdot B}{\|A\| \|B\|}

如果成千上万的用户独立将一首曲目放入名为 “sad boy hours”“crying in the rain”“2 AM existential crisis” 的播放列表中,那么该曲目的向量表示(AA)在高维空间中就会明显向这些情感描述符的向量表示(BB)靠拢。这正是推荐能在恰到好处的时刻击中你的原因——全球的集体智慧已经代表 Spotify 完成了这种情感标签的标注。

Spotify 将这些学习到的表示称为**“文化向量”**(cultural vectors)。它们不仅编码了曲风,还编码了情绪、语境、亚文化和社会含义——这些维度是仅凭原始音频分析根本无法触及的。

Spotify NLP 推荐流水线信息图,展示了网络爬虫、播放列表摄取、将曲目映射为单词并将播放列表映射为句子的 Word2Vec Skip-gram 训练,以及利用余弦相似度的文化向量空间。 图 3:Spotify 自然语言处理(NLP)支柱的概念框架,阐明了如何通过 Word2Vec 架构将用户生成的播放列表建模为语义句子,以生成具有文化感知力的歌曲嵌入并计算情感接近度。

支柱 3:基于 CNN 的原始音频分析

对于那些行为和文本信号都缺失的曲目,Spotify 的第三大支柱就会介入:对音频的频谱表示应用卷积神经网络 (CNN) 进行深层声学分析。

原始音频波形首先被转换成梅尔频谱图(Mel-Spectrogram)——这是一种频率谱随时间变化的二维表示,其频率区间按对数缩放以接近人类的听觉感知。CNN 通过多个卷积层处理该矩阵,学习检测声音中的分层模式——从瞬态起始和音调稳定性等低级特征,一直到曲风纹理和情感音区等更高级的属性。

其输出是一个编码了可测量声学特征的稠密特征向量,所有特征都归一化到 0.0–1.0 的范围(以分贝 dB 计量的响度除外):

特征范围捕捉的内容
Valence(效价)0.0 – 1.0音乐的正向情感度。高值 = 愉悦、欢快;低值 = 忧郁、紧张。
Energy(能量值)0.0 – 1.0感知强度。结合了动态范围、响度和节拍发生率。
Danceability(舞蹈性)0.0 – 1.0节奏稳定性、节拍规律性以及鼓点强度。
Acousticness(原声感)0.0 – 1.0曲目为原声音乐的置信度(纯天然乐器 vs. 电子乐器)。
Instrumentalness(纯乐器度)0.0 – 1.0无人声内容的可能性。高于 0.5 的值很可能代表纯音乐。
Loudness(响度)−60 至 0 dB曲目的整体平均响度(非播放音量)。

通过为任何新曲目输出这种稠密特征向量,系统可以完全绕过用户数据的缺失,并立即将歌曲的声学拓扑结构与那些在历史上对相似向量有较高匹配度的听众偏好进行对齐。冷启动问题随之从一个无法逾越的鸿沟瓦解为一个简单的最近邻查找。

Spotify 原始音频分析流水线信息图,展示了新曲目向梅尔频谱图的转换、其通过 CNN 层(卷积层、池化层、全连接层)的处理,以及用于进行最近邻查找的稠密声学特征向量的提取。 图 4:Spotify 原始音频分析的神经网络架构,阐明了从对数缩放的梅尔频谱图通过 CNN 提取特征以生成声学属性稠密特征向量的流水线,用于解决冷启动问题。


每周新发现:三大支柱的交汇处

“每周新发现”(Discover Weekly)并不是单一的算法。它是一个由上述三大支柱同步输出而诞生的产品。

以下是每周一生成你的新播放列表时发生的事情的简化追踪:

  1. 候选生成(Candidate Generation)。 ALS 模型会在用户嵌入空间中识别出你的最近邻居——即根据最近的行为信号,其品味向量与你最接近的听众。从他们的集体聆听历史中,系统会汇编出一个候选曲目池:包含他们喜爱而你尚未听过的歌曲。

  2. 评分与重排(Scoring and Re-ranking)。 每首候选曲目都会根据你的声学档案(来自 CNN 音频特征)及其文化向量(来自 NLP 流水线)进行评分。一首在行为上相关、在声学上一致且带有符合你语境的文化描述符的曲目将会脱颖而出,排在靠前的位置。

  3. 新鲜度约束(Novelty Constraint)。 系统会明确过滤掉你已经播放或收藏过的曲目。其目标是探索发现,而非重复。

  4. 30 首曲目的限制(The 30-Track Limit)。 Spotify 的产品团队一直表示,30 首曲目是每周探索播放列表的最佳长度——既足够丰富全面,又短到可以在单次通勤或跑步中听完。最终的排名列表会被裁剪至 30 首,其权重倾向于将高置信度的推荐放在顶部,而将更具探索性的尝试放在底部。

  5. 通过 BaRT 进行最终重排。 在列表送达之前,“智能随机播放”(Smart Shuffle)章节中描述的相同 BaRT(Bandits for Recommendations as Treatments)框架会对顺序进行最后一次处理。根据你打开 App 时的上下文信号——一天中的时间、聆听会话历史、最近的跳过率——它将决定你周一早上播放列表中的第 3 个位置应该是一个稳妥、高置信度的选择(利用/exploitation),还是一个经过计算的探索性尝试(探索/exploration)。这两个系统共享相同的底层强化学习(RL)引擎。

最终的结果是一个在理想状态下感觉完全就像来自朋友推荐的播放列表——这位朋友与你品味相投,但听过的音乐远比你想象的要多。

Spotify “每周新发现”生成流水线信息图,阐明了四个阶段:通过 ALS 最近邻生成候选、使用行为、文化和声学向量进行评分与重排、新鲜度过滤与限制,以及通过 BaRT 强化学习引擎进行最终重排以输出包含 30 首曲目的播放列表。 图 5:端到端的“每周新发现”生成流水线,展示了协同过滤、NLP 文化向量和 CNN 声学特征向统一评分引擎的交汇,随后是通过 BaRT 强化学习框架进行的新鲜度剪枝和实时上下文优化。


智能随机播放的数学原理:上下文老虎机算法


在其生命周期的早期,Spotify 使用了真正的随机生成器——Fisher-Yates 洗牌算法。从统计学上来看,真正的随机性往往会产生聚集效应:在包含 400 首曲目的曲库中,完全有可能连续听到同一位艺人的三首歌曲。当用户遇到这种情况时,他们会强烈抱怨该系统“不随机”。尽管数学上的随机性是完美的,但感知上的随机性却失效了。

工程师们对此做出的回应是,实现了一种受抖动技术启发的算法——这是一种从图像处理中借用的技术——通过在播放队列中均匀分布艺人,刻意打破真正的随机性,从而创造出公平的感知

如今,标准的随机播放已被智能随机播放(Smart Shuffle)所取代。这是一个由强化学习(Reinforcement Learning)主导的智能路由系统,具体而言是 Spotify 称之为 BaRT(Bandits for Recommendations as Treatments)的架构。

这是一个上下文多臂老虎机(Contextual Multi-Armed Bandit)问题。该算法必须不断平衡利用(Exploitation,播放它知道你喜爱的曲目)与探索(Exploration,引入未知的曲目以勾勒你不断变化的品味,并防止你陷入“过滤泡”)。驱动这一机制的算法类别中最典型的代表是 LinUCB (Linear Upper Confidence Bound)

LinUCB(a)=θ^aTxt,aExploitation+αxt,aTAa1xt,aExploration\text{LinUCB}(a) = \underbrace{ \hat{\theta}_a^T x_{t,a} }_{\text{Exploitation}} + \underbrace{ \alpha \sqrt{ x_{t,a}^T A_a^{-1} x_{t,a} } }_{\text{Exploration}}

以下是该算法在播放队列的每一步中进行实时“思考”的方式:

  1. 利用 (Exploitation) (θ^aTxt,a\hat{\theta}_a^T x_{t,a} ):在给定你当前上下文向量 xx 的情况下,选择曲目 aa 的预测回报——该向量编码了诸如一天中的时间、设备类型(耳机、车载、智能音箱)以及最近的跳过模式等信号。
  2. 探索加成 (Exploration Bonus) (αxt,aTAa1xt,a\alpha \sqrt{ x_{t,a}^T A_a^{-1} x_{t,a} } ):该曲目的统计不确定性。系统在类似上下文中极少向像你这样的用户投放的曲目会获得一个在数学上被放大的分数,从而鼓励算法收集更多关于它们的信号。α\alpha 是一个可调超参数,用于控制这种探索的进取程度。

反馈循环是直接且残酷的:如果算法投递了一首探索性曲目,而你在 30 秒内跳过了它,它就会记录一个强烈的负回报信号,并相应地更新协方差矩阵 AaA_a。如果你将该曲目添加到曲库中或调高了音量,算法就刚刚收到了这次上下文赌博获得回报的确认。系统会持续学习,调整随后的每一个决策。

Spotify 智能随机播放架构信息图,展示了随机性悖论(Fisher-Yates 算法 vs. 工程化抖动技术)、LinUCB 上下文老虎机算法的数学组成部分(利用 vs. 探索加成)以及实时强化学习反馈循环。 图 6:Spotify 智能随机播放功能的强化学习机制,对比了真正的统计随机性与感知公平性,并概述了 LinUCB 上下文多臂老虎机算法的执行及其持续的实时用户反馈循环。


架构演进:向量搜索与大语言模型

主导推荐系统的核心数学定理保持稳定,但在 2026 年,执行这些定理的基础设施已经发生了翻天覆地的变化。

近似最近邻 (ANN)

一旦用户和曲目被表示为向量,驱动推荐的核心操作就是 k-最近邻 (kNN) 搜索:在数据库中查找与给定查询向量最接近的 kk 个向量。如果天真地计算所有向量之间的点积,对于 dd 维空间中的 nn 首曲目,每次查询的计算复杂度将达到 O(nd)O(n \cdot d) ——对于包含 1 亿首歌曲的曲库来说,进行实时计算在算力上是根本不可能实现的。

Spotify 的解决方案是构建并开源 Annoy (Approximate Nearest Neighbors Oh Yeah),该项目最初由 Erik Bernhardsson 于 2013 年开发。Annoy 使用随机超平面树森林对向量空间进行划分,从而允许在 O(logn)O(\log n) 时间内进行近似最近邻查找。其代价是微小且有界的准确率损失——这对于推荐系统来说是完全可以接受的,因为 99.9% 的最优结果与 100% 的最优结果在体验上毫无差别。

到 2023 年,Spotify 过渡到了其次世代库 Voyager,它提高了 Annoy 的可扩展性、内存效率和索引构建时间——当底层向量数据库随着新用户行为的源源涌入而需要持续更新时,这一点至关重要。

认知层:大语言模型 (LLM)

随着生成式 AI 的到来,推荐流水线的原始数学输出现在由一个基于大语言模型(LLM)构建的语义层进行编排。诸如 AI DJ 之类的功能充当了智能翻译接口:LLM 解析非结构化的用户上下文——对话式提示词、隐式情感状态、时间和地点——并将其转化为针对底层向量数据库的精准维度查询。

旧系统与新系统之间并非竞争关系。LLM 负责将叙事个性化,并让内容交付更具人情味。而矩阵分解、余弦相似度和 LinUCB 优化依然承担着实际音乐筛选的重任。生成式 AI 是口才雄辩的前端,而数学则是其运转的引擎。

展示 Spotify 现代架构演进的信息图,分为数学引擎(通过 kNN、Annoy 和 Voyager 进行向量搜索)与认知层(将非结构化用户提示词转化为精准维度查询的 LLM 编排)。 图 7:Spotify 统一的现代架构,阐明了高性能近似最近邻 (ANN) 向量搜索库(如 Annoy 和 Voyager)与认知 LLM 编排层之间的交汇,该层将人类的语义语境转化为结构化的数据库查询。


技术术语表

术语定义
Collaborative Filtering(协同过滤)基于用户之间共享的行为模式的推荐方法
Matrix Factorization(矩阵分解)将稀疏的用户-物品矩阵分解为隐式因子矩阵 UUVV
ALS(交替最小二乘法)一种用于求解矩阵分解的迭代算法
Latent Vector(隐式向量)用户或歌曲在 kk 维空间中抽象特征的稠密数值表示
Cold Start Problem(冷启动问题)向没有任何历史用户交互数据的内容进行推荐的挑战
Word2Vec一种通过序列中的共现关系来学习词(或曲目)嵌入的浅层神经网络
Cultural Vector(文化向量)通过对播放列表标题、文章和文化语境进行 NLP 分析而得出的音乐嵌入
Cosine Similarity(余弦相似度)衡量两个向量之间夹角的度量;1.0 = 方向完全相同,0 = 正交
Mel-Spectrogram(梅尔频谱图)音频的二维时频表示,其频率尺度经缩放以匹配人类的听觉感知
Valence(效价)编码音乐正向情感(欢快)或忧郁程度的音频特征(0.0–1.0)
Multi-Armed Bandit(多臂老虎机)一种用于平衡未知领域探索(Exploration)与已知奖励利用(Exploitation)的强化学习范式
LinUCB线性上置信界(Linear Upper Confidence Bound)——一种根据预测回报和不确定性来选择动作的上下文老虎机算法
ANN / Annoy / Voyager用于在高维空间中进行快速向量相似度搜索的近似最近邻(Approximate Nearest Neighbor)库
BaRTSpotify 的强化学习(RL)框架,用于实时播放队列的个性化定制(意为将推荐视为干预的老虎机算法)

结语:多维镜像

归根结底,Spotify 的推荐引擎并不是读心术。它是一面从不眨眼的高频明镜——将你自己的行为模式反射回给你,并在全球超过 6 亿其他听众的集体智慧加持下被无限放大。

在 Spotify 的后端,你的音乐身份并不是以曲风或艺人列表的形式存储的。它是一个浮点数数组——一个漂浮在无限、多维空间中的单一坐标。该算法系统之所以能够精准找到契合你周二傍晚心情的曲目,不过是数十亿次持续的矩阵乘法、上下文老虎机决策和余弦相似度查找的结果,这一切都在无情地向你已经身处的那一点向量空间靠拢。

它看似能读懂的灵魂,自始至终不过是几何学。

返回博客
分享:

保持关注

第一时间获取最新文章、思考及动态。