協(xié)同過濾算法:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

3 評論 10404 瀏覽 59 收藏 20 分鐘

產(chǎn)品經(jīng)理要不要懂技術(shù)?要的!本系列文章將從最簡單的概念開始,逐步講解推薦系統(tǒng)的發(fā)展歷程和最新實踐。以產(chǎn)品經(jīng)理的視角,闡述推薦系統(tǒng)涉及的算法,技術(shù)和架構(gòu)。本章是第二章,將系統(tǒng)性地通過圖文的方式介紹協(xié)同過濾算法。

我有個兄弟,是抖音的點贊狂魔,他的點贊次數(shù)高達6924次,而且他大多數(shù)的贊都是給那些青春靚麗的小姐姐們,如下圖。看他的抖音推薦內(nèi)容,都是滿目的小姐姐唱啊跳啊不亦樂乎,他也覺得甚爽。不過,好景不長,沒多久他就跟我說:“我再也不敢再點了,我老婆已經(jīng)發(fā)現(xiàn)我給小姐姐們點了上1000個贊,而且知道我點贊的視頻,也會推薦給她”。

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

把好友看過的視頻推薦給用戶,這就是協(xié)同過濾。準確地說,叫用戶協(xié)同過濾(User Collaborative Filtering)。

一、協(xié)同過濾概述(Collaborative Filtering)

協(xié)同過濾(簡稱CF)是推薦系統(tǒng)最重要的思想之一。在早期,協(xié)同過濾幾乎等同于推薦系統(tǒng)。協(xié)同過濾思想產(chǎn)生于1994年,被用于郵件系統(tǒng)上。2001年,亞馬遜用協(xié)同過濾算法來推薦相似商品。

協(xié)同過濾的思想比較簡單,主要有三種:

  1. 用戶協(xié)同過濾(UserCF):相似的用戶可能喜歡相同物品。如加了好友的兩個用戶,或者點擊行為類似的用戶被視為相似用戶。如我兄弟和她的太太互加了抖音好友,他們兩人各自喜歡的視頻,可能會產(chǎn)生互相推薦。
  2. 物品協(xié)同過濾(ItemCF):相似的物品可能被同個用戶喜歡。這個就是著名的世界杯期間沃爾瑪尿布和啤酒的故事了。這里因為世界杯期間,奶爸要喝啤酒看球,又要帶娃,啤酒和尿布同時被奶爸所需要,也就是相似商品,可以放在一起銷售。
  3. 模型協(xié)同過濾:使用矩陣分解模型來學習用戶和物品的協(xié)同過濾信息。一般這種協(xié)同過濾模型有:SVD,SVD++等。這種協(xié)同過濾要比前兩個來得抽象些,這里先不解釋,后面詳述。

下面按照物品協(xié)同過濾,用戶協(xié)同過濾和模型協(xié)同過濾的順序,詳細解釋這幾種算法。

二、物品協(xié)同過濾的計算

2003年,亞馬遜發(fā)表了一篇論文,闡述了他們?nèi)绾斡梦锲穮f(xié)同過濾算法(Item-to-Item Collaborative Filtering),搭建他們“看了又看”功能。

如下圖:

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

這是17年前的截圖,圖跟紙質(zhì)老照片那樣變得斑駁。圖中是在購物車關(guān)聯(lián)頁面的相關(guān)推薦。那么,這個協(xié)同過濾推薦是如何做計算出來的呢?

前面第一章說到,人工智能實踐過程三個步驟:數(shù)據(jù),學習和決策。這里也將用同樣的步驟,以圖書銷售推薦為例,解釋物品協(xié)同過濾的過程。為了簡單化,假設(shè)某圖書銷售平臺總共有6本書銷售,有6個用戶購買。

(1)數(shù)據(jù)

用戶的評分數(shù)據(jù),分值1-5分。每個用戶對圖書的評分如下圖矩陣所示。

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

(2)學習算法

前面說到ItemCF的定義是,相似的物品可能被同個用戶喜歡。反過來講,就是被同個用戶喜歡的物品是相似商品。如上圖中,圖書1和圖書2兩本書,被用戶A同時喜歡,這兩本書具有相似性。而圖書5和圖書6,沒有被同個用戶同時喜歡,不具有相似性。

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

如果用余弦相似度計算圖書1和圖書2的相似度,也叫做cosine距離,計算過程為:

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

回想高中時候的課本我們就可以知道,上面的similarity計算公式,實際上就是計算書籍1的評分向量(4,5,4,0,0,0)和書籍2的評分向量(3,0,3,3,4,0)的 cos 夾角。

用同樣的方式,可以算出圖書1跟其他五本圖書相似度分別為0.27, 0 .79,0.32,0.99和0。對每兩本書計算完這個相似度后,就可以獲得全部圖書的相似矩陣。

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

一個平臺不僅僅有6本圖書6個用戶,我們再擴展到一般的情況。計算物品的相似度,實際是計算每兩個物品評分向量的cosine距離,評分向量的每一維,代表了一個用戶,下圖中,表格的第一行代表了所有用戶對物品A的評分。當有100萬個用戶時,也就是計算每兩個100萬維向量的距離。這樣就導致計算量很大,而且很多平臺不僅僅只有100萬用戶,因而這個低效的計算方式需要改進。

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

(3)預(yù)測決策

有了評分矩陣之后,預(yù)測決策一般有兩種場景。

一種是根據(jù)相似度排序推薦最近鄰物品。類似于“看了還看”,“買了還買”場景。在這里的例子中,我們知道圖書1和其他圖書的相似度排序分別是圖書5,圖書3,圖書4和圖書2。當用戶點擊了圖書1時,就可以按照相似順序從高到低推薦。

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

第二種是根據(jù)相似度預(yù)測評分推薦物品。如何決策要不要給用戶B推薦圖書2,圖書4和圖書6呢?

如下圖,通過用戶B對圖書1的評分 * 未知圖書與圖書1的相似度來預(yù)測用戶B對剩下圖書的評分。如圖書2的預(yù)測評分 = 圖書1的評分5分 * 圖書1和圖書2的相似度0.27 ,從而用戶B對圖書2的評分是:5×0.27=1.35。同樣方式計算出其他圖書的評分預(yù)測。

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

從上面的結(jié)果來看,用戶B對其他圖書評分比較低,這幾本圖書推薦的可能性大大減少。

物品協(xié)同過濾實際使用

這是推薦系統(tǒng)里最樸素的算法,因為它的計算量會隨著用戶和物品的數(shù)量呈指數(shù)增長,所以它并不適合在大量用戶或大量物品的場景使用。在它誕生的年代,還沒有大數(shù)據(jù),這種計算方式耗費大量內(nèi)存,需要做大量的優(yōu)化。我嘗試過用100萬用戶,100萬物品和500萬條的數(shù)據(jù)在256G內(nèi)存的機器上做過嘗試,計算一分鐘后就宣告內(nèi)存耗盡。

因為這個缺點,就需要新的算法來計算物品的協(xié)同過濾。

前面提到,計算任意兩物品之間的相似度后,有兩個使用場景。針對這兩個場景,分別有不同的迭代算法:

  • 根據(jù)相似度排序推薦最近鄰物品:使用如Word2vec,Item2vec等Embedding類的算法,將物品嵌入固定的向量空間中,再使用LSH算法(局部敏感哈希算法)取最近鄰物品。這個后續(xù)文章會介紹。
  • 根據(jù)相似度預(yù)測評分推薦物品:本章后續(xù)介紹的SVD算法。

雖然這個算法使用較少了,但是物品協(xié)同過濾的思想都是一脈相乘的,理解了這個簡單的cosine相似度計算方式,可以更好理解后續(xù)的迭代算法。

最后補充一下,物品協(xié)同過濾的一個缺點,或者說是協(xié)同過濾的缺點,對于一個新物品,協(xié)同過濾是無法推薦的。因為新物品用戶無評分,導致它跟所有物品的相似度都是為0,這個是使用這個算法時非常需要注意的一個點。

三、用戶協(xié)同過濾計算

用戶協(xié)同過濾(UserCF)的計算方式跟物品協(xié)同過濾(ItemCF)的計算方式類似。不同的是由計算兩兩物品的相似度,轉(zhuǎn)換成計算兩兩用戶的相似度。

如下圖所示:

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

評分了相同圖書的用戶為相似用戶,他們的相似度同樣也用cosine相似度公式來計算。計算完相似度后,就可以根據(jù)用戶間的相似性,預(yù)測用戶對未評分圖書進行評分預(yù)測。

但是在亞馬遜上,由于用戶評分的稀疏性(很多用戶壓根不評分),沒有評分的用戶無法跟其他用戶計算相似性,從而導致很多用戶之間沒有相似度。所以2001年的時候,亞馬遜選擇物品協(xié)同過濾算法來做推薦,并發(fā)表了論文。這個論文也導致大家一度認為物品協(xié)同過濾優(yōu)于用戶協(xié)同過濾。

其實只有最合適的算法,沒有最優(yōu)的算法。

時間到了移動互聯(lián)網(wǎng)的今天,我們更多是用點擊數(shù)據(jù),用戶好友關(guān)系,通訊錄或者甚至是同一個WIFI地址來計算用戶協(xié)同過濾,數(shù)據(jù)稀疏性得到一定程度上的解決?,F(xiàn)在,用戶的協(xié)同過濾在信息流內(nèi)容推薦,社交性的推薦系統(tǒng)有著很好的利用。比如抖音,因為內(nèi)容更新頻繁,用戶協(xié)同過濾可以作為很好的召回手段,所以也就會出現(xiàn)老公點贊的視頻會被推薦給他老婆的情景。

同樣地,這里介紹的cosine相似度的算法,也不是工業(yè)界現(xiàn)在最佳實踐的用戶相似度計算方式了。用戶相似度的計算,現(xiàn)在的最佳實踐也同樣也是用Embedding的方式實現(xiàn)。

而且,用戶相似度的計算,最有效的方式不一定是通過本節(jié)中介紹的計算方式,帶社交功能的APP可以通過用戶的好友關(guān)系,一般的APP可以通過獲取用戶的通訊錄實現(xiàn)用戶協(xié)同過濾。這些方式都來的更加簡單和直接。

四、模型協(xié)同過濾-矩陣分解(SVD)

對于很多沒有計算機專業(yè)背景的人來說,直接理解SVD算法是很困難的。需要有高等數(shù)學,線性代數(shù),還要理解機器學習模型中的目標函數(shù),損失函數(shù),梯度,正則化,最小二乘法等概念。很多文章介紹SVD都很技術(shù),這里不準備采用技術(shù)大咖們的方式。我還是繼續(xù)用圖文的方式介紹,這也許是世界上最簡單的理解SVD的方式。

首先介紹一下背景。

SVD算法的誕生,跟美國Netflix公司有關(guān)。這家公司中文名叫網(wǎng)飛,拍了大家熟悉的網(wǎng)劇《紙牌屋》。

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

時間來到2006年,Netflix發(fā)起一個推薦系統(tǒng)的懸賞競賽。他們公開了自己網(wǎng)站的用戶數(shù)據(jù)評分數(shù)據(jù)包,并放出100萬美元懸賞優(yōu)化推薦算法。凡是能在Netflix現(xiàn)有的推薦系統(tǒng)基礎(chǔ)上,把均方根誤差降低10%的人,都能參與瓜分這100萬美元。消息一放出,引來了無數(shù)高手參加。這場比賽中,最佳算法就是SVD。

背景介紹完了,接下來直接介紹SVD是怎么計算的。

還是跟前面那樣,簡單化問題:假設(shè)一個平臺只有4個用戶和4本圖書。

(1)數(shù)據(jù)

用戶對物品評分1-5分,且有以下評分記錄。

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

(2)學習算法

根據(jù)線性代數(shù)我們知道,一個矩陣可以分解為多個矩陣的乘積。SVD英文全稱叫做Singular Value Decomposition,這個算法是個矩陣分解的通用名稱,在不同領(lǐng)域有不同的形式。在推薦系統(tǒng)領(lǐng)域,可以簡單的認為,SVD就是將一個矩陣,在一定的精度損失下,將一個矩陣分解成兩個矩陣。

運用這個算法,我們可以將上圖的矩陣做以下的近似分解:

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

其中,用戶矩陣部分代表著每個用戶的偏好在一個二維隱語義空間上的映射。同樣地,物品矩陣代表著每本圖書的特性在一個二維隱語義空間上的映射。這兩個矩陣也就是模型的結(jié)果。這樣,我們訓練模型的時候,就只需要訓練用戶矩陣中的8個參數(shù)和物品矩陣中的8個參數(shù)即可。大大減少了計算量。

模型訓練的過程,簡單地說,就是通過最小二乘法,不斷將用戶評分數(shù)據(jù)迭代入矩陣中計算,直到把均方誤差優(yōu)化到最小。上圖的結(jié)果是我通過Spark的ML庫ALS模塊直接計算的。

算法的具體目標函數(shù),損失函數(shù)和梯度等,詳述則涉及很多機器學習知識點,這里就不作介紹了。技術(shù)方面有很多解讀文章,需要進一步理解的同學,可以搜索相關(guān)文章閱讀。

(3)預(yù)測決策

通過模型訓練,我們得到用戶矩陣Q和物品矩陣P后,全部用戶對全部圖書的評分預(yù)測可以通過R = PQ來獲得。如上圖中,用戶A的向量(1.40,-1.18)乘以物品2的向量(2.19,0.73)則可得用戶A對物品1的評分預(yù)測為:1.40×(-1.18)+2.19×0.73=2.21。

對所有的用戶和物品都執(zhí)行相同操作,可以得到全部用戶對全部物品的評分。如下圖右側(cè)矩陣:

協(xié)同過濾:在抖音狂給1000個小姐姐點贊的事被老婆發(fā)現(xiàn)了!

得到全部的評分預(yù)測后,我們就可以對每本圖書進行擇優(yōu)推薦。需要注意的是,用戶矩陣和物品矩陣的乘積,得到的評分預(yù)估值,與用戶的實際評分不是全等關(guān)系,而是近似相等的關(guān)系。如上圖中兩個矩陣綠色部分,用戶實際評分和預(yù)估評分都是近似的,有一定的誤差。

在現(xiàn)在的實際應(yīng)用中,SVD一般作為協(xié)同過濾的離線召回使用。一般地,將需要給用戶推薦的物品提前離線計算好,存在HBASE中,在用戶有請求的時候,直接讀取推薦的結(jié)果,放入初排階段的召回集中。

總結(jié)

(1)協(xié)同過濾優(yōu)點

協(xié)同推薦是應(yīng)用最廣泛的推薦算法?;趦?nèi)容推薦的算法,需要給物品打上標簽和給用戶建用戶畫像,才能實現(xiàn)匹配推薦。相比之下,協(xié)同過濾簡單了許多。它是僅使用用戶行為的進行推薦,我們不需要對物品或信息進行完整的標簽化分析,避免了一些人可能難以量化描述的概念的標簽構(gòu)建,又可以很好地發(fā)現(xiàn)用戶的潛在興趣偏好。

(2)協(xié)同過濾缺點

因為協(xié)同過濾依賴用戶的歷史數(shù)據(jù),面對新的用戶或者新的物品,在開始的時候沒有數(shù)據(jù)或數(shù)據(jù)較少時,協(xié)同過濾算法無法做出推薦。需要等數(shù)據(jù)積累,或者其他方案進行彌補缺陷,也就是常說的冷啟動的問題。

(3)機器學習領(lǐng)域,當精確的方式不行難以計算或者速度太慢的時候,往往會選擇犧牲一點精度,達到差不多但非??焖俚男Ч?。SVD就是其中的一個例子。

(4)沒有完美的算法,只有最合適的算法?,F(xiàn)在的實踐,也不是單純用協(xié)同過濾來做推薦,而是將他們作為其中的一個或幾個召回策略來使用。

 

本文由 @菠蘿的海王子原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 相似度計算那里,分子4*3這個是怎么算的

    來自廣東 回復
  2. 請問微信視頻號和抖音在“朋友點贊,系統(tǒng)推薦”這種邏輯上有沒有什么區(qū)別???

    回復
    1. 微信視頻號中好友關(guān)系推薦所占權(quán)重應(yīng)該更高一些,因為產(chǎn)品本身的定位就是半熟人短視頻社交。而抖音則是用戶標簽推薦的權(quán)重更高,用上文來看也就是物品協(xié)調(diào)。我的理解是這樣的

      來自廣東 回復