馬蜂窩推薦排序算法模型是如何實現快速迭代的

Part.1

馬蜂窩推薦系統架構

馬蜂窩推薦系統主要由召回(Match)、排序(Rank)、重排序(Rerank)幾個部分組成,整體架構圖如下:

馬蜂窩推薦排序算法模型是如何實現快速迭代的

在召回階段,系統會從海量的內容庫篩選出符合用戶偏好的候選集(百級、千級);排序階段在此基礎上,基於特定的優化目標(如點擊率)對候選集內容進行更加精準的計算和選擇,為每一條內容進行精確打分,進而從候選集的成百上千條內容中選出用戶最感興趣的少量高質量內容。

本文我們將重點介紹馬蜂窩推薦系統中的核心之一——排序算法平臺,它的整體架構如何;為了 給用戶呈現更加精準的推薦結果 ,在支撐模型快速、高效迭代的過程中,排序算法平臺發揮了哪些作用及經歷的實踐。

Part.2

排序算法平臺的演進

2.1 整體架構

目前,馬蜂窩排序算法線上模型排序平臺主要由 通用數據處理模塊、可替換模型生產模塊、監控與分析模塊 三部分組成,各模塊結構及平臺整體工作流程如下圖所示:

馬蜂窩推薦排序算法模型是如何實現快速迭代的

2.1.1 模塊 功能

(1) 通用數據處理模塊

核心功能是特徵建設以及訓練樣本的構建,也是整個排序算法最為基礎和關鍵的部分。數據源涉及點擊曝光日誌、用戶畫像、內容畫像等等,底層的數據處理依賴 Spark 離線批處理和 Flink 實時流處理。

(2) 可替換模型生產模塊

主要負責訓練集的構建、模型的訓練以及生成線上配置,實現模型的無縫同步上線。

(3) 監控與分析模塊

主要包括上游依賴數據的監控、推薦池的監控,特徵的監控與分析,模型的可視化分析等功能。

各個模塊的功能以及他們之間的交互使用 JSON 配置文件進行集成,使模型的訓練和上線僅僅需要修改配置就能完成,極大提升了開發效率,為排序算法的快速迭代打下了堅實的基礎。

2.1.2 主要配置文件類型

配置文件主要分為 TrainConfig、MergeConfig、OnlineConfig、CtrConfig 四類,其作用分別為:

(1)TrainConfig

指訓練配置,主要包括訓練集配置和模型配置:

  • 訓練集配置包括指定使用哪些特徵進行訓練;指定使用哪些時間段內的訓練數據;指定場景、頁面、和頻道等
  • 模型配置包括模型參數、訓練集路徑、測試集路徑、模型保存路徑等

(2)MergeConfig

指特徵配置,包括上下文特徵、用戶特徵、物品特徵、交叉特徵的選擇。

這裡,我們將交叉特徵的計算方式也實現了配置化。例如用戶特徵中有一些向量特徵,內容特徵也有一些向量特徵。當我們希望使用某兩個向量的餘弦相似度或者歐式距離作為一個交叉特徵給模型使用時,這種交叉特徵的選擇和計算方式可以直接通過配置實現,並且同步的線上配置中供線上使用。

(3)OnlineConfig

指線上配置,訓練數據構建的過程中自動生成供線上使用,包括特徵的配置(上下文特徵、用戶特徵、內容特徵、交叉特徵)、模型的路徑、特徵的版本。

(4)CtrConfig

指默認 CTR 配置,作用為針對用戶和內容的 CTR 特徵進行平滑處理。

2.1.3 特徵工程

從應用的視角來看,特徵主要包括三類,用戶特徵(User Feature)、內容特徵(Article Feature)、上下文特徵(Context Feature)。

如果按獲取的方式又可以分為:

  • 統計特徵(Statistics Feature):包括用戶、內容、特定時間段內的點擊量/曝光量/CTR 等
  • 向量特徵(Embedding Feature):以標籤、目的地等信息為基礎,利用用戶點擊行為歷史,使用 Word2Vec 訓練的向量特徵等;
  • 交叉特徵(Cross Feature):基於標籤或目的地向量,構建用戶向量或物品向量,從而得到用戶與物品的相似度特徵等

2.2 排序算法平臺 V1

在排序算法平臺 V1 階段,通過簡單的 JSON 文件配置,平臺就能夠實現特徵的選擇、訓練集的選擇、分場景 XGBoost 模型的訓練、XGBoost 模型離線 AUC 的評估、生成線上配置文件自動同步上線等功能。

馬蜂窩推薦排序算法模型是如何實現快速迭代的

但在使用過程中,我們仍然發現了一些存在的問題:

  • 模型上線效果與預期表現不一致時,很難排查和定位原因,影響模型的迭代開發
  • 由於模型的不可解釋性,很難建立對模型和特徵的深入認識,以輔助模型的優化

2.3 排序算法平臺 V2

針對上面存在的這些問題,我們在排序算法平臺的監控分析模塊增加了 數據驗證、模型解釋 的功能,幫助我們對模型的持續迭代優化提供更加科學、精準的依據。

馬蜂窩推薦排序算法模型是如何實現快速迭代的

2.3.1 數據驗證(DataVerification)

在算法平臺 V1 階段,當模型離線效果(AUC)表現很好,而線上效果不符合預期時,我們很難排查定位問題,影響模型迭代。

通過對問題的調查和分析我們發現,造成線上效果不符合預期的一個很重要的原因,可能是目前模型的訓練集是基於數倉每天彙總的一張點擊曝光表得到。由於數據上報延遲等原因,這張離線的點擊曝光表中的一些上下文特徵與實時的點擊曝光行為可能存在誤差,帶來一些離線和線上特徵不一致的問題。

針對這種情況,我們增加了數據驗證的功能,將離線構建的訓練集與線上打印的實時特徵日誌進行各個維度的對比分析。

具體做法就是以線上的實時點擊曝光日誌(包含所使用的模型、特徵以及模型預測分等信息)為基礎,為每條實時點擊曝光記錄都增加一個唯一 ID,在離線彙總的點擊曝光表中也會保留這個唯一 ID。這樣,針對一條點擊曝光記錄,我們就可以將離線構建的訓練集中的特徵,與線上實際使用的特徵關聯起來,對線上和離線模型的 AUC、線上和離線模型的預測分以及特徵的情況進行對比,從而發現一些問題。

舉例來說,在之前的模型迭代過程中,模型離線 AUC 很高,但是線上效果卻並不理想。通過數據驗證,我們首先對比了線上和離線模型 AUC 的情況,發現存在效果不一致的現象,接著對比線上和離線模型的預測分,並找到線上和離線預測分相差最大的 TopK 個樣本,對它們的離線特徵和線上特徵進行對比分析。最後發現是由於數據上報延遲造成了一些線上和離線上下文特徵的不一致,以及線上XGBoost、DMatrix 構建時選的 missingValue 參數有問題,從而導致了線上和離線模型預測分存在偏差。 上述問題修復後,線上 UV 點擊率提升了 16.79%,PV 點擊率提升了 19.10%。

通過數據驗證的功能和解決策略,我們快速定位到了問題的原因,加速算法模型迭代開發的過程,提升了線上的應用效果。

2.3.2 模型解釋(ModelExplain)

模型解釋可以打開機器學習模型的黑盒,增加我們對模型決策的信任,幫助理解模型決策,為改進模型提供啟發。關於模型解釋的一些概念,推薦給大家兩篇文章來幫助理解:《Why Should I Trust You Explaining the Predictions of Any Classifier》、《A Unified Approach to Interpreting Model Predictions》。

在實際開發中,我們總是在模型的準確性與模型的可解釋性之間權衡。簡單的模型擁有很好的解釋性,但是準確性不高;而複雜的模型提高模型準確性的同時又犧牲了模型的可解釋性。使用簡單的模型解釋複雜的模型是當前模型解釋的核心方法之一。

目前,我們線上模型排序使用的是 XGBoost 模型。但在 XGBoost 模型中,傳統的基於特徵重要性的模型解釋方法,只能從整體上對每個特徵給出一個重要性的衡量,不支持對模型的局部輸出解釋,或者說單樣本模型輸出解釋。在這樣的背景下,我們的模型解釋模塊使用了新的模型解釋方法 Shap 和 Lime,不僅支持特徵的重要性,也支持模型的局部解釋,使我們可以瞭解到在單個樣本中,某個特徵的某個取值對模型的輸出可以起到何種程度的正向或負向作用。

下面通過一個從實際場景中簡化的示例來介紹模型解釋的核心功能。首先介紹一下幾個特徵的含義:

馬蜂窩推薦排序算法模型是如何實現快速迭代的

馬蜂窩推薦排序算法模型是如何實現快速迭代的

我們的模型解釋會對單個樣本給出以下的分析:



如圖所示,模型對單個樣本,,的預測值為 0.094930, 0.073473, 0.066176。針對單個樣本的預測,各個特徵值起到多大的正負向作用可以從圖中的特徵條形帶的長度看出,紅色代表正向作用,藍色代表負向作用。這個值是由下表中的 shap_value 值決定的:

馬蜂窩推薦排序算法模型是如何實現快速迭代的

馬蜂窩推薦排序算法模型是如何實現快速迭代的

其中, logit_output_value = 1.0 / (1 + np.exp(-margin_output_value)),logit_base_value = 1.0 / (1 + np.exp(-margin_base_value)) ,output_value 是 XGBoost 模型輸出值;base_value 是模型期望輸出;近似等於整個訓練集中模型預測值的均值; shap_value 是對該特徵對預測結果起到的正負向作用的一個衡量。

模型預測值logit_output_value,0.094930>0.073473>0.066176,所以排序結果為 I 1 > > I 2 > I 3 , U 0 - I 1 的預測值為0.094930,特徵 doubleFlow_article_ctr_7_v1= I 1 ctr 起到 了 0.062029 的正向作用,使得預測值相較於基值,有增加的趨勢。 同理,ui_cosi ne_70=0.894006,起到了 0.188769 的 正向作用。

直觀上我們可以看出,內容 7 天點擊率以及用戶-內容相似度越高,模型預測 值越高,這也是符合預期的。 實際場景中,我們會有更多的特徵。

Shap 模型解釋最核心的功能是支持局部單樣本分析,當然它也支持全局的分析,如特徵重要性,特徵正負向作用,特徵交互等。 下圖是對特 徵 doubleFlow_article_ctr_7_v1 的分析,可以看出,內容 7 天點擊率 小於閾值對模型的預測起負向作用,大於閾值對模型的預測起正向作用。

馬蜂窩推薦排序算法模型是如何實現快速迭代的

Part.3

近期規劃

近期,排序算法平臺將繼續提升訓練模型的線上應用效果,並把特徵的實時作為工作重點,快速反映線上的變化。

當前排序算法平臺使用的 XGBoost 模型優點是不需要太多的特徵工程,包括特徵缺失值處理、連續特徵離散化、交叉特徵構建等。但也存在許多不足,包括:

1. 很難處理高緯稀疏特徵

2. 需要加載完整的數據集到內存進行模型的訓練,不支持在線學習算法,很難實現模型的實時更新。

針對這些問題,後期我們將進行 Wide&Deep,DeepFM 等深度模型的建設,如下圖所示:

馬蜂窩推薦排序算法模型是如何實現快速迭代的

另外,當前的模型每次都是預測單個 Item 的分數,然後進行排序取一刷的結果,(Learning to rank,pointwise)。後期我們希望可以實現一次給用戶推薦一刷的結果(Learning to rank,listwise),給用戶帶來更加實時、準確的推薦結果。


分享到:


相關文章: