1. 程式人生 > >深度學習在CTR中的應用

深度學習在CTR中的應用

一、資料 目前的很多資料均是基於張偉楠的FNN模型,但還沒有很大規模的應用。 另一種是google提出的wide & deep learning模型,主要用於推薦,美團的文章中也有介紹。
    • 介紹FNN模型。將FM模型訓出的結果作為其中的embedding層,上面套上全連線神經網路。
    • 介紹PNN模型。在FNN的embedding層的上面加入produce層,往上還是用全連線神經網路。
    • Google提出的wide和deep learning模型。
    • 這是來自張偉楠博士在攜程技術中心主辦的深度學習Meetup中的主題演講。張偉楠博士現在是上海交大的助理教授,其個人主頁是 http://wnzhang.net/
      ,他是FNN和PNN的主要作者,還是SVDFeature的作者之一,11年和12年的KDD Cup都有他的身影。
    • 作者 Kintocai (蔡建濤,來自騰訊)
    • 這篇文章寫得非常好,而且還有作者的一些精闢分析和實踐經驗,特別是在最後給出了一個總結性的框架圖,將這些模型以及一些連續特徵的處理方法統一到一個整體框架中,非常贊。
    • 很同意作者的好幾個觀點,比如:
      • 在訓練樣本量足夠的情況下,儘可能用簡單一些的模型,減少inference的計算量,提高計算的吞吐量,大資料本身就可以解決很多問題。
      • 離散LR依然是二分類問題場景的首選方案,LR加上良好的特徵工程足以解決大部分實際問題。
    • 不過對於dropout的使用,個人覺得在全連線層適當使用dropout是有用的,它可以在一定程度防止模型的過擬合。當然如果是訓練資料量較大,特徵維度較少時,dropout不是必需的。
二、FNN/PNN原理 1、基本思路 (1)使用FM計算出每個特徵對應的隱變數。 (2)將樣本中的每個特徵轉化為對應的隱變數。 (3)各個隱向量進行內積或者外積計算後,輸入DNN模型 2、embedding:將one-hot離散數值對映為連續數值 我們需要將非常大的特徵向量嵌入到低維向量空間中來減小模型複雜度,而FM(Factorisation machine)無疑是被業內公認為最有效的embedding model:     第一部分仍然為Logistic Regression,第二部分是通過兩兩向量之間的點積來判斷特徵向量之間和目標變數之間的關係。 3、基本網路 基於上面的討論,我們可以得出以下DNN網路結構:
(1)各個field轉化為對應的隱變數(這裡假設每個field只有一個是特徵是1,比如只有city=shanghai為1,其餘為0,則只需要將shanghai這個特徵轉為相應的隱變數即可) (2)將各個field的隱變數分別兩兩做內積/外積。 (3)將這個內積/外積結果作為輸入,繼續進入DNN計算。 4、FNN 根據上面的討論,FNN的網路結構如下 5、FNN的效果 那我們可以看出FNN的效果優於LR和 FM 模型。我們進一步考慮FNN與一般的神經網路的區別是什麼?大部分的神經網路模型對向量之間的處理都是採用加法操作,而FM 則是通過向量之間的乘法來衡量兩者之間的關係。我們知道乘法關係其實相當於邏輯“且”的關係,拿上述例子來說,只有特徵是學生而且在上海的人才有更大的概率去點選迪斯尼廣告。但是加法僅相當於邏輯中“或”的關係,顯然“且”比“或”更能嚴格區分目標變數。 6、PNN 我們接下來的工作就是對乘法關係建模。可以對兩個向量做內積和外積的乘法操作: 可以看出對外積操作得到矩陣而言,如果該矩陣只有對角線上有值,就變成了內積操作的結果,所以內積操作可以看作是外積操作的一種特殊情況。通過這種方式,我們就可以衡量連個不同域之間的關係。 在此基礎之上我們搭建的神經網路如下所示: 首先對輸入資料進行embedding處理,得到一個low-dimensional vector層,對該層的任意兩個feature進行內積或是外積處理就得到上圖的藍色節點,另外一種處理方式是把這些Feature直接和1相乘複製到上一層的Z中,然後把Z和P接在一起就可以作為神經網路的輸入層,在此基礎上我們就可以應用神經網路去模型了。 那麼對特徵做內積或是外積處理就會產生一個複雜度的問題:假設有60個域,那麼把這些feature做內積處理,就會產生將近1800個元素的矩陣,如此就會產生一個很大的weight矩陣,那我們需要學習的引數就很多,那我們的資料集可能就滿足不了這個要求。那接下來的做法就是:由於weight矩陣是個對稱陣,我們可以用factorization來處理這個對稱陣,把它轉換為一個小矩陣乘以這個小矩陣的轉置,這樣就會大大減少我們所需要訓練的引數: 7、PNN的效果 8、PNN隱藏層數量 我們還測試了最佳的隱層層數,隱層層數並不是越多越好,層數過多的模型會出現過擬合效應,這個隱層數是跟資料集大小相關,一般而言資料集越大所需要的隱層就越多,我們這裡模型顯示的最佳隱層是3層: 《使用者線上廣告點選行為預測的深度學習模型》還有其它一些數值配置 三、關於FNN/PNN的一些討論 部分觀點來自 《閒聊DNN CTR預估模型》 1、關於embedding 從離散到連續, embedding確實是非常合適的方案, embedding可以把離散特徵嵌入到高緯連續空間, 而且embedding 可以通過BP訓練求解。 Embedding解決了離散到連續的transform並不代表解決了所有的問題。CTR Prediction已經步入了千億樣本、千億特徵的時代[7],Google Play App 推薦都已經是5000億樣本了[8]。 如果每個離散特徵都對應一個representation vector,假設dimension 為50, 那麼就是50 * 千億 級別的引數。毫無疑問, 訓練如此龐大引數規模的模型是非常困難的,甚至不可為。解決這個問題可以有很多思路, 比如砍掉低頻特徵、降低representation vector dimension、特徵選擇、設計連續值特徵等等。試著回想一下離散特徵體系, 很容易可以發現離散特徵總量是千億級別, 但是category  field (feature set或則叫feature slot)總數一般也就幾十到幾百, 那麼一種很顯而易見的思路就是把離散特徵的representation vector 都歸一到每個category field上, 如此一來dnn的輸入規模瞬間回到了 num_category_field * dimension 的複雜度。 2、FM用作embedding 在FNN/PNN,train 一個FM模型就可以得到embedding。 工業上很多時候都會選擇基於FM來產生representation,包括比較有名的百度鳳巢、今日頭條、阿里。【注:其實不是基於FM產生representation的方法最優秀, 只是國內大部分公司都沒有複雜模型自主研發能力, 如果TF、MxNet之類開源DNN Lib沒有現成支援離散特徵Embedding版本的話就只好如此了。還有一種原因是線上遷移成本以及實際應用場景緣故導致的, 比如線上也想用FM\LR的預估。】輸入層可以使用 FM產生的所有資料,包括feature vector、w,同時可以引入其他統計值特徵以及新設計的連續值特徵。學術界以及一些比賽當中會有一些CNN預估模型, 設計方案也特別令人印象深刻, 這裡就不多展開了。 3、矩陣分解 通過使用每個category field的feature vector 做inner product 或則 outer product 來產生dnn 輸入層(也就是上圖裡面的Product Layer)。這種做法有助於特徵的交叉,同時也會導致另外一個問題: 輸入層的膨脹。假設有100個category  field, inner product 就會產生接近5000個輸入節點, outer product 那就更多了。 為解決這個問題作者又引入了一個矩陣分解的方法來優化, 也算是比較常見的優化方法吧。除此之外,文章還提到了一些包括啟用函式選擇、 隱層數選擇、dropout 概率選擇等等trick, 這些都不是我今天想要講的重點, 有興趣的同學可以參看對應的paper。 4、樣本假設的合理性 這裡Dr.Zhang 有一個假設:每個category field 有且只有唯一 positive value。 第一個問題是category 有且僅有一個positive value這個假設大部分時間是不成立的。比如使用者的興趣特徵, 很可能有多個興趣標籤, 也可能缺失。當然這個問題也很好解決, 多個的話可以選擇average(類似於Word2vec的隱層處理), 缺失的話可以選擇均值預設填充。 5、dropout 第二個問題,dropout的真的好麼?直觀上廣告特徵輸入的稀疏性很強, 大量的category field 缺失, dropout 很可能會極大稀疏性, 引起效果損失。但是用不用dropout沒有絕對性, 和特徵覆蓋以及樣本數量強相關, 比如你和百度鳳巢或則Google一樣擁有數千億樣本, 就沒有必要使用dropout。 6、inner/outer product 第三個問題, 輸入層是否真的需要做inner product或則outer product?這應該是學術界的方法, Dr.zhang引用的那篇文章還沒公開發表, 所以暫時沒有對比資料。但是隻要展開w 以及feature vector, 隱層潛在就會完成outer  product,通過隱層數以及隱層節點數可以控制交叉程度。 輸入層複雜度增加會影響整個系統的吞吐,如果樣本資料量足夠大, 儘可能設計簡單一些的模型, 提高吞吐量, 大資料本身就可以解決很多問題。 7、DNN真的就這麼強嗎? DNN 雖然已經是非常常見的模型了, 而且工業界應用非常廣泛了, 但是殺雞焉用牛刀, 離散LR依然是二分類問題場景的首選方案。不可小看大離散LR, 設計精良的離散LR效果槓槓的, 足夠解決大部分實際問題。