(馬蜂窩技術原創文章,微信ID:mfwtech)git
馬蜂窩推薦系統主要由召回(Match)、排序(Rank)、重排序(Rerank)幾個部分組成,總體架構圖以下:算法
在召回階段,系統會從海量的內容庫篩選出符合用戶偏好的候選集(百級、千級);排序階段在此基礎上,基於特定的優化目標(如點擊率)對候選集內容進行更加精準的計算和選擇,爲每一條內容進行精確打分,進而從候選集的成百上千條內容中選出用戶最感興趣的少許高質量內容。微信
本文咱們將重點介紹馬蜂窩推薦系統中的核心之一——排序算法平臺,它的總體架構如何;爲了給用戶呈現更加精準的推薦結果,在支撐模型快速、高效迭代的過程當中,排序算法平臺發揮了哪些做用及經歷的實踐。架構
目前,馬蜂窩排序算法線上模型排序平臺主要由通用數據處理模塊、可替換模型生產模塊、監控與分析模塊三部分組成,各模塊結構及平臺總體工做流程以下圖所示:機器學習
(1) 通用數據處理模塊ide
核心功能是特徵建設以及訓練樣本的構建,也是整個排序算法最爲基礎和關鍵的部分。數據源涉及點擊曝光日誌、用戶畫像、內容畫像等等,底層的數據處理依賴 Spark 離線批處理和 Flink 實時流處理。學習
(2) 可替換模型生產模塊測試
主要負責訓練集的構建、模型的訓練以及生成線上配置,實現模型的無縫同步上線。優化
(3) 監控與分析模塊ui
主要包括上游依賴數據的監控、推薦池的監控,特徵的監控與分析,模型的可視化分析等功能。
各個模塊的功能以及他們之間的交互使用 JSON 配置文件進行集成,使模型的訓練和上線僅僅須要修改配置就能完成,極大提高了開發效率,爲排序算法的快速迭代打下了堅實的基礎。
配置文件主要分爲 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):基於標籤或目的地向量,構建用戶向量或物品向量,從而獲得用戶與物品的類似度特徵等
在排序算法平臺 V1 階段,經過簡單的 JSON 文件配置,平臺就可以實現特徵的選擇、訓練集的選擇、分場景 XGBoost 模型的訓練、XGBoost 模型離線 AUC 的評估、生成線上配置文件自動同步上線等功能。
針對上面存在的這些問題,咱們在排序算法平臺的監控分析模塊增長了數據驗證、模型解釋的功能,幫助咱們對模型的持續迭代優化提供更加科學、精準的依據。
在算法平臺 V1 階段,當模型離線效果(AUC)表現很好,而線上效果不符合預期時,咱們很難排查定位問題,影響模型迭代。
經過對問題的調查和分析咱們發現,形成線上效果不符合預期的一個很重要的緣由,多是目前模型的訓練集是基於數倉天天彙總的一張點擊曝光表獲得。因爲數據上報延遲等緣由,這張離線的點擊曝光表中的一些上下文特徵與實時的點擊曝光行爲可能存在偏差,帶來一些離線和線上特徵不一致的問題。
針對這種狀況,咱們增長了數據驗證的功能,將離線構建的訓練集與線上打印的實時特徵日誌進行各個維度的對比分析。
具體作法就是以線上的實時點擊曝光日誌(包含所使用的模型、特徵以及模型預測分等信息)爲基礎,爲每條實時點擊曝光記錄都增長一個惟一 ID,在離線彙總的點擊曝光表中也會保留這個惟一 ID。這樣,針對一條點擊曝光記錄,咱們就能夠將離線構建的訓練集中的特徵,與線上實際使用的特徵關聯起來,對線上和離線模型的 AUC、線上和離線模型的預測分以及特徵的狀況進行對比,從而發現一些問題。
舉例來講,在以前的模型迭代過程當中,模型離線 AUC 很高,可是線上效果卻並不理想。經過數據驗證,咱們首先對比了線上和離線模型 AUC 的狀況,發現存在效果不一致的現象,接着對比線上和離線模型的預測分,並找到線上和離線預測分相差最大的 TopK 個樣本,對它們的離線特徵和線上特徵進行對比分析。最後發現是因爲數據上報延遲形成了一些線上和離線上下文特徵的不一致,以及線上XGBoost、DMatrix 構建時選的 missingValue 參數有問題,從而致使了線上和離線模型預測分存在誤差。上述問題修復後,線上 UV 點擊率提高了 16.79%,PV 點擊率提高了 19.10%。
經過數據驗證的功能和解決策略,咱們快速定位到了問題的緣由,加速算法模型迭代開發的過程,提高了線上的應用效果。
模型解釋能夠打開機器學習模型的黑盒,增長咱們對模型決策的信任,幫助理解模型決策,爲改進模型提供啓發。關於模型解釋的一些概念,推薦給你們兩篇文章來幫助理解:《Why Should I Trust You Explaining the Predictions of Any Classifier》、《A Unified Approach to Interpreting Model Predictions》。
在實際開發中,咱們老是在模型的準確性與模型的可解釋性之間權衡。簡單的模型擁有很好的解釋性,可是準確性不高;而複雜的模型提升模型準確性的同時又犧牲了模型的可解釋性。使用簡單的模型解釋複雜的模型是當前模型解釋的核心方法之一。
目前,咱們線上模型排序使用的是 XGBoost 模型。但在 XGBoost 模型中,傳統的基於特徵重要性的模型解釋方法,只能從總體上對每一個特徵給出一個重要性的衡量,不支持對模型的局部輸出解釋,或者說單樣本模型輸出解釋。在這樣的背景下,咱們的模型解釋模塊使用了新的模型解釋方法 Shap 和 Lime,不只支持特徵的重要性,也支持模型的局部解釋,使咱們能夠了解到在單個樣本中,某個特徵的某個取值對模型的輸出能夠起到何種程度的正向或負向做用。
下面經過一個從實際場景中簡化的示例來介紹模型解釋的核心功能。首先介紹一下幾個特徵的含義:
咱們的模型解釋會對單個樣本給出如下的分析:
U0-I2
U_0-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>I3,U0-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 天點擊率小於閾值對模型的預測起負向做用,大於閾值對模型的預測起正向做用。
近期,排序算法平臺將繼續提高訓練模型的線上應用效果,並把特徵的實時做爲工做重點,快速反映線上的變化。
當前排序算法平臺使用的 XGBoost 模型優勢是不須要太多的特徵工程,包括特徵缺失值處理、連續特徵離散化、交叉特徵構建等。但也存在許多不足,包括:
很難處理高緯稀疏特徵
須要加載完整的數據集到內存進行模型的訓練,不支持在線學習算法,很難實現模型的實時更新。
針對這些問題,後期咱們將進行 Wide&Deep,DeepFM 等深度模型的建設,以下圖所示:
另外,當前的模型每次都是預測單個 Item 的分數,而後進行排序取一刷的結果,(Learning to rank,pointwise)。後期咱們但願能夠實現一次給用戶推薦一刷的結果(Learning to rank,listwise),給用戶帶來更加實時、準確的推薦結果。
本文做者:夏鼎新、王磊,馬蜂窩推薦算法平臺研發工程師。