【嵌牛导读】:深度学习如今已经在生活的各个方面都被广泛应用。它也可以用来进行打造音乐推荐系统。
【嵌牛鼻子】:深度学习 音乐推荐系统
【嵌牛提问】:如何用深度学习发现一首歌属于哪个流派?
【嵌牛正文】:
这些年我(作者 Matt Murray——译者注)在音乐上可没少花钱,经常到一个叫JunoDownload的网站上付费下载 MP3 歌曲。这个数字音乐下载网站在 DJ 圈里很火,在上面能买到各种流派的歌曲。
总之这是一个非常不错的音乐资源,为在售的每首歌都提供了一个 2 分钟的 MP3 格式的试听样本。唯一的问题是····在这个网站上找到一首老歌实在是太困难了。
这个网站极度热衷推广新歌曲,当然这也说得过去,因为新歌卖得火就意味着赚的更多了。但是那些以前的老歌呢?
音乐推荐
其实在 JunoDownload 网站上已经存在一些推荐歌曲,在网站主界面上有在售歌曲排行榜,新歌排行榜,以及由一些 DJ 和网站编辑创建的推荐歌单。
购买了这首歌曲的人还买了
在每首歌的页面上,窗口右手边显示了“”,“”和“”,这些信息倒也有用。
你可能还喜欢
但是坐拥这么大的一个音乐数据库,我觉得这个网站上却唯独缺少基于内容的推荐类型,比如“”,也就是根据用户当前所听的歌曲和已购买的歌曲,向用户推荐他可能喜欢的同类歌曲。
当然我也知道,现在几乎所有的音乐 App 都已经有这种功能,但是亲自用深度学习技术创建一种能帮自己发现歌曲的系统,还是很酷的,对吧?所以我决定搭建一款音乐推荐系统。
过程
要想实现这个目标,需要几个步骤,包括获取数据、处理数据和训练模型。
整个工作流程涉及:
下载 MP3 文件
我需要做的第一件事就是下载大量 MP3 样本文件用作数据。
在爬取网站上超过 40 万首歌曲文件的单曲信息后,我会任意选择 9 种不同的音乐流派,并按这 9 个流派从每个流派中随机选择 1000 首歌曲。
这 9 个歌曲流派是:
碎拍音乐
雷鬼乐
慢摇
鼓打贝斯
经典电音
嘻哈乐
极简音乐
摇滚乐
迷幻舞曲
在接下来几天内,我下载了全部 9000 首 MP3 文件。
将音频转换为声谱图
一份音频文件内包含的数据非常多,所以这一步的大部分工作实质上就是浓缩音乐中的信息,提取主要特征并去除所有的噪声数据。基本上这是一项降维操作,首个步骤就是把音频转换为图像形式。
利用离散傅里叶变换法,我将音频信号转换为频域,以这种方式处理了全部 9000 个 MP3 音频文件,为每首歌保存了它们的声谱图。所谓声谱图就是声音频率的频谱随着时间变化的可视化表示。图谱中颜色的深浅表示该频率下的声音大小。
我选择创建单色的声谱图,如下所示:
这是从嘻哈单曲中生成的约为 20 秒的音频,其中声谱图中 X 轴为时间,Y 轴为声音频率。
将图像分为 256 x 256 的正方图
如果用这些数据训练模型,我需要将所有的图像具有相等的维度,所以我将全部声谱图分割为 256 x 256 的正方图。这表示每张图上约为 5 秒的音频。
现在我总共有超过 18 万 5 千张图像,每张图像都有一个标签,注明了音乐流派。
我将数据分为包含 12 万张图像的训练集、包含 4 万 5 千张图像的验证集和 2 万张图像的 Holdout 验证集。
用图像训练一个卷积神经网络
我用我的图像数据训练了一个 CNN 网络,我需要教它来识别不同类型的音乐在声谱图图像中“看起来”是怎样的,所以我使用了音乐流派标签训练它从图像中识别音乐流派。
下面是 CNN 工作流的可视化图:
首先以上图左上角的声谱图开始,将它转换为一个由表示每个像素中颜色的数字组成的矩阵。从这里开始,数据会经过工作流中的多个层级,每经过一层,矩阵的形状就会被转换,直到最终抵达右下角的 softmax 分类器。这个分类器是一个由 9 个数字组成的向量,包含了 CNN 将 9 个音乐流派分配给声谱图的概率。
还有一步就是全连接层,这是一个由 128 个数字组成的向量,它们实质上是在图像经过多个网络层传递后从中提取的 128 个音乐特征。思考这一层的另一种方法是原始图像中的所有关键信息都已浓缩为“解释”图像的 128 个数字。
那么我们怎么使用 CNN 模型呢
经过训练后,模型能够以 75 的准确率分类音乐流派,我觉得这个准确率还可以,因为划分音乐流派有时是相当主观的,而且音乐有时常常也不止一个流派。下面是模型分配各个流派的准确率:
碎拍音乐:91%
雷鬼乐:90%
慢摇:79%
鼓打贝斯:78%
经典电音:71%
嘻哈乐:71%
极简音乐:70%
摇滚乐: 63%
迷幻舞曲:61%
模型为歌曲分配音乐流派的效果还是很不错的,我怀疑嘻哈乐、鼓打贝斯和慢摇之间可能存在一些交叉,这可能导致了分类准确率降低。由于碎拍乐和其它 8 种流派区别很大,所以这可能是为何模型分类它的准确率很高的原因。
不过,这些数字对我来说并不是最重要的,我真正关心的是模型能否区分不同类型的音乐。
音乐推荐系统
现在我已经训练了一个能在声谱图上“看”音乐的神经网络,不再需要 softmax 分类器了,所以移除了这一层,并为数据集中全部 18 万 5 千张图像提取了它们的 128 个音乐特征向量。
每张图像仅表示大约 5 秒长的音频,样本 MP3 文件总共长 2 分钟,我大约有 23 张图像——因此每个音乐文件会有 23 个特征向量。我计算了每首歌的平均向量,得到了 9000 个特征向量,每个对应我最初下载的 9000 首歌曲中的每一首。
和开头一样,我把这 9000 个音频文件转换为 9000 张声谱图,将它们分割为 18 万 5 千张更小的声谱图,再用它们训练一个卷积神经网络。然后我从这些图像中提取了 18 万 5 千个特征向量,为 9000 个原始音频文件计算了它们的平均向量。
此时已经从音乐文件中提取了 128 个特征,这些音乐文件都有不同的音乐特点。那么为了创建能推荐具有相似特点的歌曲的推荐系统,我只需找到哪些向量彼此最相似。要得到这个结果,我需要计算出 9000 个向量的余弦相似性。
歌曲推荐
最后一步就是随机选择一首歌,然后让模型从我下载的 9000 首 MP3 歌曲数据集中返回相似音乐(具有最大余弦相似性的歌曲)的最佳推荐。
结语
我觉得整件事情最酷的地方就是完全不用人监督,想象一下,如果你自己一首接一首的听完这 9000 首歌曲,为它们标记好流派,这得花多长时间啊。假设你有一百万首歌曲呢?
所以我对我创建的这款音乐推荐系统还是很知足的,它能在无需人类事先听取音频的情况下,很好地找到风格很相似的歌曲。
作者:莫斯科的雨夜