01 Likee短視頻推薦模型和特征工程簡介
Likee短視頻是全球視頻社交平臺BIGO旗下的短視頻產品,2017年7月正式上線,在三年的時間內已經交出了全球MAU過億的成績單。首頁廣場瀑布流是Likee短視頻最主要的視頻消費場景。三年來,Likee推薦模型在不斷優化網絡結構的同時,在特征工程方向也發展出一套特有的技術解決方案。
特征工程,顧名思義,是對原始數據進行一系列處理,將其提煉為模型可理解的輸入數據格式,為模型提供信息增益以提升模型精度,特征工程是一個表示和展現信息的過程。在實際工作中,特征工程旨在去除原始數據中的雜質和冗余,設計更高效的特征以刻畫求解的問題與模型預測目標之間的關系。
特征是模型訓練和預估的基礎,決定了模型精度的上限。對于在線推薦服務而言,特征數據流對于策略迭代的效率起著至關重要的作用。經過多年實踐中的積累和提煉,我們演化出一套針對大規模實時深度模型的特征數據框架,在提高策略迭代效率和模型效果的同時,也極大簡化了工程復雜性和業務成本開銷。這套特征數據流框架在Likee短視頻首頁推薦場景的精排和粗排模塊完成多個AB實驗和全流量上線,模型AUC和業務指標均取得顯著提升。
如圖一所示,排序模型流程包括日志收集、訓練數據生成、模型訓練和線上打分等階段。當推薦系統對用戶進行推薦時,會記錄當時的物料特征、用戶狀態與上下文信息,并收集本次推薦的用戶行為反饋。在經過樣本標簽匹配和特征抽取后生成最終的訓練數據。離線使用 PS-WORKERS分布式訓練框架對DNN模型進行分布式實時訓練,定期dump最新模型并加載到線上,用于線上排序服務。
Likee首頁推薦初始階段為了滿足快速上線的需求,線上使用的模型是基于連續統計特征的XGB模型,但是樹模型在多目標建模和增量學習方便嚴重不足。近年來,深度學習模型憑借其強大的表達能力和靈活的網絡結構在工業屆推薦和廣告領域取得重大進展,Likee首頁推薦場景中,用戶與視頻交互產生了海量的真實行為數據,為深度學習模型應用提供了必要的條件。為處理大規模的訓練樣本和提高訓練效率,我們使用分布式訓練框架訓練DNN模型,并基于該框架進行了多次優化嘗試,在Likee首頁推薦場景下取得了顯著的效果提升。
特征數據作為模型的輸入與模型結構緊密相連,特征體系隨著模型選型不斷升級,下面將分別從統計特征、session特征、多模態特征和cache tensor介紹我們在特征工程方面所做的優化與嘗試。
02 Flink統計特征和session特征
2.1 基于滑動變長窗口聚合的Flink統計特征
相比于基于連續值統計特征的樹模型,增量fine-train的DNN模型非常依賴于稀疏特征hashkey的復現,因此模型和特征時效性至關重要,因此我們引入業界主流的分布式流數據計算引擎Flink實現分鐘級延遲的統計特征和秒級延遲的session特征。
如圖二所示,我們采用變長bucket窗口聚合的方式對每一個統計實體進行counting,記錄其在時間軸上不同bucket的counting累加值,對于越久遠的行為我們采用更大的bucket時間間距進行聚合,在模型使用時,我們再根據特征具體的時間范圍從聚合桶隊列累加出任意時間段內的統計值。通過這樣的方式,在保證counting統計值精度的同時,能夠大幅降低redis和Flink任務的內存存儲和讀寫壓力。
2.3 Flink秒級延遲session特征
如圖三所示,使用Flink任務記錄用戶歷史行為隊列,當Flink任務收到用戶行為打點日志時,從redis讀取用戶行為隊列進行更新然后寫回到redis。其中,我們做了如下工程實踐優化:
● 分用戶行為隊列存儲。在短視頻推薦場景用戶行為豐富,用戶的高階行為(點贊,關注,分享)稀疏且更能夠反應用戶興趣,因此根據用戶不同行為劃分成多個種子視頻隊列,保證用戶興趣度更高的高階行為種子能夠被更長久存儲和充分利用;
● 冷熱數據分離。為了優化redis的讀寫和存儲壓力,將用戶一天以前的長周期行為隊列冷備到pika,在線上模型使用時再將redis短期行為隊列和pika長期行為隊列合并成完整的用戶行為隊列,通過這樣的方式,我們存儲的用戶歷史行為隊列長度可以達到千量級;
● 用戶行為反饋編碼。為了進一步建模用戶對種子視頻的偏好度,Flink任務會記錄用戶對每個種子視頻的所有交互數據(是否播完,播放時長,播放次數,是否點贊|關注|分享|評論等),在模型網絡里將用戶反饋行為編碼后embbeding作為用戶對歷史種子興趣度的補充信息,在用戶興趣網絡里該特征效果顯著;
● 種子視頻屬性特征線上實時獲取。Flink任務只記錄種子視頻id,種子視頻屬性特征是在線上模型使用時根據種子視頻id從畫像特征服務獲取。
基于以上秒級延遲的用戶session隊列特征,Likee短視頻首頁推薦粗精排均全量了用戶興趣網絡模型。
03 自動統計特征
3.1 Flink統計特征數據流的問題
隨著Likee短視頻日活和視頻生產量高速增長,原有Flink統計任務很快遇到瓶頸,其面臨以下幾點問題:
● 機器資源消耗高,穩定性差。Flink統計任務涉及到打點日志解析、歷史特征讀取、特征計算&新特征回寫,大量的計算和IO開銷導致流式系統穩定性堪憂,并且機器消耗資源巨大;流失統計任務的不穩定導致統計特征分布劇烈變化,線上效果顯著下降,同時會影響離線訓練數據導致線上模型很難迅速恢復;
● 用戶&物料交互統計信息缺失。推薦系統基于用戶歷史行為進行推薦,千人千面的個性化推薦系統強依賴于用戶屬性(用戶id,性別,年齡,城市,興趣標簽,手機機型等)與物料屬性(視頻id,拍客id,標簽,城市,國家等)之間的交叉特征。用戶屬性和視頻屬性間的交叉特征高度稀疏且數據量巨大, Flink統計的數據必須長久存儲于內存或者分布式內存存儲系統(如redis),受限于存儲系統容量,無法統計這部分交叉特征的統計值。
3.2 自動統計特征的實現
自動統計特征就是把特征做到模型里,在模型訓練時借助于分布式訓練平臺強大的I/O和存儲能力,在訓練引擎內進行特征級別的counting統計,從而簡化離線特征計算流程的復雜度。
在模型訓練時,以樣本里出現的每個hashkey為統計對象實體,首先從參數服務器pull 該hashkey歷史累計的行為統計量(stats feature),如果該hashkey第一次出現,則將stats feature用0向量初始化, 然后用當前樣本的用戶行為反饋action_tpl(表示樣本是否曝光,是否點擊,是否播完,播放時長等行為)對其進行更新:
Stats_feature <- stats_feature * decay_rate + actiontpl
其中decay_rate 表示時間衰減因子,然后將更新后的stats_feature push回參數服務器。
3.3 自動統計特征在DNN模型里的使用和優化
如上圖所示,對每個特征域而言,根據其hashkey從參數服務器pull 其對應的counting統計值,然后多個特征域統計向量concat在一起構成統計特征域(stats feature)。對模型而言,原始的counting統計值與模型的預估目標并不完全一致,需要將原始counting統計值轉換為與模型目標更相關的率值特征(列表點擊率,播完率,點贊率等)。
圖五為專門設計的counting統計特征預處理模塊,首先將原值進行對數操作,將求比率的除法運算轉換成等價的求差運算,然后引入差值矩陣實現批量求差操作,得到的結果即為我們需要的比率特征。
3.4 自動統計特征和embedding 特征的比較
stats特征和embedding特征從特征本質上而言其實是相通的,都是作為該特征filed特定的hashkey的信息輸入,并且他們的原始信息都來源樣本里的用戶行為反饋,只不過二者更新方式(即獲取特征信息的方式)不同。embedding特征的更新是通過梯度回傳進行軟更新(回傳的梯度依賴于樣本里的用戶行為構造的label),stats特征則是直接根據樣本里用戶行為進行硬更新。軟更新的embedding特征是基于整個模型參數每次進行小幅度更新,對于復現次數足夠多的hashkey能夠學習到更高的精度和更全面的信息,硬更新的stats特征對于復現次數少的hashkey能夠做到更快速收斂。
stat特征和emb特征各有優劣互為補足,上圖表示只用stat特征和只用emb特征以及二者都用的三個模型auc對比。
對于高度稀疏復現次數少的交叉特征,embbeding特征因為hashkey出現次數少導致訓練不充分,而交叉統計特征則能夠更快速準確地捕獲到用戶的個性化興趣。
04 多模態特征
4.1 為什么引入多模態特征
在DNN模型升級和網絡結構優化拿到巨大收益后,Likee模型組致力于將視頻raw feature作為特征增加到模型中去。視頻raw feature是用戶直接接收的信號,并且raw feature和 ID 類特征不同,ID 類特征的所有信息都源于樣本里和 label 共現信息的用戶反饋,而raw feature本身具有物理含義,所以其具有更好的泛化性。另一方面,Likee短視頻作為全球領先的短視頻社區,新視頻冷啟和優質視頻挖掘對于資源生態扮演著重要的角色,對于缺乏用戶行為反饋的新視頻,raw feature是視頻內容理解和質量評估最重要的信息來源。
4.2 多模態特征抽取
視頻raw feature過大,每天產生近百億樣本,涉及數據會達到上百 T,對于存儲和 I/O 都會造成很大的壓力,因此需要對視頻raw feature進行特征提取和壓縮。同時,如果直接引入視頻raw feature作為排序模型的原始輸入特征,將多模態模型和排序模型聯合訓練,會導致模型訓練收斂慢且效果不穩定的問題。
最終多模態特征抽取設計如下:在視頻上傳入庫時,使用預訓練好的視頻模型(I3D)和語音模型對原始視頻進行特征提取,將多模態模型的最后一層全連接輸入作為原始視頻raw feature的低維向量表達,然后將他們存入到視頻固有屬性特征,在排序模型中將視覺和語音向量和視頻ID emb向量以及其他side info作為視頻表征的原始輸入。
4.3 多模態向量聚類后embedding
由于預訓練的多模態模型和排序模型目標完全不一致,為了讓生成的多模態向量能夠更好地擬合排序目標,除了將上述視覺和語音向量直接作為模型輸入,我們還采用K-MEANS分別對視覺和語音向量進行聚類得到視覺聚類id和語音聚類id,然后將這兩個聚類id再經過DNN模型 embbeding層得到新的向量,通過排序模型目標的梯度回傳來進一步學習多模態特征的向量表達,作為多模態特征輸入的補充信息。
05 cache tensor
5.1 特征數據流的進一步革新
在自動統計特征中,我們打破了特征體系和模型系統明確的分界線,將統計特征做到模型里,極大簡化了在線和離線模型對外界特征數據流的依賴。隨著推薦模型的迅猛發展,越來越豐富的模型特征導致線上原始特征和emb|stat特征參數的存儲以及讀取I/O壓力驟增,越來越復雜的模型網絡帶來巨大的模型預估計算量。因此我們重新梳理了在線離線數據流和模型訓練流程,通過cache tensor的方式極大緩解了以上所述的存儲,I/O和計算壓力。
5.2 cache tensor的工程實現
如圖七所示,左邊是我們過去的特征數據流程,線上特征服務根據用戶id和候選視頻id列表從在線存儲系統獲取特征片段并拼接成完整的原始特征數據,將其輸入給線上排序服務的同時還將原始特征數據dump到日志系統供離線生成訓練數據。在自動統計特征全量以后,我們的特征可以分為以下幾類:用戶畫像特征,視頻畫像特征,拍客畫像特征以及用戶session特征,其中三個畫像特征更新頻次低且占據原始特征的大部分存儲空間。
我們采用cache tensor技術對特征數據流進行簡化,線上特征服務只讀取變化快的user_session特征,不再讀取時序上基本固定不變的畫像特征,排序服務獲取的(也就是日志系統dump的)原始特征只包含session特征以及用戶uid還有候選視頻item id。
在模型離線訓練時,根據樣本里的用戶id和視頻itemid從存儲系統讀取相應的畫像特征對樣本進行特征補全,然后使用batch 訓練的方式對模型進行更新。在模型訓練的同時,需要記錄樣本里出現過的用戶id和物料id列表供后續流程使用。
在模型訓練結束后加載訓練得到的模型,分別輸入樣本里出現過的用戶id和itemid列表,再次從存儲系統讀取相應的屬性特征對樣本進行特征補全,然后使用模型對樣本進行預測。在預估過程中,將模型網絡中的部分中間tensor cache到模型,和模型本來的emb參數一同存儲。如上圖所示,將模型網絡分成兩個部分, offline predict network和online predict network, 其中offline predictnet work中的虛線方框tensor (user emb和item emb) 即為需要cache的tensor。
在線服務模型對候選視頻進行打分時,無需再讀取和預處理畫像特征,只需要將線上特征服務返回的用戶id和候選視頻itemid以及session特征輸入給模型,模型根據用戶id以及候選itemid在模型參數里查找相應cached tensor提供給裁剪后的模型網絡進行預測,上圖中 online predict network是根據cached tensor經過裁剪的線上預估網絡,其輸入為離線建庫cache tensor后的模型參數。
采用cache tensor的方式優化離在線數據流后,線上預估服務吞吐量增加6倍的情況下預估耗時降低40%。同時基于cache tensor優化粗排模型結構,粗排模型auc提升2%,線上ab實驗也取得顯著效果收益。
06 總結
在Likee短視頻推薦模型中,為了提升離在線特征數據流系統的穩定性和工程性能,同時優化排序模型效果,我們嘗試了如下改進:(1)引入Flink實現秒級延遲的session特征服務,通過分隊列和冷熱數據分離實現千量級用戶行為序列特征,用于建模用戶長短期興趣;(2)通過自動統計特征工程,在模型訓練時同時進行特征更新,將統計特征做到模型參數里,極大簡化特征數據流程,在提升工程架構性能的同時獲得了業務指標的顯著提升;(3)采用cache tensor的方式將畫像特征做到模型參數里,進一步降低線上模型對于外圍特征存儲系統的數據依賴,同時經過預估網絡的裁剪降低線上模型預估計算量,解決復雜模型網絡的在線預估耗時瓶頸,為更復雜精準的排序模型打好基礎。
下一篇 BIGO海量小文件存儲實踐