協同過濾推薦算法

協同過濾推薦算法

作者在《推薦系統產品與算法概述》這篇文章中簡單介紹了協同過濾算法。協同過濾算法是在整個推薦系統發展史上比較出名的算法,具備舉足輕重的地位,甚至在當今還在大量使用。

本篇文章作者會詳細講解協同過濾推薦算法的方方面面,這裡所講的也是作者基於多年推薦系統研究及工程實踐經驗的基礎上總結而成,希望對大家學習協同過濾推薦算法有所幫助,提供一些借鑑。

本文會從協同過濾思想簡介、協同過濾算法原理介紹、離線協同過濾算法的工程實現、近實時協同過濾算法的工程實現、協同過濾算法應用場景、協同過濾算法的優缺點、協同過濾算法落地需要關注的幾個問題等7個方面來講述。希望讀者讀完本文,可以很好地理解協同過濾的思路、算法原理、工程實現方案,並且具備基於本文的思路自己獨立實現一個在真實業務場景中可用的協同過濾推薦系統的能力。

在正式講解之前,先做一個簡單定義。本文用”

操作過“這個詞來表示用戶對標的物的各種操作行為,包括瀏覽、點擊、播放、收藏、評論、點贊、轉發、評分等等。


一、協同過濾思想簡介

協同過濾,從字面上理解,包括協同和過濾兩個操作。所謂協同就是利用群體的行為來做決策(推薦),生物上有協同進化的說法,通過協同的作用,讓群體逐步進化到更佳的狀態。對於推薦系統來說,通過用戶的持續協同作用,最終給用戶的推薦會越來越準。而過濾,就是從可行的決策(推薦)方案(標的物)中將用戶喜歡的方案(標的物)找(過濾)出來。

具體來說,協同過濾的思路是通過群體的行為來找到某種相似性(用戶之間的相似性或者標的物之間的相似性),通過該相似性來為用戶做決策和推薦。

現實生活中有很多協同過濾的案例及思想體現,除了前面提到的生物的進化是一種”協同過濾“作用外,我認為人類喜歡追求相親中的“門當戶對”,其實也是一種協同過濾思想的反射,門當戶對實際上是建立了相親男女的一種“相似度”(家庭背景、出身、生活習慣、為人處世、消費觀、甚至價值觀可能會相似),給自己找一個門當戶對的伴侶就是一種“過濾”,當雙方”門當戶對“時,各方面的習慣及價值觀會更相似,未來幸福的概率也會更大。如果整個社會具備這樣的傳統和風氣,以及在真實”案例“中”門當戶對“的夫妻確實會更和諧,通過”協同進化“作用,大家會越來越認同這種方式。我個人也覺得”門當戶對“是有一定道理的。

協同過濾利用了兩個非常樸素的自然哲學思想:“群體的智慧”和“相似的物體具備相似的性質”,群體的智慧從數學上講應該滿足一定的統計學規律,是一種朝向平衡穩定態發展的動態過程,越相似的物體化學及物理組成越一致,當然表現的外在特性會更相似。雖然這兩個思想很簡單,也很容易理解,但是正因為思想很樸素,價值反而非常大。所以協同過濾算法原理很簡單,但是效果很不錯,而且也非常容易實現。

協同過濾分為基於用戶的協同過濾和基於標的物(物品)的協同過濾兩類算法。下面我們對協同過濾的算法原理來做詳細的介紹。


二、協同過濾算法原理介紹

上面一節簡單介紹了協同過濾的思想,基於協同過濾的兩種推薦算法,核心思想是很樸素的”物以類聚、人以群分“的思想。所謂物以類聚,就是計算出每個標的物最相似的標的物列表,我們就可以為用戶推薦用戶喜歡的標的物相似的標的物,這就是基於物品(標的物)的協同過濾。所謂人以群分,就是我們可以將與該用戶相似的用戶喜歡過的標的物推薦給該用戶(而該用戶未曾操作過),這就是基於用戶的協同過濾。具體思想可以參考下面的圖1。

協同過濾推薦算法

圖1:”物以類聚,人以群分“的樸素協同過濾推薦

協同過濾的核心是怎麼計算標的物之間的相似度以及用戶之間的相似度。我們可以採用非常樸素的思想來計算相似度。我們將用戶對標的物的評分(或者隱式反饋,如點擊、收藏等)構建如下用戶行為矩陣(見下面圖2),矩陣的某個元素代表某個用戶對某個標的物的評分(如果是隱式反饋,值為1),如果某個用戶對某個標的物未產生行為,值為0。其中行向量代表某個用戶對所有標的物的評分向量,列向量代表所有用戶對某個標的物的評分向量。有了行向量和列向量,我們就可以計算用戶與用戶之間、標的物與標的物之間的相似度了。具體來說,行向量之間的相似度就是用戶之間的相似度,列向量之間的相似度就是標的物之間的相似度。

為了避免誤解,這裡簡單解釋一下隱式反饋,只要不是用戶直接評分的操作行為都算隱式反饋,包括瀏覽、點擊、播放、收藏、評論、點贊、轉發等等。有很多隱式反饋是可以間接獲得評分的,後面會講解。如果不間接獲得評分,就用0、1表示是否操作過。

在真實業務場景中用戶數和標的物數一般都是很大的(用戶數可能是百萬、千萬、億級,標的物可能是十萬、百萬、千萬級),而每個用戶只會操作過有限個標的物,所以用戶行為矩陣是稀疏矩陣。正因為矩陣是稀疏的,會方便我們進行相似度計算及為用戶做推薦。

協同過濾推薦算法

圖2:用戶對標的物的操作行為矩陣

相似度的計算可以採用cosine餘弦相似度算法來計算兩個向量

協同過濾推薦算法

(可以是上圖的中行向量或者列向量)之間的相似度:

協同過濾推薦算法

計算完了用戶(行向量)或者標的物(列向量)之間的相似度,那麼下面說說怎麼為用戶做個性化推薦。

1.基於用戶的協同過濾

根據上面算法思想的介紹,我們可以將與該用戶最相似的用戶喜歡的標的物推薦給該用戶。這就是基於用戶的協同過濾的核心思想。

用戶u對標的物s的喜好度sim(u,s)可以採用如下公式計算,其中U是與該用戶最相似的用戶集合(我們可以基於用戶相似度找到與某用戶最相似的K個用戶),

協同過濾推薦算法

是用戶

協同過濾推薦算法

對標的物s的喜好度(對於隱式反饋為1,而對於非隱式反饋,該值為用戶對標的物的評分),

協同過濾推薦算法

是用戶

協同過濾推薦算法

與用戶u的相似度。

協同過濾推薦算法

有了用戶對每個標的物的評分,基於評分降序排列,就可以取topN推薦給用戶了。

2.基於標的物的協同過濾

類似地,通過將用戶操作過的標的物最相似的標的物推薦給用戶,這就是基於標的物的協同過濾的核心思想。

用戶u對標的物s的喜好度sim(u,s)可以採用如下公式計算,其中S是所有用戶操作過的標的物的列表,

協同過濾推薦算法

是用戶u對標的物

協同過濾推薦算法

的喜好度,

協同過濾推薦算法

是標的物

協同過濾推薦算法

與s的相似度。

協同過濾推薦算法

有了用戶對每個標的物的評分,基於評分降序排列,就可以取topN推薦給用戶了。

從上面的介紹中我們可以看到協同過濾算法思路非常直觀易懂,計算公式也相對簡單,並且後面兩節我們也會說明它易於分佈式實現,同時該算法也不依賴於用戶及標的物的其他metadata信息。協同過濾算法被Netflix、Amazon等大的互聯網公司證明效果也非常好,也能夠為用戶推薦新穎性內容,所以一直以來都在工業界得到非常廣泛的應用。


三、離線協同過濾算法的工程實現

雖然協同過濾算法原理非常簡單,但是在大規模用戶及海量標的物的場景下,單機是難以解決計算問題的,我們必須藉助分佈式技術來實現,讓整個算法可以應對大規模數據的挑戰。在本節,我們基於主流的Spark分佈式計算平臺相關的技術來詳細講解協同過濾算法的離線(批處理)實現思路,供大家參考(讀者可以閱讀參考文獻1、2、3、4瞭解協同過濾算法原理及工業應用),同時會在下一節講解在近實時場景下怎麼在工程上實現協同過濾算法。

在這裡我們只講解基於標的物的協同過濾算法的工程實現方案,基於用戶的協同過濾思路完全一樣,不再贅述。

為了簡單起見,我們可以將推薦過程拆解為2個階段,先計算相似度,再為用戶推薦。下面分別介紹這兩個步驟怎麼工程實現。

1.計算topK相似度

本步驟我們計算出任意兩個標的物之間的相似度,有了任意兩個標的物之間的相似度,那麼我們就可以為每個標的物計算出與它最相似的K個標的物了。

假設有兩個標的物

協同過濾推薦算法

,它們對應的向量(即圖2中矩陣的列向量,分別是第i列和第j列)如下,其中n是用戶數。

協同過濾推薦算法

協同過濾推薦算法

那麼

協同過濾推薦算法

的相似度計算,我們可以細化如下:

協同過濾推薦算法

公式1:計算

協同過濾推薦算法

相似度

我們仔細看一下上述公式,公式的分子就是下圖矩陣中對應的i列和j列中同一行中的兩個元素(紅色矩形中的一對元素)相乘,並且將所有行上第i列和第j列的元素相乘得到的乘積相加(這裡其實只需要考慮同一行對應的i列和j列的元素都非零的情況,如果只要第i列和第j列中有一個為零,乘積也為零)。公式中分母是第i行與第i行按照上面類似的方法相乘再相加後開根號的值,再乘以第j行與第j行按照上面類似的方法相乘再相加後開根號的值。

協同過濾推薦算法

圖3:計算兩個列向量的cosine餘弦可以拆解為簡單的加減乘及開根號運算

有了上面的簡單分析,就容易分佈式計算相似度了。下面我們就來講解,在Spark上怎麼簡單地計算每個標的物的topK相似度。在Spark上計算相似度,最主要的目標是怎麼將上面巨大的計算量(前面已經提到在互聯網公司,往往用戶數和標的物數都是非常巨大的)通過分佈式技術實現,這樣就可以利用多臺服務器的計算能力,解決大計算問題。

首先將所有用戶操作過的標的物”收集“起來,形成一個用戶行為RDD,具體的數據格式如下:

協同過濾推薦算法

其中uid是用戶唯一識別編碼,sid是標的物唯一識別編碼,R是用戶對標的物的評分(即矩陣中的元素)。

對於

協同過濾推薦算法

中的某個用戶來說,他操作過的標的物

協同過濾推薦算法

協同過濾推薦算法

,一定在該用戶所在的行對應的列i和列j的元素非零,根據上面計算

協同過濾推薦算法

相似度的公式,需要將該用戶對應的

協同過濾推薦算法

的評分乘起來。這個過程可以用下面的圖4來說明。

協同過濾推薦算法

圖4:對用戶U來說,將他所有操作過的標的物做笛卡爾積

當所有用戶都按照圖4的方式轉化為標的物對及得分(圖4中右邊的

協同過濾推薦算法

)時,我們就可以對標的物對Group(聚合),將相同的對合並,對應的得分相加,最終得到的RDD為:

協同過濾推薦算法

這樣,公式1中分子就計算出來了(上式中的Score即是公式1中的分子)。現在我們需要計算分母,這非常簡單,只要從上面的RDD中將標的物sid1等於標的物sid2的列過濾出來就可以了, 通過下圖的操作,我們可以得到一個map

協同過濾推薦算法

協同過濾推薦算法

圖5:從

協同過濾推薦算法

中過濾出

協同過濾推薦算法

的元素,用於計算公式1中的分母

協同過濾推薦算法

最多含有標的物的數量(m)個的元素,相對來說不大,我們可以將

協同過濾推薦算法

廣播(broadcast)出去。

協同過濾推薦算法

方便我們按照公式1除以分母,最終得到

協同過濾推薦算法

的相似度。

通過上面這些步驟,公式1中的分子和分母基本都很容易計算出來了,我們通過下圖的代碼(下面的broadcast即是

協同過濾推薦算法

),就可以計算出每組

協同過濾推薦算法

對的相似度,最終得到的RDD為:

協同過濾推薦算法

,其中Sim為sid1和sid2的相似度。

協同過濾推薦算法

圖6:計算每組

協同過濾推薦算法

的相似度

有了上面的準備,下面我們來說明一下怎麼計算每個標的物的topK最相似的標的物。

具體的計算過程可以用如下的Spark Transformation來實現。其中第三步的TopK需要我們自己實現一個函數,求

協同過濾推薦算法

這樣的列表中評分最大的TopK個元素,實現也是非常容易的,這裡不贅述。

協同過濾推薦算法

如果我們把每個標的物最相似的K個標的物及相似度看成一個列向量的話,那麼我們計算出的標的物相似度其實可以看作如下矩陣,該矩陣每列K個非零元素。

協同過濾推薦算法

圖7:標的物相似度矩陣

到此為止,我們通過Spark提供的一些Transformation操作及一些工程實現上的技巧計算出了每個標的物topK最相似的標的物。該計算方法可以橫向拓展,所以再大的用戶數和標的物數都可以輕鬆應對,最多可能需要多加一些服務器。

2.為用戶生成推薦

有了1中計算出的標的物topK最相似的標的物,下面我們來說明一下怎麼為用戶生成個性化推薦。生成個性化推薦有兩種工程實現策略,一種是看成矩陣的乘積,另外一種是根據第二節2中”基於標的物的協同過濾“中的公式來計算,這兩種方法本質上是一樣的,只是工程實現上不一樣。下面我們分別講解這兩種實現方案。

(1) 通過矩陣相乘為用戶生成推薦

上面圖2中的矩陣是用戶行為矩陣,第i行第j列的元素代表了用戶i對標的物j的偏好/評分,我們將該矩陣記為

協同過濾推薦算法

,其中n是用戶數,m是標的物數。圖7中的矩陣是標的物之間的相似度矩陣,我們將它記為

協同過濾推薦算法

,這是一個方陣。

協同過濾推薦算法

協同過濾推薦算法

其實都是稀疏矩陣,我們通過計算這兩個矩陣的乘積(Spark上是可以直接計算兩個稀疏矩陣的乘積的),最終的結果矩陣就可以方便用來為用戶推薦了:

協同過濾推薦算法

。其中的第i行

協同過濾推薦算法

代表的是用戶i對每個標的物的偏好得分,我們從這個列表中過濾掉用戶操作過的標的物,然後按照得分從高到低降序排列取topN就是最終給用戶的推薦。

(2) 通計算公式為用戶生成推薦

標的物相似度矩陣

協同過濾推薦算法

是稀疏矩陣,最多

協同過濾推薦算法

個非零元素(因為每個標的物只保留K個最相似的標的物),一般K取幾十或者上百規模的數值,m如果是十萬或者百萬量級,存儲空間在1G左右(例如,如果m=100萬,K=100,相似度為雙精度浮點數,那麼

協同過濾推薦算法

非零元素佔用的空間為100萬*100*8Byte=763M),完全可以通過廣播的形式將

協同過濾推薦算法

broadcast到每個Spark計算節點中。我們先將相似矩陣轉化為下圖的Map結構,再廣播出去,方便利用公式計算相似度。

協同過濾推薦算法

圖8:標的物的topK相似列表利用Map數據結構來存儲

有了標的物之間的相似度Map,為用戶計算推薦的過程可以基於用戶行為RDD,在每個Partition中,針對每個用戶u計算u與每個標的物之間的偏好度(利用第二節2基於標的物的協同過濾中的公式),再取topN就得到該用戶的推薦結果了。由於用戶行為採用了RDD來表示,所以整個計算過程可以分佈式進行,每個Partition分佈在一臺服務器上進行計算。具體的計算邏輯可以用下面的代碼片段來實現。

協同過濾推薦算法

圖9:為每個用戶計算topN推薦

講到這裡,基於Spark平臺離線實現協同過濾算法的工程方案就講完了。該實現方案強依賴於Spark的數據結構及分佈式計算函數,可能在不同的計算平臺上(比如Flink、Tensorflow等)具體的實現方式會不一樣,但是基本思路和原理是一樣的,有興趣並且平時使用這些平臺的讀者可以在這些計算平臺上獨自實現一下,算是對自己的一個挑戰。


四、近實時協同過濾算法的工程實現

上面第三節中的協同過濾工程實現方案適合做離線批量計算,比較適合標的物增長較緩慢的場景及產品(比如電商、視頻、音樂等),對於新聞、短視頻這類增量非常大並且時效性強的產品(如今日頭條、快手等)是不太合適的。那麼我們是否可以設計出一套適合這類標的物快速增長的產品及場景下的協同過濾算法呢?實際上是可以的,下面我們來簡單說一下怎麼近實時實現簡單的協同過濾算法。

我們的近實時協同過濾算法基於Kafka、HBase和Spark Streaming等分佈式技術來實現,核心思想跟第三節中的類似,只不過我們這裡是實時更新的,具體的算法流程及涉及到的數據結構見下面圖10。下面我們對實現原理做簡單介紹,整個推薦過程一共分為4步。

協同過濾推薦算法

圖10:近實時基於標的物的協同過濾算法流程及相關數據結構

  1. 獲取用戶在一個時間窗口內的行為

首先Spark Streaming程序從kafka讀取一個時間窗口(Window)(一般一個時間窗口幾秒鐘,時間越短實時性越好,但是對計算能力要求也越高)內的用戶行為數據,我們對同一個用戶U的行為做聚合,得到上面圖中間部分的用戶行為列表(用戶在該時間窗口中有k次行為記錄)。

順便說一下,因為是實時計算,所以用戶行為數據會實時傳輸到Kafka中,供後續的Spark Streaming程序讀取。

  1. 基於用戶在時間窗口W內的行為及用戶行為記錄表更新標的物關聯表CR

基於(1)中獲取的用戶行為記錄,在這一步,我們需要更新標的物關聯表CR,這裡涉及到兩類更新。首先,用戶U在時間窗口W內的所有k次行為

協同過濾推薦算法

,我們對標的物兩兩組合(自身和自身做笛卡爾積)並將得分相乘更新到CR中,比如

協同過濾推薦算法

組合,它們的得分

協同過濾推薦算法

相乘

協同過濾推薦算法

更新到CR表中rowkey為

協同過濾推薦算法

的行中。

協同過濾推薦算法

的得分score更新為score+

協同過濾推薦算法

)。其次,對於用戶U在時間窗口W中的行為還要與用戶行為表UAction中的行為兩兩組合(做笛卡爾積)採用前面介紹的一樣的策略更新到CR表中,這裡為了防止組合過多,我們可以只選擇時間在一定範圍內(比如2天內)的標的物對組合,從而減少計算量。

這裡說一下,如果用戶操作的某個標的物已經在行為表UAction中(這種情況一般是用戶對同一個標的物做了多次操作,昨天看了這短視頻,今天刷到了又看了一遍),我們需要將這兩次相同的行為合併起來,具體上我們可以將這兩次行為中得分高的賦值給行為表中該標的物的得分,同時將操作時間更新為最新操作該標的物的時間。同時將時間窗口W中該操作行為剔除掉,不參上面提到的時間窗口W中的操作行為跟UAction表中同樣的操作行為的笛卡爾積計算。

  1. 更新用戶的行為記錄HBase表:UAction

基於(1)獲取中的用戶行為記錄,當(2)處理完之後,將行為記錄插入用戶行為表UAction中。為了計算簡單方便及保留用戶最近的行為,用戶行為表中我們可以只保留最近N條(可以選擇的參數,比如20條)行為,同時只保留最近一段時間內(比如5天)的行為。

  1. 為用戶生成個性化推薦

有了上面(1)、(2)、(3)步的基礎,最後一步是為用戶做推薦了,我們對計算過程簡單說明如下:

用戶U對標的物的評分

協同過濾推薦算法

可以採用如下公式計算。

協同過濾推薦算法

其中t是用戶操作過的標的物,

協同過濾推薦算法

是該用戶對標的物t的得分(即圖10中UAction數據結構中的評分r),

協同過濾推薦算法

是標的物t和標的物s之間的相似度,可以採用如下公式計算,這裡

協同過濾推薦算法

就是標的物關聯表CR中(t,s)對應的得分,

協同過濾推薦算法

協同過濾推薦算法

類似。

協同過濾推薦算法

當我們計算完了用戶U跟所有標的物的得分之後,通過對得分降序排列取topN就可以作為U的推薦了。當標的物量很大(特別是新聞短視頻類產品)時,實時計算還是壓力非常大的,這時我們可以採用一個簡單的技巧,我們事先從CR表中過濾出跟用戶行為表中至少有一個標的物t有交集的標的物s(即標的物對

協同過濾推薦算法

得分不為零),只針對這部分標的物計算

協同過濾推薦算法

,再從這些標的物中選擇得分最大的topN推薦給用戶。為什麼可以這麼做呢?因為如果某個標的物s與用戶行為標的物集合無交集,那麼根據計算

協同過濾推薦算法

的公式,

協同過濾推薦算法

一定為0,這時計算出的

協同過濾推薦算法

也一定為0。

上面針對一個用戶怎麼實時計算協同過濾做了講解,那麼在一個時間窗口W中有若干個用戶都有操作行為,這時可以將用戶均勻分配到不同的Partition中,每個Partition為一批用戶計推薦。具體流程可以參考下面圖11。為每個用戶計算好推薦後,可以插一份到HBase中作為一個副本,另外還可以通過Kafka將推薦結果同步一份到CouchBase集群中,供推薦Web服務為用戶提供線上推薦服務。

協同過濾推薦算法

圖11:在同一時間窗口W中為多個用戶生成個性化推薦

近實時的協同過濾主要用於對時效性要求比較高的產品形態,比如新聞、短視頻等應用。這些應用標的物更新快,用戶消耗一個標的物(讀一篇文章、看一段短視頻)所花的時間較短,這類應用一般是用於填補用戶的碎片化時間的。而對於電商、視頻等產品,近實時的協同過濾不是必須的。

上面我們講解的只是近實時協同過濾的一種實現方案,其實近實時協同過濾有很多可行的實現方案,我們的實現方案跟參考文獻6中的covisitation counts方案思路本質上是一致的。讀者也可以閱讀參考文獻5,騰訊給出了另外一個利用Storm來實時實現協同過濾的方案,思路是非常值得借鑑的。另外參考文獻6中Google實現了一個新聞的協同過濾算法,通過MinHash算法基於用戶行為來近實時計算用戶相似度,最終通過類似基於用戶的協同過濾的算法來為用戶推薦。參考文獻7、8也對怎麼增量做協同過濾給出了獨特的方法和思路。


五、協同過濾算法的應用場景

協同過濾是非常重要的一類推薦算法,我們在第三、第四節介紹了批處理(離線)協同過濾和近實時協同過濾的工程實現方案,相信大家對怎麼基於Spark及HBase技術實現協同過濾有了比較清晰的認知。那麼協同過濾算法可以用於哪些推薦業務場景呢?它主要的及延伸的應用場景有如下3類:


1.完全個性化推薦(範式)

完全個性化推薦是為每個用戶推薦不一樣的標的物推薦列表,我們在第二節中所講解的兩類協同過濾算法即是完全個性化推薦的方法,所以協同過濾可以用於該場景中。我們在第三、第四節中也非常明確地給出了從工程上實現完全個性化推薦的思路。

下圖是電視貓電影猜你喜歡推薦,這是一類完全個性化推薦範式,這類推薦可以基於協同過濾算法來實現。

協同過濾推薦算法

圖12:電視貓完全個性化推薦:電影猜你喜歡

2.標的物關聯標的物推薦(範式)

雖然第二節沒有直接講標的物關聯標的物的算法,但是講到了怎麼計算兩個標的物之間的相似度(即圖2中評分矩陣的列向量之間的相似度),我們利用該相似度可以計算某個標的物最相似的K個標的物(在第三節1中我們給出了實現標的物相似性的工程實現,在第四節4中我們也給出了近實時計算標的物相似度的實現方案)。那麼這K個最相似的標的物就可以作為該標的物的關聯推薦。

下圖是電視貓相似影片推薦,是一類標的物關聯標的物推薦範式,這類推薦可以基於協同過濾算法中間過程中的標的物topN相似度計算來實現。

協同過濾推薦算法

圖13:電視貓標的物關聯標的物推薦:相似影片

3.其他應用形式及場景

在協同過濾算法的講解中,我們可以將用戶或者標的物用向量表示(用戶行為矩陣中的行向量和列向量),有了用戶和標的物的向量表示,我們就可以對用戶和標的物做聚類了。

對用戶聚類後,當然可以用於做推薦,將同一類中其他用戶操作過的標的物推薦給該用戶就是一種可行的推薦策略。同時,用戶聚類後,也可以用於做lookalike類的商業化(如廣告)嘗試。

對標的物聚類後,也可以用於做標的物關聯推薦,將同一類中的其他標的物作為關聯推薦結果。另外,標的物聚類後,這些類可以作為專題供編輯或者運營團隊來作為一種內容分發的素材。


六、協同過濾算法的優缺點

前面對協同過濾算法做了比較完備的講解,也提到了協同過濾算法的一些特點,這裡我們簡單羅列一些協同過濾算法的優缺點,方便大家更進一步深入瞭解協同過濾算法。

1.優點

協同過濾算有很多優點,總結下來最大的優點有如下幾個:

(1) 算法原理簡單、思想樸素

從前面的幾節講解中不難看出,協同過濾算法的實現非常簡單,只要懂簡單的四則混合運算,瞭解向量和矩陣的基本概念就可以理解算法的原理。估計在整個機器學習領域,沒有比這個算法更直觀簡單的算法了。

協同過濾的思想是簡單的”物以類聚“、”人以群分“的思想,相信大家都可以理解,正因為思想樸素,所以算法原理簡單。

(2) 算法易於分佈式實現、可以處理海量數據集

我們在第三、第四節分別講解了協同過濾算法的離線和實時工程實現,大家應該很容易看到,協同過濾算法可以非常容易利用Spark分佈式平臺來實現,因此可以通過增加計算節點很容易處理大規模數據集。

(3) 算法整體效果很不錯

協同過濾算法是得到工業界驗證過的一類重要算法,在Netflix、Google、Amazon及國內大型互聯網公司都有很好的落地和應用。

(4) 能夠為用戶推薦出多樣性、新穎性的標的物

前面講到協同過濾算法是基於群體智慧的一類算法,它利用群體行為來做決策。在實踐使用中已經被證明可以很好的為用戶推薦多樣性、新穎性的標的物。特別是當群體規模越大,用戶行為越多,推薦的效果越好。

(5) 協同過濾算法只需要用戶的行為信息,不依賴用戶及標的物的其他信息

從前面的算法及工程實踐中大家可以知道,協同過濾算法只依賴用戶的操作行為,不依賴具體用戶相關和標的物相關的信息就可以做推薦,往往用戶信息和標的物信息都是比較複雜的半結構化或者非結構化的信息,處理起來很不方便。這是一個極大的優勢,正因為這個優勢讓協同過濾算法在工業界大放異彩。

2.缺點

除了上面介紹的這些優點外,協同過濾算法也存在一些不足的方面,具體來說,在下面這些點,協同過濾算法存在軟肋,有提升和優化的空間。

(1) 冷啟動問題

協同過濾算法依賴用戶的行為來為用戶做推薦,如果用戶行為少(比如新上線的產品或者用戶規模不大的產品),這時就很難發揮協同過濾算法的優勢和價值,甚至根本無法為用戶做推薦。這時可以採用基於內容的推薦算法作為補充。

另外,對於新入庫的標的物,由於只有很少的用戶操作行為,這時相當於用戶行為矩陣中該標的物對應的列基本都是零,這時無法計算出該標的物的相似標的物,同時,該標的物也不會出現在其他標的物的相似列表中,因此無法將該標的物推薦出去。這時,可以採用人工的策略將該標的物在一定的位置曝光,或者強行以一定的比例或者概率加入推薦列表中,通過收集該標的物的行為解決該標的物無法被推薦出去的問題。

在第七節我們會更加詳細介紹協同過濾的冷啟動解決方案。

(2) 稀疏性問題

對於現代的互聯網產品,用戶基數大,標的物數量多(特別是新聞、UGC短視頻類產品),一般用戶只對很少量的標的物產生操作行為,這是用戶操作行為矩陣是非常稀疏的,太稀疏的行為矩陣計算出的標的物相似度往往不夠精準,最終影響推薦結果的精準度。


七、協同過濾算法落地到業務場景需要關注的問題

協同過濾算法雖然簡單,但是在實際業務中,為了讓它有較好的效果,最終對業務產生較大的價值,我們在使用該算法時需要注意如下問題。

1.是採用基於用戶的協同過濾還是採用基於標的物的協同過濾

在互聯網產品中一般會採用基於標的物的協同過濾,因為對於互聯網產品來說,用戶相對於標的物變化更大,用戶是增長較快的,標的物增長相對較慢(這也不是絕對的,像新聞、短視頻類應用標的物也是增速巨大的),利用基於標的物的協同過濾算法效果更穩定。

2.對時間加權

一般來說,用戶的興趣是隨著時間變化的,越是久遠的行為對用戶當前的興趣貢獻越小,基於該思考,我們可以對用戶的行為矩陣做時間加權處理。將用戶評分加上一個時間懲罰因子,對久遠的行為進行一定的懲罰,可行的懲罰方案可以採用指數衰減的方式。例如,我們可以採用如下的公式來對時間做衰減,我們可以選擇一個時間作為基準值,比如當前時間,下式中的n是標的物操作時間與基準時間相差的天數(n=0時,w(0)=1)。

協同過濾推薦算法

3.關於用戶對標的物的評分

在真實業務場景中,用戶不一定對標的物評分,可能只有操作行為。這時可以採用隱式反饋的方式來做協同過濾,雖然隱式反饋的效果可能會差一些。

但同時,我們是可以通過一些方法和技巧來間接獲得隱式反饋的評分的,主要有如下兩類方法,通過這兩類方法獲得評分,是非常直觀的,效果肯定比隱式反饋直接用0或者1好。

雖然很多時候用戶的反饋是隱式的,但用戶的操作行為是多樣化的,有瀏覽、點擊、點贊、購買、收藏、分享、評論等等,我們可以基於用戶這些隱式行為的投入度(投入的時間成本、資金成本、社交壓力等,投入成本越大給定越高的分數)對這些行為人為打分,比如瀏覽給1分,點贊給2分,轉發給4分等等。這樣我們就可以針對用戶不同的行為生成差異化的評分。

對於像音樂、視頻、文章等,我們可以記錄用戶在消費這些標的物上所花的時間來計算評分。拿視頻來說,如果一個電影總時長是100分鐘,如果用戶看了60分鐘就退出了,那麼我們就可以給用戶打6分(10分制,因為用戶看了60%,所以打6分)。

4.相似度計算

我們在前面講解協同過濾算法時需要計算兩個向量的相似度,本文前面採用的是cosine餘弦相似度。其實,計算兩個向量相似度的方式非常多,cosine餘弦是被證明在很多場景效果都不錯的一個算法,但並不是所有場景cosine餘弦都是最好的,需要針對不同場景做嘗試和對比。在這裡,我們簡單羅列一些常用的相似度計算的方法,供大家參考。

(1) cosine餘弦相似度

前面已經花了很大篇幅講解了cosine的計算公式,這裡不贅述。需要提一點的是,針對隱式反饋(用戶只有點擊等行為,沒有評分),向量的元素要麼為1要麼為0,直接用cosine餘弦公式效果不是很好,參考文獻5針對隱式反饋給出了一個更好的計算公式(見下面圖14),其中

協同過濾推薦算法

是用戶u對標的物p的評分(對於隱式反饋,評分是0或者1,但是參考文獻5針對用戶不同的隱式反饋給出了不同的評分,而不是一律用1,比如瀏覽給1分,收藏給3分,分享給5分等,

協同過濾推薦算法

取用戶u對標的物p所有的隱式反饋行為中得分最高的)。

協同過濾推薦算法

圖14:一種優化後的計算隱式反饋相似度的公式,類似cosine餘弦公式

(2) 皮爾森相關係數(Pearson correlation coefficient)

皮爾森相關係數是一種線性相關係數。皮爾森相關係數是用來反映兩個變量線性相關的程度的統計量。具體計算公式如下面圖15,其中

協同過濾推薦算法

協同過濾推薦算法

是兩個向量,

協同過濾推薦算法

協同過濾推薦算法

是這兩個向量的均值。參考文獻9中有對怎麼利用皮爾遜相關係數做協同過濾的介紹,感興趣的讀者可以參考學習。

協同過濾推薦算法

圖15:皮爾遜相關係數的計算公式

(3) Jaccard coefficient

Jaccard係數用於計算兩個集合之間的相似度,也比較適合隱式反饋類型的用戶行為,假設兩個標的物

協同過濾推薦算法

,操作過這兩個標的物的用戶分別為:

協同過濾推薦算法

協同過濾推薦算法

那麼Jaccard係數的計算公式如下:

協同過濾推薦算法

5.冷啟動問題

前面在講協同過濾算法的缺點時講到協同過濾算法會存在嚴重的冷啟動問題,主要表現在如下3個方面:

(1) 用戶冷啟動

所謂用戶冷啟動就是新用戶沒有太多的行為,我們無法為他計算個性化推薦。這時可行的推薦策略是為這類用戶推薦熱門標的物、通過人工編排篩選出的標的物。或者用戶只有很少的行為,協同過濾效果也不好,這時可以採用基於內容的推薦算法補充。

(2) 標的物冷啟動

所謂標的物冷啟動就是新的標的物加入系統,沒有用戶操作行為,這時協同過濾算法也無法將該標的物推薦給用戶。可行的解決方案有三個:

首先,這類標的物可以通過人工曝光到比較好的推薦位(如首頁)上,在盡短的時間內獲得足夠多的用戶行為,這樣就可以“啟動”協同過濾算法了。這裡有個比較大的問題是,如果該標的物不是主流的標的物、不夠熱門的話,放在好的位子不光佔用資源同時對用戶體驗還不好。

其次,在推薦算法上做一些策略,可以將這類新的標的物以一定的概率混雜在用戶的推薦列表中,讓這些標的物有足夠多的曝光,在曝光過程中收集用戶行為,同時該方法也可以提升用戶推薦的多樣性。

最後,這類標的物也可以通過基於內容的推薦算法來分發出去,作者在《基於內容的推薦算法》中已經講過內容推薦,這裡不再贅述。

(3) 系統冷啟動

所謂系統冷啟動,就是該產品是一個新開發不久的產品,還在發展用戶初期階段,這時協同過濾算法基本無法起作用,最好採用基於內容的推薦算法或者直接利用編輯編排一些多樣性的優質內容作為推薦備選推薦集。


總結

至此,協同過濾推薦算法基本講完了,在最後我們做一個簡單總結。本文對協同過濾算法原理、工程實踐進行了介紹,在工程實踐上既講解了批處理實現方案,同時也講解了一種近實時實現方案。並且對協同過濾的產品形態及應用場景、優缺點、在落地協同過濾算法中需要注意的問題進行了介紹。希望本文可以幫助讀者更深入地瞭解協同過濾推薦算法。參考文獻中的材料從學術上、工業界都對協同過濾算法原理、實踐從不同視角及場景進行了論述,具有非常大的參考價值,值得大家閱讀學習。


參考文獻

  1. Item-based collaborative filtering recommendation algorithms
  2. item-based top-n recommendation algorithms
  3. Collaborative filtering for implicit feedback datasets
  4. Amazon.com reecommendations: Item-to-item collaborative filtering
  5. TencentRec- Real-time Stream Recommendation in Practice
  6. Google news personalization: Scalable online collaborative flitering
  7. Forgetting mechanisms for incremental collaborative filtering
  8. Scalable collaborative filtering using incremental update and local link prediction
  9. GroupLens:An Open Architecture for Collaborative Filtering of Netnews
  10. An algorithmic framework for performing collaborative filtering
  11. A survey of collaborative filtering techniques
  12. [2011] Collaborative filtering recommender systems


分享到:


相關文章: