自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

推薦系統(tǒng)經(jīng)典模型Wide & Deep

開發(fā) 前端
今天我們剖析的也是推薦領(lǐng)域的經(jīng)典論文,叫做Wide & Deep Learning for Recommender Systems。它發(fā)表于2016年,作者是Google App Store的推薦團(tuán)隊(duì)。

 [[349422]]

今天我們剖析的也是推薦領(lǐng)域的經(jīng)典論文,叫做Wide & Deep Learning for Recommender Systems。它發(fā)表于2016年,作者是Google App Store的推薦團(tuán)隊(duì)。這年剛好是深度學(xué)習(xí)興起的時(shí)間。這篇文章討論的就是如何利用深度學(xué)習(xí)模型來(lái)進(jìn)行推薦系統(tǒng)的CTR預(yù)測(cè),可以說(shuō)是在推薦系統(tǒng)領(lǐng)域一次深度學(xué)習(xí)的成功嘗試。

著名的推薦模型Wide & deep就是出自這篇論文,這個(gè)模型因?yàn)閷?shí)現(xiàn)簡(jiǎn)單,效果不俗而在各大公司廣泛應(yīng)用。因此它同樣也可以認(rèn)為是推薦領(lǐng)域的必讀文章之一。

長(zhǎng)文預(yù)警,建議先馬后看。

摘要

在大規(guī)模特征的場(chǎng)景當(dāng)中,我們通常(2016年之前)是使用將非線性特征應(yīng)用在線性模型上的做法來(lái)實(shí)現(xiàn)的,使用這種方式,我們的輸入會(huì)是一個(gè)非常稀疏的向量。雖然我們要實(shí)現(xiàn)這樣的非線性特征,通過(guò)一些特征轉(zhuǎn)化以及特征交叉的方法是可以實(shí)現(xiàn)的,但是這會(huì)需要消耗大量的人力物力。

這個(gè)問題其實(shí)我們之前在介紹FM模型的時(shí)候也曾經(jīng)提到過(guò),對(duì)于FM模型來(lái)說(shuō),其實(shí)解決的也是同樣的問題。只是解決的方法不同,F(xiàn)M模型的方法是引入一個(gè)n x k的參數(shù)矩陣V來(lái)計(jì)算所有特征兩兩交叉的權(quán)重,來(lái)降低參數(shù)的數(shù)量以及提升預(yù)測(cè)和訓(xùn)練的效率。而在本篇paper當(dāng)中,討論的是使用神經(jīng)網(wǎng)絡(luò)來(lái)解決這個(gè)問題。

解決問題的核心在于embedding,embedding直譯過(guò)來(lái)是嵌入,但是這樣并不容易理解。一般來(lái)說(shuō)我們可以理解成某些特征的向量表示。比如Word2Vec當(dāng)中,我們做的就是把一個(gè)單詞用一個(gè)向量來(lái)表示。這些向量就稱為word embedding。embedding有一個(gè)特點(diǎn)就是長(zhǎng)度是固定的,但是值一般是通過(guò)神經(jīng)網(wǎng)絡(luò)來(lái)學(xué)習(xí)得到的。

我們可以利用同樣訓(xùn)練embedding的方式來(lái)在神經(jīng)網(wǎng)絡(luò)當(dāng)中訓(xùn)練一些特征的embedding,這樣我們需要的特征工程的工作量就大大地減少。但是僅僅使用embedding也是不行的,在一些場(chǎng)景當(dāng)中可能會(huì)引起過(guò)擬合,所以我們需要把線性特征以及稀疏特征結(jié)合起來(lái),這樣就可以讓模型既不會(huì)陷入過(guò)擬合,又可以有足夠的能力可以學(xué)到更好的效果。

簡(jiǎn)介

正如我們之前文章所分享的一樣,推薦系統(tǒng)也可以看成是搜索的排序系統(tǒng)。它的輸入是一個(gè)用戶信息以及用戶瀏覽的上下文信息,返回的結(jié)果是一個(gè)排好序的序列。

正因?yàn)槿绱?,?duì)于推薦系統(tǒng)來(lái)說(shuō),也會(huì)面臨一個(gè)和搜索排序系統(tǒng)一個(gè)類似的挑戰(zhàn)——記憶性和泛化性的權(quán)衡。記憶性可以簡(jiǎn)單地理解成對(duì)商品或者是特征之間成對(duì)出現(xiàn)的一種學(xué)習(xí),由于用戶的歷史行為特征是非常強(qiáng)的特征,記憶性因此可以帶來(lái)更好的效果。但是與之同時(shí)也會(huì)有問題產(chǎn)生,最典型的問題就是模型的泛化能力不夠。

對(duì)于泛化能力來(lái)說(shuō),它的主要來(lái)源是特征之間的相關(guān)性以及傳遞性。有可能特征A和B直接和label相關(guān),也可能特征A與特征B相關(guān),特征B與label相關(guān),這種就稱為傳遞性。利用特征之間的傳遞性, 我們就可以探索一些歷史數(shù)據(jù)當(dāng)中很少出現(xiàn)的特征組合,從而獲得很強(qiáng)的泛化能力。

在大規(guī)模的在線推薦以及排序系統(tǒng)當(dāng)中,比如像是LR這樣的線性模型被廣泛應(yīng)用,因?yàn)檫@些模型非常簡(jiǎn)單、拓展性好、性能很強(qiáng),并且可解釋性也很好。這些模型經(jīng)常用one-hot這樣的二進(jìn)制數(shù)據(jù)來(lái)訓(xùn)練,舉個(gè)例子,比如如果用戶安裝了netflix,那么user_installed_app=netflix這個(gè)特征就是1,否則就是0。因此呢,一些二階特征的可解釋性就很強(qiáng)。

比如用戶如果還瀏覽過(guò)了Pandora,那么user_installed_app=netflix,impression_app=pandora這個(gè)聯(lián)合特征就是1,聯(lián)合特征的權(quán)重其實(shí)就是這兩者的相關(guān)性。但是這樣的特征需要大量的人工操作,并且由于樣本的稀疏性,對(duì)于一些沒有在訓(xùn)練數(shù)據(jù)當(dāng)中出現(xiàn)過(guò)的組合,模型就無(wú)法學(xué)習(xí)到它們的權(quán)重了。

但是這個(gè)問題可以被基于embedding的模型解決,比如之前介紹過(guò)的FM模型,或者是深度神經(jīng)網(wǎng)絡(luò)。它可以通過(guò)訓(xùn)練出低維度下的embedding,用embedding向量去計(jì)算得到交叉特征的權(quán)重。然而如果特征非常稀疏的話,我們也很難保證生成的embedding的效果。比如用戶的偏好比較明顯,或者是商品比較小眾,在這樣的情況下會(huì)使得大部分的query-item的pair對(duì)沒有行為,然而由embedding算出來(lái)的權(quán)重可能大于0,因此而導(dǎo)致過(guò)擬合,使得推薦結(jié)果不準(zhǔn)。對(duì)于這種特殊的情況,線性模型的擬合、泛化能力反而更好。

在這篇paper當(dāng)中,我們將會(huì)介紹Wide & Deep模型,它在一個(gè)模型當(dāng)中兼容了記憶性以及泛化性。它可以同時(shí)訓(xùn)練線性模型以及神經(jīng)網(wǎng)絡(luò)兩個(gè)部分,從而達(dá)到更好的效果。

論文的主要內(nèi)容有以下幾點(diǎn):

Wide & Deep模型,包含前饋神經(jīng)網(wǎng)絡(luò)embedding部分以及以及線性模型特征轉(zhuǎn)換,在廣義推薦系統(tǒng)當(dāng)中的應(yīng)用

Wide & Deep模型在Google Play場(chǎng)景下的實(shí)現(xiàn)與評(píng)估,Google Play是一個(gè)擁有超過(guò)10億日活和100w App的移動(dòng)App商店

推薦系統(tǒng)概述

這是一張經(jīng)典的推薦系統(tǒng)的架構(gòu)圖:

 

當(dāng)用戶訪問app store的時(shí)候會(huì)生成一個(gè)請(qǐng)求,這個(gè)請(qǐng)求當(dāng)中會(huì)包含用戶以及上下文的特征。推薦系統(tǒng)會(huì)返回一系列的app,這些app都是模型篩選出來(lái)用戶可能會(huì)點(diǎn)擊或者是購(gòu)買的app。當(dāng)用戶看到這些信息之后,會(huì)產(chǎn)生一些行為,比如瀏覽(沒有行為)、點(diǎn)擊、購(gòu)買,產(chǎn)生行為之后,這些數(shù)據(jù)會(huì)被記錄在Logs當(dāng)中,成為訓(xùn)練數(shù)據(jù)。

我們看下上面部分,也就是從DataBase到Retrieval的部分。由于Database當(dāng)中的數(shù)據(jù)量過(guò)大,足足有上百萬(wàn)。所以我們想要在規(guī)定時(shí)間內(nèi)(10毫秒)給所有的app都調(diào)用模型打一個(gè)分,然后進(jìn)行排序是不可能的。所以我們需要對(duì)請(qǐng)求進(jìn)行Retrieval,也就是召回。Retrieval系統(tǒng)會(huì)對(duì)用戶的請(qǐng)求進(jìn)行召回,召回的方法有很多,可以利用機(jī)器學(xué)習(xí)模型,也可以進(jìn)行規(guī)則。一般來(lái)說(shuō)都是先基于規(guī)則快速篩選,再進(jìn)行機(jī)器學(xué)習(xí)模型過(guò)濾。

進(jìn)行篩選和檢索結(jié)束之后,最后再調(diào)用Wide & Deep模型進(jìn)行CTR預(yù)估,根據(jù)預(yù)測(cè)出來(lái)的CTR對(duì)這些APP進(jìn)行排序。在這篇paper當(dāng)中我們同樣忽略其他技術(shù)細(xì)節(jié),只關(guān)注與Wide & Deep模型的實(shí)現(xiàn)。

Wide & Deep原理

首先我們來(lái)看下業(yè)內(nèi)的常用的模型的結(jié)構(gòu)圖:

 

這張圖源于論文,從左到右分別展示了Wide模型,Wide & Deep模型以及Deep模型。從圖上我們也看得出來(lái)所謂的Wide模型呢其實(shí)就是線性模型,Deep模型是深度神經(jīng)網(wǎng)絡(luò)模型。下面結(jié)合這張圖對(duì)這兩個(gè)部分做一個(gè)詳細(xì)一點(diǎn)的介紹。

Wide部分

Wide部分其實(shí)就是一個(gè)泛化的形如的線性模型,就如上圖左邊部分所展示的一樣。y是我們要預(yù)測(cè)的結(jié)果,x是特征,它是一個(gè)d維的向量。這里的d是特征的數(shù)量。同樣w也是一個(gè)d維的權(quán)重向量,b呢則是偏移量。這些我們?cè)谥熬€性回歸的模型當(dāng)中曾經(jīng)都介紹過(guò),大家應(yīng)該也都不陌生。

特征包含兩個(gè)部分,一種是原始數(shù)據(jù)直接拿過(guò)來(lái)的數(shù)據(jù),另外一種是我們經(jīng)過(guò)特征轉(zhuǎn)化之后得到的特征。最重要的一種特征轉(zhuǎn)化方式就是交叉組合,交叉組合可以定義成如下形式:

這里的是一個(gè)bool型的變量,表示的是第i個(gè)特征的第k種轉(zhuǎn)化函數(shù)的結(jié)果。由于使用的是乘積的形式,只有所有項(xiàng)都為真,最終的結(jié)果才是1,否則是0。比如"AND(gender=female,language=en)"這就是一個(gè)交叉特征,只有當(dāng)用戶的性別為女,并且使用的語(yǔ)言為英文同時(shí)成立,這個(gè)特征的結(jié)果才會(huì)是1。通過(guò)這種方式我們可以捕捉到特征之間的交互,以及為線性模型加入非線性的特征。

Deep部分

Deep部分是一個(gè)前饋神經(jīng)網(wǎng)絡(luò),也就是上圖當(dāng)中的右側(cè)部分。

 

我們觀察一下這張圖會(huì)發(fā)現(xiàn)很多細(xì)節(jié),比如它的輸入是一個(gè)sparse的feature,可以簡(jiǎn)單理解成multihot的數(shù)組。這個(gè)輸入會(huì)在神經(jīng)網(wǎng)絡(luò)的第一層轉(zhuǎn)化成一個(gè)低維度的embedding,然后神經(jīng)網(wǎng)絡(luò)訓(xùn)練的是這個(gè)embedding。這個(gè)模塊主要是被設(shè)計(jì)用來(lái)處理一些類別特征,比如說(shuō)item的類目,用戶的性別等等。

和傳統(tǒng)意義上的one-hot方法相比,embedding的方式用一個(gè)向量來(lái)表示一個(gè)離散型的變量,它的表達(dá)能力更強(qiáng),并且這個(gè)向量的值是讓模型自己學(xué)習(xí)的,因此泛化能力也大大提升。這也是深度神經(jīng)網(wǎng)絡(luò)當(dāng)中常見的做法。

Wide & Deep合并

Wide部分和Deep部分都有了之后,通過(guò)加權(quán)的方式合并在一起。這也就是上圖當(dāng)中的中間部分。

 

最上層輸出之前其實(shí)是一個(gè)sigmoid層或者是一個(gè)linear層,就是一個(gè)簡(jiǎn)單的線性累加。英文叫做joint,paper當(dāng)中還列舉了joint和ensemble的區(qū)別,對(duì)于ensemble模型來(lái)說(shuō),它的每一個(gè)部分是獨(dú)立訓(xùn)練的。而joint模型當(dāng)中的不同部分是聯(lián)合訓(xùn)練的。ensemble模型當(dāng)中的每一個(gè)部分的參數(shù)是互不影響的,但是對(duì)于joint模型而言,它當(dāng)中的參數(shù)是同時(shí)訓(xùn)練的。

這樣帶來(lái)的結(jié)果是,由于訓(xùn)練對(duì)于每個(gè)部分是分開的,所以每一個(gè)子模型的參數(shù)空間都很大,這樣才能獲得比較好的效果。而joint訓(xùn)練的方式則沒有這個(gè)問題,我們把線性部分和深度學(xué)習(xí)的部分分開,可以互補(bǔ)它們之間的缺陷,從而達(dá)到更好的效果,并且也不用人為地?cái)U(kuò)大訓(xùn)練參數(shù)的數(shù)量。

系統(tǒng)實(shí)現(xiàn)

app推薦的數(shù)據(jù)流包含了三個(gè)部分:數(shù)據(jù)生產(chǎn)、模型訓(xùn)練以及模型服務(wù)。用一張圖來(lái)展示大概是這樣的:

 

數(shù)據(jù)生產(chǎn)

在數(shù)據(jù)生產(chǎn)的階段,我們使用app在用戶面前曝光一段時(shí)間作為一個(gè)樣本,如果這個(gè)app被用戶點(diǎn)擊安裝,那么這個(gè)樣本被標(biāo)記為1,否則標(biāo)記為0。這也是絕大多數(shù)推薦場(chǎng)景下的做法。

在這個(gè)階段,系統(tǒng)會(huì)去查表,把一些字符串類別的特征轉(zhuǎn)化成int型的id。比如娛樂類的對(duì)應(yīng)1,攝影類的對(duì)應(yīng)2,比如收費(fèi)的對(duì)應(yīng)0,免費(fèi)的對(duì)應(yīng)1等等。同時(shí)會(huì)把數(shù)字類型的特征做標(biāo)準(zhǔn)化處理,縮放到[0, 1]的范圍內(nèi)。

模型訓(xùn)練

paper當(dāng)中提供了一張模型的結(jié)構(gòu)圖:

 

從上圖當(dāng)中我們可以看到,左邊是一些連續(xù)性的特征,比如年齡,安裝的app數(shù)量等等,右邊是一些離散型的特征,比如設(shè)備信息,安裝過(guò)的app等等。這些離散型的特征都會(huì)被轉(zhuǎn)化成embedding,之后和右邊的連續(xù)性特征一起進(jìn)入神經(jīng)網(wǎng)絡(luò)進(jìn)行學(xué)習(xí)。paper當(dāng)中使用的是32維的embedding。

模型每次訓(xùn)練會(huì)使用超過(guò)500 billion的樣本數(shù)量進(jìn)行訓(xùn)練,每次搜集到了新的訓(xùn)練數(shù)據(jù)都會(huì)訓(xùn)練模型。但是如果每一次訓(xùn)練我們都從頭開始的話,顯然會(huì)非常緩慢,并且會(huì)浪費(fèi)大量的計(jì)算資源。因此paper當(dāng)中選擇了一種增量更新的模式,也就是說(shuō)在模型更新的時(shí)候,會(huì)加載舊模型的參數(shù),再使用最新的數(shù)據(jù)進(jìn)行更新訓(xùn)練。在新模型更新上線之前,會(huì)先驗(yàn)證模型的效果,確認(rèn)效果沒有問題之后再進(jìn)行更新。

模型服務(wù)

當(dāng)模型被訓(xùn)練好被加載進(jìn)來(lái)之后,對(duì)于每一個(gè)請(qǐng)求,服務(wù)器都會(huì)從recall系統(tǒng)當(dāng)中獲取一系列候選的app,以及用戶的特征。接著調(diào)用模型對(duì)每一個(gè)app進(jìn)行打分,獲取了分?jǐn)?shù)之后,服務(wù)器會(huì)對(duì)候選的app按照分?jǐn)?shù)從高到低進(jìn)行排序。

為了保證服務(wù)器的響應(yīng)能力,能夠在10ms時(shí)間內(nèi)返回結(jié)果,paper采取了多線程并發(fā)執(zhí)行的方法。老實(shí)講,我覺得這份數(shù)據(jù)有點(diǎn)虛。因?yàn)楝F(xiàn)在的模型沒有不使用并發(fā)執(zhí)行的,但即使是并發(fā)執(zhí)行,使用深度學(xué)習(xí)進(jìn)行預(yù)測(cè)也很難保證效率能夠到達(dá)這種程度。也許是還采用了其他的一些優(yōu)化,但是paper里沒有全寫出來(lái)。

模型結(jié)果

為了驗(yàn)證Wide & Deep模型的效果,paper在真實(shí)的場(chǎng)景當(dāng)中從兩個(gè)角度進(jìn)行了大量的測(cè)試。包括app的獲取量以及服務(wù)的表現(xiàn)。

App 獲取量

在線上環(huán)境進(jìn)行了為期3周的A/B測(cè)試,1個(gè)桶作為對(duì)照桶,使用之前版本的線性模型。1個(gè)桶使用Wide & Deep模型,另外一個(gè)桶只使用Deep模型,去除了linear的部分。這三個(gè)桶各自占據(jù)了1%的流量,最后得到的結(jié)果如下:

 

Wide & Deep模型不僅AUC更高,并且線上APP的獲取量也提升了3.9%。

服務(wù)性能

對(duì)于推薦系統(tǒng)來(lái)說(shuō),服務(wù)端的性能一直是一個(gè)很大的問題,因?yàn)榧刃枰休d大量的流量,也需要保證延遲非常短。而使用機(jī)器學(xué)習(xí)或者是深度學(xué)習(xí)模型來(lái)進(jìn)行CTR的預(yù)測(cè),本身的復(fù)雜度是非常高的。根據(jù)paper當(dāng)中的說(shuō)法,高峰時(shí)期,他們的服務(wù)器會(huì)承載1千萬(wàn)的qps。

如果使用單線程來(lái)處理一個(gè)batch的數(shù)據(jù)需要31毫秒,為了提升速度,他們開發(fā)了多線程打分的機(jī)制,并且將一個(gè)batch拆分成了幾個(gè)部分進(jìn)行并發(fā)計(jì)算。通過(guò)這樣的方式,將客戶端的延遲降低到了14毫秒。

 

代碼實(shí)現(xiàn)

光說(shuō)不練假把式,Wide & Deep在推薦領(lǐng)域一度表現(xiàn)不俗,并且模型的實(shí)現(xiàn)也不復(fù)雜。我曾經(jīng)使用Pytorch實(shí)現(xiàn)過(guò)一個(gè)簡(jiǎn)易版本,貼出來(lái)拋磚引玉給大家做一個(gè)參考。

  1. import torch  
  2. from torch import nn 
  3.  
  4. class WideAndDeep(nn.Module): 
  5.     def __init__(self, dense_dim=13, site_category_dim=24, app_category_dim=32): 
  6.         super(WideAndDeep, self).__init__() 
  7.         # 線性部分 
  8.         self.logistic = nn.Linear(19, 1, bias=True
  9.         # embedding部分 
  10.         self.site_emb = nn.Embedding(site_category_dim, 6) 
  11.         self.app_emb = nn.Embedding(app_category_dim, 6) 
  12.         # 融合部分 
  13.         self.fusion_layer = nn.Linear(12, 6) 
  14.      
  15.     def forward(self, x): 
  16.         site = self.site_emb(x[:, -2].long()) 
  17.         app = self.app_emb(x[:, -1].long()) 
  18.         emb = self.fusion_layer(torch.cat((site, app), dim=1)) 
  19.         return torch.sigmoid(self.logistic(torch.cat((emb, x[:, :-2]), dim=1))) 

由于我當(dāng)時(shí)的應(yīng)用場(chǎng)景比較簡(jiǎn)單,所以網(wǎng)絡(luò)結(jié)構(gòu)只有三層,但是原理是一樣的,如果要應(yīng)用在復(fù)雜的場(chǎng)景當(dāng)中,只需要增加特征以及網(wǎng)絡(luò)層次即可。

本文轉(zhuǎn)載自微信公眾號(hào)「TechFlow」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系TechFlow公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: TechFlow
相關(guān)推薦

2019-01-28 08:31:47

360架構(gòu)系統(tǒng)

2023-05-30 10:14:18

系統(tǒng)論文

2022-08-19 10:27:39

系統(tǒng)模型

2010-06-07 17:24:44

UML

2024-02-28 08:20:25

推薦系統(tǒng)大模型ChatGPT

2024-06-26 19:18:53

2023-10-11 07:20:17

2010-06-29 13:45:50

UML類圖教程

2022-08-31 10:04:28

模型算法

2022-01-12 14:40:49

推薦系統(tǒng)模型

2011-04-21 11:35:13

黑白激光打印機(jī)

2010-08-04 09:51:05

Flex學(xué)習(xí)

2011-03-04 09:39:36

Windows

2022-06-17 11:54:17

數(shù)據(jù)模型系統(tǒng)

2024-07-22 09:10:04

大語(yǔ)言模型推薦系統(tǒng)人工智能

2016-09-30 15:03:13

推薦系統(tǒng)算法

2011-08-24 23:20:51

惠普激光打印

2011-04-20 17:25:16

黑白激光打印

2022-04-08 12:36:02

模型系統(tǒng)

2017-02-05 21:02:44

大數(shù)據(jù)深度學(xué)習(xí)推薦系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)