基于Wide Deep Learning的推荐系统
我們先來看下Google Inc的paper:Wide & Deep Learning for Recommender Systems。
一、介紹
推薦系統(tǒng)可以看成是一個(gè)搜索排序系統(tǒng),其中輸入的query是一個(gè)用戶和上下文的集合,輸出是一個(gè)item列表。給定一個(gè)query,推薦任務(wù)就是在數(shù)據(jù)庫中找到相關(guān)的items,接著基于目標(biāo)(比如:點(diǎn)擊or購買)去對items進(jìn)行排序。
推薦系統(tǒng)與常見的搜索排序問題相同的一個(gè)挑戰(zhàn)是,同時(shí)滿足Memorization和Generalization。Memorization可以寬泛地定義成學(xué)到items或features的共現(xiàn)率,并利用(exploiting)這種在歷史數(shù)據(jù)中的相關(guān)關(guān)系(correlation)。Generalization則基于相關(guān)關(guān)系的轉(zhuǎn)移,并探索(explores)在過往很少或從不出現(xiàn)的新的特征組合。基于Memorization的推薦系統(tǒng)通常更局部化(topical),將items與執(zhí)行相應(yīng)動(dòng)作的users直接相關(guān)。而基于Generalization的推薦則更趨向于推薦多樣化的items。在本papers中,我們主要關(guān)注Google Play Stores的推薦問題,方法本身可用于其它場景。
對于工業(yè)界大規(guī)模的在線推薦和排序系統(tǒng),常用的線性模型(比如:logistic regression)被廣泛使用,因?yàn)樗暮唵涡?、可擴(kuò)展性以及可解釋性。模型通常在使用one-hot編碼的二值化的稀疏特征上。例如,二值化特征”user_installed_app=netflix”,如果用戶過去安裝(installed)了Netflix,則具有特征值1.?通過在稀疏特征上使用cross-product transformation可以有效地達(dá)到Memorization,比如AND(user_installed_app=netflix, impression_app=pandora),如果用戶過去安裝了Netflix,接著被曝光了Pandora,那么它的值是1.?這可以解釋一個(gè)特征對(feature pair)的共現(xiàn)率與目標(biāo)label間的相關(guān)關(guān)系。通過使用更少(粗)粒度的特征可以添加Generalization,例如:AND(user_installed_category=video, impression_category=music),(注:上面Memorization使用的是具體的app,而此處Generalization使用的僅僅是app的category),但人工的特征工程通常是必需的。(cross-product transformation)的一個(gè)限制是,不能泛化到那些在訓(xùn)練數(shù)據(jù)上沒有出現(xiàn)過的query-item特征對。
而Embedding-based的模型,比如因子分解機(jī)(FM)或深度神經(jīng)網(wǎng)絡(luò),只需要很少的特征工程,通過為每個(gè)query和item特征對(pair)學(xué)到一個(gè)低維的dense embedding vector,可以泛化到之前未見過的query-item特征對,。然而,當(dāng)?shù)讓拥膓uery-item矩陣很稀疏和高秩(high-rank)時(shí)(比如,用戶具有特殊偏好或很少出現(xiàn)的items),很難為query-item pair學(xué)到有效的低維表示。在這種情況下,大多數(shù)query-item pairs之間是沒有交叉的,但dense embeddings會(huì)為所有的query-item pairs生成非零的預(yù)測,這樣會(huì)過泛化(over-generalize),并生成不相關(guān)的推薦。另一方面,使用交叉特征轉(zhuǎn)換(cross-product features transformations)的線性模型可以使用更少的參數(shù)就能記住(memorize)這些“異常規(guī)則(exception rules)”。(embedding 優(yōu)點(diǎn):泛化,缺點(diǎn):稀疏時(shí))
在本文中,我們提出了Wide&Deep learning框架來在同一個(gè)模型中達(dá)到Memorization 和 Generalization,通過聯(lián)合訓(xùn)練一個(gè)如圖一所示的線性模型組件和一個(gè)神經(jīng)網(wǎng)絡(luò)組件。
本文的主要貢獻(xiàn):
- Wide & Deep 學(xué)習(xí)框架,可以用于聯(lián)合訓(xùn)練帶embeddings的feed-forward神經(jīng)網(wǎng)絡(luò)以及帶特征轉(zhuǎn)換的線性模型,用于帶稀疏輸入的常見推薦系統(tǒng)中。
- Wide & Deep推薦系統(tǒng)的實(shí)現(xiàn)和評(píng)估在Google Play上已經(jīng)產(chǎn)品化,這個(gè)app store具有數(shù)十億的活躍用戶、以及上百萬的app。
- 開源,在Tensorflow上提供了一個(gè)高級(jí)API。
思想很簡單,我們展示了Wide & Deep框架,它極大地提升了App的獲得率(acquisition rate)并且同時(shí)滿足training和serving的速度要求。
推薦系統(tǒng)總覽
app推薦系統(tǒng)如圖二所示。一個(gè)query,它包含著許多用戶和上下文特征,當(dāng)一個(gè)用戶訪問app store時(shí)生成。推薦系統(tǒng)會(huì)返回一個(gè)app列表(曝光:impressions),用戶在此之上會(huì)執(zhí)行特定的動(dòng)作(點(diǎn)擊:click或購買:purchase)。這些用戶動(dòng)作,伴隨著queries和impressions,會(huì)以日志的形式記錄下來。
由于在數(shù)據(jù)庫中有超過百萬的app,對于在serving延遲條件之內(nèi)(通常為O(10)ms)的每一個(gè)query,盡可能得對每一個(gè)app進(jìn)行評(píng)分是相當(dāng)困難。因此,上述第一步收到一個(gè)query的過程是檢索(retrieval)。檢索系統(tǒng)會(huì)返回一個(gè)最匹配query的item的短列表,通常使用機(jī)器學(xué)習(xí)模型和人工定義規(guī)則來達(dá)到。在數(shù)量減至候選池后,排序系統(tǒng)(ranking system)會(huì)通過它們的得分對所有items進(jìn)行排序。得分通常是P(y|x)P(y|x),對于給定的特征x,一個(gè)用戶的動(dòng)作標(biāo)簽y,包括用戶特征(比如:國家,語言,人口屬性信息),上下文特征(比如:設(shè)備,天的小時(shí),周的天),曝光特征(比如:app age, app的歷史統(tǒng)計(jì)信息)。在本文中,我們只關(guān)注在排序系統(tǒng)中使用Wide & Deep 學(xué)習(xí)框架。
3. Wide & Deep Learning
3.1 Wide組件
wide組件是一個(gè)泛化的線性模型,形式為:y=wTx+by=wTx+b,如圖1(左)所示。y是預(yù)測,x=[x1,x2,…,xd]x=[x1,x2,…,xd]是d維的特征向量,?w=[w1,w2,…,wd]w=[w1,w2,…,wd]是模型參數(shù),其中b為bias。特征集包括原始的輸入特征和轉(zhuǎn)換后的特征,一個(gè)最重要的轉(zhuǎn)換是,cross-product transformation。它可以定義成:
?k(x)=∏i=1dxckii,cki∈{0,1}?k(x)=∏i=1dxicki,cki∈{0,1}
…(1)
其中ckicki為一個(gè)boolean變量,如果第i個(gè)特征是第k個(gè)變換?k?k的一部分,那么為1; 否則為0.對于二值特征,一個(gè)cross-product transformation(比如:”AND(gender=female, language=en)”)只能當(dāng)組成特征(“gender=female” 和 “l(fā)anguage=en”)都為1時(shí)才會(huì)為1, 否則為0. 這會(huì)捕獲二值特征間的交叉,為通用的線性模型添加非線性。
3.2 Deep組件
Deep組件是一個(gè)前饋神經(jīng)網(wǎng)絡(luò)(feed-forward NN),如圖1(右)所示。對于類別型特征,原始的輸入是特征字符串(比如:”language=en”)。這些稀疏的,高維的類別型特征會(huì)首先被轉(zhuǎn)換成一個(gè)低維的、dense的、real-valued的向量,通常叫做“embedding vector”。embedding的維度通常是O(10)到O(100)的階。該embedding vectors被隨機(jī)初始化,接著最小化最終的loss的方式訓(xùn)練得到該值。這些低維的dense embedding vectors接著通過前向傳遞被feed給神經(jīng)網(wǎng)絡(luò)的隱層。特別地,每個(gè)隱層都會(huì)執(zhí)行以下的計(jì)算:
al+1=f(W(l)a(l)+b(l))al+1=f(W(l)a(l)+b(l))
…(2)
其中,l是層數(shù),f是激活函數(shù)(通常為ReLUs),a(l),b(l)和W(l)a(l),b(l)和W(l)分別是第l層的activations, bias,以及weights。
3.3 Wide & Deep模型的聯(lián)合訓(xùn)練
Wide組件和Deep組件組合在一起,對它們的輸入日志進(jìn)行一個(gè)加權(quán)求和來做為預(yù)測,它會(huì)被feed給一個(gè)常見的logistic loss function來進(jìn)行聯(lián)合訓(xùn)練。注意,聯(lián)合訓(xùn)練(joint training)和集成訓(xùn)練(ensemble)有明顯的區(qū)別。在ensemble中,每個(gè)獨(dú)立的模型會(huì)單獨(dú)訓(xùn)練,相互并不知道,只有在預(yù)測時(shí)會(huì)組合在一起。相反地,聯(lián)合訓(xùn)練(joint training)會(huì)同時(shí)優(yōu)化所有參數(shù),通過將wide組件和deep組件在訓(xùn)練時(shí)進(jìn)行加權(quán)求和的方式進(jìn)行。這也暗示了模型的size:對于一個(gè)ensemble,由于訓(xùn)練是不聯(lián)合的(disjoint),每個(gè)單獨(dú)的模型size通常需要更大些(例如:更多的特征和轉(zhuǎn)換)來達(dá)到合理的精度。相比之下,對于聯(lián)合訓(xùn)練(joint training)來說,wide組件只需要補(bǔ)充deep組件的缺點(diǎn),使用一小部分的cross-product特征轉(zhuǎn)換即可,而非使用一個(gè)full-size的wide模型。
一個(gè)Wide&Deep模型的聯(lián)合訓(xùn)練,通過對梯度進(jìn)行后向傳播算法、SGD優(yōu)化來完成。在試驗(yàn)中,我們使用FTRL算法,使用L1正則做為Wide組件的優(yōu)化器,對Deep組件使用AdaGrad。
組合模型如圖一(中)所示。對于一個(gè)logistic regression問題,模型的預(yù)測為:
P(Y=1|x)=σ(wTwide[x,?(x)]+wTdeepa(lf)+b)P(Y=1|x)=σ(wwideT[x,?(x)]+wdeepTa(lf)+b)
…(3)
其中Y是二分類的label,σ(?)σ(·)是sigmoid function,??(x)?(x)是對原始特征x做cross product transformations,b是bias項(xiàng)。wwidewwide是所有wide模型權(quán)重向量,wdeepwdeep是應(yīng)用在最終激活函數(shù)a(lf)a(lf)上的權(quán)重。
4.系統(tǒng)實(shí)現(xiàn)
app推薦的pipeline實(shí)現(xiàn)包含了三個(gè)stage:數(shù)據(jù)生成,模型訓(xùn)練,模型serving。如圖3所示。
4.1 數(shù)據(jù)生成
在這一階段,用戶和app的曝光數(shù)據(jù)在一定時(shí)間內(nèi)被用于生成訓(xùn)練數(shù)據(jù)。每個(gè)樣本對應(yīng)于一個(gè)曝光。label為app的獲得率(acquisition):如果曝光的app被下載則為1, 否則為0.
詞匯表(Vocabularies),它是一個(gè)關(guān)于將類別特征字符串映射到integer ID上的表,也在該階段生成。該系統(tǒng)會(huì)為至少出現(xiàn)過某個(gè)最小次數(shù)的所有的string特征計(jì)算ID空間。連續(xù)的real-valued特征被歸一化到[0, 1],通過將一個(gè)特征值x映射到它的累積分布函數(shù)P(X<=x)P(X<=x),將它分成nqnq份 (quantiles)。對于第i個(gè)份(quantiles),對應(yīng)的歸一化值為:i?1nq?1i?1nq?1。分位數(shù)(quantiles)邊界在數(shù)據(jù)生成階段計(jì)算。
4.2 模型訓(xùn)練
我們在試驗(yàn)中使用的模型結(jié)構(gòu)如圖4所示。在訓(xùn)練期間,我們的輸入層接受訓(xùn)練數(shù)據(jù)和詞匯表的輸入,一起為一個(gè)label生成sparse和dense特征。wide組件包含了用戶安裝app和曝光app的cross-product transformation。對于模型的deep組件,會(huì)為每個(gè)類別型特征學(xué)到一個(gè)32維的embedding向量。我們將所有embeddings聯(lián)接起來形成dense features,產(chǎn)生一個(gè)接近1200維的dense vector。聯(lián)接向量接著輸入到3個(gè)ReLU層,以及最終的logistic輸出單元。
此處做個(gè)注解(美食推薦場景FoodIO):wide模型的目的是,記住(memorize)哪些items能更好地對應(yīng)每個(gè)query。因此,你訓(xùn)練帶交叉特征轉(zhuǎn)換的線性模型,是為了捕獲一個(gè)query-item feature pair與相應(yīng)的目標(biāo)label(一個(gè)item是否被消費(fèi)、購買)間的共現(xiàn)關(guān)系。該模型會(huì)預(yù)測每個(gè)item的消費(fèi)概率?P(consumption∥query,item)P(consumption‖query,item),接著FoodIO會(huì)返回最高預(yù)測購買率的top item。例如,模型學(xué)到了特征:AND(query=”炸雞(fried chicken)”, item=”雞肉和華夫餅(chicken and waffles)”)的效果很好,而AND(query=”炸雞(fried chicken)”, item=”雞肉炒飯(chicken fried rice)”)這個(gè)并不受喜歡,盡管字符上更匹配。換句話說,它可以記住哪些用戶喜歡,從而獲得更多的交易額。
同理:上述wide中提到的installed app和impressed app可以理解成是上面的item和query。
Wide & Deep模型在超過5000億的樣本上進(jìn)行訓(xùn)練。每一時(shí)刻有新的訓(xùn)練數(shù)據(jù)集到達(dá)時(shí),模型需要重新訓(xùn)練。然而,每次從頭到尾重新訓(xùn)練的計(jì)算開銷很大,數(shù)據(jù)到達(dá)和模型更新后serving間的延遲較大。為了解決該問題,我們實(shí)現(xiàn)了一個(gè)warm-starting系統(tǒng),它會(huì)使用前一個(gè)模型的embeddings和線性模型權(quán)重來初始化一個(gè)新的模型。
在將模型加載到模型服務(wù)器上之前,需要做模型的演習(xí),以便確保它不會(huì)在serving的真實(shí)環(huán)境上出現(xiàn)問題。我們在經(jīng)驗(yàn)上會(huì)驗(yàn)證模型質(zhì)量,對比前一模型做心智檢查(sanity check)。
4.3 模型Serving
一旦模型被訓(xùn)練和驗(yàn)證后,我們會(huì)將它加載到模型服務(wù)器上。對于每個(gè)請求,服務(wù)器會(huì)從app檢索系統(tǒng)上接收到一個(gè)app候選集,以及用戶特征來從高到低排序,接著將app按順序展示給用戶。得分的計(jì)算通過在Wide&Deep模型上運(yùn)行一個(gè)前向推斷傳遞(forward inference pass)來計(jì)算。
為了在10ms的級(jí)別服務(wù)每個(gè)請求,我們使用多線程并行來優(yōu)化性能,運(yùn)行運(yùn)行更小的batches,而不是在單個(gè)batch inference step中為所有的候選app進(jìn)行scoring。
5.試驗(yàn)結(jié)果
為了在真實(shí)的推薦系統(tǒng)上評(píng)估Wide & Deep learning的效果,我們運(yùn)行了在線試驗(yàn),并在兩部分進(jìn)行系統(tǒng)評(píng)測:app獲得率(app acquisitions)和serving性能。
5.1 App Acquisitions
我們在一個(gè)A/B testing框架上做了3周的試驗(yàn)。對于控制組,1%的用戶被隨機(jī)選中,推薦由之前版本的排序系統(tǒng)生成,它是一個(gè)高度優(yōu)化的wide-only logistic regression模型,具有豐富的cross-product特征轉(zhuǎn)換。對于試驗(yàn)組,隨機(jī)選中1%的用戶,使用相同的特征進(jìn)行訓(xùn)練。如表1所示,Wide & Deep模型在app store的主頁上提升了app acquisition rate,對比控制組,有+3.9%的提升。另一個(gè)分組只使用deep組件,使用相同的神經(jīng)網(wǎng)絡(luò)模型,具有+1%的增益。
除了在線試驗(yàn),我們也展示了在held-out離線數(shù)據(jù)上的AUC。其中Wide & Deep具有更高的離線AUC,在線也更好。一個(gè)可能的原因是,曝光和點(diǎn)擊在離線數(shù)據(jù)集上是確定的,而在線系統(tǒng)通過混合generalization和memorization,從新的用戶響應(yīng)學(xué)到,生成新的探索推薦。
5.2 Serving Performance
Serving時(shí)具有高的吞吐率(throughout)和低延時(shí)是很有挑戰(zhàn)性的。在高峰期,我們的推薦服務(wù)每秒處理1000w個(gè)app得分。單個(gè)線程上,在單個(gè)batch上為所有的候選得進(jìn)行scoring會(huì)花費(fèi)31ms。我們實(shí)現(xiàn)了多線程,并會(huì)將每個(gè)batch分割到更小的size上,它會(huì)將客戶端的延遲的延遲減小到14ms上,所圖2所示。
6.相關(guān)工作
將使用特征交叉轉(zhuǎn)換的wide linear model與使用dense embeddings的deep neural networks,受之前工作的啟發(fā),比如FM:它會(huì)向線性模型中添加generalization,它會(huì)將兩個(gè)變量的交互分解成兩個(gè)低維向量的點(diǎn)積。在該paper中,我們擴(kuò)展了模型的能力,通過神經(jīng)網(wǎng)絡(luò)而非點(diǎn)積,來學(xué)習(xí)在embeddings間的高度非線性交叉(highly nonlinear interactions)。
在語言模型中,提出了RNN和n-gram的最大熵模型的joint training,通過學(xué)習(xí)從input到output之間的直接權(quán)重,可以極大減小RNN的復(fù)雜度(hidden layer)。在計(jì)算機(jī)視覺中,deep residual learning被用于減小訓(xùn)練更深模型的難度,使用簡短連接(跳過一或多層)來提升accuracy。神經(jīng)網(wǎng)絡(luò)與圖模型的joint training被用于人體姿式識(shí)別。在本文中,我們會(huì)探索前饋神經(jīng)網(wǎng)絡(luò)和線性模型的joint training,將稀疏特征和output unit進(jìn)行直接連接,使用稀疏input數(shù)據(jù)來進(jìn)行通用的推薦和ranking問題。
7.Tensorflow
只需要3步,即可以使用tf.estimator API來配置一個(gè)wide,deep或者Wide&Deep:
- 1.選中wide組件的特征:選中你想用的稀疏的base特征列和交叉列特征列
- 2.選擇deep組件的特征:選擇連續(xù)型的列,對于每個(gè)類別型列的embedding維,以及隱層的size。
- 將它們放置到一個(gè)Wide&Deep模型中(DNNLinearCombinedClassifier)
關(guān)于更詳細(xì)的操作,示例代碼在:/tensorflow/tensorflow/examples/learn/wide_n_deep_tutorial.py,具體詳見tensorflow tutorial。
參考
- 0.Wide & Deep Learning for Recommender Systems
- 1.TensorFlow Wide & Deep Learning Tutorial
- https://ai.googleblog.com/2016/06/wide-deep-learning-better-together-with.html
總結(jié)
以上是生活随笔為你收集整理的基于Wide Deep Learning的推荐系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 构建并用 TensorFlow Serv
- 下一篇: java信息管理系统总结_java实现科