天天看點

螞蟻金服核心技術:百億特征實時推薦算法揭秘

小叽導讀:文章提出一整套創新算法與架構,通過對TensorFlow底層的彈性改造,解決了線上學習的彈性特征伸縮和穩定性問題,并以GroupLasso和特征線上頻次過濾等自研算法優化了模型稀疏性。在支付寶核心推薦業務獲得了uvctr的顯著提升,并較大地提升了鍊路效率。

0.綜述

線上學習(Online learning)由于能捕捉使用者的動态行為,實作模型快速自适應,進而成為提升推薦系統性能的重要工具。然而它對鍊路和模型的穩定性,訓練系統的性能都提出了很高的要求。但在基于原生TensorFlow,設計Online推薦算法時,我們發現三個核心問題:

一些資訊推薦場景,需要大量長尾詞彙作為特征,需使用featuremap對低頻特征頻次截斷并連續性編碼,但耗時且方法aggressive。

使用流式資料後,無法預知特征規模,而是随訓練逐漸增長。是以需預留特征空間訓練幾天後重新開機,否則會越界。

模型稀疏性不佳,體積達到數十GB,導緻上傳和線上加載耗時長且不穩定。

更重要的是,線上學習如火如荼,當流式特征和資料都被打通後,能按需增删特征,實作參數彈性伸縮的新一代訓練平台成為大勢所趨。為了解決這些問題,從2017年底至今,螞蟻金服人工智能部的同學,充分考慮螞蟻的業務場景和鍊路,對TensorFlow進行了彈性改造, 解決了以上三大痛點,簡化并加速離線和線上學習任務。其核心能力如下:

彈性特征伸縮體系,支援百億參數訓練。

group_lasso優化器和頻次過濾,提高模型稀疏性,明顯提升線上效果。

模型體積壓縮90%,完善的特征管理和模型穩定性監控。

在與業務線團隊的共同努力下,目前已在支付寶首頁的多個推薦場景全流量上線。其中某推薦位的個性化online learning桶最近一周相比線上多模型融合最優桶提升4.23% , 相比随機對照提升達34.67% 。 某個性化資訊推薦業務最近一周,相比DNN基準uv-ctr提升+0.77%,pv-ctr提升+4.78%,模型體積壓縮90%,鍊路效率提升50%。

  1. 彈性改造及優勢

背景:在原生TensorFlow中,我們通過Variable來聲明變量,若變量超過了單機承載的能力,可使用partitioned_variables來将參數配置設定到不同機器上。 但必須指定shape,聲明後即不可改變,通過數組索引查找。

由于推薦系統中大量使用稀疏特征,實踐中一般采取embedding_lookup_sparse一類的方法在一個巨大的Dense Variable中查找向量并求和,來代替矩陣乘法。開源Tensorflow限定了Variable使用前必須聲明次元大小,這帶來了兩個問題:

1)需要預先計算特征到次元範圍内的int值的映射表,這一步操作通常在ODPS上完成。因為需要掃描所有出現的特征并編号,計算非常緩慢;

2)在online learning場景下,為了容納新出現的特征,需要預留一部分次元空間,并線上上不斷修改映射表,超過預留白間則需要重新啟動線上任務。

為了突破固定次元限制,實作特征的動态增加和删除,最樸素的優化想法是在TensorFlow底層實作模拟字典行為的Variable,并在此基礎上重新實作Tensorflow上層API。由此我們進行了優化,在server新增了基于HashMap的HashVariable,其記憶體結構如下:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

在聲明該變量時,隻需增加一句,其他訓練代碼皆不需改動:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

每個特征都通過hash函數映射到一個2的64次方大小的空間内。當需要計算該特征時,PS會按需惰性建立并傳回之。但其上層行為與原生TF一緻。由于去掉了featuremap轉ID的過程,我們内部形象地将其稱為“去ID化”。在此之上我們實作了Group Lasso FTRL,頻次過濾和模型壓縮等一系列算法。

備注:彈性特征帶來一個顯著的優勢:隻要用足夠強的L1稀疏性限制,在單機上就能調試任意大規模的特征訓練,帶來很多友善。我們的hashmap實作是KV化的,key是特征,value是vector的首位址。

離線訓練優化

經過這樣的改造後,在離線批量學習上,帶來了以下變化:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

線上訓練優化

online learning上,能帶來如下變化:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

除了性能有明顯的提升之外,其最大的優勢是不需提前申請空間,訓練可以無縫穩定運作。

  1. 特征動态增删技術

彈性架構,主要目的就是特征優選,讓模型自适應地選擇最優特征,進而實作稀疏化,降低過拟合。本節介紹特征優選的兩個核心技術:

使用流式頻次過濾, 對特征進入進行判定。

使用Group Lasso優化器,對特征進行篩選和删除。

2.1 Group Lasso 優化器

稀疏化是算法追求的重要模型特性,從簡單的L1正則化和Truncated Gradient[9], 再到讨論累積梯度平均值的RDA(Regularized Dual Averaging)[10], 再到目前常見的 FTRL[2] 。 然而它們都是針對廣義線性模型優化問題提出的稀疏性優化算法,沒有針對sparse DNN中的特征embedding層做特殊處理。把embedding參數向量當做普通參數進行稀疏化,并不能達到線上性模型中能達到的特征選擇效果,進而無法有效地進行模型壓縮。

例如:當包含新特征的樣本進入時,一個特征對應的一組參數(如embedding size為7,則參數數量為7)被激活,FTRL判定特征中的部分參數無效時,也不能安全地将該特征删除。如圖:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

是以,在L1和L2正則的基礎上,人們引入L21正則(group lasso)和L2正則(exclusive sparsity),分别表示如下:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

L21早在2011年已經引入,它最初目的是解決一組高度關聯特征(如男女)應同時被保留或删除的問題,我們創新地擴充到embedding的表示上,以解決類似的問題。

在L21中,由于内層L2正則将一個特征的所有參數施加相同的限制,能将整組參數清除或保留,由此決定embedding層中的某些特征對應的embedding向量是否完全删除,提升模型泛化性。是以稱為group lasso。

而L12則正好相反,它迫使每組參數中的非0參數數量一緻但值又盡可能不同,但使輸出神經元互相競争輸入神經元,進而使特征對目标更具區分性。

對于DNN分類網絡,底層表示要求有足夠的泛化性和特征抽象能力,上層接近softmax層,需要更好的區分性。是以我們通常在最底層的embedding層使用group lasso。即如下的優化目标:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

直接将L21正則項懲罰加入loss,模型最終也能收斂,但并不能保證稀疏性。是以Group lasso優化器參考了FTRL,将梯度疊代分成兩個半步,前半步按梯度下降,後半步微調實作稀疏性。通過調節L1正則項(即公式中的λ),能有效地控制模型稀疏性。

Group lasso是彈性計算改造後,模型性能提升和壓縮的關鍵。值得指出:

在我們實作的優化器中,Variable,以及accum和linear兩個slot也是KV存儲。

L12和L21正則相結合的方法也已經有論文讨論[8],但我們還未在業務上嘗試出效果。

由于篇幅限制,本節不打算詳細介紹Group lasso的原理和推導

2.2 流式頻次過濾

讨論完特征動态删除的方法後,我們再分析特征的準入政策。

2.2.1 頻次過濾的必要性

在Google讨論FTRL的文章1中提到, 在高維資料中大部分特征都是非常稀疏的,在億級别的樣本中隻出現幾次。那麼一個有趣的問題是,FTRL或Group FTRL優化器能否能删除(lasso)極低頻特征?

在RDA的優化公式中,滿足以下條件的特征會被置0:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

若在t步之前,該特征隻出現過幾次,未出現的step的梯度為0,随着步數增大,滿足上述條件變得越來越容易。由此RDA是可以直覺處理極稀疏特征的。 但對于FTRL,要滿足:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

其中,

螞蟻金服核心技術:百億特征實時推薦算法揭秘

不僅和曆史梯度有關,還與曆史學習率和權重w有關。 是以FTRL雖然也能處理極稀疏特征,但并沒有RDA那麼aggressive(此處還待詳細地分析其下界,Group FTRL與此類似)。

由于FTRL在設計和推導時并未明确考慮極低頻特征,雖然通過增大λ,确實能去除大量極低頻特征,但由于限制太強,導緻部分有效特征也被lasso,在離線實驗中被證明嚴重影響性能。其次,對這些巨量極低頻特征,儲存曆史資訊的工程代價是很高昂的(增加幾倍的參數空間和存儲需求),如下圖:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

是以我們提出,能否在實時資料流上模拟離線頻次過濾,為特征提供準入門檻,在不降低模型性能的基礎上,盡量去除極低頻特征,進一步實作稀疏化?

2.2.2 頻次過濾的幾種實作

注意: 由于預設的embedding_lookup_sparse對特征執行了unique操作(特征歸一化以簡化計算),是以在PS端是不可能擷取真實特征和label頻次的。需要Python端對placeholder統計後,上傳給server端指定的Variable,優化器通過slot獲得該Variable後作出聯合決策。

最naive的思路是模拟離線頻次過濾,對特征進行計數,隻有達到一定門檻值後再進入訓練,但這樣破壞了資料完整性:如總頻次6,而門檻值過濾為5,則該特征出現的前5次都被忽略了。為此我們提出了兩種優化方案:

基于泊松分布的特征頻次估計

在離線shuffle後的特征滿足均勻分布,但對線上資料流,特征進入訓練系統可看做蔔瓦松過程,符合泊松分布:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

其中n為目前出現的次數,t為目前的步數,λ為機關時間發生率,是泊松分布的主要參數,T為訓練總步數。

螞蟻金服核心技術:百億特征實時推薦算法揭秘

為特征最低門限(即最少在T時間内出現的次數)。

是以我們能通過前t步的特征出現的次數n,将t時刻當做機關時間,則

螞蟻金服核心技術:百億特征實時推薦算法揭秘

。 根據泊松分布,我們可以算出剩餘

螞蟻金服核心技術:百億特征實時推薦算法揭秘

時間内事件發生大于等于

螞蟻金服核心技術:百億特征實時推薦算法揭秘

次的機率

螞蟻金服核心技術:百億特征實時推薦算法揭秘

。 每次該特征出現時,都可按該機率

螞蟻金服核心技術:百億特征實時推薦算法揭秘

做伯努利采樣,特征在t步進入系統的機率用下式計算:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

通過真實線上資料仿真,它能接近離線頻次過濾的效果,其λ是随每次特征進入時動态計算的。它的缺陷是:

當t越小時,事件發生在t内的次數的variance越大,是以會以一定機率誤加或丢棄特征。

未來總的訓練步數T在線上學習中是未知的。

頻次過濾與優化器相分離,導緻不能獲得優化器的統計資訊。

動态調L1正則方案

在經典的FTRL實作中,L1正則對每個特征都是一緻的。這導緻了2.2.1 中提到的問題:過大的L1雖然過濾了極低頻特征,但也影響的了模型的性能。參考各類優化器(如Adam)對learning_rate的改進,我們提出:通過特征頻次影響L1正則系數,使得不同頻次的特征有不同的lasso效果。

特征頻次和基于MLE的參數估計的置信度相關,出現次數越低置信度越低。如果在純頻率統計基礎上加入一個先驗分布(正則項),當頻率統計置信度越低的時候,越傾向于先驗分布,相應的正則系數要更大。我們經過多個實驗,給出了以下的經驗公式:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

其中c是懲罰倍數,

螞蟻金服核心技術:百億特征實時推薦算法揭秘

為特征最低門限,這兩者皆為超參,

螞蟻金服核心技術:百億特征實時推薦算法揭秘

是目前特征出現的頻次。

我們線上上環境,使用了動态調節L1正則的方案 。在uvctr不降甚至有些微提升的基礎上,模型特征數比不使用頻次過濾減少75%,進而從實驗證明了頻次過濾對稀疏化的正向性。它的缺點也很明顯:特征頻次和正則系數之間的映射關系缺少嚴謹證明。

頻次過濾作為特征管理的一部分,目前還少有相關論文研究,亟待我們繼續探索。

3. 模型壓縮和穩定性

3.1 模型壓縮

在工程上,由于做了優化,如特征被優化器lasso後,隻将其置0,并不會真正删除;在足夠多步數後才删除。同時引入記憶體池,避免特征的反複建立和删除帶來的不必要的性能損失。 這就導緻在訓練結束後,模型依然存在大量0向量。導出時要進一步做模型壓縮。

由于引入了HashPull和HashPush等非TF原生算子,需要将其裁剪後轉換為原生TF的op。 我們将這些步驟統稱圖裁剪(GraphCut), 它使得線上inference引擎,不需要做任何改動即可相容彈性改造。由于有效特征大大減少,打分速度相比原引擎提升50%以上。

我們将圖裁剪看做TF-graph的靜态優化問題,分為3個步驟:

第一遍周遊Graph,搜尋可優化子結構和不相容的op。

第二遍周遊,記錄節點上下遊和中繼資料,裁剪關鍵op,并将Variable的非0值轉存至Tensorflow原生的MutableDenseHashTable。本步驟将模型體積壓縮90%。

拼接建立節點,重建依賴關系,最後遞歸回溯上遊節點,去除與inference無關的子圖結構

我們實作了完整簡潔的圖裁剪工具,在模型熱導出時調用, 将模型從原先的8GB左右壓縮到幾百兆大小,同時保證模型打分一緻。

3.2 模型穩定性和監控

online learning的穩定性非常重要。我們将線上真實效果,與實時模型生成的效果,進行了嚴密的監控,一旦樣本偏差過多,就會觸發報警。

由于需捕捉時變的資料變化,因而不能用固定的離線資料集評估模型結果。我們使用阿裡流式日志系統sls最新流入的資料作為評估樣本,以滑動視窗先打分後再訓練,既維持了不間斷的訓練,不浪費資料,同時盡可能高頻地得到最新模型效果。

我們對如下核心名額做了監控:

樣本監控: 正負比例,線上打分值和online-auc(即線上模型打分得到的auc),産出速率,消費速率。

訓練級監控: AUC, User-AUC(參考備注),loss, 模型打分均值(與樣本的正負比例對齊),異常資訊。

特征級管理: 總特征規模,有效/0/删除特征規模,新增/插入/删除的速率。

整體模型和排程:模型導出的時間,大小,打分分布是否正常,是否正常排程。

業務名額:uvctr,pvctr(小時級更新,T+1報表)。

線上與訓練名額之間的對應關系如下表:

螞蟻金服核心技術:百億特征實時推薦算法揭秘

通過http接口,每隔一段時間發送監控資料,出現異常會及時産生釘釘和郵件報警。下圖是對9月20日到27号的監控,從第二張圖表來看,模型能較好的适應目前資料流的打分分布。

螞蟻金服核心技術:百億特征實時推薦算法揭秘

User-AUC:傳統的AUC并不能完全描述uvctr,因為模型很可能學到了不同使用者間的偏序關系,而非單個使用者在不同offer下的點選偏序關系。為此,我們使用了User-AUC,它盡可能地模拟了線上uvctr的計算過程,在真實實驗中,監控系統的uvctr小時報表,與實時模型輸出的User-AUC高度一緻。

4. 工程實作和效果

目前算法已經在支付寶首頁的多個推薦位上線。推薦系統根據使用者的曆史點選,融合使用者畫像和興趣,結合實時特征,預估使用者CTR,進而提升系統整體點選率。

我們以推薦位業務為例說明,其采用了經典的wide&deep的網絡結構,其sparse部分包含百級别的group(見下段備注1)。 一天流入約百億樣本,label的join視窗為固定時長。由于負樣本占大多數,上遊鍊路對正負樣本做了1:8的降采樣(見下文備注2)。

訓練任務采用螞蟻統一訓練平台建構,并使用工作流進行定時排程,離線和線上任務的其他參數全部一緻。Batchsize為512,每200步(即20萬樣本)評估結果,定時将模型通過圖裁剪導出到線上系統。當任務失敗時,排程系統會自動拉起,從checkpoint恢複。

該推薦業務的online learning桶最近一周相比線上多模型融合最優桶提升4.23% , 相比随機對照提升達34.67% 。 另一資訊推薦業務其最近一周,相比DNN基準uv-ctr提升+0.77%,pv-ctr提升+4.78%。實驗效果相比有較大的提升。

備注1: group embedding是将相似emb特征分組,各自lookup求和後再concat,使得特征交叉在更高層進行。其設計是考慮到不同group的特征差異很大(如user和item),不應直接對位求和。

備注2: inference打分僅做pointwise排序,采樣雖改變資料分布但不改變偏序關系,是以并未在訓練上做補償。

5. 未來工作

彈性特征已經成為螞蟻實時強化深度學習的核心要素。它隻是第一步,在解決特征空間按需建立問題後,它會帶來一個充滿想象力的底層架構,衆多技術都能在此基礎上深挖: 在工程上,可繼續從分鐘級向秒級優化,進一步提升鍊路實時性并實作模型增量更新; 在算法上,我們正在探索如樣本重要性采樣,自動特征學習,線上線性規劃與DNN的結合,實作優化器聯合決策等技術。

由于線上學習是個複雜的系統工程,我們在開發和調優時遇到了大量的困難,涉及樣本回流,訓練平台,模型打分,線上評估等一系列問題,尤其是穩定性,但基本都一一克服。為了保證線上結果穩定可信,我們在觀察和優化兩三個月後才釋出這篇文章。

本文作者為螞蟻金服人工智能部認知計算組的基礎算法團隊,團隊涉及圖像、NLP、推薦算法和知識圖譜等領域,帶頭人為國家知名算法專家褚崴,擁有定損寶和理賠寶等核心業務。

原文釋出時間為:2018-12-04

本文作者:墨眀

本文來自雲栖社群合作夥伴“

阿裡巴巴機器智能

”,了解相關資訊可以關注“

”。

繼續閱讀