用深度學習打造自己的音樂推薦系統

weixin_33872660發表於2018-11-02

姓名:閆偉  學號:15020150038

轉載自:https://zhuanlan.zhihu.com/p/44188154,有刪節。

【嵌牛導讀】:深度學習如今已經在生活的各個方面都被廣泛應用。它也可以用來進行打造音樂推薦系統。

【嵌牛鼻子】:深度學習 音樂推薦系統

【嵌牛提問】:如何用深度學習發現一首歌屬於哪個流派?

【嵌牛正文】:

這些年我(作者 Matt Murray——譯者注)在音樂上可沒少花錢,經常到一個叫JunoDownload的網站上付費下載 MP3 歌曲。這個數字音樂下載網站在 DJ 圈裡很火,在上面能買到各種流派的歌曲。

14739783-0464b7d3b1174389.jpg

總之這是一個非常不錯的音樂資源,為在售的每首歌都提供了一個 2 分鐘的 MP3 格式的試聽樣本。唯一的問題是····在這個網站上找到一首老歌實在是太困難了。

這個網站極度熱衷推廣新歌曲,當然這也說得過去,因為新歌賣得火就意味著賺的更多了。但是那些以前的老歌呢?

音樂推薦

其實在 JunoDownload 網站上已經存在一些推薦歌曲,在網站主介面上有在售歌曲排行榜,新歌排行榜,以及由一些 DJ 和網站編輯建立的推薦歌單。

14739783-25369e864335bc2a.jpg

在每首歌的頁面上,視窗右手邊顯示了“購買了這首歌曲的人還買了”,“該歌手釋出的其它歌曲”和“該唱片公司釋出的其它歌曲”,這些資訊倒也有用。

但是坐擁這麼大的一個音樂資料庫,我覺得這個網站上卻唯獨缺少基於內容的推薦型別,比如“你可能還喜歡”,也就是根據使用者當前所聽的歌曲和已購買的歌曲,向使用者推薦他可能喜歡的同類歌曲。

當然我也知道,現在幾乎所有的音樂 App 都已經有這種功能,但是親自用深度學習技術建立一種能幫自己發現歌曲的系統,還是很酷的,對吧?所以我決定搭建一款音樂推薦系統。

過程

要想實現這個目標,需要幾個步驟,包括獲取資料、處理資料和訓練模型。

整個工作流程涉及:

下載 MP3 檔案

我需要做的第一件事就是下載大量 MP3 樣本檔案用作資料。

在爬取網站上超過 40 萬首歌曲檔案的單曲資訊後,我會任意選擇 9 種不同的音樂流派,並按這 9 個流派從每個流派中隨機選擇 1000 首歌曲。

這 9 個歌曲流派是:

碎拍音樂

雷鬼樂

慢搖

鼓打貝斯

經典電音

嘻哈樂

極簡音樂

搖滾樂

迷幻舞曲

在接下來幾天內,我下載了全部 9000 首 MP3 檔案。

將音訊轉換為聲譜圖

一份音訊檔案內包含的資料非常多,所以這一步的大部分工作實質上就是濃縮音樂中的資訊,提取主要特徵並去除所有的噪聲資料。基本上這是一項降維操作,首個步驟就是把音訊轉換為影象形式。

利用離散傅立葉變換法,我將音訊訊號轉換為頻域,以這種方式處理了全部 9000 個 MP3 音訊檔案,為每首歌儲存了它們的聲譜圖。所謂聲譜圖就是聲音訊率的頻譜隨著時間變化的視覺化表示。圖譜中顏色的深淺表示該頻率下的聲音大小。

我選擇建立單色的聲譜圖,如下所示:

14739783-07b74f4727ee6b77.jpg

這是從嘻哈單曲中生成的約為 20 秒的音訊,其中聲譜圖中 X 軸為時間,Y 軸為聲音訊率。

將影象分為 256 x 256 的正方圖

如果用這些資料訓練模型,我需要將所有的影象具有相等的維度,所以我將全部聲譜圖分割為 256 x 256 的正方圖。這表示每張圖上約為 5 秒的音訊。

14739783-c4744edb5087faac.jpg

現在我總共有超過 18 萬 5 千張影象,每張影象都有一個標籤,註明了音樂流派。

我將資料分為包含 12 萬張影象的訓練集、包含 4 萬 5 千張影象的驗證集和 2 萬張影象的 Holdout 驗證集。

用影象訓練一個卷積神經網路

我用我的影象資料訓練了一個 CNN 網路,我需要教它來識別不同型別的音樂在聲譜圖影象中“看起來”是怎樣的,所以我使用了音樂流派標籤訓練它從影象中識別音樂流派。

下面是 CNN 工作流的視覺化圖:

14739783-c12bc58d05e8a7f6.jpg

首先以上圖左上角的聲譜圖開始,將它轉換為一個由表示每個畫素中顏色的數字組成的矩陣。從這裡開始,資料會經過工作流中的多個層級,每經過一層,矩陣的形狀就會被轉換,直到最終抵達右下角的 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 首歌曲,為它們標記好流派,這得花多長時間啊。假設你有一百萬首歌曲呢?

所以我對我建立的這款音樂推薦系統還是很知足的,它能在無需人類事先聽取音訊的情況下,很好地找到風格很相似的歌曲。

本專案程式碼地址:

https://github.com/mattmurray/music_recommender​github.com

mattmurray/juno_crawler​github.com

14739783-a65217d1eb2da13f.jpg

參考資料:http://mattmurray.net/building-a-music-recommender-with-deep-learning/

相關文章