在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN

1 FM

  • 在CTR預估中,經常會遇到one-hot類型的變量,one-hot類型變量會導致嚴重的數據特徵稀疏的情況,為了解決這一問題,在上一講中,我們介紹了FM算法
  • 詳細參見上一篇文章"在計算廣告和推薦系統中的AI算法(1)--FM模型"

2 FFM

2.1 原理

  • 在CTR預估中,經常會遇到one-hot類型的變量,one-hot類型變量會導致嚴重的數據特徵稀疏的情況,為了解決這一問題,在上一講中,我們介紹了FM算法。這一講我們介紹一種在FM基礎上發展出來的算法-FFM(Field-aware Factorization Machine)。
  • FFM模型中引入了類別的概念,即field。還是拿上一講中的數據來講,先看下圖:
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN
  • 在上面的廣告點擊案例中,“Day=26/11/15”、“Day=1/7/14”、“Day=19/2/15”這三個特徵都是代表日期的,可以放到同一個field中。同理,Country也可以放到一個field中。簡單來說,同一個categorical特徵經過One-Hot編碼生成的數值特徵都可以放到同一個field,包括用戶國籍,廣告類型,日期等等。
  • 在FFM中,每一維特徵 xi,針對其它特徵的每一種field fj,都會學習一個隱向量 v_i,fj。因此,隱向量不僅與特徵相關,也與field相關。也就是說,“Day=26/11/15”這個特徵與“Country”特徵和“Ad_type"特徵進行關聯的時候使用不同的隱向量,這與“Country”和“Ad_type”的內在差異相符,也是FFM中“field-aware”的由來。
  • 假設樣本的 n個特徵屬於 f個field,那麼FFM的二次項有 nf個隱向量。而在FM模型中,每一維特徵的隱向量只有一個。FM可以看作FFM的特例,是把所有特徵都歸屬到一個field時的FFM模型。根據FFM的field敏感特性,可以導出其模型方程。
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN
  • 可以看到,如果隱向量的長度為 k,那麼FFM的二次參數有 nfk 個,遠多於FM模型的 nk個。此外,由於隱向量與field相關,FFM二次項並不能夠化簡,其預測複雜度是 O(kn^2)。
  • 下面以一個例子簡單說明FFM的特徵組合方式。輸入記錄如下:
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN
  • 這條記錄可以編碼成5個特徵,其中“Genre=Comedy”和“Genre=Drama”屬於同一個field,“Price”是數值型,不用One-Hot編碼轉換。為了方便說明FFM的樣本格式,我們將所有的特徵和對應的field映射成整數編號。
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN
  • 那麼,FFM的組合特徵有10項,如下圖所示。
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN

其中,紅色是field編號,藍色是特徵編號。

2.2 代碼的github地址:

  • https://github.com/princewen/tensorflow_practice/tree/master/recommendation-FFM-Demo

3 DeepFM

3.1 特徵組合的挑戰

  • 對於一個基於CTR預估的推薦系統,最重要的是學習到用戶點擊行為背後隱含的特徵組合。在不同的推薦場景中,低階組合特徵或者高階組合特徵可能都會對最終的CTR產生影響。
  • 之前介紹的因子分解機(Factorization Machines, FM)通過對於每一維特徵的隱變量內積來提取特徵組合。最終的結果也非常好。但是,雖然理論上來講FM可以對高階特徵組合進行建模,但實際上因為計算複雜度的原因一般都只用到了二階特徵組合。
  • 那麼對於高階的特徵組合來說,我們很自然的想法,通過多層的神經網絡即DNN去解決。

DNN的侷限

  • 下面的圖片來自於張俊林教授在AI大會上所使用的PPT。
  • 我們之前也介紹過了,對於離散特徵的處理,我們使用的是將特徵轉換成為one-hot的形式,但是將One-hot類型的特徵輸入到DNN中,會導致網絡參數太多:

所以,可以將DNN與FM進行一個合理的融合,其中一種融合就是DeepFM:

  • 我們先來看一下DeepFM的模型結構:
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN
  • DeepFM包含兩部分:神經網絡部分與因子分解機部分,分別負責低階特徵的提取和高階特徵的提取。這兩部分共享同樣的輸入。DeepFM的預測結果可以寫為:
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN

3.3 代碼:

  • DeepFM原代碼地址:https://github.com/ChenglongChen/tensorflow-DeepFM
  • 本文代碼地址:https://github.com/princewen/tensorflow_practice/tree/master/Basic-DeepFM-model
  • 數據下載地址:https://www.kaggle.com/c/porto-seguro-safe-driver-prediction

4 多值離散特徵的embedding解決方案

4.1 背景

  • 在本系列第三篇文章中,在處理DeepFM數據時,由於每一個離散特徵只有一個取值,因此我們在處理的過程中,將原始數據處理成了兩個文件,一個記錄特徵的索引,一個記錄了特徵的值,而每一列,則代表一個離散特徵。
  • 但假如,我們某一個離散特徵有多個取值呢?舉個例子來說,每個人喜歡的NBA球隊,有的人可能喜歡火箭和湖人,有的人可能只喜歡勇士,也有的人喜歡騎士、綠軍、猛龍等一大堆。對於這種特徵,我們本文將其稱為多值離散特徵。
  • 根據DeepFM的思想,我們需要將每一個field的特徵轉換為定長的embedding,即使有多個取值,也是要變換成定長的embedding。
  • 那麼,一種思路來了,比如一個用戶喜歡兩個球隊,這個field的特徵可能是[1,1,0,0,0,0,0.....0],那麼我們使用兩次embedding lookup,再取個平均不就好了嘛。
  • 嗯,這的確也許可能是一種思路吧,在tensorflow中,其實有一個函數能夠實現我們上述的思路,那就是tf.nn.embedding_lookup_sparse。彆著急,我們一步一步來實現多值離散特徵的embedding處理過程。

4.2 解決方案

  • 輸入數據假設我們有三條數據,每條數據代表一個user所喜歡的nba球員,比如有登哥,炮哥,杜老四,慕斯等等:

我們建立一個所有球員的集合:

  • 數據處理這裡我們需要一個得到一個SparseTensor,即多為稀疏矩陣的一種表示方式,我們只記錄非0值所在的位置和值。比如說,下面就是我們對上面數據處理過後的一個SparseTensor,indices是數組中非0元素的下標,values跟indices一一對應,表示該下標位置的值,最後一個表示的是數組的大小。
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN

處理得到SparseTensor的完整代碼如下:

  • 定義embedding變量定義我們的embedding的大小為3:
  • 得到embedding值將我們剛才得到的SparseTensor,傳入到tf.nn.embedding_lookup_sparse中,我們就可以得到多值離散特徵的embedding值。tags = sparse_from_csv(csv)
  • embedded_tags = tf.nn.embedding_lookup_sparse(embedding_params, sp_ids=tags, sp_weights=None)
  • sp_ids就是我們剛剛得到的SparseTensor,而sp_weights=None代表的每一個取值的權重,如果是None的話,所有權重都是1,也就是相當於取了平均。如果不是None的話,我們需要同樣傳入一個SparseTensor,代表不同球員的喜歡權重。大家感興趣可以自己去嘗試。
  • 測試輸出最後我們來看看得到的效果:
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN

這只是一種解決方案,大家可以去探索更多的方法。

5 DCN

5.1 原理

  • Deep&Cross Network模型我們下面將簡稱DCN模型:一個DCN模型從嵌入和堆積層開始,接著是一個交叉網絡和一個與之平行的深度網絡,之後是最後的組合層,它結合了兩個網絡的輸出。完整的網絡模型如圖:
  • 嵌入和堆疊層
  • 我們考慮具有離散和連續特徵的輸入數據。在網絡規模推薦系統中,如CTR預測,輸入主要是分類特徵,如“country=usa”。這些特徵通常是編碼為獨熱向量如“[ 0,1,0 ]”;然而,這往往導致過度的高維特徵空間大的詞彙。
  • 為了減少維數,我們採用嵌入過程將這些離散特徵轉換成實數值的稠密向量(通常稱為嵌入向量):
  • 然後,我們將嵌入向量與連續特徵向量疊加起來形成一個向量:
  • 拼接起來的向量X0將作為我們Cross Network和Deep Network的輸入
  • Cross Network
  • 交叉網絡的核心思想是以有效的方式應用顯式特徵交叉。交叉網絡由交叉層組成,每個層具有以下公式:一個交叉層的可視化如圖所示:
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN
  • 可以看到,交叉網絡的特殊結構使交叉特徵的程度隨著層深度的增加而增大。多項式的最高程度(就輸入X0而言)為L層交叉網絡L + 1。如果用Lc表示交叉層數,d表示輸入維度。然後,參數的數量參與跨網絡參數為:d * Lc * 2 (w和b)
  • 交叉網絡的少數參數限制了模型容量。為了捕捉高度非線性的相互作用,模型並行地引入了一個深度網絡。
  • Deep Network深度網絡就是一個全連接的前饋神經網絡,每個深度層具有如下公式:
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN
  • Combination Layer鏈接層將兩個並行網絡的輸出連接起來,經過一層全鏈接層得到輸出:
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN
  • 如果採用的是對數損失函數,那麼損失函數形式如下:
在計算廣告和推薦系統中的AI算法(2)--FFM/DeepFFM/DCN
  • 總結
  • DCN能夠有效地捕獲有限度的有效特徵的相互作用,學會高度非線性的相互作用,不需要人工特徵工程或遍歷搜索,並具有較低的計算成本。
  • 論文的主要貢獻包括:1)提出了一種新的交叉網絡,在每個層上明確地應用特徵交叉,有效地學習有界度的預測交叉特徵,並且不需要手工特徵工程或窮舉搜索。
  • 2)跨網絡簡單而有效。通過設計,各層的多項式級數最高,並由層深度決定。網絡由所有的交叉項組成,它們的係數各不相同。
  • 3)跨網絡內存高效,易於實現。
  • 4)實驗結果表明,交叉網絡(DCN)在LogLoss上與DNN相比少了近一個量級的參數量。

5.3 代碼

  • 本文的代碼根據之前DeepFM的代碼進行改進,我們只介紹模型的實現部分,其他數據處理的細節大家可以參考作者的github上的代碼:
  • https://github.com/princewen/tensorflow_practice/tree/master/Basic-DCN-Demo
  • 數據下載地址:https://www.kaggle.com/c/porto-seguro-safe-driver-prediction


分享到:


相關文章: