Spotify的每周發現(Weekly Discovery):機器學習是如何找到你喜歡的音樂的
版權聲明:本文翻譯自《Spotify』s Discover Weekly: How machine learning finds your new music》,原作者Sophia Ciocca 。原作者保留所有權益,未經原作者或本人允許,任何人不得以任何方式、任何理由轉載本文。若發現未經溝通轉載,請按照800元/千字付費。
個人音樂推薦背後的科學道理
和往常的每一個周一一樣,在這個周一,超過一億的Spotify用戶再一次發現了為他們而生的全新的音樂播放列表。這個列表是一個含有30首為每位用戶量身打造的音樂的合集,用戶們之前從未聽過這些音樂,但是卻可能會愛上它們。這個列表叫做每周發現(Weekly Discovery),是一個非常神奇的東西。
我是Spotify的忠實粉絲,尤其喜歡它的每周發現。為什麼?它讓我覺得我正在被關注。他比我生命中的任何一個人都更了解我的音樂喜好。它每周都能恰到好處的滿足我,帶給我那些我自己可能永遠找不到,或者永遠不知道我會喜歡的曲子,這一直以來令我感到無比的愉快。
各位帶好耳機的朋友們,請允許我介紹我的虛擬好友:
當然,並不僅僅只有我一個人沉迷於每周發現——有太多的用戶們為之瘋狂,這也驅使著Spotify徹底的重新思考了它們的關注點,並且投入了更多資源在這一基於演算法的播放列表上。
看到@Spotify的每周發現如此了解我,這真的很恐怖。就像是和我一起經歷了瀕死體驗的前女友一樣。
——@dave_horwitz@Spotify的每周發現實在是太了解我了!如果它向我求婚我一定會答應!——@amandawhitbred
自從每周發現於2015年首次發布以來,我一直渴望搞清楚它是怎樣工作的(另外我還是這家公司的迷妹,因此有時候我會假裝我在那兒工作並研究他們的產品)。經過三周瘋狂的Googling,我覺得我大概有點兒明白幕後的門道了。
那麼,Spotify是如何做到每周為每人挑選30首音樂的?讓我們首先張開眼睛看看其他音樂服務公司是如何完成音樂推薦的,然後再看看Spotify是如何完成的更好的。
在線音樂推薦簡史
回到20世紀,Songza拉開了在線音樂推薦的大幕,他們使用人工推薦來為用戶創建播放列表。「人工推薦」意味著有一隊「音樂專家」或其他什麼管理員手工將他們認為不錯的音樂整理為播放列表,然後聽眾就會只聽他們的播放列表(後來,Beats Music沿用了同樣的策略)。人工推薦的效果還可以,但它依靠人力操作,並且過於簡單,因此無法考慮到每個聽眾個體音樂品味的細微差別。
和Songza類似,Pandora也是音樂推薦舞台上的一位老玩家。他們使用了一種稍微高級一點的技術,也就是人工標記歌曲特徵的方法。這意味著組織一波人來聽音樂,為每首曲子選一些描述性的詞語,並且用著些詞語來標記這首曲子。然後,Pandora就可以簡簡單單的通過篩選某個特定的標籤來生成相似歌曲的播放列表。
差不多在同一時期,出身MIT Media Lab的音樂智能機構——The Echo Nest——誕生了。他們採用了更加高級的方法來為用戶生成定製化音樂列表。The Echo Nest 使用演算法來分析音樂的音頻和文字內容,從而實現音樂識別、個性化推薦、播放列表生成和分析。
最後,還有一個選擇了另外一種方法的公司,那就是Last.fm, 他們今天依然存在於市場上。Last.fm使用了被稱為協同過濾(collaborative filtering)的方法來識別用戶喜歡的音樂。(後文詳述)
那麼,假如這就是其他音樂推薦服務如何為用戶推薦他們喜歡的音樂的,Spotify又是如何設計出他們的神奇機器,哪些因素看起來能夠使它比其他公司更加準確的識別每個用戶的喜好呢?
Spotify的三類推薦模型
實際上,Spotify不僅僅只用單單一個革命性的推薦模型——相反,他們把其他推薦服務所使用的最好的策略結合起來,創造了他們自己獨特的強大的發現引擎。
要創造每周推薦,主要有三種類型的推薦引擎:
- 協同過濾(Collaborative Filtering)模型:(例如Last.fm原來使用的方法)通過分析你的行為和其他人的行為。
- 自然語言處理(Natural Language Processing,NLP)模型:通過分析文本
- 音頻(Audio)模型:通過分析原聲音軌本身。
讓我們深入學習一下這些推薦模型都是如何工作的!
推薦模型 NO. 1: 協同過濾(Collaborative Filtering)模型
首先,來看一些背景知識:當很多人聽到協同過濾這個詞的時候,他們首先想到的是Netflix,因為他們是最早使用這一演算法來驅動推薦模型的公司之一。依靠用戶的電影星級評分數據來理解哪些電影應該被推薦給其他相似的用戶。
在Netflix的成功應用之後,這一技術很快擴散開來。現在,任何一個想要開始寫一個推薦模型的人都會考慮從協同過濾模型開始。
然而,與Netflix不同的是,Spotify並沒有這些用戶對音樂的評分數據。相反,Spotify的數據是隱含反饋——具體來說,我們聽某首曲子的次數,和其他的數據,包括用戶是否把這首曲子保存到了自己的播放列表中,或者聽完歌曲後訪問了演唱者的主頁。
那麼,什麼事協同過濾?這一演算法又是如何工作的?如果我們高度概括一下,總結為一句對話那就是:
發生了什麼?這兩個人都有各自的樂曲喜好:左邊的喜歡P,Q,R,S,右邊的喜歡Q,R,S,T。
協同過濾使用這些數據來分析:
「嗯你們都喜歡Q,R和S,那麼你們大概是相似的用戶。因此你們各自很有可能喜歡其他人聽過但你們還沒聽過的曲子。」
因此它會建議右邊的人試試P曲子,左邊的人試試T曲子,很簡單對不?
但是Spotify是如何將這一概念應用到實踐中,從而基於百萬其他用戶的偏好來為百萬用戶推薦歌曲呢?
。。。矩陣!
實際上,我們這裡看到的矩陣是十分巨大的,每一行代表了Spotify的1400萬用戶中的每一個,而每一列則代表了Spotify曲庫中300萬首歌的每一首。
然後,在Python庫中運行下面這個很長很複雜的矩陣分解公示:
運行結束後我們得到兩類向量,在這裡分別用 X 和 Y 代表。 X是用戶向量,代表一位用戶的喜好,Y是歌曲向量,代表一個單獨的歌曲特徵。
現在,我們得到了1400萬個一一對應的用戶向量和300萬歌曲向量。這些向量的內容是一些無意義的數字,但是在通過對比可以得到很有意義的結果。
要找到那些和我的口味一致的人,協同過濾對比我的向量和其他所有人的向量值,最終找到和我最相似的人。同樣的方法,在Y向量上面,也就是歌曲上,我們可以拿一首歌的向量和其他所有歌曲對比,找到最相似的那一首。
協同過濾演算法的效果不錯,但是Spotify知道,如果加上另外的一個引擎,它的效果將會更好。
推薦模型NO.2:自然語言處理(Natural Language Processing,NLP)
Spotify使用的第二類模型是自然語言處理模型。這一模型的輸入數據——顧名思義——就是普通的文字:歌曲題錄、文章、博客和網路上的其他文本。
自然語言處理——計算機理解人類語言的能力——本身就是一個巨大的領域。大多數時候利用用情感分析APIs。
NLP背後的詳細機制已經超出了本文的範疇,這裡僅作簡單的介紹:Spotify定期爬取網頁的內容,例如關於音樂的博客或者其他文本,分析人們對某位藝術家或者歌曲做了怎樣的評價——哪些形容詞和語言經常被用來談論這些歌曲,哪些其他的藝術家和歌曲也經常被一併談論。
儘管我不清楚具體Spotify是如何決定後續處理他們爬下來的數據的,但我可以告訴你Echo Nest是怎麼做的。首先他們將數據分類到所謂的「文化向量」(cultural vectors)或「主題詞」(top terms)。每位藝術家和歌曲都有上千個每天都變化的主題詞,每個詞有一個權重,代表了這個描述的重要程度(大概就是一個人用這個詞來描述這首音樂的可能性)。
然後,就像在協同過濾中一樣,NLP模型使用這些詞和權重來創建一個向量表示一首歌,然後就可以確定兩首音樂是否相似。酷不酷?!
推薦模型NO.3: 原始音頻模型
你也許在想:
hey!我們已經有了前面兩個模型了,為什麼還要分析音頻本身呢?
那麼,首先,添加第三個模型可以更好地提高這一推薦系統的準確性。但是實際上,添加這個模型更多的是出於第二個目的:原始音頻模型考慮了新歌曲。
例如,一首由你的歌手-作曲家朋友寫的歌被發到了Spotify上面。也許它只被聽了50次,那能夠被協同過濾器對比的聽眾就更少了。這首歌也沒被人們在網路上討論過,那麼NLP模型也無法挑出它來。幸運的是,原始音頻模型不會區別對待新歌曲和流行歌曲,因此有了它的幫助,你朋友的歌也可以和那些流行的歌曲一起出現在每周推薦的列表上!
那麼,到了問「怎麼樣」的時候了——我們怎麼樣才能分析如此抽象的原始音頻模型呢?
……使用卷積神經網路!
卷積神經網路也被用來處理人臉識別。在Spotify的例子里,經過修改,它被用在了音頻數據而不是像素上。這是一個卷積神經網路結構的例子:
這個神經網路有四層卷積層,見於左側的較寬的框;三個密度層,見於右側較窄的框。輸入值是音頻的時間-頻率數據,這一數據隨後會被串聯起來以形成頻譜圖。
音頻進入這些卷積層,然後我們會看到「全局時間池化層」(Global temporal pooling),在這裡整個時間軸被池化,然後高效地計算在整首歌的時間裡所學習到的特徵的統計數據。
處理之後,神經網路輸出對這首歌的理解,包括一些特徵,例如大概的時間戳、基調、模式、節奏、響度等。以下是對Daft Punk的「Around the World」 的一個30秒選段數據的展示:
最終,對一首歌的關鍵特徵的理解是Spotify可以理解歌曲之間的本質上的相似度,進而基於用戶的聽歌歷史了解用戶是否會喜歡這首歌。
我們介紹了三個推薦模型及其基本概念,他們為推薦系統輸入數據,並最終驅動了每周發現。當然這些推薦模型全都和Spotify的更大的生態系統息息相關,包括海量的數據存儲,大量的Hadoop集群以衡量推薦結果和使這些引擎在巨大的矩陣上運行,無盡的網路音樂文章和大量的音頻文件。
我希望這篇文章能提供一些有用的信息,撩起你的好奇心,就像我一樣。現在,我要去創建我自己的每周發現,找到新的我喜歡的音樂,了解幕後所有的機器學習演算法。
Sources:
?—?From Idea to Execution: Spotify』s Discover Weekly (Chris Johnson, ex-Spotify)
?—?Collaborative Filtering at Spotify (Erik Bernhardsson, ex-Spotify)
?—?Recommending music on Spotify with deep learning(Sander Dieleman)
?—?How music recommendation works?—?and doesn』t work(Brian Whitman, co-founder of The Echo Nest)
?—?Ever Wonder How Spotify Discover Weekly Works? Data Science (Galvanize)
?—?The magic that makes Spotify』s Discover Weekly playlists so damn good (Quartz)
?—?The Echo Nest』s Analyzer Documentation
推薦閱讀:
※平移不變的正則線性回歸
※在CentOS 7下搭建機器學習環境
※泰坦尼克號存活預測
※《機器學習實戰》學習總結(十)——K-均值聚類(k-Means)
※第一章:機器學習在能源互聯網中的應用綜述(一)