【DNN】W&D(Wide and Deep)

0.介紹

Google 發表在 DLRS 2016 上發表的文章。Wide & Deep 模型的核心思想是結合線性模型的記憶能力DNN 模型的泛化能力,從而提升整體模型性能。該結構被提出後即引起熱捧,在業界影響力非常大,很多公司紛紛仿照該結構併成功應用於自身的推薦等相關業務。我是在18年工作的代碼中看到了這個模型,線上服務有wide deep類,但是模型迭代時,工具封裝的太好了,都沒有見到過顯示的網絡結構,只是將對應部分輸入,然後得到模型,上線即可,今日來徹底捋捋這個框架。

wide&deep網絡中,wide部分是將特徵和線性模型結合,可以取得不錯的效果,模型簡單且可解釋性好。但整體來看,該網絡結構對特徵的依賴比較大,需要大量的人工參與才能獲取到好的效果。後續會有一些做特徵交叉組合的網絡衍生,比如DCN,PNN。

1.核心

Motivation

推薦系統的主要挑戰之一,是同時解決Memorization和Generalization,理解這兩個概念是理解全文思路的關鍵,下面分別進行解釋。

  • Wide側就是普通LR,一般根據人工先驗知識,將一些簡單、明顯的特徵交叉,喂入Wide側,讓Wide側能夠記住這些規則。
  • Deep側就是DNN,通過embedding的方式將categorical/id特徵映射成稠密向量,讓DNN學習到這些特徵之間的深層交叉,以增強擴展能力。
  • Memorization--- 可能只推薦用戶有過行爲的item

面對擁有大規模離散sparse特徵的CTR預估問題時,將特徵進行非線性轉換,然後再使用線性模型是在業界非常普遍的做法,最流行的即「LR+特徵叉乘」。Memorization 通過一系列人工的特徵叉乘(cross-product)來構造這些非線性特徵,捕捉sparse特徵之間的高階相關性,即“記憶” 歷史數據中曾共同出現過的特徵對。

典型代表是LR模型,使用大量的原始sparse特徵和叉乘特徵作爲輸入,很多原始的dense特徵通常也會被分桶離散化構造爲sparse特徵。這種做法的優點是模型可解釋高,實現快速高效,特徵重要度易於分析,在工業界已被證明是很有效的。Memorization的缺點是:

  1. 需要更多的人工設計;
  2. 可能出現過擬合。可以這樣理解:如果將所有特徵叉乘起來,那麼幾乎相當於純粹記住每個訓練樣本,這個極端情況是最細粒度的叉乘,我們可以通過構造更粗粒度的特徵叉乘來增強泛化性;
  3. 無法捕捉訓練數據中未曾出現過的特徵對。例如上面的例子中,如果每個專業的人都沒有下載過《消愁》,那麼這兩個特徵共同出現的頻次是0,模型訓練後的對應權重也將是0;
  • Generalization--- 可能推薦出跟user愛好不那麼相關的

Generalization 爲sparse特徵學習低維的dense embeddings 來捕獲特徵相關性,學習到的embeddings 本身帶有一定的語義信息。可以聯想到NLP中的詞向量,不同詞的詞向量有相關性,因此文中也稱Generalization是基於相關性之間的傳遞。這類模型的代表是DNN和FM。

Generalization的優點是更少的人工參與對歷史上沒有出現的特徵組合有更好的泛化性 。但在推薦系統中,當user-item matrix非常稀疏時,例如有和獨特愛好的users以及很小衆的items,NN很難爲users和items學習到有效的embedding。這種情況下,大部分user-item應該是沒有關聯的,但dense embedding 的方法還是可以得到對所有 user-item pair 的非零預測,因此導致 over-generalize並推薦不怎麼相關的物品。此時Memorization就展示了優勢,它可以“記住”這些特殊的特徵組合。

Memorization根據歷史行爲數據,產生的推薦通常和用戶已有行爲的物品直接相關的物品。而Generalization會學習新的特徵組合,提高推薦物品的多樣性。 論文作者結合兩者的優點,提出了一個新的學習算法——Wide & Deep Learning,其中Wide & Deep分別對應Memorization & Generalization。

網絡結構

Wide 該部分是廣義線性模型,即y=wTx+b,x=[x1,x2,…,xd]x=[x1,x2,…,xd] 是包含了 d 個特徵的向量,w=[w1,w2,…,wd]w=[w1,w2,…,wd] 是模型參數,b 是偏置。特徵包括了原始的輸入特徵以及 cross-product transformation 特徵。

Deep 該部分是前饋神經網絡,網絡會對一些sparse特徵(如ID類特徵)學習一個低維的dense embeddings(維度量級通常在O(10)到O(100)之間),然後和一些原始dense特徵一起作爲網絡的輸入。

一開始嵌入向量(embedding vectors)被隨機初始化,然後訓練過程中通過最小化損失函數來優化模型。每一個隱層(hidden-layer)做這樣的計算:

a(l+1)=f(W(l)a(l)+b(l))a(l+1)=f(W(l)a(l)+b(l)),f 是激活函數(通常用 ReLU),l 是層數。

總結一下,基於 embedding 的深度模型的輸入是 類別特徵(產生embedding)+連續特徵

  • 聯合訓練--- 

一、得到的模型size更小

二、訓練過程中,各自發揮作用,wide彌補deep的缺陷,大部分學習工作還是在deep。

聯合訓練(Joint Training)和集成(Ensemble)是不同的,集成是每個模型單獨訓練,再將模型的結果匯合。相比聯合訓練,集成的每個獨立模型都得學得足夠好才有利於隨後的匯合,因此每個模型的model size也相對更大。而聯合訓練的wide部分只需要作一小部分的特徵叉乘來彌補deep部分的不足,不需要 一個full-size 的wide 模型。(Wide部分設置很有意思,作者爲什麼這麼做呢?結合業務思考,在Google Play商店的app下載中,不斷有新的app推出,並且有很多“非常冷門、小衆”的app,而現在的智能手機user幾乎全部會安裝一系列必要的app。聯想前面對Memorization和Generalization的介紹,此時的Deep部分無法很好的爲這些app學到有效的embeddding,而這時Wide可以發揮了它“記憶”的優勢,作者在這裏選擇了“記憶”user下載的app與被推薦的app之間的相關性,有點類似“裝個這個app後還可能會裝什麼”。對於Wide來說,它現在的任務是彌補Deep的缺陷,其他大部分的活就交給Deep了,所以這時的Wide相比單獨Wide也顯得非常“輕量級”,這也是Join相對於Ensemble的優勢。

在論文中,作者通過梯度的反向傳播,使用 mini-batch stochastic optimization 訓練參數,並對wide部分使用帶L1正則的Follow- the-regularized-leader (FTRL) 算法,對deep部分使用 AdaGrad算法

總結

  1. 詳細解釋了目前常用的 Wide 與 Deep 模型各自的優勢:Memorization 與 Generalization。
  2. 結合 Wide 與 Deep 的優勢,提出了聯合訓練的 Wide & Deep Learning。相比單獨的 Wide / Deep模型,實驗顯示了Wide & Deep的有效性,併成功將之成功應用於Google Play的app推薦業務。
  3. 目前Wide 結合 Deep的思想已經非常流行,結構雖然簡單,從業界的很多反饋來看,合理地結合自身業務借鑑該結構,實際效果確實是efficient,我們的feeds流主模型也借鑑了該思想。

2.代碼

使用TensorFlow實現代碼,github地址:wide &deep代碼​​​​​​​

新版本TensorFlow自帶了DNNLinearCombinedClassifier實現了Wide&Deep模型,再使用Wide&Deep,只需要幾行代碼即可。而且,因爲DNNLinearCombinedClassifier繼承自Estimator,基類已經自動實現瞭如定時保存模型、重啓後自動加載模型繼續訓練、自動保存metric供模型可視化、分佈式訓練等一系列的“小而重要”的功能,“一切都彷彿非常美好”。如有興趣可以閱讀源碼。

續集:

“記憶與擴展”、“類別特徵”和“特徵交叉”,來描繪推薦算法的發展脈絡。沿着這一脈絡,結出了Wide&Deep, FM/FFM/DeepFM, Product-based nural net,Deep Cross Network, Deep Interest Network等果實。

Wide&Deep全文圍繞着“記憶”(Memorization)與“擴展(Generalization)”兩個詞展開。實際上,它們在推薦系統中有兩個更響亮的名字,Exploitation & Exploration,即著名的EE問題。

稀疏的類別/ID類特徵,纔是推薦、搜索領域的“一等公民”,被研究得更多。即使有一些實數值特徵,比如歷史曝光次數、點擊次數、CTR之類的,也往往通過bucket的方式,變成categorical特徵,才喂進模型。這裏說一句,工作中,會將連續特徵按照分位數進行讀取,也就是分段,存儲、傳輸、運算,提升運算效率

 

參考:
1.論文:https://arxiv.org/pdf/1606.07792.pdf

2.論文閱讀筆記:http://www.shuang0420.com/2017/03/13

3.論文的翻譯(近似):https://zhuanlan.zhihu.com/p/53361519

4.代碼及其解說:https://blog.csdn.net/sxf1061926959/article/details/78440220

5.代碼github:https://github.com/Shicoder/Deep_Rec/tree/master/Deep_Rank

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章