推薦系統(tǒng)主要解決的是信息過載的問題滔迈,目標(biāo)是從海量物品篩選出不同用戶各自喜歡的物品,從而為每個用戶提供個性化的推薦被辑。推薦系統(tǒng)往往架設(shè)在大規(guī)模的業(yè)務(wù)系統(tǒng)之上,面臨著用戶的不斷增長敬惦,物品的不斷變化盼理,并且有著全面的推薦評價指標(biāo)和嚴(yán)格的性能要求(Netflix 的請求時間在 250 ms 以內(nèi),今日頭條的請求時間在 200ms 以內(nèi))俄删,所以推薦系統(tǒng)很難一次性地快速計算出用戶所喜好的物品宏怔,并且同時滿足準(zhǔn)確度、多樣性等評價指標(biāo)畴椰。為了解決如上這些問題臊诊,推薦系統(tǒng)通常被設(shè)計為三個階段:召回、排序和調(diào)整斜脂,如下圖所示:
在召回階段抓艳,首先篩選出和用戶直接相關(guān)或間接相關(guān)的物品,將原始數(shù)據(jù)從萬帚戳、百萬玷或、億級別縮小到萬儡首、千級別;在排序階段偏友,通常使用二分類算法來預(yù)測用戶對物品的喜好程度(或者是點擊率)蔬胯,然后將物品按照喜好程序從大到小依次排列,篩選出用戶最有可能喜歡的物品位他,這里又將召回數(shù)據(jù)從萬氛濒、千級別縮小到千、百級別鹅髓;最后在調(diào)整階段舞竿,需要過濾掉重復(fù)推薦的、已經(jīng)購買或閱讀的迈勋、已經(jīng)下線的物品炬灭,當(dāng)召回和排序結(jié)果不足時,需要使用熱門物品進(jìn)行補(bǔ)充靡菇,最后合并物品基礎(chǔ)信息重归,將包含完整信息的物品推薦列表返回給客戶端。
這里以文章推薦系統(tǒng)為例厦凤,講述一下推薦系統(tǒng)的完整流程鼻吮,如下圖所示:
同步業(yè)務(wù)數(shù)據(jù)
為了避免推薦系統(tǒng)的數(shù)據(jù)讀寫、計算等對應(yīng)用產(chǎn)生影響较鼓,我們首先要將業(yè)務(wù)數(shù)據(jù)從應(yīng)用數(shù)據(jù)庫 MySQL 同步到推薦系統(tǒng)數(shù)據(jù)庫 Hive 中椎木,這里利用 Sqoop 先將 MySQL 中的業(yè)務(wù)數(shù)據(jù)同步到推薦系統(tǒng)的 HDFS 中,再關(guān)聯(lián)到指定的 Hive 表中博烂,這樣就可以在推薦系統(tǒng)數(shù)據(jù)庫 Hive 中使用用戶數(shù)據(jù)和文章數(shù)據(jù)了香椎,并且不會對應(yīng)用產(chǎn)生任何影響。收集用戶行為數(shù)據(jù)
除了用戶數(shù)據(jù)和文章數(shù)據(jù)禽篱,我們還需要得到用戶對文章的行為數(shù)據(jù)畜伐,比如曝光、點擊躺率、閱讀玛界、點贊、收藏悼吱、分享慎框、評論等。我們的用戶行為數(shù)據(jù)是記錄在應(yīng)用服務(wù)器的日志文件中的后添,所以可以利用 Flume 對應(yīng)用服務(wù)器的日志文件進(jìn)行監(jiān)聽笨枯,一方面將收集到的用戶行為數(shù)據(jù)同步到 HDFS 中,并關(guān)聯(lián)到 Hive 的用戶行為表,每天更新一次猎醇,以供離線計算使用窥突。另一方面將 Flume 收集到的用戶行為數(shù)據(jù)同步到 Kafka,實時更新硫嘶,以供在線計算使用阻问。構(gòu)建離線畫像和特征
文章畫像由關(guān)鍵詞和主題詞組成,我們首先讀取 Hive 中的文章數(shù)據(jù)沦疾,將文章內(nèi)容進(jìn)行分詞称近,根據(jù) TF-IDF 模型計算每個詞的權(quán)重,將 TF-IDF 權(quán)重最高的 K 個詞作為關(guān)鍵詞哮塞,再根據(jù) TextRank 模型計算每個詞的權(quán)重刨秆,將 TextRank 權(quán)重最高的 K 個詞與 TF-IDF 權(quán)重最高的 K 個詞的共現(xiàn)詞作為主題詞,將關(guān)鍵詞和主題詞存儲到 Hive 的文章畫像表中忆畅。接下來衡未,利用 Word2Vec 模型,計算得到所有關(guān)鍵詞的平均向量家凯,作為文章的詞向量缓醋,存儲到 Hive 的文章向量表中,并利用 BucketedRandomProjectionLSH 模型計算得到文章的相似度绊诲,將每篇文章相似度最高的 K 篇文章送粱,存儲到 Hbase 的文章相似表中。這樣我們就得到了每篇文章的畫像掂之、詞向量以及相似文章列表抗俄。
構(gòu)建離線用戶畫像
我們可以將用戶喜歡的文章的主題詞作為用戶標(biāo)簽,以便后面根據(jù)用戶標(biāo)簽來推薦符合其偏好的文章世舰。首先讀取用戶行為數(shù)據(jù)和文章畫像數(shù)據(jù)动雹,計算在用戶產(chǎn)生過行為的所有文章中,每個主題詞的權(quán)重跟压,不同的行為洽胶,權(quán)重不同,計算公式為:用戶標(biāo)簽權(quán)重 =(用戶行為分值之和)x 時間衰減裆馒,這樣就計算得到了用戶的標(biāo)簽及標(biāo)簽權(quán)重,接著讀取用戶數(shù)據(jù)丐怯,得到用戶基礎(chǔ)信息喷好,將用戶標(biāo)簽、標(biāo)簽權(quán)重及用戶基礎(chǔ)信息一并存儲到 Hbase 的用戶畫像表中读跷。到這里我們已經(jīng)通過機(jī)器學(xué)習(xí)算法梗搅,基于用戶和文章的業(yè)務(wù)數(shù)據(jù)得到了用戶和文章的畫像,但為了后面可以更方便地將數(shù)據(jù)提供給深度學(xué)習(xí)模型進(jìn)行訓(xùn)練,我們還需要將畫像數(shù)據(jù)進(jìn)一步抽象為特征數(shù)據(jù)无切。構(gòu)建離線文章特征
由于已經(jīng)有了畫像信息荡短,特征構(gòu)造就變得簡單了。讀取文章畫像數(shù)據(jù)哆键,將文章權(quán)重最高的 K 個關(guān)鍵詞的權(quán)重作為文章關(guān)鍵詞權(quán)重向量掘托,將頻道 ID、關(guān)鍵詞權(quán)重向量籍嘹、詞向量作為文章特征存儲到 Hbase 的文章特征表闪盔。構(gòu)建離線用戶特征
讀取用戶畫像數(shù)據(jù),將權(quán)重最高的 K 個標(biāo)簽的權(quán)重作為用戶標(biāo)簽權(quán)重向量辱士,將用戶標(biāo)簽權(quán)重向量作為用戶特征存儲到 Hbase 的用戶特征表泪掀。
- 多路召回
基于模型的離線召回
我們可以根據(jù)用戶的歷史點擊行為來預(yù)測相似用戶,并利用相似用戶的點擊行為來預(yù)測對文章的偏好得分颂碘,這種召回方式稱為 u2u2i异赫。獲取用戶歷史點擊行為數(shù)據(jù),利用 ALS 模型計算得到用戶對文章的偏好得分及文章列表头岔,讀取并過濾歷史召回結(jié)果塔拳,防止重復(fù)推薦,將過濾后的偏好得分最高的 K 篇文章存入 Hbase 的召回結(jié)果表中切油,列族為 als蝙斜,表明召回類型為 ALS 模型召回,并記錄到 Hbase 的歷史召回結(jié)果表澎胡。基于內(nèi)容的離線召回
我們可以根據(jù)用戶的歷史點擊行為孕荠,向用戶推薦其以前喜歡的文章的相似文章,這種方式稱為 u2i2i攻谁。讀取用戶歷史行為數(shù)據(jù)稚伍,獲取用戶歷史發(fā)生過點擊、閱讀戚宦、收藏个曙、分享等行為的文章,接著讀取文章相似表受楼,獲取與發(fā)生行為的每篇文章相似度最高的 K 篇文章垦搬,然后讀取并過濾歷史召回結(jié)果,防止重復(fù)推薦艳汽,最后將過濾后的文章存入 Hbase 的召回結(jié)果表中猴贰,列族為 content,表明召回類型為內(nèi)容召回河狐,并記錄到 Hbase 的歷史召回結(jié)果表米绕。基于內(nèi)容的在線召回
和上面一樣瑟捣,還是根據(jù)用戶的點擊行為,向用戶推薦其喜歡的文章的相似文章栅干,不過這里是用戶實時發(fā)生的行為迈套,所以叫做在線召回。讀取 Kafka 中的用戶實時行為數(shù)據(jù)碱鳞,獲取用戶實時發(fā)生點擊桑李、閱讀、收藏劫笙、分享等行為的文章芙扎,接著讀取文章相似表,獲取與發(fā)生行為的每篇文章相似度最高的 K 篇文章填大,然后讀取并過濾歷史召回結(jié)果戒洼,防止重復(fù)推薦,最后將過濾后的文章存入 Hbase 的召回結(jié)果表中允华,列族為 online圈浇,表明召回類型為在線召回,并記錄到 Hbase 的歷史召回結(jié)果表靴寂。基于熱門文章的在線召回
讀取 Kafka 中的用戶實時行為數(shù)據(jù)磷蜀,獲取用戶當(dāng)前發(fā)生點擊、閱讀百炬、收藏褐隆、分享等行為的文章,增加這些文章在 Redis 中的熱度分?jǐn)?shù)剖踊。基于新文章的在線召回
讀取 Kafka 中的實時用戶行為數(shù)據(jù)庶弃,獲取新發(fā)布的文章,將其加入到 Redis 中德澈,并設(shè)置過期時間歇攻。
- 排序
不同模型的做法大致相同,這里以 LR 模型為例梆造。
基于 LR 模型的離線訓(xùn)練
讀取 Hive 的用戶歷史行為數(shù)據(jù)缴守,并切分為訓(xùn)練集和測試集,根據(jù)其中的用戶 ID 和文章 ID镇辉,讀取 Hbase 的用戶特征數(shù)據(jù)和文章特征數(shù)據(jù)屡穗,將二者合并作為訓(xùn)練集的輸入特征,將用戶對文章是否點擊作為訓(xùn)練集的標(biāo)簽忽肛,將上一次的模型參數(shù)作為 LR 模型的初始化參數(shù)鸡捐,進(jìn)行點擊率預(yù)估訓(xùn)練,計算得出 AUC 等評分指標(biāo)并進(jìn)行推薦效果分析麻裁。基于 LR 模型的在線排序
當(dāng)推薦中心讀取 Hbase 的推薦結(jié)果表無數(shù)據(jù)時,推薦中心將調(diào)用在線排序服務(wù)來重新獲取推薦結(jié)果。排序服務(wù)首先讀取 Hbase 的召回結(jié)果作為測試集煎源,讀取 Hbase 的用戶特征數(shù)據(jù)和文章特征數(shù)據(jù)色迂,將二者合并作為測試集的輸入特征,使用 LR 模型進(jìn)行點擊率預(yù)估手销,計算得到點擊率最高的前 K 個文章歇僧,然后讀取并過濾歷史推薦結(jié)果,防止重復(fù)推薦锋拖,最后將過濾后的文章列表存入 Hbase 的推薦結(jié)果表中诈悍,key 為 lr,表明排序類型為 LR 排序兽埃。
- 推薦中心
流量切分(ABTest)
我們可以根據(jù)用戶 ID 進(jìn)行哈希分桶侥钳,將流量切分到多個桶,每個桶對應(yīng)一種排序策略柄错,從而對比不同排序策略在線上環(huán)境的效果舷夺。推薦數(shù)據(jù)讀取邏輯
優(yōu)先讀取 Redis 和 Hbase 中緩存的推薦結(jié)果,若 Redis 和 Hbase 都為空售貌,則調(diào)用在線排序服務(wù)獲得推薦結(jié)果给猾。兜底補(bǔ)足(超時截斷)
當(dāng)調(diào)用排序服務(wù)無結(jié)果,或者讀取超時的時候颂跨,推薦中心會截斷當(dāng)前請求敢伸,直接讀取 Redis 中的熱門文章和新文章作為推薦結(jié)果。合并信息
合并物品基礎(chǔ)信息恒削,將包含完整信息的物品推薦列表返回給客戶端池颈。
參考
https://space.bilibili.com/61036655/channel/detail?cid=91348(強(qiáng)烈推薦,螞蟻大神的視頻講得很棒)
https://www.bilibili.com/video/av68356229
https://pan.baidu.com/s/1-uvGJ-mEskjhtaial0Xmgw(學(xué)習(xí)資源已保存至網(wǎng)盤蔓同, 提取碼:eakp)