「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


分享嘉賓:錢丁丁 騰訊 高級研究員編輯整理:劉一全內容來源:DataFun AI Talk《Yoo視頻底層頁推薦系統-從0到1的實踐》出品社區:DataFun注:歡迎轉載,轉載請註明出處。


「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


本次分享主要包括以下幾個部分:

1. 業務背景;2. 召回相關技術與實踐;3. 排序相關技術與實踐;4. 思考及未來規劃。


1. 業務背景

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


底層頁指在點擊左側雙列feed流中點擊一個視頻(1號)後繼續滑動出現的視頻(234號)

在底層頁推薦場景中除了需要考慮和主視頻的相關性以外,還需要考慮上下文(用戶對視頻234的行為)。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


底層頁的整體框架如上圖所示,當客戶端發起推薦列表請求,服務端會依次做以下事情:

1. 請求畫像服務,得到描述用戶興趣的特徵;2. 請求Trigger,由若干個不同機制的Trigger分別得到不同的召回集;3. 合併召回結果,輸入rank層做排序;4. 經過一些產品/業務策略的規則組成的曝光策略服務得到最終的視頻list,發給用戶。


服務的底層,直接和線上服務打交道的,包括做向量相似度計算的faiss,做緩存的redis,做消息隊列的Hippo,還有一些數據分發服務。

再下面一層則是大數據計算平臺Hadoop,Spark,SparkStreaming,以及機器學習計算平臺Angel和Tensorflow。

2. 召回相關技術與實踐

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


召回策略主要分為以下4個方向:

1. 基於熱門:在冷啟動階段,缺少用戶行為的時候,用高質量視頻做推薦;2. 基於屬性:根據年齡,性別,地域等用戶屬性,不同屬性的用戶有不同的興趣偏好;3. 基於內容: 根據視頻的標題,標籤,圖片等等,找相似的視頻;4. 基於行為:根據用戶的點擊/播放行為序列,建模計算相關的視頻。


「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


ICF方法(基於物品的協同過濾)原理是比較兩個視頻觀看過的用戶列表,重合度越高則越相似。在計算協同過濾相似度時對原始公式做了以下優化:

1. 考慮用戶看兩個視頻相隔的時間,在分子上乘一個衰減係數,時間越長相關性越低;2. 考慮用戶看視頻的數量,在分母乘以衰減係數,對看大量視頻的用戶做降權;3. 不同的主item對應的其他item的list中分數的最大值可能差異很大,可以對每個主item做歸一化處理。


「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


表示學習的思路是類似word2vec,為每個樣本(通過embedding)生成一個向量,再計算向量的相似度找到相似的樣本。可以利用的數據例如視頻封面,視頻標題,視頻標籤和行為序列。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


ImageEmbedding召回因為樣本比較少,做分類模型困難,所以採用預訓練的方法。加載Inception模型,輸入圖像做前向計算,將softmax前的輸出層取出來即可得到一個embedding向量,最後使用faiss找到最相似的向量,也就找到了最相似的圖片。評估目前採用人工的方法,人工評估召回的topN圖片中有幾個是相似的。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


Title/Tag Embedding有兩種方法:第一種是標準的word2vec模式,用自己的標題/標籤數據訓練一個詞向量模型。這種方法的召回結果不太好,分析原因是數據量小。第二種是採用了公開詞向量數據,這種用海量數據訓練得到的預訓練詞向量模型,效果比第一種更好。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


Network Embedding召回也叫Graph Embedding,有三種方式: 1. 矩陣分解: 效果不太好,用的比較少 2. 隨機遊走: 利用隨機遊走構造一些序列做embedding 3.具體使用中最直接的方法是:把用戶的播放列表當作nlp中的一個句子(每個視頻作為一個單詞)訓練word2vec。直接用word2vec會有一些問題,可以優化的方式包括:1. 對高低頻的item(視頻)做過濾和降採樣 2. 合理的劃分session(取多少天的數據)。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


Network Embedding常見的做法並不是先將樣本直接構造成skip-gram的形式,而是先把行為序列構造成圖的形式,然後針對每個節點進行隨機遊走,生成一些候選序列,再去做Embedding學習。這樣做存在的問題1:新的item缺少行為數據導致圖稀疏,解決方案是將最近幾個小時看的視頻兩兩做全連接。問題2是熱門視頻:解決方案是對視頻做聚類。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


推薦系統的常規做法是分召回,排序兩個階段。原因是如果對全量數據(用戶數*物品數)做排序,計算量可能太大,所以先用召回層減少候選集的大小。除非在某些特殊情況下,對全庫做排序也許是可行的,如果物品的數量不是很大,比如只有幾十/幾百萬,再把模型的特徵減少。當候選池達到上億甚至更多的時候就不可行了,儘管使用embedding方法可以近似選擇全局最優,但是計算距離的方法比較單一。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


高階的方法是採用阿里提出的一種tree-based deep match的方法,核心的思想是要從全部候選池中找到用戶感興趣的item,為了減少問題的規模,將候選集構建成樹結構,只有葉子節點才是單個的item,每個非葉子節點潛在表達了子孫items。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


第一步:將視頻按照二級分類排序,使得相同二級類目的視頻處在相鄰的位置,所有視頻組成一個list。第二步:遞歸的將list一分為二得到左右子樹,直到每個list只剩下一個或兩個視頻。這樣就構建出了一個有層級結構的樹。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


將用戶的歷史行為序列和樹中的目標節點做點積,經過深度神經網絡之後得到用戶對每個候選節點感興趣的概率。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


訓練時正樣本選擇有播放行為的葉子結點和它的祖先。負樣本有兩種選擇:(a)每層隨機選擇節點作為負樣本,這樣做的好處是結果的多樣性好 (b)每層選擇兄弟節點作為負樣本,這樣做的好處是和歷史行為更匹配。完整的召回過程是自頂向下的依次對每個節點打分,選擇topk,遇到葉子節點就放入召回池,遇到非葉子節點就繼續向下尋找。

樹形結構的好處除了可以做全庫檢索,還會有更好的多樣性。這樣做更符合人腦的特點,人通常不會只對某一種類別的內容感興趣,而是對不同的內容都或多或少的有興趣。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


最後總結一下:最初級的方法是基於統計的協同過濾系列,之後演化出進階的Embedding系列之所以應用比較廣很大程度上受益於faiss提高了向量相似度計算的效率,目前最前沿的是TDM這種全庫查詢的方式。

3. 排序相關技術與實踐

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


接下來介紹排序模塊,大致經歷了LR,Deep,Wide&Deep三個階段,其中LR模型暫時不做介紹。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


深度模型目前採用了一種比較基礎的架構。底層是sparse feature id。接下來embedding,每一列是一個field,比如畫像信息、上下文等等。然後concat,經過全聯接的隱藏層之後輸出。DNN模型的效果與LR相比沒有很大提升,原因是低階特徵組合能力不足,但好處在對稀疏特徵的表達能力有提升。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


Wide&Deep模型的Wide部分和LR的做法相同,所以克服了DNN模型的缺點,auc相對LR/DNN有1%的提升,不過依然依賴於人工做一些交叉特徵。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


Wide&DCN模型是2017年穀歌提出來的,它的特點是加入了一個cross層做特徵交叉,具體的交叉方式如公式所示:每一層的Embedding由上一層和第0層交叉,每一層中的每個元素的交叉由階數確定,最終形成了多階交叉的效果。離線auc和W&D相比提高1%,而DeepFM和W&D相比提升不大。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


最後在介紹一下工程方面的實踐經驗。排序的難點是要求實時,並且特徵和樣本的數量都很大。下面將會從樣本數據,特徵結構,離線訓練,線上推斷和模型調試五個方面分別介紹。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


Tensorflow有兩種處理特徵的方式:明文vs二進制(TFRecord)。明文的特點是可讀性好,但是速度慢。二進制雖然速度快,但也存在一些問題,只支持三種格式的數據,而且String結構比較佔用空間,解析速度也慢。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


特徵結構嘗試過三種方式。第一種是明文形式,FeatureColumn的速度非常慢,特徵ID化方式比FeatureColumn快十倍,不論離線訓練還是線上推斷都是如此。後兩種是特徵ID的形式。

第一種是開放的特徵id,使用方便,只需要把特徵做hash,但缺點是Tensorflow底層dense結構無法支持。第二種是序列化特徵id,這種做法的缺點是序列化速度慢,好處是可以做特徵預處理。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


離線訓練使用的是數據分佈式模式,數據並行計算梯度。模型是集中式的,非分佈式存儲,每片數據計算的梯度使用同步方式更新模型。

線上推斷有兩種方式。一種是TFServing,這種方式存在一些問題。因為加載模型和模型推斷是採用同一個線程,所以在加載模型的時候會出現推斷服務短暫阻塞,造成超時。TFServing還會定時自動加載目錄中的模型文件,如果模型有問題也會自動加載模型,這是我們不希望發生的。另外在模型加載初期會出現響應慢的現象,通常稱為WarmUp問題。不過可以通過BatchThread提升計算效率。

還有一種方式是用TensorflowAPI進行推斷,可以自行設置觸發條件控制模型的加載,而不限制於一定要固定的時間間隔加載一次。另外還可以自行調用session函數進行並行推斷。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


在提高模型的訓練效率方面,有不少可以嘗試的優化點,比如batchsize的調整,Tensorflow中dataset api中cache的使用,特徵選擇及Embedding調整,隱藏層個數及緯度的調整,樣本降採樣等等。使用Tensorflow timeline工具可以幫忙快速定位耗時函數,加速模型訓練。

在提高模型的推斷效率方面,可以優化線上特徵數據拼接效率,及控制線程和batch之間的比例。

在提高效果方面,數據量越大越好,使用tensorboard關注實時auc和明文輸出bias/loss等數據,儘早發現模型訓練中的錯誤。

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


模型的演化過程大致經過了線性模型,非線性模型,興趣模型這幾個階段。推薦和搜索業務的關注點是有一些不同的,推薦更關注對用戶興趣的描述,而搜索關注對query的理解。阿里的DIN和DIEN是大家公認對效果提升比較明顯的。

4. 思考及未來規劃

「回顧」Yoo視頻底層頁推薦系統-從0到1的實踐


最後是一些思考和未來的規劃。Embedding方面計劃講將行為和內容融合到一起做embedding,還有一種方式將用戶行為構建成圖,利用圖卷積神經網絡做embedding學習。另一方面是序列化數據的利用,用LSTM/GRU做序列化的item推薦,或者直接對序列化行為建模用戶興趣,這些方法時間複雜度高,工程挑戰較大。利用Bandit算法去做用戶興趣探索是常用的一種做法,後續將會探索強化學習尤其深度強化學習在興趣探索上的應用。

此外兩個難點,一個是多任務學習,因為有的時候任務目標不僅僅是點擊率,還需要提高停留時長等指標。另一個是多模態,把圖片和視頻數據如何用到召回中來。

作者介紹:

錢丁丁,騰訊高級研究員。Yoo視頻底層頁視頻排序技術負責人,帶領團隊從0到1搭建短視頻排序技術體系,並實現了從淺層機器學習模型到深度模型的升級換代。畢業之後加入搜狗商業部門,負責無線搜索廣告的排序算法工作。曾在騰訊網絡媒體事業部,負責天天快報新聞推薦系統排序算法工作。

——END——


分享到:


相關文章: