千萬級推薦系統架構設計

本文轉載自公衆號:高效運維

作者簡介

馮丙見

一下科技大數據部門資深架構師

 

 

一直播現在大家都能看到它的影子,技術上面來講很多東西都是通用的,可以在這裏面借鑑一下,看看是不是有一些在你工作當中可以適用的東西。

從三個方面介紹一下我們的系統,一個是面向我們架構設計,一個是用戶畫像系統,還有一個是評估推薦系統。

 

1、推薦系統架構設計

我們先來看一下推薦系統產生的背景,隨着互聯網技術發展,信息過載成爲普遍問題,信息消費者,從海量信息中找到自己感興趣的內容比較困難,作爲信息生產者,讓自己生產的信息脫穎而出,受到廣大用戶的關注也是比較困難的。

這個問題很早之前就已經意識到了,並且有了解決方案。最早的解決方案是以雅虎,後來推出了搜索引擎,因爲搜索引擎找到相關的內容給用戶,如果用戶描述的關鍵字不準確,或者用戶本身沒有什麼需求,這個時候推薦系統不需要用戶描述它的需求,是根據它的歷史給用戶推薦感興趣的內容,推薦系統是用來滿足用戶需求不是很明確的時候,幫用戶找到可能感興趣的內容。

推薦系統的主要任務就是建立用戶和信息之間的聯繫,一方面幫用戶找到他可能感興趣的內容,同時另一方面把信息呈現在可能對它感興趣的用戶面前,以此達到雙方共贏。

解決海量信息過載時用戶獲取信息效率,解決用戶無明確需求時信息獲取,長尾物品推薦,滿足小衆個性化需求,我們現在常見的是個性化推薦,已經成爲了各大網站的標配了。

再一個app上面的話是中間件存在,一個內容的話,是推薦系統根據模型推薦你內容,同時做一些相關性的推薦,比如說“看了又看,買了又買”相關性的推薦。或者你買了一個東西,給你推薦和這個東西最相關的,在一些社交網站會推薦一些相似用戶或者好友相似推薦。我們會預測到用戶感興趣的話,會給推一些感興趣的信息。

我們看一下整體流程,過濾出優質內容,去除低速、敏感信息。我們根據用戶的興趣找到他感興趣的內容,用常用的一些算法找到感興趣的內容,比如說看了一個美食的視頻,就可以把新的視頻推薦給你。

如果發現你跟某一個人很相似,那個人看過我的視頻,你沒看過,就可以把這個推薦給你,在這個量級,一個用戶很難說一天一次把這些多文章和視頻看完,所以我們進行三步走,就是把用戶最感興趣的內容放在最前面,根據用戶、物品特徵,含量信息預估視頻的可能性,根據這個可能性從高到低的排序,把最可能看的推薦給他,經過這一步之後剩下的可能是幾十個或者幾個了,這個量級用戶一次是有可能看完的。

 

我們看一下推薦系統的架構,在推薦系統裏面用戶跟系統有兩種交互的場景,右邊這個表示的是用戶的一些行爲數據,比如說觀看信息、購買信息之類的行爲信息會上報到我們的接收服務裏面,緩存到消息推薦裏面,後面會做兩種方式的處理,一種是用這種數據訓練兩種模型,用來做後面的推薦用。

 

我們看一下推薦系統常用的算法。流行度推薦算法是熱門排行榜,基於內容是標籤推薦。協同過濾有UserCF 基於用戶協同過濾;ItemCF 基於物品協同過濾;ModuleCF 基於模型協同過濾,還有基於圖模型,基於社交關係。

 

推薦系統架構-排行榜

我們看第一大類是排行榜,它在推薦系統裏面是非常重要的一個算法,非常簡單,容易實現、非常容易理解,解決新用戶冷啓動問題,可作爲老用戶的興趣發現方式,可作爲其他算法補充,可作爲系統降級方案。

缺點是所有人看的一樣,沒有個性化,排行榜更新相對較慢,短期不會修改太大的變化,容易受到攻擊,也就是被刷榜。

介紹一下它的思路,把排行榜想象成一個梯子,每個物品都在奮力往上爬,他們的動力來自用戶的手動投票,物品本身都要承受一定的重力,會從梯子上掉下來,用戶投票可以抵擋部分重力,投票數不及時或者不夠的話,排行榜上的物品夠會掉下來。

左上角是它的公式,P表示物品得票數;T表示物品已發佈時間(單位爲小時),加上2是爲了防止最新的物品導致分母過小;G表示“重力因子”,即將物品排名往下拉的力量。

我們看一下貝葉斯平均,曝光人數是1的時候,點擊人數是1,ctr是100%,曝光人數是2的話,點擊人數是1,ctr是50%,曝光人數是10000的時候,點擊人數是3000,ctr是30%。

思路是先估計一個值,然後不斷用新的信息修正,使得它越來越接近正確的值,如果投票人數少,總分接近全局平均分,如果投票人數多,總分接近項目平均分。

看一下它的公式,n是該項目的投票人數;x是該項目的每張選票的值;m是平均投票得分;C是平均投票人數。

推薦系統架構-基於內容推薦

下面講一下基於內容推薦,利用用戶已知興趣特徵和物品的特徵相匹配爲用戶推薦感興趣的商品。我舉一個例子,這張表裏面用戶A的旅遊權重是0.8%,美食是0.3%,舞蹈是0.7%,根據這個權重做一些推薦。用戶B也是一樣的思路。

基於內容推薦來說,優點就是實現比較簡單,推薦結果比較容易理解,對於新物品在沒有用戶評分的情況下,也可以進行推薦,只從當前用戶提供的評分構建興趣模型,不需要像CF一樣找近鄰。

缺點就是對於新用戶有冷啓動的問題,需要生成標籤,圖片,視頻很難提取標籤,它只能推薦和用戶興趣相似的物品,無法發現令人驚喜的推薦。意思就是說如果你喜歡美食不喜歡旅遊的,就只會給你推薦美食相關的,絕對不會給你推薦旅遊的。

推薦系統架構-協同過濾

我們知道推薦系統構架重要的一點就是協同過濾,根據目標用戶的行爲特徵,爲他發現一個興趣相投,擁有共同經驗的羣體,然後根據羣體的喜好來爲目標用戶過濾能感興趣的內容。

我們看一下它的優缺點,優點是推薦個性化、自動化程度高,能夠有效的利用其他相似使用者的回饋信息,不斷更新信息,加快個性化學習的速度,允許用戶之間的分享觀點,避免了內容分析的不準確;可以發現使用者潛在的但自己尚未發現的興趣偏好。缺點是用戶和項目的數量都非常大,這種情況下,評分矩陣會極度稀疏,這會對算法的效率產生消極影響,新用戶、新項目存在冷啓動問題,可解釋性差。

推薦系統架構-相似度計算

因爲會涉及到用戶相似度,Jaccard相似度。傑卡德相似度是兩個集合的交集元素個數在並集中所佔的比例。非常適用布爾向量計算例如使用用戶的收藏行爲,計算用戶之間的相似度。它的算法也是非常簡單的。

然後是歐氏距離。歐式距離計算m維空間中兩個點之間的真實距離,歐式距離得到的值是一個非負數,最大值是正無窮。通常相似度計算需要轉換爲[-1,1]之間。度量的是空間中兩個點的絕對差異,適用於分析用戶能力模型之間的差異,比如消費能力、貢獻能力等。

 

第三個是餘弦相似度,餘弦相似度計算兩個向量的夾角餘弦值來評估他們的相似度;餘弦相似度適用於文本、用戶、物品相似度計算;取值在[-1,1]之間;趨近於1, 表示兩個向量的方向相近;趨近於-1,表示兩個向量的方向相反;趨近於0, 表示兩個向量近乎於正交。

我們比較一下兩種協同,從使用場景來說,UserCF適用於用戶相對物品較少場景。ItemCF適用於物品數相對較少場景比如直播場景持續開播的主播相對較少。從實時性來說,UserCF用戶有新的交互行爲,推薦結果也需要等待模型更新時才變化。LtemCF用戶有新的交互行爲,推薦結果也需要等待模型更新時才變化。

冷啓動方面,UserCF新用戶、新物品有交互行爲後,也需要等待模型更新纔能有推薦結果或被推薦出去。LtemCF有兩點,1. 新用戶只要對一個物品有交互行爲就可以給他推薦類似的其他物品;2. 新物品需要等待模型更新。推薦的理由,UserCF不能提供很好的推薦理由。LtemCF可以提供,因爲看了或者買了XX所有給你推薦XX的理由。

左上角的圖是用戶評分爲矩陣,每一行代表一個用戶,每一列代表一個物品,空的部分是沒有打過分,空的是他看過或者是他買過的,很少有主動評分的場景。我們的目標是把控制填出來,按照評分的高低反映給用戶就可以了,做法就是把大的矩陣拆分成小矩陣。爲什麼說這是小矩陣,因爲它的緯度遠遠低於大矩陣。(圖),K因爲是同一個,它們相乘了以後還是這樣的,所以是還原了大矩陣,還原了以後把所有的坑填滿了就可以反映給用戶了。

我們看一個例子,左邊是大矩陣,分解成兩個小矩陣,用已知的值算出來以後,比如說第一個用戶。(圖)按照這個評分就可以反應給用戶。

我們看一下Spark ALS,它需要用戶ID,物品ID,還有評分。模型訓練完了以後,給所有用戶進行推薦,推薦完了以後得到一個新的。這個從高到低進行排序的,我們把這個反映給用戶就可以了。

推薦系統架構-領域和矩陣分解

我們看一下領域和矩陣分解的不同,方式來看的話,領域是基於領域本質是基於統計的方法,沒有學習的過程。矩陣分解是一種基於機器學習的方法,通過優化一個設定的指標建立最優的模型。

從複雜度來看,領域是有M個用戶,N個物品,O(MM)或O(NN)。矩陣分解是M個用戶,N個物品,F個隱類,O(F*(M+N))。

冷啓動方面,領域:ItemCF新用戶只要對一個物品有交互行爲就可以給他推薦類似的其他物品,其他情況需要等待模型更新。

矩陣分解:新用戶、新物品有交互行爲後,也需要等待模型更新纔能有推薦結果或被推薦出去。

推薦的理由,領域可以提供推薦解釋,矩陣分解不能提供推薦解釋。

推薦系統架構—多算法融合

推薦系統架構—多算法融合。在召回結束以後我們要合併爲一個列表,第一種是交叉式混合,直接將不同的推薦算法的結果組合在一起推薦給用戶,從而每個推薦算法的優質結果都會被展示給用戶。

第二種是切換式混合,根據不同應用場景決定使用哪一種推薦算法,使用場景改變的話則切換推薦算法。

第三種是分級混合,先界定不同算法的好壞,優先使用好算法的推薦結果,得不到結果時使用次好的算法,依此類推。

推薦系統架構—排序

在召回階段,多個通道的召回的內容是不具有可比性的,並且因爲數據量太大也難以進行更加精確的偏好和質量評估,因此需要在排序階段對召回結果進行統一的準確的打分排序。

它的做法就是右邊這張圖,結合用戶的一些行爲數據模型來,然後當用戶訪問的時候,我們會拿到一些符合用戶的特徵,我們剛纔拿到了列表,用戶這次什麼時候訪問的,使用什麼設備訪問的,以及什麼地方來的,這種信息輸出到這個排序模型裏面會反饋一個結果,用戶看了這個視頻這個物品的可能是性多少,按照這個可能性進行從高的排序,把這個結果反映給我們。

排序-LR+GBDT,Facebook2014年的一篇論文中,提及到GBDT+LR的解決方案,先使用GBDT對一些稠密的特徵進行特徵選擇,得到的葉子節點,再拼接離散化特徵放進去LR進行訓練。利用GBDT替代人工實現連續值特徵的離散化,而且同時在一定程度組合了特徵,可以改善人工離散化中可能出現的邊界問題,也減少了人工的工作量。

2、畫像系統

我們介紹一下第二部分是推薦系統—用戶畫像,應用的場景最主要的是用戶分析和研究用的,就是單一用戶行爲細緻分析和用戶調研,可以做單獨羣體使用習慣研究。還有產品和運營,瞭解系統用戶現狀,優化用戶體驗實現精準營銷,實現精準化營銷。

是可以跟業務系統相關的,推薦系統,基於內容統計,排序階段特徵獲取,PUSH系統,找到可能對主播感興趣的用戶。用戶剛好喜歡這個主播所具有的特徵,給他發信息,以此讓他參加。

我們看一下用戶畫像的架構,最底層是原始數據,比如說物品的信息,還有各種日誌,觀看日誌,評論日誌,送禮日誌等等,有了這些以後對它們進行規劃。可以做一些統計行爲信息,用戶什麼時間段喜歡看視頻,每天看多少個,用戶的付費能力怎麼樣,每天付費多少,可以根據這些行爲日誌,算出用戶的興趣,比如一個用戶經常看跟美食相關的視頻。有了用戶畫像以後,可以提供給運營系統,還有push系統。

用戶畫像分幾類,一個是基礎屬性年齡、性別、設備型號、安裝渠道、常駐地等等。用戶行動就是觀看時段、觀看時長、消費等級、活躍度。用戶興趣是感興趣的類別和感興趣的標籤。

3、評估推薦系統好壞

最後講一下評估推薦系統好壞。算法評價指標有三類,1.準確率,推薦列表中用戶喜歡的物品所佔的比例。2.召回率,用戶喜歡的物品出現在推薦列表中。3.覆蓋率,描述一個推薦系統對物品長尾的挖掘能力,推薦系統能夠推薦出來的物品佔總物品集合的比例。

產品層面,1.用戶留存;2.用戶付費率;3.用戶觀看時長。

目標就是制定一個KPI,推薦系統的算法跟別的不太一樣的,不像傳統的能夠定量知道加幾臺服務器接口能夠提升多少,做法就是要進行不斷大量的實驗,找到真正可以提高的算法,流程就是首先要做一些離線實驗,當我們確定算法以後進行一些離線實驗,本身會得到一些算法上面的指標評估,進行AB測試然後查看結果,調優算法,達到我們的目標會給它切更多流量,如果沒有達到這個目標就下線,這種方案不太成功的話,我們就換一種方式。

要做到這種流程的話,需要做很多的支撐,一方面是模擬推薦。在上線之前可以很直觀看到結果,線上還可以跑很多的實驗,你不可能用自己的手機每個看,只能通過模擬推薦隨時看到每個實驗的結果。第二種場景就是當我們在分析問題的時候,可以用到這樣的系統,分析用戶畫像,以此找到問題然後提高系統的能力。

然後是AB測試系統,這是一個非常重要的系統。用戶訪問這個系統,AB測試根據環境信息、用戶特徵確定所屬實驗,召回排序算法生成推薦結果,推薦系統生成ID,用戶反饋曝光,點擊等交互信息,系統根據推薦ID統計策略、算法各項指標,根據指標調整算法。

這個是AB測試添加實驗的頁面,根據環境信息、用戶畫像添加實驗,比如可以添加北京地區、男性用戶,習慣晚高峯觀看直播的實驗,比如可以添加一線城市,高付費用戶的實驗。

添加完以後,就可以在系統裏面查看它的推薦效果了,如果發現推薦效果不太理想,你就進行一些數據的分析,到模擬系統推薦裏面查看一下,調整完以後再看效果。

以上內容是我今天要講的所有內容,謝謝大家!

說明:本文爲一直播馮丙見老師在 GOPS 2018 · 上海站演講整理而成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章