網易雲音樂的推薦歌單是怎麼計算的?

網易雲音樂的推薦歌單是怎麼計算的網易內部怎麼做到這麼好的推薦?在知乎上面問幾乎不會得到正確答案的吧,我的答案只是從我的經驗出發: 「如果設計產品的話,我會這樣思考」。

一個優秀的推薦系統不僅僅是個性化演算法這麼簡單 -- 基礎的也好,fancy的也好 -- 一個完整的推薦系統體系怎能不提及官方團隊推薦(Editorial)、UGC(User-Generated Content)和熱門推薦(Top Seller/Trending)的協作呢?

相似度矩陣(Similarity Matrix):

大家提的各種演算法裡面,幾乎都是基於相似度的吧 -- 無論是CF還是Content based產生的相似度,前者需要用戶的行為數據,後者需要歌曲的元數據(metadata),比如旋律、Tag等等。具體演算法就不再複述了,屬於計算機科學的基礎內容,很多人都說過了,實現起來簡單。雖然很多人給出了沙盒的數據,但是這些數據實在是太好了,雖然不知網易數據的「質」和「量」如何,但是應該不至於這麼好(?)。所以,憑單一的方法真的大丈夫嗎?

我們先從Similarity的問題說起:

大多數用戶一開始會先從自己熟悉的歌曲開始,然後一般都會給出非常相關的推薦,比如你聽周杰倫的任何歌曲,他的其他熱門歌曲肯定都會非常相關,比如周杰倫的《晴天》,周杰倫的《遊園會》,周杰倫的《七里香》,也不失為一個好的推薦。但是你會發現全都是周杰倫,單調死了。全是周杰倫的理由很簡單,因為很多用戶都連著聽下去呀,聽完一首周杰倫到下一首周杰倫,聽完這個專輯聽下個專輯。如果你往後再翻翻,估計還能找到別歌手的歌曲,但是請記著:你的屏幕就這麼大,坑就這麼多,再好的推薦不能在考前的位置被用戶看到和消費到終歸也還是扯淡。現在我們來嘗試解決這個問題,我們先來做個簡單的多樣化過濾,我們限制來自同一個歌手的推薦數量,這樣後面更多歌手的歌去被推上來了,很好。

現在又一個的問題來了,陳奕迅這時候發新磚了,用戶一下子蜂擁去聽他的新磚了,包括周杰倫的一眾擁躉們也跑去觀望了一下,這樣的情況持續了一個多月,這下好了,用戶看到的推薦裡面現在幾乎都能看到陳奕迅的這些歌了,儘管他這的歌跟周杰倫的歌原本不至於這麼相關。而且由於這個效應,更多的人從推薦裡面點進去了聽陳奕迅的這些歌,造成了一個惡性循環,使得你的Similarity以為他們真的相關,這時候其他真正相關的優質推薦卻被擠壓到後面了。我們來嘗試解決這個問題,最簡單的莫過於是計算相似度的時候過濾掉「過於」熱門的歌曲了,把這些歌曲推後吧,感覺問題應該也能解決了。

現在一波未平一波又起,假設現在一個非常優秀的Indie歌手,唱的歌也好有周杰倫的早年的范,反正就是非常相關,周杰倫的歌迷肯定會喜歡那種(對不起實在不熟悉國內歌手,幸虧不是做的這行,這位迷一樣的歌手大家請自行腦補)。這位迷一樣的歌手剛出道,宣傳力度不大,也只有少數幾個地方能聽到他的歌曲,只有被小數的幾個周杰倫迷給發掘出來了,現在問題來了,我們該如何使得這個歌手被發掘出來呢?這個基本上與上一個問題相反,這是冷門的優秀推薦很難被發掘。這時候我們可以用點歸一化

網易雲音樂的推薦歌單是怎麼計算的(Normalization)的小伎倆微調一下。值得一提的是,歸一化更能給解決一下上一個提及的太過熱門的問題,可以說怎樣做Normalization才是各大廠家的殺手鐧吧,雖然都可能大同小異,但是不同行業還是需要細分。

先別歇下,更多的問題將要來襲:

Similarity的確是非常natural的推薦演算法,事實上當數據足夠大、足夠乾淨和精確的時候,Simialrity是很難被打敗的。但是設想如果是網易音樂發展初期,沒有很多用戶數據的情況下呢?又如果是網易音樂急速擴張時期,用戶數據很多但是很sparse的時候呢?又從用戶角度切入,設想是一個剛加入的新用戶,並沒有其它用戶數據來源來提供推薦的情況下呢?這些冷啟動問題,又該如何解決呢?難道就應該放棄這些用戶?可能我們可以做更多的Trick來調整我們的演算法,也可以去嘗試更fancy的其他演算法,嘗試去做Hybrid、fused的系統,但是首先,產品的研發周期會變長,開發投入變大,系統變複雜維護的消耗更大,然後更糟糕的是因為進展緩慢,用戶一直看的就是不咋地的推薦,用戶開始流失,數據更加稀疏,最後導致惡性循環。

工程師的尊嚴並不是鑽牛角尖:

...而是拿出creative的思維來跳出盒子,嘗試通過別的途徑來解決這些問題。

我們先從做一個首頁顯示熱門榜單開始,這是一個非常容易實現的功能,計數、排序、簡單分類:中國、歐美、日本和韓國,按流派也行:流行、搖滾、古典,甚至按年齡段或者群體,不外乎是幾個資料庫搜索的事情。但是這些熱門排行榜卻作用非凡,用戶可以從中發現當前的大趨勢(Trending),比如說,現在張傑比周杰倫風頭要盛,聽聽張傑的看看怎樣。由此榜單也能幫助用戶發現他本來興趣圈以外的東西。這麼容易實現的功能,卻也可以帶來不少的好處,屬於「low hanging fruit」,沒有不摘的理由。

然後我們來聘請一批專業的媒體編輯員,讓他們根據我們歌曲庫里的內容,生成比較專業的榜單,比如:「高逼格小清新」,「喧囂中,不妨試的調調」 還有 「被遺忘的經典華語女聲」。用過其它的歌曲軟體的人估計對這個也不陌生,比如說蝦米。這個也能很大程度上幫助用戶發現興趣圈以外的東西,而且由專業人員生成的歌單,更有目的性,比如說你喜歡蘇打綠是因為「小清新」,那麼在「小清新」的歌單里的,就是一大批高質量的,對你而言非常優秀的推薦了。這樣的功能也能很快組織和實現起來,好處也是大大的。

最後,看到了知乎的威力以後,我們考慮做UGC。從做一個簡單的UGC功能開始,我們現在另開一個資料庫,允許用戶保存自己的歌單,並在個人主頁推薦這些歌單。同時我們在主頁中定期置頂一些訪問量較大的歌單。功能上非常容易實現。UGC所激發的用戶潛能可以使得用戶產生與專業編輯員質量相當的、甚至更高的歌單。功能上的實現實在是再簡單不過,效果更是不言而喻。

這時候我們的很大一部分問題得到解決,就算是我們的Similarity所產生的推薦並不是那麼好的時候,我們的用戶並不會由此而失去發現音樂的途徑。聽歌的人多了,用戶保持engaging,老用戶們持續產生高質量的數據,我們之前的個性化推薦演算法也能有更好數據來調整參數,從而產生更好的音樂推薦,更好好的用戶群體也能推動熱門榜單與UGC的發展,進入良性循環。

我希望我闡述清楚了一個好的推薦系統「生態圈」的重要性,演算法牛逼的當然有,再牛逼的都有,但是你總要trade-off,總會有不足。現實中,估計很少問題被是「一條路走到黑」地,「簡單暴力」地方法解決的吧。

現在再來回顧題主的問題:

「網音給我推薦的歌單幾乎次次驚艷,而且大多都沒聽過,或者好久以前聽過早就忘記了名字,或者之前不知道在哪聽過 只是知道其中一部分旋律,根本不知道名字,等等,聽起來整個人逼格大有提升。」

"我想知道網音的歌單推薦是網音項目團隊精心挑選製作的,還是眾多音樂達人的推薦?即:歌單是網音官方提供,還是UGC?才有如此對口味的歌單推薦?"

我的猜測(因為我永遠不知道答案)是:都有。

我感覺題主描述的就是一個成熟的推薦系統生態圈共同作用的結果,剛剛去看了一下網易雲音樂的界面(所幸暫時還沒有地區限制),的確也是有這些功能的。(網易雲音樂 聽見好時光)

題主得到的高逼格推薦,很可能就是最早來源於一個名為「高逼格小清新」專業編輯推薦歌單,有效地引導了興趣相投的用戶去發現這些音樂,大多跟你有相似品味的人都聽過並感覺不錯,最後還經過fancy演算法「沉澱」、「發酵」,產生了很好的相似度,從而生成了了這麼優秀的推薦並推送了給了題主。然後題主來知乎發了個帖子,大家被「驚艷」到了,更多的新用戶加入,perfect!

最後,如果真的有這麼多用戶都覺得網易雲音樂的推薦都非常「驚艷」的話,那這個產品就實在是太成功了,特別是考慮到「眾口難調」的音樂領域。

網易雲音樂的推薦歌單是怎麼計算的


推薦閱讀:

撐住我,讓我真正停留
如何免費下載付費VIP音樂,這個網站你知道嗎?
網易雲音樂2017年度最熱新歌TOP10,你聽過幾首?
衝破音樂鄙視鏈?獨立音樂人的美麗與哀愁

TAG:網易 | 蝦米音樂網 | 音樂 | 網易雲音樂 | 推薦 |