今天開始了推薦系統(tǒng)的第二個模型Wide&Deep的學習,這是谷歌發(fā)表于2016年的深度學習模型,主要的思想是用Memorization和Generalization來幫助網(wǎng)絡去學習到目標函數(shù)。具體地,論文地址在此:https://arxiv.org/pdf/1606.07792.pdf
Wide&Deep的網(wǎng)絡結構

Wide模型:傳統(tǒng)的logistic regression模型,即將處理好的輸入的特征通過線性加權的方式,再通過sigmoid函數(shù)的變換,用來擬合目標函數(shù)的概率。該部分的特點為,對于歷史中出現(xiàn)過的某個值,或者某種特征組合是很敏感的,因而,它的作用是memorization。在wide部分,我們通常會將ID類型的特征放入其中,希望它能夠學習到在數(shù)據(jù)集中高頻出現(xiàn)的特征組合,其中,我們使用帶L1的隨機梯度下降的算法FTRL(Follow the Regularized Leader)使得wide部分的稀疏性大大降低,節(jié)約參數(shù)的計算和存儲。當然,一些手動交叉的部分的特征也可以放入wide模型中去。
Deep模型:deep neural network模型,即深度學習的多層感知機的網(wǎng)絡結構。通過多層感知機的疊加,對特征進行非線性的抽取,可以組合得到一定的泛化能力。因而,它的作用是generalization。在deep部分,我們通常選擇一些數(shù)值型的特征放在deep中,通過embedding+深度交互的結合,能夠學習到各個特征的最優(yōu)向量表達。由于Deep部分的輸入是embedding向量以及數(shù)值類特征,因此,優(yōu)化的時候可以使用AdaGrad去訓練。
Wide&Deep模型:
從谷歌的論文的網(wǎng)絡結構圖可以看到,它的dense部分為連續(xù)型變量(如年齡、app的安裝數(shù)量、訪問次數(shù)等等)+類別型變量(如人口基礎信息、設備類型、用戶曝光App等),它的deep部分為用戶安裝的app和用戶曝光的app的特征交叉。

具體代碼:





相關思考題:
在模型結構日漸復雜的今天,你認為wide部分存在的意義還大嗎?在你的模型中還保留這wide部分這種簡單暴力的結構,還是已經(jīng)用更復雜的結構來代替?
在模型結構日益復雜的今天,我認為wide部分還是有存在的意義的,可以提取出高頻出現(xiàn)的特征組合,當然,這塊部分也可以用FM來替代,比較典型的是deepFM模型。能把Wide部分和Deep部分分開訓練嗎?能讓FTRL在線學習,而深度部分batch訓練嗎?
我覺得不能將Wide和Deep分開訓練,因為兩者的聯(lián)合才構建了到最終的目標函數(shù)的映射。
附錄:
namedtuple是升級版的tuple,tuple的特性是一個包含多個不可變屬性值的對象,namedtuple對于對象本身就做了命名,同時也給域做了命名定義,如下面的例子,定義了一個name為SparseFeat的namedtuple,該namedtuple具有三個域,分別為name、vocabulary_size和embedding_size。
from collections import namedtuple
SparseFeat = namedtuple('SparseFeat',['name','vocabulary_size','embedding_size'])
sparseFeat = SparseFeat(name='Sparse1', vocabulary_size=14, embedding_dim=8)
參考資料:
- [DataWhale學習資料](https://github.com/datawhalechina/team-learning-rs/blob/master/DeepRecommendationModel/Wide%26Deep.md)
- [見微知著,你真的搞懂Google的Wide&Deep模型了嗎?]
https://zhuanlan.zhihu.com/p/142958834 - [在線最優(yōu)化求解] (https://github.com/wzhe06/Ad-papers/blob/master/Optimization%20Method/%E5%9C%A8%E7%BA%BF%E6%9C%80%E4%BC%98%E5%8C%96%E6%B1%82%E8%A7%A3%28Online%20Optimization%29-%E5%86%AF%E6%89%AC.pdf)