模型
上圖講得十分清楚:
第一層(最下層)黃點(diǎn)和灰點(diǎn),表示稀疏離散特征。
第二層表示對(duì)稀疏離散特征embedding后的稠密特征向量。
第三層就是深度模型,這里使用了ReLu激活函數(shù)
第四層就是輸出單元,sigmoid激活也可以認(rèn)為是LR
- 1,最左邊的Wide模型其實(shí)就是LR模型。最右面Deep模型其實(shí)就是深度模型了。中間是兩者結(jié)合的Wide&Deep模型,其輸出單元接收的是左右兩部分輸出的拼接。
-
2,對(duì)于兩部分模型(Wide,Deep)的輸入,看下圖
Wide&Deep具體應(yīng)用模型
這是google paly 商店的推薦應(yīng)用,wide模型和deep模型接受了不同的特征。
deep模型直接接收連續(xù)特征和embedding后的離散特征。其輸出的即
wide模型只接受了部分離散特征:user installed app即用戶(hù)安裝的app,impression app即用戶(hù)看到的被展示的app(看到了但沒(méi)下載),以及這兩部分特征的交叉。其輸出即
其中
是交叉特征。
優(yōu)化
最終模型輸出是
每一批數(shù)據(jù),模型同時(shí)優(yōu)化只是在優(yōu)化算法上
使用Follow-the-regularized-leader (FTRL)+L1正則 FTRL優(yōu)化算法
使用AdaGrad
注意這里的同時(shí)優(yōu)化,google論文中叫joint training(聯(lián)合訓(xùn)練)。并非ensemble(集成學(xué)習(xí))
這是因?yàn)閷?duì)于集成學(xué)習(xí),每個(gè)子學(xué)習(xí)器的訓(xùn)練都是獨(dú)立的,兩個(gè)子學(xué)習(xí)器參數(shù)不會(huì)一起訓(xùn)練。
而聯(lián)合訓(xùn)練指參數(shù)是同時(shí)更新的。
Embedding 層
- 為什么需要做embedding?
超高維度的稀疏輸入輸入網(wǎng)絡(luò),將帶來(lái)更高維度的參數(shù)矩陣,這會(huì)帶來(lái)更大的計(jì)算壓力。所以神經(jīng)網(wǎng)絡(luò)更善于處理稠密的實(shí)值輸入。所以,需要對(duì)稀疏的離散特征做embedding - 怎么做embedding?
- 1,離線(xiàn)提前做embedding,例如對(duì)于詞的嵌入可以使用Word2vec對(duì)詞做嵌入。也可利用FM先學(xué)習(xí)好稀疏特征的隱向量。
- 2,隨機(jī)初始化。之后跟著模型參數(shù)一起訓(xùn)練。其實(shí)1中無(wú)論是word2vec還是FM,也是一開(kāi)始隨機(jī)初始化,然后訓(xùn)練學(xué)習(xí)而來(lái)。這是最常用的方法。
在wide&deep中,embedding是隨機(jī)生成的,并在接下來(lái)的訓(xùn)練中更新
The embedding values are initialized randomly, and are trained along with all other model parameters to minimize the training loss.
通常會(huì)用
tf.feature_column.embedding_column(categorical_column,
dimension,
combiner='mean',
initializer=None,
ckpt_to_load_from=None,
tensor_name_in_ckpt=None,
max_norm=None,
trainable=True)
注意參數(shù)trainable=True
即默認(rèn)會(huì)繼續(xù)訓(xùn)練這個(gè)embedding
而當(dāng)設(shè)置trainable=False
時(shí),一般配合已經(jīng)訓(xùn)練好的embedding
討論
- wide與deep分別代表了什么?
wide是簡(jiǎn)單的線(xiàn)性模型,他會(huì)記住訓(xùn)練數(shù)據(jù)中已經(jīng)出現(xiàn)的模式,并賦予權(quán)重。這代表了記憶
deep是深度的復(fù)雜模型,會(huì)在一層層的網(wǎng)絡(luò)中計(jì)算出訓(xùn)練數(shù)據(jù)中未出現(xiàn)的模式的權(quán)重。這代表了泛化
這里的模式,可以簡(jiǎn)單理解為特征組合。
Wide側(cè)就是普通LR,一般根據(jù)人工先驗(yàn)知識(shí),將一些簡(jiǎn)單、明顯的特征交叉,喂入Wide側(cè),讓W(xué)ide側(cè)能夠記住這些規(guī)則。
Deep側(cè)就是DNN,通過(guò)embedding的方式將categorical/id特征映射成稠密向量,讓DNN學(xué)習(xí)到這些特征之間的深層交叉,以增強(qiáng)擴(kuò)展能力。
但其實(shí)deep模型本身也會(huì)記住已出現(xiàn)的模式并進(jìn)行訓(xùn)練吧?相當(dāng)于低階特征也可以得到有效利用,為什么還要加上wide模型呢?
可能原因:deep模型可解釋性不強(qiáng)。wide模型可解釋性強(qiáng)。通過(guò)wide模型可以挑選出權(quán)重較高的低階特征。同時(shí),對(duì)低階特征另外單獨(dú)建模,也是很有可能提高精度的。其他
https://zhuanlan.zhihu.com/p/47293765
相比于實(shí)數(shù)型特征,稀疏的類(lèi)別/ID類(lèi)特征,才是推薦、搜索領(lǐng)域的“一等公民”,被研究得更多。即使有一些實(shí)數(shù)值特征,比如歷史曝光次數(shù)、點(diǎn)擊次數(shù)、CTR之類(lèi)的,也往往通過(guò)bucket的方式,變成categorical特征,才喂進(jìn)模型。
推薦、搜索喜歡稀疏的類(lèi)別/ID類(lèi)特征,可能有三方面的原因:
https://zhuanlan.zhihu.com/p/47293765
1,LR, DNN在底層還是一個(gè)線(xiàn)性模型,但是現(xiàn)實(shí)生活中,標(biāo)簽y與特征x之間較少存在線(xiàn)性關(guān)系,而往往是分段的。以“點(diǎn)擊率-歷史曝光次數(shù)”之間的關(guān)系為例,之前曝光過(guò)1、2次的時(shí)候,“點(diǎn)擊率-歷史曝光次數(shù)”之間一般是正相關(guān)的,再多曝光1、2次,用戶(hù)由于好奇,沒(méi)準(zhǔn)就點(diǎn)擊了;但是,如果已經(jīng)曝光過(guò)8、9次了,由于用戶(hù)已經(jīng)失去了新鮮感,越多曝光,用戶(hù)越不可能再點(diǎn),這時(shí)“點(diǎn)擊率~歷史曝光次數(shù)”就表現(xiàn)出負(fù)相關(guān)性。因此,categorical特征相比于numeric特征,更加符合現(xiàn)實(shí)場(chǎng)景。
2,推薦、搜索一般都是基于用戶(hù)、商品的標(biāo)簽畫(huà)像系統(tǒng),而標(biāo)簽天生就是categorical的
3,稀疏的類(lèi)別/ID類(lèi)特征,可以稀疏地存儲(chǔ)、傳輸、運(yùn)算,提升運(yùn)算效率。
參考
https://blog.csdn.net/google19890102/article/details/78171283
https://zhuanlan.zhihu.com/p/47293765
Wide & Deep Learning for Recommender Systems - - Google
FTRL優(yōu)化算法
tensorflow_wide&deep.md
wide_deep的一個(gè)實(shí)現(xiàn)