作者丨gongyouliu
來源 | 大資料與人工智能
導語:本文會從協同過濾思想簡介、協同過濾算法原理介紹、離線協同過濾算法的工程實作、近實時協同過濾算法的工程實作、協同過濾算法應用場景、協同過濾算法的優缺點、協同過濾算法落地需要關注的幾個問題等7個方面來講述。希望讀者讀完本文,可以很好地了解協同過濾的思路、算法原理、工程實作方案,并且具備基于本文的思路自己獨立實作一個在真實業務場景中可用的協同過濾推薦系統的能力。
作者在《推薦系統産品與算法概述》這篇文章中簡單介紹了協同過濾算法。協同過濾算法是在整個推薦系統發展史上比較出名的算法,具備舉足輕重的地位,甚至在當今還在大量使用。
本篇文章作者會詳細講解協同過濾推薦算法的方方面面,這裡所講的也是作者基于多年推薦系統研究及工程實踐經驗的基礎上總結而成,希望對大家學習協同過濾推薦算法有所幫助,提供一些借鑒。
在正式講解之前,先做一個簡單定義。本文用“操作過”這個詞來表示使用者對标的物的各種操作行為,包括浏覽、點選、播放、收藏、評論、點贊、轉發、評分等等。
一、協同過濾思想簡介
協同過濾,從字面上了解,包括協同和過濾兩個操作。所謂協同就是利用群體的行為來做決策(推薦),生物上有協同進化的說法,通過協同的作用,讓群體逐漸進化到更佳的狀态。對于推薦系統來說,通過使用者的持續協同作用,最終給使用者的推薦會越來越準。而過濾,就是從可行的決策(推薦)方案(标的物)中将使用者喜歡的方案(标的物)找(過濾)出來。
具體來說,協同過濾的思路是通過群體的行為來找到某種相似性(使用者之間的相似性或者标的物之間的相似性),通過該相似性來為使用者做決策和推薦。
現實生活中有很多協同過濾的案例及思想展現,除了前面提到的生物的進化是一種”協同過濾“作用外,我認為人類喜歡追求相親中的“門當戶對”,其實也是一種協同過濾思想的反射,門當戶對實際上是建立了相親男女的一種“相似度”(家庭背景、出身、生活習慣、為人處世、消費觀、甚至價值觀可能會相似),給自己找一個門當戶對的伴侶就是一種“過濾”,當雙方”門當戶對“時,各方面的習慣及價值觀會更相似,未來幸福的機率也會更大。如果整個社會具備這樣的傳統和風氣,以及在真實”案例“中”門當戶對“的夫妻确實會更和諧,通過”協同進化“作用,大家會越來越認同這種方式。我個人也覺得”門當戶對“是有一定道理的。
協同過濾利用了兩個非常樸素的自然哲學思想:“群體的智慧”和“相似的物體具備相似的性質”,群體的智慧從數學上講應該滿足一定的統計學規律,是一種朝向平衡穩定态發展的動态過程,越相似的物體化學及實體組成越一緻,當然表現的外在特性會更相似。雖然這兩個思想很簡單,也很容易了解,但是正因為思想很樸素,價值反而非常大。是以協同過濾算法原理很簡單,但是效果很不錯,而且也非常容易實作。
協同過濾分為基于使用者的協同過濾和基于标的物(物品)的協同過濾兩類算法。下面我們對協同過濾的算法原理來做詳細的介紹。
二、協同過濾算法原理介紹
上面一節簡單介紹了協同過濾的思想,基于協同過濾的兩種推薦算法,核心思想是很樸素的”物以類聚、人以群分“的思想。所謂物以類聚,就是計算出每個标的物最相似的标的物清單,我們就可以為使用者推薦使用者喜歡的标的物相似的标的物,這就是基于物品(标的物)的協同過濾。所謂人以群分,就是我們可以将與該使用者相似的使用者喜歡過的标的物的标的物推薦給該使用者(而該使用者未曾操作過),這就是基于使用者的協同過濾。具體思想可以參考下面的圖1。

圖1:”物以類聚,人以群分“的樸素協同過濾推薦
協同過濾的核心是怎麼計算标的物之間的相似度以及使用者之間的相似度。我們可以采用非常樸素的思想來計算相似度。我們将使用者對标的物的評分(或者隐式回報,如點選、收藏等)建構如下使用者行為矩陣(見下面圖2),矩陣的某個元素代表某個使用者對某個标的物的評分(如果是隐式回報,值為1),如果某個使用者對某個标的物未産生行為,值為0。其中行向量代表某個使用者對所有标的物的評分向量,列向量代表所有使用者對某個标的物的評分向量。有了行向量和列向量,我們就可以計算使用者與使用者之間、标的物與标的物之間的相似度了。具體來說,行向量之間的相似度就是使用者之間的相似度,列向量之間的相似度就是标的物之間的相似度。
為了避免誤解,這裡簡單解釋一下隐式回報,隻要不是使用者直接評分的操作行為都算隐式回報,包括浏覽、點選、播放、收藏、評論、點贊、轉發等等。有很多隐式回報是可以間接獲得評分的,後面會講解。如果不間接獲得評分,就用0、1表示是否操作過。
在真實業務場景中使用者數和标的物數一般都是很大的(使用者數可能是百萬、千萬、億級,标的物可能是十萬、百萬、千萬級),而每個使用者隻會操作過有限個标的物,是以使用者行為矩陣是稀疏矩陣。正因為矩陣是稀疏的,會友善我們進行相似度計算及為使用者做推薦。
圖2:使用者對标的物的操作行為矩陣
相似度的計算可以采用cosine餘弦相似度算法來計算兩個向量
(可以是上圖2中的行向量或者列向量)之間的相似度:
計算完了使用者(行向量)或者标的物(列向量)之間的相似度,那麼下面說說怎麼為使用者做個性化推薦。
2.1 基于使用者協同過濾
根據上面算法思想的介紹,我們可以将與該使用者最相似的使用者喜歡的标的物推薦給該使用者。這就是基于使用者的協同過濾的核心思想。
使用者u對标的物s的喜好度sim(u,s)可以采用如下公式計算,其中U是與該使用者最相似的使用者集合(我們可以基于使用者相似度找到與某使用者最相似的K個使用者),
是使用者
對标的物s的喜好度(對于隐式回報為1,而對于非隐式回報,該值為使用者對标的物的評分),
是使用者
與使用者u的相似度。
有了使用者對每個标的物的評分,基于評分降序排列,就可以取topN推薦給使用者了。
2.2 基于标的物的協同過濾
類似地,通過将使用者操作過的标的物最相似的标的物推薦給使用者,這就是基于标的物的協同過濾的核心思想。
使用者u對标的物s的喜好度sim(u,s)可以采用如下公式計算,其中S是所有使用者操作過的标的物的清單,
是使用者u對标的物
的喜好度,
是标的物
與s的相似度。
有了使用者對每個标的物的評分,基于評分降序排列,就可以取topN推薦給使用者了。
從上面的介紹中我們可以看到協同過濾算法思路非常直覺易懂,計算公式也相對簡單,并且後面兩節我們也會說明它易于分布式實作,同時該算法也不依賴于使用者及标的物的其他metadata資訊。協同過濾算法被Netflix、Amazon等大的網際網路公司證明效果也非常好,也能夠為使用者推薦新穎性内容,是以一直以來都在工業界得到非常廣泛的應用。
三、離線協同過濾算法的工程實作
雖然協同過濾算法原理非常簡單,但是在大規模使用者及海量标的物的場景下,單機是難以解決計算問題的,我們必須借助分布式技術來實作,讓整個算法可以應對大規模資料的挑戰。在本節,我們基于主流的Spark分布式計算平台相關的技術來詳細講解協同過濾算法的離線(批處理)實作思路,供大家參考(讀者可以閱讀參考文獻1、2、3、4了解協同過濾算法原理及工業應用),同時會在下一節講解在近實時場景下怎麼在工程上實作協同過濾算法。
在這裡我們隻講解基于标的物的協同過濾算法的工程實作方案,基于使用者的協同過濾思路完全一樣,不再贅述。
為了簡單起見,我們可以将推薦過程拆解為2個階段,先計算相似度,再為使用者推薦。下面分别介紹這兩個步驟怎麼工程實作。
3.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最相似的标的物。該計算方法可以橫向拓展,是以再大的使用者數和标的物數都可以輕松應對,最多可能需要多加一些伺服器。
3.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:近實時基于标的物的協同過濾算法流程及相關資料結構
4.1 擷取使用者在一個時間視窗内的行為
首先Spark Streaming程式從kafka讀取一個時間視窗(Window)(一般一個時間視窗幾秒鐘,時間越短實時性越好,但是對計算能力要求也越高)内的使用者行為資料,我們對同一個使用者U的行為做聚合,得到上面圖中間部分的使用者行為清單(使用者在該時間視窗中有k次行為記錄)。
順便說一下,因為是實時計算,是以使用者行為資料會實時傳輸到Kafka中,供後續的Spark Streaming程式讀取。
4.2 基于使用者在時間視窗W内的行為及使用者行為記錄表更新标的物關聯表CR
基于(1)中擷取的使用者行為記錄,在這一步,我們需要更新标的物關聯表CR,這裡涉及到兩類更新。
首先,使用者U在時間視窗W内的所有k次行為
,我們對标的物兩兩組合(自身和自身做笛卡爾積)并将得分相乘更新到CR中,比如
組合,它們的得分
相乘
更新到CR表中rowkey為
的行中。
的得分score更新為score+
)。其次,對于使用者U在時間視窗W中的行為還要與使用者行為表UAction中的行為兩兩組合(做笛卡爾積)采用前面介紹的一樣的政策更新到CR表中,這裡為了防止組合過多,我們可以隻選擇時間在一定範圍内(比如2天内)的标的物對組合,進而減少計算量。
這裡說一下,如果使用者操作的某個标的物已經在行為表UAction中(這種情況一般是使用者對同一個标的物做了多次操作,昨天看了這短視訊,今天刷到了又看了一遍),我們需要将這兩次相同的行為合并起來,具體上我們可以将這兩次行為中得分高的指派給行為表中該标的物的得分,同時将操作時間更新為最新操作該标的物的時間。同時将時間視窗W中該操作行為剔除掉,不參上面提到的時間視窗W中的操作行為跟UAction表中同樣的操作行為的笛卡爾積計算。
4.3 更新使用者的行為記錄HBase表:UAction
基于(1)擷取中的使用者行為記錄,當(2)處理完之後,将行為記錄插入使用者行為表UAction中。為了計算簡單友善及保留使用者最近的行為,使用者行為表中我們可以隻保留最近N條(可以選擇的參數,比如20條)行為,同時隻保留最近一段時間内(比如5天)的行為。
4.4 為使用者生成個性化推薦
有了上面(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類:
5.1 完全個性化推薦(範式)
完全個性化推薦是為每個使用者推薦不一樣的标的物推薦清單,我們在第二節中所講解的兩類協同過濾算法即是完全個性化推薦的方法,是以協同過濾可以用于該場景中。我們在第三、第四節中也非常明确地給出了從工程上實作完全個性化推薦的思路。
下圖是電視貓電影猜你喜歡推薦,這是一類完全個性化推薦範式,這類推薦可以基于協同過濾算法來實作。
圖12:電視貓完全個性化推薦:電影猜你喜歡
5.2标的物關聯标的物推薦(範式)
雖然第二節沒有直接講标的物關聯标的物的算法,但是講到了怎麼計算兩個标的物之間的相似度(即圖2中評分矩陣的列向量之間的相似度),我們利用該相似度可以計算某個标的物最相似的K個标的物(在第三節1中我們給出了實作标的物相似性的工程實作,在第四節4中我們也給出了近實時計算标的物相似度的實作方案)。那麼這K個最相似的标的物就可以作為該标的物的關聯推薦。
下圖是電視貓相似影片推薦,是一類标的物關聯标的物推薦範式,這類推薦可以基于協同過濾算法中間過程中的标的物topN相似度計算來實作。
圖13:電視貓标的物關聯标的物推薦:相似影片
5.3其他應用形式及場景
在協同過濾算法的講解中,我們可以将使用者或者标的物用向量表示(使用者行為矩陣中的行向量和列向量),有了使用者和标的物的向量表示,我們就可以對使用者和标的物做聚類了。
對使用者聚類後,當然可以用于做推薦,将同一類中其他使用者操作過的标的物推薦給該使用者就是一種可行的推薦政策。同時,使用者聚類後,也可以用于做lookalike類的商業化(如廣告)嘗試。
對标的物聚類後,也可以用于做标的物關聯推薦,将同一類中的其他标的物作為關聯推薦結果。另外,标的物聚類後,這些類可以作為專題供編輯或者營運團隊來作為一種内容分發的素材。
六、協同過濾算法的優缺點
前面對協同過濾算法做了比較完備的講解,也提到了協同過濾算法的一些特點,這裡我們簡單羅列一些協同過濾算法的優缺點,友善大家更進一步深入了解協同過濾算法。
優點
協同過濾算有很多優點,總結下來最大的優點有如下幾個:
(1) 算法原理簡單、思想樸素
從前面的幾節講解中不難看出,協同過濾算法的實作非常簡單,隻要懂簡單的四則混合運算,了解向量和矩陣的基本概念就可以了解算法的原理。估計在整個機器學習領域,沒有比這個算法更直覺簡單的算法了。
協同過濾的思想是簡單的”物以類聚“、”人以群分“的思想,相信大家都可以了解,正因為思想樸素,是以算法原理簡單。
(2) 算法易于分布式實作、可以處理海量資料集
我們在第三、第四節分别講解了協同過濾算法的離線和實時工程實作,大家應該很容易看到,協同過濾算法可以非常容易利用Spark分布式平台來實作,是以可以通過增加計算節點很容易處理大規模資料集。
(3) 算法整體效果很不錯
協同過濾算法是得到工業界驗證過的一類重要算法,在Netflix、Google、Amazon及國内大型網際網路公司都有很好的落地和應用。
(4) 能夠為使用者推薦出多樣性、新穎性的标的物
前面講到協同過濾算法是基于群體智慧的一類算法,它利用群體行為來做決策。在實踐使用中已經被證明可以很好的為使用者推薦多樣性、新穎性的标的物。特别是當群體規模越大,使用者行為越多,推薦的效果越好。
(5) 協同過濾算法隻需要使用者的行為資訊,不依賴使用者及标的物的其他資訊
從前面的算法及工程實踐中大家可以知道,協同過濾算法隻依賴使用者的操作行為,不依賴具體使用者相關和标的物相關的資訊就可以做推薦,往往使用者資訊和标的物資訊都是比較複雜的半結構化或者非結構化的資訊,處理起來很不友善。這是一個極大的優勢,正因為這個優勢讓協同過濾算法在工業界大放異彩。
缺點
除了上面介紹的這些優點外,協同過濾算法也存在一些不足的方面,具體來說,在下面這些點,協同過濾算法存在軟肋,有提升和優化的空間。
(1) 冷啟動問題
協同過濾算法依賴使用者的行為來為使用者做推薦,如果使用者行為少(比如新上線的産品或者使用者規模不大的産品),這時就很難發揮協同過濾算法的優勢和價值,甚至根本無法為使用者做推薦。這時可以采用基于内容的推薦算法作為補充。
另外,對于新入庫的标的物,由于隻有很少的使用者操作行為,這時相當于使用者行為矩陣中該标的物對應的列基本都是零,這時無法計算出該标的物的相似标的物,同時,該标的物也不會出現在其他标的物的相似清單中,是以無法将該标的物推薦出去。這時,可以采用人工的政策将該标的物在一定的位置曝光,或者強行以一定的比例或者機率加入推薦清單中,通過收集該标的物的行為解決該标的物無法被推薦出去的問題。
在第七節我們會更加詳細介紹協同過濾的冷啟動解決方案。
(2) 稀疏性問題
對于現代的網際網路産品,使用者基數大,标的物數量多(特别是新聞、UGC短視訊類産品),一般使用者隻對很少量的标的物産生操作行為,這是使用者操作行為矩陣是非常稀疏的,太稀疏的行為矩陣計算出的标的物相似度往往不夠精準,最終影響推薦結果的精準度。
協同過濾算法雖然簡單,但是在實際業務中,為了讓它有較好的效果,最終對業務産生較大的價值,我們在使用該算法時需要注意如下問題。
7.1 是采用基于使用者的協同過濾還是采用基于标的物的協同過濾
在網際網路産品中一般會采用基于标的物的協同過濾,因為對于網際網路産品來說,使用者相對于标的物變化更大,使用者是增長較快的,标的物增長相對較慢(這也不是絕對的,像新聞、短視訊類應用标的物也是增速巨大的),利用基于标的物的協同過濾算法效果更穩定。
7.2 對時間權重
一般來說,使用者的興趣是随着時間變化的,越是久遠的行為對使用者目前的興趣貢獻越小,基于該思考,我們可以對使用者的行為矩陣做時間權重處理。将使用者評分加上一個時間懲罰因子,對久遠的行為進行一定的懲罰,可行的懲罰方案可以采用指數衰減的方式。例如,我們可以采用如下的公式來對時間做衰減,我們可以選擇一個時間作為基準值,比如目前時間,下式中的n是标的物操作時間與基準時間相差的天數(n=0時,w(0)=1)。
7.3 關于使用者對标的物的評分
在真實業務場景中,使用者不一定對标的物評分,可能隻有操作行為。這時可以采用隐式回報的方式來做協同過濾,雖然隐式回報的效果可能會差一些。
但同時,我們是可以通過一些方法和技巧來間接獲得隐式回報的評分的,主要有如下兩類方法,通過這兩類方法獲得評分,是非常直覺的,效果肯定比隐式回報直接用0或者1好。
雖然很多時候使用者的回報是隐式的,但使用者的操作行為是多樣化的,有浏覽、點選、點贊、購買、收藏、分享、評論等等,我們可以基于使用者這些隐式行為的投入度(投入的時間成本、資金成本、社交壓力等,投入成本越大給定越高的分數)對這些行為人為打分,比如浏覽給1分,點贊給2分,轉發給4分等等。這樣我們就可以針對使用者不同的行為生成差異化的評分。
對于像音樂、視訊、文章等,我們可以記錄使用者在消費這些标的物上所花的時間來計算評分。拿視訊來說,如果一個電影總時長是100分鐘,如果使用者看了60分鐘就退出了,那麼我們就可以給使用者打6分(10分制,因為使用者看了60%,是以打6分)。
7.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系數的計算公式如下:
7.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
(*本文為 AI科技大學營轉載文章,轉載請微信原作者)