← 返回 无痛入门音乐科技

「MIR-04」音乐推荐: 努力懂你的预言家

2020年3月14日 13:44 · 无痛入门音乐科技

如何在千万首你从来没听过的歌曲/歌手/歌单中, 挑出最符合你品味的候选? 让音乐推荐算法成为你挑歌之路上的专属预言家!

♬ 本文为MIR音乐信息检索系列的第8篇文章 ♬
首先直观展示一下, QQ音乐9.8版本的推荐页在我手机上的样子, 这也是音乐推荐算法主要工作的地方.

Image

这里每日都会更新专属于我的推荐歌曲即"每日30首", 如果我只想随意听听歌就像背景音乐一样一直播放, 那不妨点开同样根据我口味定制的"个性电台". 此外还有更多为我推荐的歌单与视频, 如果一直往下翻可以无限加载:
音乐推荐系统动真格儿地讲起来, 那就是一本书. 本文依然本着无痛入门的科普目的, 将大致讲解:

『经典的协同过滤』

协同过滤 (简称CF) 大概是最常见的推荐算法了, 它和我们首先能想到的推荐逻辑一样: "用户1和用户2是因为音乐结缘的好朋友, 两个人有很相似的听歌历史(都听过歌曲A和B), 当用户2给1推荐1没听过的新歌C, 用户1应该会喜欢哒! " 这就是所谓的User-based CF.

Image上图来自Medium

而另外一种Item-based CF则是通过物品之间的相似进行推荐:

Image

上图来自Medium

那么问题来了, 在音乐这个场景中, 如何判断不同歌曲之间是相似的? 又如何判断不同听歌群众之间的相似? 先来解决歌曲相似的问题, 直接抛出Spotify的解决方案: 用自然语言处理中word2vec的方法, 从海量歌单入手实现song2vec.

在文本信息中, 语义相似或有潜在联系的词语, 会更大概率地出现在同一个段落, 因此用海量文本信息训练出来的自然语言处理模型, 其中隐层的权重就可以隐晦地表示一个词语, 实现word2vec. 比如下图中, 在训练这个大模型时, 输入端用了"后巷", 输出端用了"小", "暗", "后边", "the"(顿时不知道咋翻译)这些与"后巷"在同个自然段出现的词语. 以后我们判断"后巷"与"大街"有多相似时, 可以直接用下图中的模型权重W1, 与输入"大街"时模型对应的W1', 互相比较.

Image上图来自Medium

同理, 音乐平台上海量用户创建了海量的歌单, 这些歌单里涵盖的歌曲一般都有很强的相关性, 也许是流派相似, 也许是同个时代的热门, 等等等等. 那我们也可以像word2vec一样, 实现song2vec:

Image上图来自Medium

此时此刻, 每一首出现在歌单里的歌曲都能分别被表示成一个向量, 向量之间的相似性可通过欧氏距离, cosine距离, 或其他各种距离去计算, 或者交给开源的"ANNOY".

而用户之间的相似性, 则可以根据他们的听歌历史对应的向量去计算. 比如下图中用户A和B分别听过4首歌曲, 每个歌曲通过song2vec得到的向量用简单的2个数值表示一下:

Image

那么将歌曲的向量加和取平均, 就能得到代表用户A和B的向量, 分别是(2.5, 2.5)和(3.5, 3.5).

Image

接下来用户A和B到底多相似, 就又回到计算向量之间的距离问题了.

☞ ANNOY: https://github.com/spotify/annoy

说到这里, 不知道大家是否有发现协同过滤的弊端? 那就是"冷启动"问题, 即song2vec只能将在歌单里出现过的歌曲变成向量, 如果有太冷门的歌曲, 从来没被任何用户放在歌单里, 或者一首刚刚发布的新歌, 岂不是没有对应向量的存在?

基于内容的推荐就是解决冷启动的一剂良药, 而海量的音乐内容除了有歌词, 语种, 发行时间等信息之外, 音乐本身最最本质的音频信号也可以用于推荐.


『完全基于音频信号的推荐』

已经有不少工作尝试将我们之前"音频特征小全"里提到的各种特征, 加入进推荐系统里, 然而收效甚微. 直到2013年NeurIPS上的一篇"Deep content-based music recommendation"横空出世, 这是一作Aäron van den Oord在Spotify实习时的成果, 他现在在Google DeepMind工作, WavNet也是他的主要成就. 这篇文章和对应的博客也已经被许多人翻译成了中文.

文章里并没有用到多炫酷的深度学习模型, 音频预处理也是常见的波形转变为2D的时频谱, 再将其作为输入. 训练好的模型可以实现将一首歌表示成一个40维的向量:

Image

最关键的点就在于, 在训练模型的过程中用到的40维是什么? 从哪儿来的? 答案是把"各个用户对各个歌曲收听次数量"的矩阵进行分解后得到的表示各个歌曲的40维潜在因子(latent factors), 也就是下图里的"y_i".

Image

论文中矩阵分解用到的是WMF (weighted matrix factorization, 详见后文方参考文献), 设定超参数为40即可分别得到表示用户的和表示歌曲的40维潜在因子.

我们单独把"歌曲i的40维潜在因子y_i"抽出来, 在训练深度模型时, 将该歌曲的时频谱作为输入, 设定模型输出y'_i也是40维, 训练过程中使y'_i不断地去接近y_i的值. 对于其他训练集中的歌曲也是同样操作, 最后深度学习模型的参数θ可以做到使所有y'_i和y_i之间的MSE差距最小:

Image

当来了一首全新的歌时, 将其时频谱输入到刚训练好的模型中, 就能预测输出一个表示这首歌的40维潜在因子, 将它与原来分解出来的用户u的40维潜在因子x_u相乘, 就能估算出用户u将来会收听这首新歌多少次了! 若预测到收听次数越高, 把这首新歌推荐给用户u的可能性就越大.

当然也可以把深度学习模型输出的40维潜在因子, 像上文的song2vec一样, 用于相似歌曲的召回!

☞ 原论文链接: https://papers.nips.cc/paper/5004-deep-content-based-music-recommendation

☞ WMF参考文献: Yifan Hu, Yehuda Koren, and Chris Volinsky. Collaborative filtering for implicit feedback datasets. In Proceedings of the 2008 Eighth IEEE International Conference on Data Mining, 2008.


『万物皆可embedding』

除了协同过滤和基于内容的推荐, 更厉害的音乐推荐系统还应该做到为用户设身处地的进行推荐, 即contex-aware. 比如我在跑步的时候要是一直被推荐到瑜伽歌曲, 那就不太合适, 但这里又会涉及到app与用户隐私之间的问题.

目前业界多为混合推荐, 各种策略均有. 所用特征如果一个值无法清晰表示, 不如变成像song2vec或潜在因子那样的embedding. 关于音乐推荐系统的更多前沿学术内容可以参考Markus Schedl和Peter Knees发表过的文章.

"Deep Learning in Music Recommendation Systems." Frontiers in Applied Mathematics and Statistics 5 (2019): 44. 


最后, 音乐推荐更离不开用户的反馈, 当你在app上对我们推荐歌曲的喜恶越明确, 算法就越会贴合你的口味. 

分别用"完全基于音频的潜在因子"和"协同过滤里word2vec"召回的相似歌曲, 有什么微妙的不同, 欢迎大家扫码去我的QQ音乐歌单中感受一下 (注: 歌单中均以第一首歌曲为起源, 第2&3首用了42维audio embedding, 第3&4首用了84维, 最后两首用word2vec进行相似歌曲召回).

Image

Image