Spotify 每週推薦功能:基於機器學習的音樂推薦

lsvih發表於2019-02-27

Spotify 每週推薦功能:基於機器學習的音樂推薦

在每週週一,超過 1 億位 Spotify 使用者會收到一份新鮮的歌曲播放列表。這個自定義列表中包含了 30 首使用者從來沒聽過,但可能會喜歡上的歌曲。這個神奇的功能被稱為“每週推薦(Discover Weekly)”。

我是 Spotify 的忠實粉絲,尤其喜歡它的每週推薦功能。因為,它讓我感覺到我被重視著。它比誰都瞭解我的音樂品味,而且每週的推薦都剛好令我滿足。如果沒有它,我可能一輩子都找不到一些我非常喜歡的歌曲。

如果你苦於找不到想聽的音樂,請讓我隆重介紹我最好的虛擬夥伴:

A Spotify Discover Weekly playlist — specifically, mine.
A Spotify Discover Weekly playlist — specifically, mine.

事實證明,痴迷於每週推薦的使用者不僅只有我一個 —— 許多使用者都為它痴狂,這足以讓 Spotify 重新思考其發展重點,將更多的資源投入播放列表推薦演算法中。

每週推薦功能於 2015 亮相,從那時開始,我就非常渴望瞭解它是如何運作的(我是他們公司的粉絲,所以常常假設自己在 Spotify 工作並研究他們的產品)。在經過三個星期的瘋狂搜尋之後,我得以瞟到了其帷幕後的一絲真容。

那麼 Spotify 是如何做出每週為每個使用者選出 30 首歌這個驚人的工作的呢?讓我們先看一看其它一些音樂服務商是如何進行音樂推薦的,然後分析為什麼 Spotify 做的更好。


早在 2000 年,Songza 就開始使用人工編輯來進行線上音樂策展(curation,策劃並展示)。“人工編輯”意味著需要一些”音樂專家“團隊或者其它管理員手動將他們認為很好聽的歌放到歌單中去。(後來 Beats Music 也實行了同樣的策略)。雖然人工編輯運作的很好,但是它需要手動操作並且過於簡單,無法考慮到每個聽眾個人音樂品味的差別

如 Songza 一樣,Pandora 也是音樂策展的元老之一。它採用的方法較為先進,使用人工標註歌曲屬性的方法。也就是說,有一組人在聽歌之後,為每首歌選擇一些描述性的詞,對各個曲目進行了標註。然後,Pandora 就能利用程式碼簡單地對標註進行篩選,得到比較類似的歌單。

與此同時,麻省理工學院媒體實驗室開發出了名為”The Echo Nest“的智慧音樂助手,開創了一種更加先進的個性化音樂推薦方式。The Echo Nest 使用演算法分析各個音樂音訊與文字的內容,使其能進行音樂識別、個性化推薦、建立歌單以及進行分析。

此外,至今依然存在的 Last.fm 採用了一種名為協同過濾的不同的方法。它可以識別使用者可能喜歡的音樂。稍後會詳細提到它。


以上就是其它音樂策展服務進行推薦的方法。那麼 Spotify 是如何造出它們神奇的引擎,如何做出更加符合使用者口味的推薦的呢?

Spotify 的 3 種推薦模型

實際上 Spotify 並沒有使用某個革命性的推薦模型 —— 與此相反,他們是將一些其它服務中單一使用的最佳策略混合起來,建立了自己獨特、強大的發現引擎。

Spotify 每週推薦的開發者主要採用瞭如下三種型別的推薦:

  1. 協同過濾模型(就是 Last.fm 最開始使用的模型),通過分析你的行為與他人的行為進行運作。
  2. 自然語言處理(NLP)模型,用於分析文字
  3. 音訊 模型,用於分析原始音軌
Image credit: Chris Johnson, Spotify
Image credit: Chris Johnson, Spotify

下面讓我們深入瞭解上述各個推薦模型吧!


推薦模型 #1:協同過濾

首先簡述一些背景:當人們聽見”協同推薦“這個詞的時候,大多會想起 Netflix 這個首批採用協同過濾推薦模型的公司。他們使用使用者對影片的評星來確定將什麼影片推薦給其它喜好相似的使用者。

當 Netflix 成功使用這種推薦方法之後,開始迅速發展。現在通常被認為是嘗試使用推薦模型的鼻祖。

與 Netflix 不同,Spotify 沒有讓使用者對音樂進行評星。他們採用的資料是隱式反饋 —— 具體來說,包括對使用者聽歌的流資料進行統計,以及收集一些其它的流資料,包括使用者是否將歌曲儲存到他們自己的歌單、在聽完歌之後是否訪問了歌手的主頁等等。

那麼什麼是協同過濾,它又是如何運作的呢?這兒用下面這個簡短的對話來做個簡述:

Image by Erik Bernhardsson
Image by Erik Bernhardsson

圖中發生了什麼?圖中的兩個人都有一些喜歡的歌曲 – 左邊的人喜歡歌曲 P、Q、R 及 S;右邊的人喜歡歌曲 Q、R、S 及 T。

協同過濾就像用這些資料說:

”Emmmmm,你們都喜歡 Q、R、S 三首歌,所以你們可能是類似的使用者。所以,你應該會喜歡對方愛聽而你還沒聽過的歌。“

也就是說,會建議右邊的人去聽歌曲 P 試試,建議左邊的人去聽聽歌曲 T。這很簡單吧!

但 Spotify 是如何將這種方法落到實處,用於由百萬級別使用者的喜好歌曲來計算百萬級別使用者的推薦的呢?

……應用數學矩陣,然後使用 Python 庫來實現。

在實際情況中,你在看到的這個矩陣是巨大無比的,矩陣中的每一行都代表了 Spotify 的 1.4 億使用者(如果你也用 Spotify,那你也會是這個矩陣的一行),每列代表了 Spotify 資料庫中的 3000 萬首歌

接著,Python 庫會長時間、緩慢地對矩陣按照以下分離公式進行計算:

在它完成計算之後,我們會得到兩種向量,在這裡用 X 與 Y 表示。X 是使用者向量,代表了單個使用者的口味;Y 是歌曲向量,代表了一首歌的屬性。

使用者/歌曲矩陣會產生兩個向量:使用者向量與歌曲向量。
使用者/歌曲矩陣會產生兩個向量:使用者向量與歌曲向量。

現在,我們有了 1.4 億條使用者向量以及 3000 萬條歌曲向量。這些向量的內容實質上就是一堆數字,本身沒有任何意義。但是對它們進行對比就能起到巨大的作用。

為了找到哪些使用者和我有著最相似的口味,協同過濾會將我的向量和其它每個使用者的向量進行對比,最終找到與我最相近的使用者。同樣的,對 Y 向量進行比較,可以找到與你正在聽的歌最相近的歌。

協同過濾的效果相當不錯,但 Spotify 沒有滿足於此,他們知道通過增加一些其它的引擎可以使得效果更好。下面讓我們看看 NLP。


推薦模型 #2:自然語言處理(NLP)

Spotify 採用的第二種推薦模型是自然語言處理(NLP)模型。顧名思義,這種模型的資料來源就是傳統意義上的文字 —— 這些文字來源於歌曲的後設資料、新聞文章、部落格,以及網際網路中的其它文字。

NLP 是一種讓計算機理解人類語言的能力,是一個龐大的領域。在這兒可以採用一些情感分析 API 來實現。

NLP 背後的機制已經超出了本文的討論範圍。不過我們可以這麼來大致概括:Spotify 爬蟲不斷地查詢與音樂有關的部落格以及各種文字,並瞭解人們對特定藝術家及歌曲的看法 —— 談到這些歌曲人們通常會用什麼形容詞和語言,以及會同時提到哪些其他的藝術家及歌曲。

雖然我不知道 Spotify 處理資料的細節,但我知道 the Echo Nest 是如何與他們進行協同工作的。他們會將語言處理封裝為“文化向量”或者“高頻短語”。每個藝術家及歌曲都有著數以千計的高頻短語,且每天都在變化。每個短語都有一個權重,用於表示這個短語的重要性(大致來說,就是某人描述這個音樂時會用這個短語的概率)。

the Echo Nest 使用的“文化向量”與“高頻短語”,Brian Whitman 提供表格

接下來與協同過濾一樣,NLP 模型會使用這些短語和權重為每首歌構建一個表示向量,這樣就能判斷兩首歌是否相似了。酷不酷炫?


推薦模型 #3:原始音訊模型

在開始本章之前,你可能會問:

我們已經在前兩個模型中應用了足夠多的資料,為什麼還需要分析音訊本身呢?

首先,引入這第三個模型能使這個驚人的推薦服務的準確率得到進一步的提升。但實際上,使用這個模型還有第二種目的:與前兩個模型不同,原始音訊模型可以用於處理

舉個例子,你的歌手朋友將他的新歌傳上了 Spotify,然而他僅有 50 名聽眾,如果要使用協同過濾顯然人數太少了。並且他還沒有火起來,在網際網路上任何角落都沒有被提到過,因此 NLP 模型也沒法為他發揮作用。不過幸運的是原始音訊模型不會在乎這是新歌還是老歌,有了它的幫助,你朋友的歌就有可能和那些流行的歌一起被加入每週推薦歌單了!

接下來解釋“如何”對如此抽象的原始音訊進行分析。

…使用 卷積神經網路(CNN)!

卷積神經網路正是人臉識別背後使用的技術。在 Spotify 這個場景中,工程師們使用音訊資料來代替畫素。下面是神經網路一中結構的例項:

Image credit: Sander Dieleman
Image credit: Sander Dieleman

這個特製的神經網路有 4 層卷積層,它們在圖的左邊,看起來像很厚的木板;它還有 3 層全連線層,它們在圖的右邊,看起來像很窄的木板。輸入值是音訊幀的頻率的表示,在圖中以光譜圖的形式表示。

音訊幀通過這些卷積層後,在最後一個卷積層邊你可以看到一個“全域性時間池化”層。這個池化層沿整個時間軸進行池化,高效地根據統計學找出在歌曲的時間序列中找到的特徵。

在此之後,神經網路會輸出它對一首歌的理解,其中包括各種類似時間戳、調性、風格、節奏、音量等典型特徵。下圖為 Daft Punk 的 “Around the World” 一曲中擷取 30 秒片段的資料。

圖片版權:Tristan Jehan & David DesRoches (The Echo Nest)

最終,這些由一首歌理解到的各種關鍵的資訊可以讓 Spotify 理解不同的歌中的一些本質的相似之處,由此基於使用者的聽歌歷史推斷出此使用者可能會喜歡這首新歌。


以上概況了推薦模型中的三個基本組成部分。正是由這些推薦模型組成的推薦 pipeline,最終構成了強大的每週推薦歌單功能!

當然,這些推薦模型還與 Spotify 更大的生態系統息息相關,這個生態系統中包含了海量的資料,使用大量的 Hadoop 叢集對推薦系統踐行規模化運作,使得這些引擎能夠在大尺度、無窮盡的網際網路中順利地分析音樂相關文章以及無比龐大的音訊檔案。

我希望本文的資訊能滿足你的好奇心(就像我的好奇心被滿足了一樣)。現在我正在通過我個性化的每週推薦找到我喜歡的音樂,瞭解以及欣賞它背後的各種機器學習知識。?


**資源:


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章