天天看點

【科普篇】推薦系統之矩陣分解模型

矩陣分解(Matrix Factorization, MF)是推薦系統領域裡的一種經典且應用廣泛的算法。在基于使用者行為的推薦算法裡,矩陣分解算法是效果最好方法之一,曾在推薦比賽中大放異彩,成就了不少冠軍隊伍。推薦算法發展至今,MF雖然已經比不過各種CTR模型和深度CTR模型,但是它依然在推薦系統中發揮着重要作用,在召回系統和特征工程中,都可以看到它的成功應用。本文是MF系列中的第一篇,用一個簡單的例子講解了MF是如何做推薦的,旨在科普。

1.一個具體的例子

推薦系統要做的事情是為每個使用者找到其感興趣的item推薦給他,做到千人千面。下面以音樂推薦為例,講述矩陣分解是如何為使用者找到感興趣的item的。

1.1 收集資料,構造評分矩陣

矩陣分解算法是基于使用者行為的算法,為此我們需要先擷取使用者的曆史行為資料,然後以此為依據去預測使用者可能感興趣的item。下面的圖1是我們收集到的使用者行為。

【科普篇】推薦系統之矩陣分解模型

圖1

如圖1所示,我們用一個矩陣來表示收集到的使用者行為資料,這個資料集一共有24個使用者,9首歌曲。矩陣中第i 行第j 列的數字代表第i  個使用者對第j 首歌曲的播放行為,1代表有播放,空白代表無播放(一般用0表示)。比如,使用者1播放過“成都”、“董小姐”,使用者8播放過“洗白白”和“抓泥鳅”。我們把這個矩陣稱為評分矩陣。這裡所說的評分不是使用者的顯式打分,而是指使用者是否有播放。使用者行為資料有一個特點,就是一個使用者的興趣通常隻會分布在少數幾個類别上,像這裡的使用者1到使用者7隻喜歡民謠歌曲,使用者8到使用者14隻喜歡兒歌,使用者15到21隻喜歡草原風,使用者22隻喜歡民謠和兒歌,等等。由于使用者一般隻會播放少數幾首歌曲,是以這個矩陣大部分都是0(空白),是一個十分稀疏的矩陣。

1.2 分解評分矩陣

矩陣分解算法要做的事情就是去預測出矩陣中所有空白處的評分,并且使得預測評分的大小能反映使用者喜歡的程度,預測評分越大表示用于越可能喜歡。這樣我們就可以把預測評分最高的前K首歌曲推薦給使用者了。

簡單來說,矩陣分解算法是把評分矩陣分解為兩個矩陣乘積的算法,如下圖2所示。

【科普篇】推薦系統之矩陣分解模型

圖2

在圖2中,等号的左邊是評分矩陣,也就是圖1的那個矩陣,是已知資料,它被MF算法分解為等号右邊的兩個矩陣的乘積,其中一個被稱為User矩陣,另一個被稱為Item矩陣。如果評分矩陣有n 行m 列(即n個使用者,m個item),那麼分解出來的User矩陣就會有n 行k 列,其中,第i 行構成的向量用于表示第i 個使用者。Item矩陣則有k 行m 列,其中,第j 列構成的向量用于表示第j 個item。這裡的k是一個遠小于n 和m 的正整數。當我們要計算第i 個使用者對第j 個item的預測評分時,我們就可以用User矩陣的第i行和Item矩陣的第j 列做内積,這個内積的值就是預測評分了。

那MF是如何從評分矩陣中分解出User矩陣和Item矩陣的呢?簡單來說,MF把User矩陣和Item矩陣作為未知量,用它們表示出每個使用者對每個item的預測評分,然後通過最小化預測評分跟實際評分的差異,學習出User矩陣和Item矩陣。也就是說,圖2中隻有等号左邊的矩陣是已知的,等号右邊的User矩陣和Item矩陣都是未知量,由MF通過最小化預測評分跟實際評分的差異學出來的。

比如說,在上述音樂推薦的例子中,圖1中的評分矩陣可以被MF算法分解為如下User矩陣和Item矩陣的乘積,這裡的k 取3。

【科普篇】推薦系統之矩陣分解模型

圖3

其中,User矩陣共有24行,每行對應一個使用者的向量,而Item矩陣共有9列,每列對應一首歌曲的向量。

仔細觀察User矩陣可以發現,使用者的聽歌愛好會展現在使用者向量上。比如說,從圖1的評分矩陣中,我們知道使用者1到使用者7這群使用者喜歡聽民謠類的歌曲,對于這群使用者,MF學出來的使用者向量的特點是第1維的值最大。類似地,使用者8到使用者14這群使用者喜歡聽兒歌,MF學出來的使用者向量的特點是第2維的值最大。而使用者15到使用者21喜歡聽草原風,他們的使用者向量的第3維最大。對于那些有2種興趣的使用者,比如使用者22,他喜歡聽民謠和兒歌,他的使用者向量則會在第1和第2維上較大。

再來觀察Item矩陣,我們也會發現,歌曲的風格也會展現在歌曲的向量上。比如說,對于民謠類的歌曲,它們的向量第1維最大,對于兒歌,它們的第2維最大,對于草原風,它們的向量的第3維最大。

使用者向量和歌曲向量的這種特性其實是由MF的目标函數決定的。因為MF用user向量和item向量的内積去拟合評分矩陣中該user對該item的評分(例子中的0和1),是以内積的大小反映了user對item的喜歡程度。使用者向量和歌曲向量在相同的次元上越比對,内積就越大,反之内積就越小。這就導緻了學出來的使用者向量和歌曲向量的每一維取值的大小都代表了一定意義。比如在上述例子中,MF學到的每一維就代表了一個不同的歌曲類别,這裡的民謠、兒歌、草原風其實是我們根據每一維的資料特點,為了好了解而人為地給每個類别起的名字,實際上MF學出來的每一維不一定都能有這麼好的解釋,很多時候甚至可能都無法直覺地解釋每一維,但每一維的确又代表了一個類别,是以我們把這種類别稱為隐類别,把使用者向量和歌曲向量中的每一維稱為隐變量。是以矩陣分解是一種隐變量模型。隐類别的個數是要我們事先指定的,也就是上面的那個k,k 越大,隐類别就分得越細,計算量也越大。

另外,我們在例子中也可以看到,描述一個使用者的聽歌興趣可以用評分矩陣中一個9維的稀疏向量來表示(每一維代表一首歌曲),也可以用MF學出來的使用者向量來描述使用者聽歌興趣。前者是以歌曲為粒度來描述使用者聽歌興趣,後者是以隐類别為粒度來描述使用者聽歌興趣。由于隐類别的個數遠遠小于歌曲的總數,是以,MF是一種降維方法,把歌曲的次元降到隐類别的次元,然後在隐類别上比對使用者和歌曲去做推薦。

1.3 計算内積,排序,推薦

因為使用者向量和歌曲向量的内積等于預測評分,是以在我們學出User矩陣和Item矩陣之後,把這兩個矩陣相乘,就能得到每個使用者對每首歌曲的預測評分了,評分值越大,表示使用者喜歡該歌曲的可能性越大,該歌曲就越值得推薦給使用者。下面的圖4給出了圖3中的User矩陣和Item矩陣相乘的結果,我們把它稱為預測評分矩陣。

【科普篇】推薦系統之矩陣分解模型

圖4

如圖4所示,User矩陣和Item矩陣相乘得到的預測評分矩陣中每個元素都是非零的,它把圖1的原始評分矩陣中原本為空的地方都填上數字了。對于使用者1到使用者7,他們的MF向量和前3首民謠的MF向量最比對,是以它們的内積較大,但跟兒歌和草原風歌曲的MF向量都不比對,是以它們的内積較小。同理,其餘使用者也有類似的結論。我們用不同顔色把預測評分矩陣中值較大的區域标注了出來,可以看到,對于使用者喜歡的類别(展現在曆史有播放過該類别的歌曲),該類别下的歌曲的預測評分都比較大,反之,預測評分都比較小。這就說明了,MF學習出來的使用者向量和歌曲向量,可以很準确地刻畫使用者的聽歌興趣和歌曲的類别屬性,通過它們的内積能有效地為使用者找到感興趣的歌曲。

在實際使用時,我們一般是先用MF對評分矩陣做分解,得到User矩陣和Item矩陣。對于某個使用者,我們把他的使用者向量和所有item向量做内積,然後按内積從大到小排序,取出前K 個item,過濾掉曆史item後推薦給使用者。

至此,我們通過這個音樂推薦的例子,以形象但不十分嚴謹的方式,把矩陣分解模型如何做推薦的方法介紹完了。因為這是一篇科普性質的文章,其主要目的是給非推薦領域的讀者簡單介紹矩陣分解方法如何做推薦,是以它隻講述了矩陣分解算法的基本思想和做法,不會涉及具體數學公式。如果想進一步了解其中的算法細節和數學原理,可以繼續參考本系列的第二篇文章。

2.小結

(1)MF把使用者對item的評分矩陣分解為User矩陣和Item矩陣,其中User矩陣每一行代表一個使用者的向量,Item矩陣的每一列代表一個item的向量;

(2)使用者i 對item j 的預測評分等于User矩陣的第i 行和Item矩陣的第j 列的内積,預測評分越大表示使用者i 喜歡item j 的可能性越大;

(3)MF是把User矩陣和Item矩陣設為未知量,用它們來表示每個使用者對每個item的預測評分,然後通過最小化預測評分和實際評分的差異學習出User矩陣和Item矩陣;

(4)MF是一種隐變量模型,它通過在隐類别的次元上去比對使用者和item來做推薦。

(5)MF是一種降維方法,它将使用者或item的次元降低到隐類别個數的次元。

智能推薦

個性化推薦技術與産品社群