推薦系統(tǒng)已經成為互聯(lián)網(wǎng)應用提升點擊率刁岸、轉化率脏里、留存率和用戶體驗的必備手段,然而难捌,隨著流量和數(shù)據(jù)量的爆發(fā)式增長膝宁,以及企業(yè)競爭環(huán)境日新月異的變化,快速搭建一套易用根吁、精準、可靈活擴展的個性化推薦系統(tǒng)已成為每一家互聯(lián)網(wǎng)企業(yè)必備的生存技能合蔽。
推薦系統(tǒng)一方面需要能夠及時處理海量的用戶行為日志击敌,從中挖掘出用戶的畫像信息及行為偏好;另一方面又要對海量的物料數(shù)據(jù)(推薦候選集)進行精準的分析拴事,預測每個候選物料未來一段時間內的轉化概率沃斤;同時還需要對推薦的上下文進行分析圣蝎,精準預測出在應該在什么時間、什么地點衡瓶、給什么用戶推薦什么內容徘公。推薦內容的精準度、時效性哮针、多樣性关面、短長期受益平衡等各方面都對推薦系統(tǒng)提出了很高的要求。從零開始搭建一套合格的推薦系統(tǒng)絕非易事十厢。所幸等太,隨著云計算平臺的興起,搭建推薦系統(tǒng)所需要的各種基礎技術蛮放、工具缩抡、產品和平臺越來越成熟,相信搭建云上的智能推薦系統(tǒng)對中小企業(yè)來說是一個比較好的選擇包颁。
本文主要介紹如何基于阿里云平臺瞻想,從0到1搭建一套高效、精準娩嚼、易用内边、可擴展的智能推薦系統(tǒng)。
1 系統(tǒng)架構
粗略來看待锈,推薦算法可以簡單地分為召回和排序兩個階段漠其。召回模塊負責從海量的物品庫里挑選出用戶可能感興趣的物品子集,通常返回幾百個物品竿音。排序模塊負責對召回階段返回的物品集個性化排序和屎,通常返回幾十個物品組成的有序列表介汹】颓椋總結起來说贝,召回和排序有如下特點:
- 召回層:候選集規(guī)模大扯罐、模型和特征簡單硬梁、速度快结执,盡量保證用戶感興趣數(shù)據(jù)多召回掩蛤。
- 排序層:候選集不大盏阶,目標是保證排序的精準萄涯,一般使用復雜和模型和特征绪氛。
在實際的生成環(huán)境中部署推薦系統(tǒng)時,當物品庫很大時涝影,召回模塊的返回結果可能是在萬的量級枣察,一般會把上述排序模塊拆分成粗排、精排、重排三個模塊序目,粗排模塊使用簡單的機器學習模型進一步過濾掉部分候選物品臂痕,保證進入精排的物品量級在一千以下,精排模塊使用較復雜的模型給每個候選物品計算一個排序分猿涨。排序分一般以業(yè)務指標為擬合目標握童,比如在電商場景可能會用CTR預估值,或者CTR * CVR * price以便最大化GMV叛赚。重排模塊一般實現(xiàn)一些list-wise的頁面級排序澡绩,或是打散等多樣性業(yè)務規(guī)則。
召回模塊一般采用多路召回的策略红伦,從不同的角度構建用戶與候選商品之間的連接英古,并度量該連接的強弱程度。召回模塊的結果即為用戶可能感興趣的商品集合昙读。召回的算法有很多召调,這里舉例如下:
不管使用哪一種召回方法,都需要大數(shù)據(jù)計算平臺和分布式數(shù)據(jù)庫的支持蛮浑。推薦系統(tǒng)中唠叛,召回階段的要求是能夠低延時地從大量的候選集找篩選出用戶可能感興趣的物品。大規(guī)模沮稚、低延時是召回階段面臨的兩大挑戰(zhàn)艺沼;解決方案就是建立倒排索引,使用分布式數(shù)據(jù)存儲引擎存儲索引數(shù)據(jù)蕴掏,而索引數(shù)據(jù)的生成則交給大數(shù)據(jù)計算平臺(如MaxCompute障般、EMR等)負責。
通常有兩種類型的索引:
- key-value 索引:根據(jù)指定的key實現(xiàn)快速的點查
- 向量索引:向量引擎可以快速返回與query向量的top N鄰近向量集合
阿里云交互式分析產品Hologres是集 key/value 點查盛杰、向量匹配引擎挽荡、關系式數(shù)據(jù)庫 與一體的分布式數(shù)據(jù)存儲和分析引擎,非常適合在推薦系統(tǒng)中存儲召回階段的索引數(shù)據(jù)及排序階段的特征數(shù)據(jù)即供。Hologres兼容PostgreSQL協(xié)議定拟,與大數(shù)據(jù)生態(tài)無縫連接,支持高并發(fā)和低延時地查詢分析萬億級數(shù)據(jù)逗嫡。在推薦系統(tǒng)中使用Hologres至少有以下兩點好處:
- 統(tǒng)一的查詢語言實現(xiàn)點查青自、向量匹配、條件過濾等功能驱证,較少推薦系統(tǒng)需要對接的下級工具產品延窜,降低開發(fā)工作量。
- 可以輕松實現(xiàn)計算下沉雷滚,例如查詢和過濾可以在同一個查詢里實現(xiàn)需曾,減少推薦引擎與數(shù)據(jù)存儲系統(tǒng)之間的交互次數(shù)。
排序階段的主要目標是調用算法模型對召回結果的每個物品計算一個或多個目標分數(shù)祈远,并擬合成一個最終的排序分呆万,最后推薦系統(tǒng)根據(jù)排序分取top N個商品返回給請求方。這個階段涉及的工作包括:樣本構建车份、特征工程谋减、模型訓練、模型評估扫沼、模型部署出爹。每個子階段,阿里云計算平臺事業(yè)部PAI團隊都提供了相應的工具缎除,可以提高工作效率严就,減少出錯的概率,下文將詳細介紹器罐。
準備好了召回階段需要的索引數(shù)據(jù)梢为、排序階段需要的特征數(shù)據(jù)和算法模型,最后還需要一個推薦服務串起整個流程轰坊≈基于PAI團隊提供的PaiRec推薦引擎,用戶可以輕松搭建一個完整的推薦服務肴沫。一個完整的推薦系統(tǒng)粟害,通常需要在線測試不同的推薦策略和算法,少不了A/B測試框架的幫助颤芬。PAI-ABTest平臺是獨立于PaiRec推薦引擎的A/B測試平臺悲幅,支持橫向、縱向切流和分層實驗站蝠,是推薦系統(tǒng)必不可少的重要組成部分汰具。
實時特征/模型對應提升推薦算法的效果有很大的幫助,基于阿里日志服務和阿里云全托管的Flink實時計算平臺沉衣,可以輕松為推薦系統(tǒng)提高實時響應能力郁副。
通常,常規(guī)的召回豌习、粗排存谎、精排算法對新物品、新用戶都不太友好肥隆,新物品很大程度上既荚,會被模型“低估”,因此有必要在推薦系統(tǒng)中顯式地處理冷啟動問題栋艳。冷啟動問題處理不好會影響內容創(chuàng)造者的積極性恰聘,進而影響平臺生態(tài)的健康發(fā)展。Pai團隊提供了基于contextual bandit算法的物品冷啟動產品化方案,需要部署冷啟動算法的客戶可聯(lián)系我們晴叨。
一個可行的基于阿里云產品搭建的云上個性化推薦系統(tǒng)架構如下圖所示:
2 召回
2.1 協(xié)同過濾
協(xié)同過濾算法是完全基于用戶交互行為的召回算法凿宾,分為User Based CF(為當前用戶推薦相似用戶喜歡的物品)和Item Based CF(為當前用戶推薦該用戶曾經喜歡過的物品的相似物品)兩大類。具體選擇哪一種兼蕊,需要依據(jù)業(yè)務場景的特定來定初厚,通常,因為用戶興趣的多樣性和易變性孙技,UserCF在實際中使用較少产禾,多數(shù)推薦系統(tǒng)會優(yōu)先選擇ItemCF算法。
要使用協(xié)同過濾算法牵啦,首先需要構建用戶和物品的交互行為矩陣亚情,比如在電商場景,主要使用用戶的隱式反饋數(shù)據(jù)來構建行為矩陣哈雏,比如使用點擊楞件、收藏、購買等行為數(shù)據(jù)構建User-Item行為矩陣僧著。行為矩陣是很稀疏的履因,大多數(shù)元素都是空缺的,表示對于的用戶和商品之間沒有產生交互行為盹愚。協(xié)同過濾算法本質上就是使用User-Item行為矩陣中已有的值作為輸入構建模型來填充對空缺值的預估栅迄。有了預估值之后,就可以對某用戶推薦得分比較高的預估值對應的商品列表了皆怕。
交互行為矩陣的原始數(shù)據(jù)通常來自于平臺記錄的行為日志毅舆。行為日志一般有前端上報到日志服務器,最終導入到大數(shù)據(jù)處理平臺愈腾,形成行為日志表憋活,該數(shù)據(jù)是推薦算法的重要輸入之一。在阿里云PAI平臺上可用的協(xié)同過濾算法包括:etrec虱黄、swing悦即、simrank等。這些算法通過不同的公式計算物品與物品(或者用戶與用戶)之間的相似性橱乱,最終構建出每個物品的相似物品及相似分列表辜梳,這就是協(xié)同過濾算法召回用的索引數(shù)據(jù)。
PAI-Studio支持通過可視化或PAI命令的方式泳叠,配置使用協(xié)同過濾算法作瞄。以etrec算法為例,pai命令的調用方式如下:
PAI -name pai_etrec
-project algo_public
-DsimilarityType="wbcosine"
-Dweight="1"
-DminUserBehavior="2"
-Dlifecycle="28"
-DtopN="2000"
-Dalpha="0.5"
-DoutputTableName="etrec_test_result"
-DmaxUserBehavior="500"
-DinputTableName="etrec_test_input"
-Doperator="add"
-DuserColName="user"
-DitemColName="item"
swing算法的調用方式如下:
PAI -name swing_rec_ext
-project algo_public
-DinputTable='swing_test_input'
-DoutputTable='swing_test_result'
-DmaxClickPerUser='500'
-DmaxUserPerItem='600'
-Dtopk='100'
-Dalpha1='5'
-Dalpha2='1'
-Dbeta='0.3'
參考資料:基于協(xié)同過濾的物品推薦
2.2 興趣標簽
廣義上來說危纫,興趣標簽的召回是一種基于內容的召回宗挥。通常分為三個步驟:
- 挖掘物品的內容標簽乌庶;
- 根據(jù)歷史交互行為計算用戶對各個內容標簽是偏好程度;
- 給目標用戶推薦他偏好的內容標簽下對應的熱門物品契耿。
協(xié)同過濾通過相似性來構建目標用戶與候選物品之間的橋梁瞒大,而興趣標簽的召回則是通過“標簽”來架起目標用戶與候選物品之間的橋梁。
挖掘物品的標簽通常需要NLP宵喂、圖像糠赦、視頻相關的算法会傲,如中心詞提取锅棕、短語挖掘等方法可以從文本信息中挖掘興趣標簽;圖像/視頻 打標算法則從圖像和視頻內容本身來預測興趣標簽淌山。這些基礎技術在阿里云平臺上都有對應的工具裸燎。
參考資料:基于用戶和物品畫像的物品推薦
2.3 向量召回
向量召回是一種基于模型的召回方法,首先我們需要訓練一個深度學習模型泼疑,得到用戶和物品的低維實數(shù)向量(通常叫做embedding向量)德绿,每個向量對應N維空間的一個點,這些點之間的距離越近表示對應的兩個物體在現(xiàn)實世界中越相似退渗。這樣我們可以在N維空間中通過找到與當前目標用戶的點最近的M個鄰居移稳,限定鄰居的類型為候選物品,這樣我們就可以召回top M個待推薦后續(xù)物品集合会油。
雙搭模型是學習embedding向量的常用方法个粱。在Pai團隊開源的推薦算法框架EasyRec中,實現(xiàn)了兩種常用的召回模型:DSSM和MIND翻翩,包括增強的隨機負采樣版本都许,可以開箱即用。順便說一下嫂冻,EasyRec致力于成為容易上手的工業(yè)界深度學習推薦算法框架胶征,支持大規(guī)模訓練、評估桨仿、導出和部署睛低。EasyRec實現(xiàn)了業(yè)界領先的模型,包含排序服傍、召回钱雷、多目標等模型,支持超參搜索伴嗡,顯著降低了建模的復雜度和工作量急波。想了解更多EasyRec的內容,可以查看EasyRec幫助文檔瘪校。
有了embedding向量后澄暮,可以通過hologres構建向量索引名段,從而在推薦服務中快速檢索出top K的推薦物品。Hologres深度集成了阿里達摩院自研的Proxima向量檢索引擎泣懊,能夠提供低延時伸辟、高吞吐的在線查詢服務,其基于SQL查詢接口馍刮,兼容PostgreSQL生態(tài)信夫,簡單易用,且支持帶復雜過濾條件的檢索卡啰;能夠支持分布式構建向量索引静稻、以及對索引進行檢索,簡單支持水平擴展匈辱。
全量檢索查詢語法如下:
select id, pm_approx_euclidean_distance(feature, '{0.1,0.2,0.3}')) as distance
from feature_tb
order by distance asc
limit 10;
復雜條件下檢索查詢語法如下:
select id, pm_approx_euclidean_distance(feature, '{0.1,0.2,0.3}')) as distance
from feature_tb
where data_time between '1990-11-11 12:00:00' and '1990-11-11 13:00:00'
and tag in ('X', 'Y', 'Z')
order by distance asc
limit 10;
2.4 熱門召回
熱門召回通常是在前幾種召回策略失效的情況下(通常針對冷啟動用戶前幾種召回方法會失效)振湾,或者為了增加召回多樣性,而采用的一種策略亡脸。
我們可以統(tǒng)計候選物品在過去一段時間內的指標數(shù)據(jù)押搪,比如商品銷量,視頻播放量浅碾,文章閱讀量等來篩選出全局熱門或針對某個人群熱門的候選物品集大州,從而為這些用戶或人群推薦對應的物品。然而垂谢,這種方式對新物品不友好厦画,新上線的物品(如,短視頻平臺發(fā)布的內容)沒有機會被曝光埂陆,從而影響內容創(chuàng)作者的積極性苛白,以及平臺生態(tài)的健康發(fā)展。因此焚虱,我們需要對一個對候選物品人氣分預估的模型购裙,來統(tǒng)一對新老物品進行預估,并且根據(jù)預估分(而不是簡單的統(tǒng)計值)來確定熱門物品鹃栽。
人氣分模型可以基于GBDT算法來建模躏率,由于GBDT算法能夠很好地建模特征與目標直接的非線性關系,并且對特征工程的要求比較低民鼓,很容易實施薇芝。人氣分模型的一個例子可參考《商品人氣分模型》。
PAI平臺上可以使用ps_smart算法(GBDT算法的一種實現(xiàn))來訓練人氣分模型丰嘉,pai命令如下:
PAI -name ps_smart
-project algo_public
-DmodelName="product_popularity"
-DinputTableName="product_popularity_model_samples"
-DinputTablePartitions="ds=${bizdate}"
-DoutputTableName="product_popularity_model"
-DoutputImportanceTableName="product_popularity_feature_importance"
-DlabelColName="label"
-DweightCol="weight"
-DfeatureColNames="features"
-DenableSparse="true"
-Dobjective="binary:logistic"
-Dmetric="error"
-DfeatureImportanceType="gain"
-DtreeCount="100"
-DmaxDepth="5"
-Dshrinkage="0.3"
-Dl2="1.0"
-Dl1="0"
-Dlifecycle="3"
-DsketchEps="0.03"
-DsampleRatio="1.0"
-DfeatureRatio="1.0"
-DbaseScore="0.2"
-DminSplitLoss="0"
-DfeatureNum=@feaNum
可以在阿里云DataWorks開發(fā)工具上新建一個SQL節(jié)點夯到,粘貼如上的命令即可執(zhí)行。
3. 排序
3.1 特征工程
樣本構建饮亏、特征加工通常是搭建推薦系統(tǒng)的過程中最耗時耗力的階段耍贾,這個階段工作量大阅爽,也容易出錯荐开。為此付翁,阿里云PAI團隊開發(fā)了一套推薦模板,可根據(jù)配置文件晃听,由三大輸入表(用戶信息表百侧、物品信息表、交互行為表)自動為客戶生成一套初始的ETL SQL代碼能扒,完成了大部分召回佣渴、排序所需要的離線計算代碼的生成『罩啵客戶可基于該代碼繼續(xù)調整優(yōu)化观话。
通常排序模型的特征由三部分構成:
- 用戶側特征:包括用戶畫像信息、用戶粒度統(tǒng)計信息(過于一段時間窗口內用戶各種行為的統(tǒng)計值)越平、用戶偏好信息(用戶-物品或用戶-物品屬性粒度的交叉統(tǒng)計信息)
- 物品側特征:物品基礎內容信息、物品粒度的統(tǒng)計信息灵迫、物品偏好信息(物品-用戶畫像秦叛、物品-人群畫像粒度的統(tǒng)計信息)
- 上下文特征:地理位置、訪問設備瀑粥、天氣挣跋、時間等
有了上述三部分原始特征后,還需要對特征進行加工狞换,生成最終模型可接受的格式的數(shù)據(jù)避咆。由于模型加工的過程離線和在線服務都需要,因此修噪,如果離線計算開發(fā)一套代碼查库,在線服務又開發(fā)一套代碼,不僅耗費精力黄琼,而且容易出錯樊销,造成離在線特征值不一致,從而影響模型的實際效果脏款。因此围苫,為保證離在線特征加工邏輯的一致性,我們用C++開發(fā)了一套feature generator的代碼撤师,供在線服務使用剂府;同時,把同一份代碼用jni封裝后剃盾,在離線MapReduce任務中使用腺占。
Feature generator工具支持多種特征類型的加工强法,包括IdFeature、RawFeature湾笛、LookupFeature饮怯、ComboFeature、MatchFeature嚎研、SequenceFeature等蓖墅,基本滿足了日常所需。
3.2 模型訓練
Pai團隊開源了開箱即用的推薦算法訓練框架EasyRec临扮。用戶可直接用自己的數(shù)據(jù)訓練內置的算法模型论矾,也可以自定義新的算法模型。目前杆勇,已經內置了多個排序模型贪壳,如 DeepFM / MultiTower / Deep Interest Network / DSSM / DCN / WDL
等,以及 DBMTL / MMoE / ESMM / PLE
等多目標模型蚜退。另外闰靴,EasyRec兼容odps/oss/hdfs等多種輸入,支持多種類型的特征钻注,損失函數(shù)蚂且,優(yōu)化器及評估指標,支持大規(guī)模并行訓練幅恋。使用EasyRec杏死,只需要配置config文件,通過命令調用的方式就可以實現(xiàn)訓練捆交、評估淑翼、導出、推理等功能品追,無需進行代碼開發(fā)玄括,幫您快速搭建推廣搜算法。
相比NLP和CV領域的模型诵盼,推薦模型的特定是輸入的field特別多惠豺,可能有幾百個,并且各個field的類型和語義也各不相同风宁,需要不同的處理洁墙,比如,有的field當成原始特征值使用戒财,有的field需要轉embedding之后再接入model热监,因此,對輸入數(shù)據(jù)的處理通常是開發(fā)推薦模型時需要很多重復勞動饮寞、易出錯孝扛、又沒有多少技術含量的部分列吼,這讓算法工程師頭疼不已。EasyRec工具對輸入特征的處理進行了自動化苦始,只需要簡單的配置即可省去很多重復性勞動寞钥。
在阿里云平臺上《使用EasyRec構建推薦模型》請查看對應的文檔。
請查看EasyRec使用教程視頻了解詳細使用方法陌选。更多資料請查看機器學習PAI視頻內容理郑。
3.3 模型部署
模型還需要部署成服務才能被推薦引擎調用。為實現(xiàn)一站式算法應用咨油,PAI針對在線推理場景提供了在線預測服務PAI-EAS(Elastic Algorithm Service)您炉,支持基于異構硬件(CPU和GPU)的模型加載和數(shù)據(jù)請求的實時響應。
通過PAI-EAS役电,您可以將模型快速部署為RESTful API赚爵,再通過HTTP請求的方式調用該服務。PAI-EAS提供的彈性擴縮和藍綠部署等功能法瑟,可以支撐您以較低的資源成本獲取高并發(fā)且穩(wěn)定的在線算法模型服務冀膝。同時,PAI-EAS還提供了資源組管理瓢谢、版本控制及資源監(jiān)控等功能畸写,便于將模型服務應用于業(yè)務。
為了讓更多環(huán)境的開發(fā)者使用便捷的模型服務部署功能氓扛,PAI-EAS支持通過EASCMD方式完成服務部署的所有操作,詳情請參見命令使用說明论笔。舉例如下:
bizdate=$1
cat << EOF > eas_config_rank.json
{
"name": "dbmtl_rank_ml",
"generate_token": "true",
"model_path": "oss://algo/rec_dbmtl/${bizdate}/export/best/",
"processor": "tensorflow_cpu",
"oss_endpoint": "oss-us-west-1.aliyuncs.com",
"token": "******",
"metadata":{
"region": "us-west-1",
"instance": 2,
"cpu": 8,
"gpu": 0,
"memory": 8000
}
}
EOF
echo "-------------------eas_config_rank.json-------------------"
cat eas_config_rank.json
# 創(chuàng)建服務
/home/admin/usertools/tools/eascmd -i ${access_id} -k ${access_key} \
-e pai-eas.${region}.aliyuncs.com create eas_config_rank.json
# 更新服務
echo "-------------------更新服務-------------------"
/home/admin/usertools/tools/eascmd -i ${access_id} -k ${access_key} \
-e pai-eas.${region}.aliyuncs.com \
modify dbmtl_rank_ml -s eas_config_rank.json
status=$?
# 查看服務
echo "-------------------查看服務-------------------"
/home/admin/usertools/tools/eascmd -i ${access_id} -k ${access_key} \
-e pai-eas.${region}.aliyuncs.com desc dbmtl_rank_ml
exit ${status}
4. 推薦服務
最后采郎,還需要推薦服務串聯(lián)起所有的環(huán)節(jié),對外提供后續(xù)物品的內容推薦狂魔。PaiRec是Pai團隊研發(fā)的一款基于 go語言 的在線推薦服務引擎的框架蒜埋,用戶可以基于此框架快速搭建推薦在線服務,也能定制化進行二次開發(fā)最楷。
PAIRec框架 提供如下功能:
- 集成 go http server, 提供路由注冊功能整份,方便開發(fā) Restful Api
- 包含完成的推薦引擎的 pipeline 流程,里面預定義了多種召回籽孙、過濾烈评,排序策略,內置訪問阿里云 模型推理 EAS 服務
- 包含多種數(shù)據(jù)源的加載犯建,支持 hologres, mysql, redis, OTS, kafka 等
- 基于靈活的配置描述推薦流程
- 集成輕量級 A/B Test 實驗平臺
- 支持簡單易用的擴展點讲冠,方便自定義操作
整體框架如下:
內置功能模塊包括:
基于PAIRec框架開發(fā)的推薦服務可以以自定義鏡像容器的方式部署在PAI-EAS平臺上,可以復用PAI-EAS平臺的集群管理适瓦、監(jiān)控竿开、報警等基礎功能谱仪,使用起來非常方便。