一文搞懂工程化協(xié)同推薦算法(三)

? ? ?作者:livan
? ? ?來源:數(shù)據(jù)EDTA

前言

經(jīng)過前面兩篇的文章:
一文搞懂工程化協(xié)同推薦算法(一)一文搞懂工程化協(xié)同推薦算法(二)
不知大家對推薦算法有沒有一個系統(tǒng)的了解,推薦本身的邏輯很簡單,就是需要找到用戶喜歡的物品,然后呈現(xiàn)到用戶的面前,這其實像是一個算法與用戶的博弈,當用戶到APP上的時候,留下一串足印,算法根據(jù)用戶的足印和基本信息推斷用戶來這里想要做什么?或者說想要去什么地方?然后給他推薦他需要的東西。


推薦的基本結(jié)構(gòu)基本上可以分成兩類:
1) 基于協(xié)同理論的推薦算法:
????如上文,協(xié)同理論就是找到相似的用戶/物品或者相似的標簽,然后根據(jù)交易歷史中用戶和物品的交互情況進行推薦。算法在進行過程中遇到各種問題,程序員用各種方法來解決這些問題,久而久之,延伸出了現(xiàn)在各種復雜的協(xié)同推薦模式。
常見的問題有:
1.1)人工進行特征工程的問題:1.2)運算量龐大的問題:1.3)特征挖掘?qū)哟尾蛔愕膯栴}:1.4)如何使用社交鏈的問題:
2) 基于模型分類的推薦算法:
????推薦從模型的角度理解可以看作是對用戶喜好的預測,即為一個二分類的預測模型,根據(jù)用戶的行為預測用戶對某個商品喜歡不喜歡,進而根據(jù)喜好進行推薦。
????基于模型的推薦比較多的應用于點擊率預測,用戶是否會購買某個商品的預測,在主流思路中依然是以協(xié)同為主。
????下面我們延續(xù)上文的討論,在上面常見問題的基礎(chǔ)上深化我們對協(xié)同推薦的理解:


運算量龐大的問題

協(xié)同推薦的一個常見問題就是運算量的問題,每一次的迭代需要對全部的用戶行為和商品信息進行復盤,計算出最新的相似系數(shù)。用戶和商品量少的情況下還好說,可如果用戶超過一億,商品有上百萬個呢?這一情況下UV矩陣就會非常大,每運算一次都需要耗費很大的資源,而且數(shù)據(jù)存在較多的稀疏的問題,幾百萬的商品,大部分用戶點擊的只有十幾個,剩下的部分全都是零,極大的浪費運算資源。
????所以,需要找尋一些方法來降低數(shù)據(jù)的運算,即常說的——降維。
????一提到降維這個詞,有沒有很熟悉,對:很多人想到PCA、SVD等等常規(guī)的降維方法,在推薦算法中也有對應的基于降維的推薦方式:


——基于矩陣分解的系統(tǒng)推薦:
基于矩陣的推薦算法是以SVD奇異值分解為基礎(chǔ)進行的。

假設(shè)上圖為用戶的評分矩陣,經(jīng)過上文的講解,這個矩陣已經(jīng)非常熟悉了吧,我們假設(shè)他現(xiàn)在有一億行一億列,那該如何降維呢?
我們在學習奇異值的時候,經(jīng)常會聽到一句話:前10%的奇異值之和占了全部奇異值之和的80%以上的比例。所以,我們只需要通過奇異值計算的方式找到前10%的奇異值k個,計算他對應的k個特征向量,即可大規(guī)模的降低上面UV矩陣的計算資源。
經(jīng)過SVD的運算得到m*k的新的矩陣,我們就可以用這一矩陣替代UV矩陣進行相似度計算了。

基于新的低階矩陣我們計算出用戶的相似度/物品相似度,然后再對相似用戶進行推薦,計算效率大大的提升。
這樣運算有兩個好處:其一:減輕了線上存儲和計算的壓力;其二:解決了矩陣稀疏的問題;
也有一個壞處:
SVD是減輕了UV矩陣的運算量,但是SVD自身的運算呢?
????從一個矩陣拆分成三個矩陣,這本身就意味著巨大的運算量,所以,在平時工作中很少使用SVD,而是使用隱語義模型,隱語義模型與SVD不同,他把矩陣拆分成了兩個矩陣。


——ALS模式下隱語義推薦算法:
ALS是交替最小二乘法,主要是用來優(yōu)化最小損失函數(shù)的。
即根據(jù)用戶評分矩陣A,用求最小損失函數(shù)的方法求解出兩個分解的參數(shù)矩陣:
K即為隱含的因子個數(shù)。對應的損失函數(shù)為:

Cij即為用戶偏愛某個商品的置信程度,交互次數(shù)多的權(quán)重就會增加。
這里,協(xié)同過濾就成功轉(zhuǎn)化成了一個優(yōu)化問題。通過ALS計算出用戶因子矩陣P和物品因子矩陣Q。雖然降低了運算量,但是對于大數(shù)據(jù)集,還是推薦使用spark進行計算。
ALS模式的優(yōu)點在于能夠有效的解決過擬合的問題,同時對算法的可擴展性也有所提高。


特征挖掘?qū)哟尾蛔愕膯栴}

雖然說矩陣分解的方法進行相似性計算已經(jīng)非常成熟,但是,聰明的讀者也已經(jīng)發(fā)現(xiàn),矩陣分解只是針對矩陣進行的一次運算,對特征的挖掘?qū)哟蚊黠@不足,而且,矩陣也沒有用到用戶和物品本身的特性。
而深度學習中的稀疏自編碼模式可以有效的解決這兩個問題:


——稀疏自編碼模式下的推薦算法:
稀疏自編碼是用神經(jīng)網(wǎng)絡(luò)的方式來壓縮原始物品的特征向量,使物品的相似度運算能在較低緯度下進行。

如圖所示即為稀疏自編碼的網(wǎng)絡(luò)結(jié)構(gòu),簡單來講,稀疏自編碼就是一個hw,b(x) = x的函數(shù),設(shè)定神經(jīng)網(wǎng)絡(luò)的輸入值和輸出值都是x,中間多個隱含層的節(jié)點數(shù)量小于輸入和輸出層的節(jié)點數(shù)量(輸入和輸出層的節(jié)點數(shù)量一樣多),對網(wǎng)絡(luò)進行訓練,輸出層使用softmax進行訓練,得到最后的隱含層為輸出矩陣V,這一矩陣V即為經(jīng)過稀疏自編碼之后得到的物品的低維矩陣。
通常情況下,隱含層會有多層,以保證輸入層的數(shù)據(jù)得到充分的運算,也就解決了上面講的特征挖掘?qū)哟尾蛔愕那闆r,同時網(wǎng)絡(luò)輸入的是物品的屬性信息,所以,第二個問題也得以解決。
假設(shè)一個物品的特性為v1=(x1,x2,x3,x4,x5,x6),經(jīng)過上面的模型運算之后,向量就會變成v1=(k1, k2, k3)。
?????? 在使用稀疏自編碼進行運算時有兩個比較常用的延伸思路,是在使用稀疏自編碼進行數(shù)據(jù)降維時頻繁使用的方法,如下:
1) 添加隨機因子:
如果直接將輸入值看做輸出層,有可能使輸入層的數(shù)據(jù)直接穿透隱含層到達輸出層,起不到準確訓練的效果,此時可以在輸入層中加入一些混淆因子,使輸入和輸出層不完全一致,即避免了數(shù)據(jù)穿透的問題。
????隨機因子應該是遠遠小于x的值,以保證攪亂一致性的同時不會引發(fā)x值變化。
2) 用已知的X、Y值:
????在多層隱含層的自編碼模式中有一種典型的方法是:棧式自編碼。
即已知X和Y的值,通過輸入X,輸出Y訓練多層隱含層,然后得到最后一個隱含層,作為X的壓縮向量。

還是剛才的假設(shè):v1=(x1,x2,x3,x4,x5,x6),輸出層的標簽為Y=(y1、y2、y3),經(jīng)過兩層隱含層的計算得到v1 = (k1, k2, k3, k4),這一特征向量涵蓋了輸入端的物品的用戶評分屬性和輸出端的物品分類標簽屬性,是一個綜合性的向量。基于這樣的數(shù)據(jù)進行物品相似度計算能獲得較好的效果。
????寫到這里,大家有沒有發(fā)現(xiàn),稀疏自編碼并沒有用上面的評分表,而是使用了基于內(nèi)容的一些思路,推薦的協(xié)同邏輯發(fā)生了變化。所以,推薦本身不是基于一個固定不變的思路進行優(yōu)化的,有時會不停的跳躍,直到找到較好的方法。


如何使用社交鏈的問題

不管什么樣的APP都希望能夠使用到社交網(wǎng)絡(luò)的信息,因為社交網(wǎng)絡(luò)本身就是一個計算良好的U-U矩陣,能夠更準確的表示出用戶的相似度。
社交網(wǎng)絡(luò)主要有兩種模式:興趣圖譜和社交圖譜。
導致網(wǎng)絡(luò)中會有三種常見的社交數(shù)據(jù):1) 雙向確認的社交數(shù)據(jù),比如微信,A<——>B;2) 單向關(guān)注的社交數(shù)據(jù),比如微博,A——>B;3) 基于社區(qū)的社交數(shù)據(jù),比如知乎,A——>社區(qū)<——B;
在推薦算法中,社交網(wǎng)絡(luò)最常用的用法還是與協(xié)同推薦結(jié)合使用,我們先看一個社交網(wǎng)絡(luò)的圖片:

從圖中可以看出,B有兩人關(guān)注(A,E),有一人是好友(F),B購買了兩個物品(i1,i4)。上圖為社交網(wǎng)絡(luò)的一個完整的圖形,我們的推薦也是基于這一圖形進行的。
限于篇幅,本文就寫到這里~
下一篇文章我們來詳細的講解:基于社交網(wǎng)絡(luò)的推薦方式和基于深度學習融合模型的推薦算法。

◆?◆?◆ ?◆?◆
長按二維碼關(guān)注我們
數(shù)據(jù)森麟公眾號的交流群已經(jīng)建立,許多小伙伴已經(jīng)加入其中,感謝大家的支持。大家可以在群里交流關(guān)于數(shù)據(jù)分析&數(shù)據(jù)挖掘的相關(guān)內(nèi)容,還沒有加入的小伙伴可以掃描下方管理員二維碼,進群前一定要關(guān)注公眾號奧,關(guān)注后讓管理員幫忙拉進群,期待大家的加入。
管理員二維碼:
評論
圖片
表情
