天天看點

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

用過蝦米、酷狗、qq音樂、網易雲音樂,個人感受網易雲音樂在音樂推薦這塊做的真心不錯,特别是以“人”為角度的推薦,沒有像蝦米、酷狗推的那麼亂。蝦米還可以,但更多的是以歌搜歌的形式。剛注冊了一個新的賬号,避免有曆史資料的幹擾,聽了一首周傑倫的《一路向北》和陳奕迅的《淘汰》,然後去個性化推薦裡看到了蔡健雅的《紅色高跟鞋》和曲婉婷的《承認》,給我的感覺還是比較驚喜,像蔡健雅一般聽的人比較少,還能推薦到體驗不錯。當然也有很多不一定特别準,當然聽歌這東西就不需要完全準确。

網易雲音樂關于個性化推薦這塊在公司外部介紹的比較少,但應該推薦的算法和機制和大部分的音樂素材的公司做的類似。以item為核心的協同過濾(cf),通過打分機制來推薦最适合的歌曲。

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦
[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

印象中早期網易雲音樂還可以将自己聽的歌曲分享到微信朋友圈等,通過跳轉關聯到的賬戶id識别出朋友關系。這個想法的确很贊,包括我第一次聽《一路向北》的時候也是一個朋友推薦給我的,這首歌不僅是個人喜歡的風格,再加上有朋友推薦是以留下很好的印象。但是很可惜,那個時候朋友圈不能分享。微網誌還可以分享,隻是現在微網誌的資料很多水分。

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

現在主流的方式都是人工+智能推薦,人工的方式就不過多介紹,費時費力。出不了幾張有限的專輯。現在主流都是通過機器學習的方式,通過同類人類的偏好給相似的人群推薦他們都喜歡的歌曲。也有根據以歌的item推薦相似的歌曲,但體驗就是聽來聽去就是那個風格,很快就乏味了。

算法部分:

有3首歌放在那裡,《最炫民族風》,《晴天》,《hero》。

a君,收藏了《最炫民族風》,而遇到《晴天》,《hero》則總是跳過;

b君,經常單曲循環《最炫民族風》,《晴天》會播放完,《hero》則拉黑了

c君,拉黑了《最炫民族風》,而《晴天》《hero》都收藏了。

我們都看出來了,a,b二位品味接近,c和他們很不一樣。

那麼問題來了,說a,b相似,到底有多相似,如何量化?

我們把三首歌想象成三維空間的三個次元,《最炫民族風》是x軸,《晴天》是y軸,《hero》是z軸,對每首歌的喜歡程度即該次元上的坐标,

并且對喜歡程度做量化(比如: 單曲循環=5, 分享=4, 收藏=3, 主動播放=2 , 聽完=1, 跳過=-1 , 拉黑=-5 )。

那麼每個人的總體口味就是一個向量,a君是 (3,-1,-1),b君是(5,1,-5),c君是(-5,3,3)。 (抱歉我不會畫立體圖)

我們可以用向量夾角的餘弦值來表示兩個向量的相似程度, 0度角(表示兩人完全一緻)的餘弦是1, 180%角(表示兩人截然相反)的餘弦是-1。

根據餘弦公式, 夾角餘弦 = 向量點積/ (向量長度的叉積) = ( x1x2 + y1y2 + z1z2) / ( 跟号(x1平方+y1平方+z1平方 ) x 跟号(x2平方+y2平方+z2平方 ) )

可見 a君b君夾角的餘弦是0.81 , a君c君夾角的餘弦是 -0.97 ,公式誠不欺我也。

以上是三維(三首歌)的情況,如法炮制n維n首歌的情況都是一樣的。

假設我們選取一百首種子歌曲,算出了各君之間的相似值,那麼當我們發現a君還喜歡聽的《小蘋果》b君居然沒聽過,相信大家都知道該怎麼和b君推薦了吧。

第一類以人為本推薦算法的好處我想已經很清楚了,那就是精準!

代價是運算量很大,而且對于新來的人(聽得少,動作少),也不太好使,

是以人們又發明了第二類算法。

假設我們對新來的d君,隻知道她喜歡最炫民族風,那麼問題來了,給她推薦啥好咯?

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

如圖,推薦《晴天》!

這裡我想給大家介紹另外一種推薦系統,這種算法叫做潛在因子(latent factor)算法。這種算法是在netflix(沒錯,就是用大資料捧火《紙牌屋》的那家公司)的推薦算法競賽中獲獎的算法,最早被應用于電影推薦中。這種算法在實際應用中比現在排名第一的 @邰原朗 所介紹的算法誤差(rmse)會小不少,效率更高。我下面僅利用基礎的矩陣知識來介紹下這種算法。

這種算法的思想是這樣:每個使用者(user)都有自己的偏好,比如a喜歡帶有小清新的、吉他伴奏的、王菲等元素(latent factor),如果一首歌(item)帶有這些元素,那麼就将這首歌推薦給該使用者,也就是用元素去連接配接使用者和音樂。每個人對不同的元素偏好不同,而每首歌包含的元素也不一樣。我們希望能找到這樣兩個矩陣:

一,使用者-潛在因子矩陣q,表示不同的使用者對于不用元素的偏好程度,1代表很喜歡,0代表不喜歡。比如下面這樣:

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

二,潛在因子-音樂矩陣p,表示每種音樂含有各種元素的成分,比如下表中,音樂a是一個偏小清新的音樂,含有小清新這個latent factor的成分是0.9,重口味的成分是0.1,優雅的成分是0.2……

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

利用這兩個矩陣,我們能得出張三對音樂a的喜歡程度是:張三對小清新的偏好*音樂a含有小清新的成分+對重口味的偏好*音樂a含有重口味的成分+對優雅的偏好*音樂a含有優雅的成分+……

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦
[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

即:0.6*0.9+0.8*0.1+0.1*0.2+0.1*0.4+0.7*0=0.69

每個使用者對每首歌都這樣計算可以得到不同使用者對不同歌曲的評分矩陣

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

。(注,這裡的破浪線表示的是估計的評分,接下來我們還會用到不帶波浪線的r表示實際的評分):

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

是以我們隊張三推薦四首歌中得分最高的b,對李四推薦得分最高的c,王五推薦b。

如果用矩陣表示即為:

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

下面問題來了,這個潛在因子(latent factor)是怎麼得到的呢?

由于面對海量的讓使用者自己給音樂分類并告訴我們自己的偏好系數顯然是不現實的,事實上我們能獲得的資料隻有使用者行為資料。我們沿用 @邰原朗的量化标準:單曲循環=5, 分享=4, 收藏=3, 主動播放=2 , 聽完=1, 跳過=-2 , 拉黑=-5,在分析時能獲得的實際評分矩陣r,也就是輸入矩陣大概是這個樣子:

事實上這是個非常非常稀疏的矩陣,因為大部分使用者隻聽過全部音樂中很少一部分。如何利用這個矩陣去找潛在因子呢?這裡主要應用到的是矩陣的uv分解。也就是将上面的評分矩陣分解為兩個低次元的矩陣,用q和p兩個矩陣的乘積去估計實際的評分矩陣,而且我們希望估計的評分矩陣

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦
[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦
[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

和實際的評分矩陣不要相差太多,也就是求解下面的目标函數:

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

這裡涉及到最優化理論,在實際應用中,往往還要在後面加上2範數的罰項,然後利用梯度下降法就可以求得這p,q兩個矩陣的估計值。這裡我們就不展開說了。例如我們上面給出的那個例子可以分解成為這樣兩個矩陣:

這兩個矩陣相乘就可以得到估計的得分矩陣:

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

将使用者已經聽過的音樂剔除後,選擇分數最高音樂的推薦給使用者即可(紅體字)。

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

在這個例子裡面使用者7和使用者8有強的相似性:

從推薦的結果來看,正好推薦的是對方評分較高的音樂:

[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦
[案例]網易雲音樂的個性化推薦◆ ◆ ◆1.相似人群的推薦◆ ◆ ◆2. 相似歌的推薦

本質上應該都類似,都是從amazon那條路子下來的。但是這種方式也會遇到問題:

a)冷啟動的問題,在沒有使用者資料的情況下要推哪些歌曲,目前網易雲音樂搞了個比較q的調查問卷,還是挺有趣的。

b)同質化嚴重問題,怎麼加入新的元素,比如熱門+新歌來補充這塊;

c)人群變化問題,光靠推薦很明顯不代表每個個體的情況,特别是一些小衆群體,資料比較稀疏。這些就需要使用者自己主動搜尋和添加、喜歡、下載下傳的方式。

蝦米、酷狗上都是這樣的歌曲漫遊推薦的形式,個人不太提倡這樣的方式,簡單認為聽過a歌的人也可能喜歡b,這個差異還是比較大的。而且還是要維護一堆歌曲的tag标簽。

整體來說,網易雲音樂在個性化推薦這塊算法還是花了不少真功夫。看到他們在算法招聘、并發計算這些實時場景的介紹比較少,還是希望能夠有機會線上下能夠有這塊的交流。

原文釋出時間為:2016-03-03

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号

繼續閱讀