分享嘉賓:周燕穩、蔣文瑞 美圖
文章整理:李元
出品平臺:DataFun
導讀:Push 作為一種有效的拉起 DAU 和召回使用者的策略,近幾年來被各類社交 App 廣泛應用,隨著深度神經網路在語音和影象識別上取得的巨大成功,AlphaGo 戰勝人類圍棋頂尖高手,以深度網路為基礎的人工智慧迎來第三次高潮。如何將深度模型應用於個性化 push 場景,從而減少無效 push 對使用者的騷擾,是近年來一個關注的熱點。本次分享將結合美圖的實際業務場景從 Embedding、召回、排序、文案、內容池等多個方面介紹如何打造一個良好的 push 場景。
本次分享的內容概要如下:
1. 業務背景
2. Embedding 演進
首先,我們介紹 Embedding 的過程。從三個演算法層面介紹 embedding:Word2Vec,Listing Embedding ( 參考 Airbnb ) 在個性化 push 的應用,以及近兩年流行的圖相關的演算法 GCNs。
2.1 Word2Vec
- Feed 也就是展示頁的一個 item,對於美圖秀秀來說就是使用者發的一張圖,對於電商來說就是一個商品,本文統一稱為 feed。
- Embedding 就是把任何一個 Feed 轉化為一個向量,服務於後面的召回和排序。Embedding 是比較基礎的過程,在最開始階段,我們嘗試了最基礎的 Work2Vec 中的 Skip-Gram 的模型,通過對於使用者的點選序列模仿 Work2Vec 中的一個句子。如圖所示,我們有序列之後,定義視窗大小,通過中心詞,就會得到 Train Sample。緊接著定義單側視窗大小為2,就可以得到樣本對,把樣本對輸入模型,就可以返回向量。
2.2 Airbnb Listing Embedding
Airbnb listing Embedding 是2018年 KDD 的最佳論文,這裡和 Word2Vec 主要的區別在於損失函式,模型本身和 Word2Vec 是保持一致的,所以我們先看 Word2Vec 的損失函式:
損失函式由正負樣本兩部分組成,正樣本對 Dp 來源於使用者點選流生成的 item pair,負樣本對 Dn 通過當前的 item + 隨機取樣空間的其他 item ( 這裡假設隨機取樣的樣本不是當前 item 的鄰居 ),ctx 表示上下文。這裡需要注意的是在 log 裡,正樣本前面有負號,負樣本沒有負號。
但是,之前的構造只用了使用者的點選資料,實際上使用者還有點贊、分享等行為資料可以利用。所以,在 Airbnb listing Embedding 中,加入了 Global Context 這樣一個概念:通過使用者歷史的點贊、分享對應的 feed,與當前的 feed 構造出全域性正樣本對,使這些 feed 在點選序列上和當前的 feed 並不相鄰, 加入到損失函式中。( 如公式中的紫色部分 )
同理,我們可以通過使用者的點選"不喜歡"的行為來構造負樣本 ( 如公式中的紅色部分 )。除此之外,使用者的瀏覽過,但是沒有點選的 feed 也可以隨機取樣之後當做負樣本,加入到損失函式中 ( 如公式中的藍色部分 )。
這樣,就把 Airbnb listing Embedding 的策略引入到了美圖秀秀的場景裡。
2.3 Graph Embedding
Graph Embedding 是近幾年比較流行的 Embedding 方法,主要策略可以分為三類:Shallow Embedding,Neighborhood autoencoder methods 和 GCN 的方法。但是前兩種方法涉及到不可拓展和直推式的缺陷,GCN 可以避免以上的缺陷。
前面兩種 Embedding 只對行為序列本身進行了建模,但是沒有考慮節點本身的特徵;另外,在之後的排序模型中,排序模型使用了 item 的自身屬性進行排序。GCN 就是把使用者行為和 item 本身的特徵聯合起來,既能用上圖的拓撲結構,又可以把握屬性特徵,把資訊融合起來做 Embedding。在上圖中,假設我們要計算 A 的 Embedding,可以通過計算 A 的一階近鄰 BC 的資訊聚合得到 Aggregate,而 BC 的資訊可以由二階近鄰 DEC,EBFG 的資訊計算卷積 ( Convolution ) 計算得到。
具體來說,延展的過程中,主要包括對於高階資訊的彙總 Aggregate,以及當前階和鄰階節點上一階的卷積之間資訊的結合 Combine。其中,Combine 可以有很多操作,比如拼接,求和等。Aggregate 的過程中,需要注意的一點是採用了 Importance pooling,這裡並不會對每個鄰居節點都彙總,而是先計算一個Importance Factor ( 影響力因子 ),影響力因子小於閾值的不參與加權,最後根據權重去加權求和。
構件圖的不同形態:
- 二分圖形態:兩種型別 ( Feeds,User ) 內部之間沒有邊,不同型別之間才有邊;
- 單體圖形態:根據使用者同一時間段的行為,將 Feeds 之間關聯起來。
到此為止,我們介紹了 Embedding 所嘗試的方法。
3. 召回模型
召回主要採用了四個方面:全域性召回 ( 熱榜,熱搜,熱詞 ),個性化召回 ( 根據使用者的行為,興趣進行召回 ),屬性召回 ( 也就是畫像召回,通過機型,性別,年齡等 ),最後是相關召回 ( 包括相似,關鍵詞召回等 )。
3.1 個性化召回之 YoutubeNet
YoutubeNet 是近兩年比較流行的演算法,它既可以做召回,也可以做排序。通過輸入使用者的行為序列得到使用者和 item 的向量,然後就可以通過向量相似程度,對每個 user 相似的 topN 個 item 進行個性化召回,實驗中到達點選率提升了1.661%。
3.2 個性化召回之聚類召回
業務上,push 也包含一個任務是實現將"工具類使用者"轉化成"社交類使用者",從而提高長期的 DAU。在聚類召回階段,可以通過對於使用者的工具偏好特徵去構建 multi-hot 的向量,然後進行使用者群聚類,對於每個特定的使用者群召回對應的榜單。
3.3 相關召回之相似召回
相關召回在美圖秀秀中是輸出使用者近期的 item 點選流,獲取了對應的 Embedding 之後,可以通過計算 Embedding 的均值然後找餘弦距離最小的候選項;或者直接將每個候選項去找餘弦距離最小的候選項,最後進行彙總。這裡值得思考的一個問題是,何時利用好工具行為的特徵,是在排序階段,召回階段,還是生成 Embedding 的階段?經過實驗,得到在 Embedding 階段使用工具行為特徵效果最好。
3.4 相關召回之聚類召回
聚類召回主要是為了實現多樣性,避免同質化的內容。通過對 item 的 Embedding 進行聚類,相當於每個 item 多了一個分類標籤。通過統計使用者對於每個類別的行為記錄次數,按照倒敘進行排列。在召回階段,按照排列好的順序依次從每一個類別中抽取一個 item,如果所有類別都抽了一遍,召回的數量仍然不夠多,可以繼續再抽一輪,直到候選數目足夠。這樣就實現了召回源的多樣性。
3.5 相關召回之文案相關召回
當選取候選 item 之後,傳送 push 仍需要一條文字資訊觸達使用者,這裡簡稱文案。文案一般由編輯生成,會有很多候選項,所以也需要對文案進行建模召回。主要有以下三個方案:
- 關鍵詞召回:通過對於歷史的文案進行分詞,得到每條文案的關鍵詞,然後把使用者對於文案的點選對映到對於關鍵詞的點選,這樣就能得到使用者對於不同關鍵詞的偏好。當我們新需要傳送一條文案時,可以得到使用者對於每條候選文案偏好度,召回偏好大的文案。
以上,就是所有的召回部分。
4. 排序模型
4.1 LR 邏輯迴歸模型
在排序模型的初始迭代階段,使用了最簡單的 LR 模型,LR 的模型優點是模型淺,計算簡單,解釋性強,易於使用。但是缺點也顯而易見,LR 對於非線性特徵擬合程度差;除此之外,交叉特徵的生成依賴於大量嘗試以及人工經驗,所以嘗試成本很高。
4.2 xNFM 模型
通過對於 LR,Wide&Deep,deepFM,NFM,DCN,xNFM,xDeepFM 模型的嘗試與對比,最後選擇的 xNFM 的模型。xNFM 優點是組合了一階和二階的特徵的優點,效能上也可以達到工業落地的需求。
xNFM 不是業界主流的模型,而是在落地中對於 NFM 的變種。主要區別在於:
- 模型的輸入端為了降低模型引數規模,把 id 類特徵和非 id 類特徵分別進行 Embedding,可以大大減少引數規模。
- 在上層網路,主要區別在於右側。傳統的 NFM 的弊端是隻考慮了一個顯性的二階資訊,而忽略了一階資訊 ( 單特徵 ),所以我們增加了右邊的網路用來捕捉單特徵的資訊。相比於 LR,提升效果明顯,到達點選率提升13.89%。
4.3 雙塔模型
隨著使用者量的增加,計算量飆升,笛卡爾積之後會有千億級別的計算量,使得模型更新週期變長,時效性降低。為了解決這個問題,我們提出了雙塔的結構。雙塔的結構特別在,當 user 和 item 分別構建一個 DNN 的全連線的網路。這樣設計優化主要體現在工程效能方面,儲存量大大降低,預測階段耗時也降低,從而實現了支援億級別的使用者高效計算。從最初的雙塔之後接入到內積,再到上圖的雙塔接入 NFM,到最後再加入點選序列的資訊,三個版本的迭代最終點選率累計提升23.9%。
4.4 三塔模型
在之前也提到,我們有很多召回策略,但是召回源品質參差不齊,所以就需要解決對於召回源的選取。
- 最初的想法是根據每個召回源的轉化對排序結果進行 socre reweight,但是弊端也很明顯,因為召回源直接並不互斥,同個 item 會被多個召回源命中,所以 reweight 的規則也難以定義。
- 之後,為了個性化,直接把召回源資訊加入到模型中。這裡為什麼不把召回源直接加入到 item 的特徵中,而是單獨的構造了一個塔呢?主要工程上的考慮,如果把召回源的資訊加到 item 塔中,必須等 item 塔計算完成之後才能進行生產預測,會造成序列化,增加了延時。
4.5 Field_wise 三塔模型
最後一版就是對於 NFM 模型的改進,在 NFM 左邊的 Bi-Interaction Layer 中,BI 是 Bi-linear 的縮寫,這一層其實是一個pooling層操作,它把很多個向量轉換成一個向量,形式化如下:
輸入是整個的嵌入向量,xi,xj 是特徵取值,vi,vu是特徵對應的嵌入向量。中間的操作表示對應位置相乘。所以原始的嵌入向量任意兩個都進行組合,對應位置相乘結果得到一個新向量;然後把這些新向量相加,就得到了 Bi-Interaction 的輸出。這個輸出只有一個向量。這裡參考 FM 到 FFM 的改進過程,引入 Field 的概念。由於 BI 層不同的類別特徵所表達是權重不相同,而 BI 層捕捉不到這個資訊,所以可以對於每個向量相乘前可以加上權重。但是,這樣會導致引數過多,而同屬於一個 field 的變數權重應該相近,所以對於 BI 層進行同類別的權重 wi,j 共享而會使用相同引數的點積來計算:
5. 文章小節
到此為止,我們分別介紹了 Embedding,召回,排序三部分。Embedding 作為底層的服務輔助召回和排序,總共涵蓋了 word2vec,airbnb listing embedding,GCNs 等幾種不同策略;在召回部分,從不同場景與目標介紹了不同的召回策略;排序部分主要是模型由 LR 到 Field_wise 三塔模型的迭代過程,重點是如何解決特徵生產階段中耗時的笛卡爾積運算,使得一些更具規模的模型得以在線上業務投入生產。