基礎架構
推薦系統要解決什么問題?
- 在信息過載的情況下,用戶如何高效獲取感知的信息,即學習\(score(user,item,context)\)
推薦系統的技術架構
- 數據
- 數據入口:客戶端服務器端實時數據,流處理平台准實時數據,大數據平台離線數據
- 數據出口:算法模型數據,模型 Serving 特征數據,系統監控統計數據。
- 模型
- 模型種類:召回+排序+策略
- 模型訓練:離線,在線
- 模型測試:離線評估,線上 A/B 測試
特征工程
什么是特征工程?
- 利用工程手段從用戶信息,物品信息,場景信息提取出特征的過程。
推薦系統中常用特征
-
用戶行為數據:顯示反饋,隱性反饋
-
用戶關系數據:強關系,弱關系
-
屬性,標簽類數據:用戶,物品等都具有
-
內容類數據:描述性數據
-
場景信息:范圍極廣,如時間,地點等
Spark處理特征
-
由 Manager 調度,Worker 計算,返回給 Driver
-
Stage內部高效並行,邊界處進行消耗資源的 Shuffle、Reduce 操作
數據編碼方式
- 類別、ID 特征:One-Hot,Multi-Hot
- 數值特征:
- 歸一化:特征數值范圍取值不一
- 分桶:數據分布過於集中、分散
- 其他改變分布方式的操作:如開方,平方等
Embedding
用數值向量表示一個對象的方法。
- 用處
- 處理稀疏特征:大量使用 One-Hot 導致特征向量極度稀疏,不利於深度推薦模型(收斂慢,參數多)
- 融合其他信息,生成高階特征向量:主要來自於 Graph Embedding 的廣泛使用
- 主流方法
- Word2Vec:模型結構,目標函數,負采樣
- Item2Vec:Word2Vec 在任意序列上的推廣
- Graph Embedding:DeepWalk,Node2Vec
- 應用
- 直接應用:計算相似性,典型功能如相似物品推薦,猜你喜歡,召回等
- 預訓練應用:作為特征向量一部分,與其他特征拼接參與推薦模型訓練
- End2End:也即 Embedding 層,直接訓練
線上服務
高並發推薦服務器
- 負載均衡
- 緩存
- 服務降級
分級存儲
- Redis 特性
- 數據以 Key-Value 對存儲
- 數據全部存儲在內存中,硬盤只在持久化或恢復數據時起作用
召回層
- 單策略召回:利用評分、標簽、新鮮度等單一策略召回
- Pros:速度快,實現簡單
- Cons:無法覆蓋不同需求,召回率不高
- 多路召回:采用不同策略,分別召回部分候選集混合在一起
- Pros:可以覆蓋不同需求
- Cons:每一路評分不可比,需要大量人工調參
- Embedding 召回:將多種策略融合到 Embedding 中實現召回
- Pros:實現簡單,評分可比,可以融合多種信息
- Cons:線上計算復雜
局部敏感 Hash
常數時間內快速找到與一個 Embedding 最相似的 Embedding。
- 出發點
- 歐式空間中,將高維空間的點映射到低維空間,原本接近的點在低維空間肯定依然接近,但原本遠離的點有一定概率變成接近的點。
- 經驗性建議
- 點越多,桶數目越多,反之亦然。
- 維度越大,hash 函數要越多,盡量采用且作為多桶策略,反之亦然。
Serving&Inference
- 預存推薦結果
- 完全解耦,延遲極低
- 組合數目爆炸,無法引入線上 context 特征
- 預存Embedding 結果
- 推斷簡單快速
- 無法引入線上 context 特征,無法進行復雜網絡結構模型的推斷
- 預訓練 Embedding+輕量線上模型
- 隔離了離線模型的復雜性與線上推斷的效率要求
- 不能完全支持復雜模型
- Tensorflow Serving
- End2End 部署
- 線上服務效率低,需要大量優化