1. 程式人生 > >馬蜂窩推薦排序演算法模型是如何實現快速迭代的

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

(馬蜂窩技術原創文章,微信ID:mfwtech)

 

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,不僅支援特徵的重要性,也支援模型的區域性解釋,使我們可以瞭解到在單個樣本中,某個特徵的某個取值對模型的輸出可以起到何種程度的正向或負向作用。

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

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

  • U0-I1

  • U0-I2

  • U0-I3

如圖所示,模型對單個樣本 U0-I2,U0-I3_的預測值為 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,所以排序結果為 I1> I2>I3U0-I1 的預測值為0.094930,特徵 doubleFlow_article_ctr_7_v1=_I1_ctr起到了 0.062029 的正向作用,使得預測值相較於基值,有增加的趨勢。同理,ui_cosine_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),給使用者帶來更加實時、準確的推薦結果。

本文作者:夏鼎新、王磊,馬蜂窩推薦演算法平臺研發工程師。