1. 程式人生 > >網易雲音樂的推薦音樂方式與演算法漫談

網易雲音樂的推薦音樂方式與演算法漫談

網易雲音樂在我看來在各方面都是較為出色的音樂APP,網上也有各種體驗報告、產品分析,但都比較偏向互動和前端。所以,我決定對其靠後端大功能“推薦音樂和演算法”稍作一些探討。也是因為個人喜好問題,包括我做PD的時候,也喜歡接一些靠後端的專案,所以本文也不太涉及到介面互動方面的東西。

網易雲音樂希望面向的受眾為85後到90後的年輕聽眾,且分佈於經濟發達地區。這類人對新生事物的學習和消費需求較為高漲,也是網易雲音樂為何直接將“發現音樂”置於Tool Bar第一位,且大力投入的原因。

在我看來,網易雲音樂使用了3個維度向人們推薦音樂:朋友推薦、人工推薦、智慧推薦。

朋友推薦

在這三種推薦維度中,先來簡單說說朋友推薦。這個功能雖然目前還沒有特別火,但並不能否定“朋友推薦”是網易雲音樂在音樂APP領域裡最大的前沿性嘗試,如果真的做起來了,威力不可小覷。我想,這也許是微信要封殺網易雲音樂的正真原因。眾所周知,讓自己的朋友知道自己的品味,甚至得到認可,給予人的成就感激勵是巨大的,這也是騰訊沒有想到的,所以QQ音樂也立刻在社交方面奮起直追,不過目前仍讓人覺得屬於倉促之作,期待之後的發力。

人工推薦

而“人工推薦”則是網易音樂編輯人員人工推薦的歌單和電臺。人工推薦在網易雲音樂中,仍然佔著較為主導的作用。原因很簡單,私人藝術偏好屬於非常感性的問題,有些事情沒有專業編輯做推薦確實會略顯單調。也許大資料時代是來了,但在人類較感性的問題上,計算機也許還沒有什麼太好的辦法。但“人工推薦”仍有瓶頸,因為編輯這個職業的工作導向,必然導致推薦的歌單非常的大眾化,滿足的是大部分人,而偏小眾品味的使用者,則就需要智慧推薦來支撐了。

智慧推薦

純演算法的“智慧推薦”,我們並不能說它是一個偽需求,“豆瓣FM”的出現,證明了依託大資料的智慧推薦方式並非沒有市場。這也是為什麼從那以後,類“猜你喜歡”功能也逐漸在各種音樂APP中出現。

而推薦的演算法方面,目前主流的有兩種方式,一種是以“豆瓣FM”為代表的“以人為本”方式,一種是以“蝦米歌曲漫遊”為代表的“以歌為本”方式。兩種演算法擁有互補性,網易雲音樂自然也都用在了APP裡:“以人為本”演算法在“個性化推薦”的“私人FM”和“每日歌曲推薦”中展現,“以歌為本”演算法在“個性化推薦”的其餘歌單中展現。

這兩種演算法也各有優缺點,而網易雲音樂則聰明地避開了幾乎所有缺點。我們先來梳理一下這兩種演算法及他們的優缺點:

“以人為本”演算法

“以人為本”最早的應用場景來自於亞馬遜的購物推薦,也就是俗稱的“喜歡這個商品的人,也喜歡XX”。後來,這個演算法被“豆瓣FM”拿來,用在了音樂推薦上。

那麼,這個演算法到底是怎樣的呢?舉個非常簡單的例子:  

A喜歡x,y,z三首歌。

B喜歡x,y。那麼我可以推斷,B一定也喜歡z這首歌。

當然,這也是最為簡單的情況了。

還有非常多的case,比如“喜歡”如何定義?使用者“不喜歡”怎麼辦?

也許“喜歡”下的使用者行為包括:點選“喜歡”、評論、下載、收藏到歌單、點選“相似推薦”、分享、檢視MV、聽這首歌的頻率、是否播放整曲等。

而“不喜歡”的使用者行為有可能包括:5秒內切換、扔進垃圾桶、移出歌單、刪除等。

在維度特別多的情況下,我們就需要對使用者的每個行為引入權重機制。

“以人為本”的好處是非常明顯的,這種演算法不需要特別大的人力成本,只需要寫好一個基礎演算法,並不停優化就可以了。而缺點顯而易見:

第一個缺點是使用者在使用初期會碰到的情況,在使用者剛來的時候,對於演算法來說使用者是一張白紙,那麼演算法首先會給他一些大部分人喜歡的歌曲,因為這些歌曲喜歡的機率大於其他,但恰巧此使用者的品味較為奇葩,左試右試沒有匹配到,那麼這個使用者也許會陷入煩躁,甚至流失。

第二個缺點是使用者在使用較久之後會碰到的情況,聽到的歌曲風格越來越極度的同質化,就拿我本人來舉一個極端的例子,我的品味比較奇怪,又喜歡民謠,又喜歡金屬核。那麼在演算法知道了我喜歡民謠了以後,給我推薦了海量的民謠,我也一一點選了“喜歡”,然後我會在風格方面越來越專一。致使我永遠無法聽到我喜歡的金屬核。這種情況在“豆瓣FM”中尤為明顯。

第三個缺點是對一個人的品味轉移響應速度較慢。再舉個極端的例子,比如我初中的時候還喜歡蔡依林,高一的時候忽然愛上了工業金屬。而積累了海量“類蔡依林歌曲”曲庫的我,在登入後一定會不知所措,也同樣會造成我煩躁地一遍一遍的切換著歌曲。

依託於網易雲音樂現有的歌曲搜尋和收藏功能,“以人為本”的前2個缺點被網易雲音樂輕鬆克服。

至於第三個缺點如何克服呢?我們從生成機制上可以看出,“個性化推薦”下的“私人FM”和“每日歌曲推薦”的這兩個歌單的做法略顯不同,“私人FM”和“豆瓣FM”的工作原理幾乎一致,是在使用者切換歌曲的一瞬間,通過使用者的聽歌歷史來決定播放的歌曲,所以在“私人FM”下,無法切換回上一首。

而“每日歌曲推薦”裡有一句文案暴露了實現方法,“根據你的音樂口味生成,每天6:00更新”。這說明這個歌單的工作方法,一定是每天在後臺數據庫通過使用者最新的歌曲喜好和相應公式,來生成歌單。並在每天早上的6點放到線上資料庫中,呈現給使用者看。這種實現方法,也就避免了“以人為本”的第三點缺點-個人品味轉移響應速度較慢這個缺點。

“以歌為本”演算法

我們再來看以“蝦米歌曲漫遊”為代表的“以歌為本”的推薦方式。這種演算法是將每首歌曲打上Tag:

歌曲A擁有Tag:X,Y

歌曲B擁有Tag:Y,Z

你喜歡歌曲A,因為他有TagY,所以也許你也會喜歡歌曲B。

“以歌為本”這種演算法的優點是避免了“以人為本”幾乎所有的缺點。但是缺點也同樣凸顯:

第一個缺點是歌曲推薦同質化較為嚴重,這也是我經常在蝦米使用“歌曲漫遊”時碰到的情況,我喜歡同一風格的兩首歌,那麼,在分別漫遊這兩首歌的時候,生成的歌單幾乎是一模一樣的。

第二個缺點是工作量非常巨大,這個世界上所有的歌曲有3500萬首,雖然大多數人聽的歌都集中在一起,但既然使用了這種演算法,你不得不得考慮到小眾品味使用者的需求。

而網易雲音樂對“以歌為本”的演算法缺點克服,則做的更為聰明,也非常具有前沿性。

對第一個缺點,也就是歌曲推薦重複情況,網易雲音樂的做法是:不像蝦米一樣在“歌曲”這個維度上進行推薦,轉而全部使用“歌單”這個歌曲集合進行推薦,大大增加了容錯率。這種聰明做法也立刻被其他音樂APP競相模仿。

對於第二個缺點,也就是打Tag的工作量巨大問題。網易雲音樂也有自己的解決方法:在使用者建立歌單時,網易雲音樂會讓使用者自己給自己的歌單打Tag,不得超過3個,且禁止自建Tag,這兩個限制也可能暴露了這套機制的實現方法。我認為歌單上的3個Tag會被分配到歌單下的每首歌上,而一首歌經常會被不同的使用者分配到不同的歌單中,那麼剩下的事情就變得簡單了,只要取在這首歌上被分配得最多的幾個Tag來參與演算法即可。所以我們可以看到“個性化推薦”下,網易雲音樂可以通過歌單和歌曲兩個緯度來給我們推薦歌曲。這麼做不但減輕了工作量,也使歌曲Tag更科學,更具時效性。

其他優化建議

這麼看來,網易雲音樂確實在演算法上下足了功夫。是否還有地方值得優化?

我拋磚引玉一下,先說第一點,也是我經常碰到的煩惱問題,我想大家也一定碰到過。當使用任何一款音樂APP一段時間後,“我喜歡的音樂”裡一定塞了上百首上千首風格各異的歌曲,有一天我走在街上,使用隨機播放功能播放“我喜歡的音樂”歌單,此時心情是安靜的,非常想聽一些安靜的曲子,但是事與願違。我不停的切歌,卻總是找不到自己想聽的歌曲,於是將手機從口袋中掏出,找了半天終於找到了那首我最想聽的歌曲,播放完全曲後,沒想到隨機跳到的下一首歌又是我不想聽的暴躁歌曲,不停切換後仍然如此。那麼也許此時我的心情便沒有剛開始時安靜了。我推薦的做法是,在大型歌單中,隨機播放模式下,使用“以歌為本”演算法,當用戶顯露出明顯的對某些Tag的歌曲表現出不喜歡時,短時間內不再播放這些Tag的歌曲。而對於聽完全曲的歌曲,可以把這首歌的類似歌曲,大大提高隨機播放到的機率。不過這實現起來可能會比較困難,因為需要把演算法和Tag從服務端下載到本地才能實現,但也許還有別的實現方法我沒想到。

第二個需要優化的地方相信大家也會碰到,在較大歌單中,我們經常保有一些已經老掉牙早已聽膩的歌曲,只是忘記刪除,但總是會被隨機播放出來,對於這種歌一般都會被立即切換。我們是否能在這一點上進行優化?比如,當網易雲音樂發現一首歌已經到達相當的重複播放次數(具體次數可從大資料中分析),並在最後幾次播放中被快速切換,就減少隨機到該歌曲的機率。也許就可以解決這個問題。

歸根結底,對使用者體驗的追求是永無止盡的,我相信網易雲音樂仍然會在使用者體驗上繼續下足功夫,讓我們拭目以待吧。