widedeep 在贝壳推荐场景的实践
本文主要向大家介紹 wide & deep 模型在貝殼推薦場景中的實踐。
"推薦" 對于我們來說并不陌生,已經(jīng)滲透到了我們生活中的方方面面,比如淘寶的商品推薦,網(wǎng)易云的音樂推薦,抖音的短視頻推薦等。在房產(chǎn)O2O領(lǐng)域,同樣也需要推薦。無論在哪個推薦領(lǐng)域,推薦系統(tǒng)面臨的一個共同挑戰(zhàn)是如何同時滿足推薦結(jié)果的準確性和多樣性。準確性要求推薦的內(nèi)容與用戶高度相關(guān),推的精準;多樣性則要求推薦內(nèi)容更加新穎,讓用戶具有新鮮感。設(shè)計合理的推薦策略,兼顧內(nèi)容準確性和多樣性,提升線上推薦效果,一直是我們算法同學(xué)的工作重點。本文向大家介紹wide & deep 模型的設(shè)計理念與基本原理,以及該 模型在我們的業(yè)務(wù)場景中的實踐與效果。本文分享的結(jié)構(gòu)如下:
-
wide & deep 模型概述
-
wide & deep 模型在貝殼推薦場景的實踐
-
階段總結(jié)與未來規(guī)劃
wide & deep 模型概述
wide & deep模型是Google在2016年發(fā)布的一類用于分類和回歸的模型。該模型應(yīng)用到了Google Play的應(yīng)用推薦中,有效的增加了Google Play的軟件安裝量。目前wide & deep模型已經(jīng)開源,并且在TensorFlow上提供了高級API。下面將主要圍繞Google發(fā)布的論文《Wide & Deep Learning for Recommender Systems》來介紹 wide&deep 模型的原理和框架。
文中設(shè)計了一種融合淺層模型(wide)和深層模型(deep)進行聯(lián)合訓(xùn)練的框架,綜合利用淺層模型的記憶能力和深層模型的泛化能力,實現(xiàn)單模型對推薦系統(tǒng)準確性和多樣性的兼顧。模型框架如圖 Figure 1 所示。
在wide & deep模型中包括兩部分,分別為wide模型和deep模型,其中wide部分是一個廣義線性模型, 上圖中的左側(cè)部分,deep模型是一個前饋神經(jīng)網(wǎng)絡(luò),如上圖右側(cè)所示。wide & deep模型的思想來源是,模仿人腦有不斷記憶并且泛化的過程,將線性模型(用于記憶)和深度神經(jīng)網(wǎng)絡(luò)模型(用于泛化)相結(jié)合,汲取各自優(yōu)勢,從而達到整體效果的最優(yōu)。
wide & deep模型旨在使得訓(xùn)練得到的模型能夠同時兼顧記憶(Memorization)與泛化(Generalization)能力:
-
Memorization:模型能夠從歷史數(shù)據(jù)中學(xué)習到高頻共現(xiàn)的特征組合,發(fā)掘特征之間的相關(guān)性,通過特征交叉產(chǎn)生特征相互作用的“記憶”,高效可解釋。但要泛化,則需要更多的特征工程。
-
Generalization:代表模型能夠利用相關(guān)性的傳遞性去探索歷史數(shù)據(jù)中從未出現(xiàn)過的特征組合,通過embedding的方法,使用低維稠密特征輸入,可以更好的泛化訓(xùn)練樣本中從未出現(xiàn)的交叉特征。
我們分別來看一下wide部分和deep部分:
Wide部分?就是我們熟知的LR線性模型,這部分主要用作學(xué)習樣本中特征的共現(xiàn)性,達到 “記憶” 的目的。該模型的表達式如下:
其中,y是預(yù)估值,x表示特征向量,w為模型參數(shù), b是偏置項。
特征集合包括原始特征和轉(zhuǎn)換后的特征,其中交叉特征在wide部分十分重要,能夠捕捉到特征間的交互,因此通常會對稀疏的特征進行交叉特征轉(zhuǎn)換,定義如下:
其中是一個布爾變量,當?shù)趥€特征是第個轉(zhuǎn)換的一部分時為1,否則為0。舉個二元特征來說,交叉特征轉(zhuǎn)換(e.g :?),只有當和同時為1時,轉(zhuǎn)換結(jié)果才為1,否則為0。因此,通過特征之間的交叉變換,便捕獲了二元特征之間的相關(guān)性,為廣義線性模型增加了非線性。
Deep部分是一個前饋神經(jīng)網(wǎng)絡(luò)。該部分的輸入,通常是一些稠密的連續(xù)特征,對于一些高維的稀疏特征(id類等特征),首先會轉(zhuǎn)換成低維且稠密的向量,就是大家常說的embeding vector,然后將這些特征拼接成一個大的稠密矩陣,再喂入第一層。在訓(xùn)練過程中通過優(yōu)化損失函數(shù)不斷迭代更新,每個隱藏層執(zhí)行下面的運算:
其中l(wèi)是隱層的標號;f是激活函數(shù),Google的論文中使用的是ReLU。
最后通過?聯(lián)合訓(xùn)練?的方式將 wide 模型的輸出和 deep 模型的輸出合并到一起。這里要重點區(qū)別聯(lián)合訓(xùn)練和集成學(xué)習的差別。集成學(xué)習是多模型分別獨立訓(xùn)練,最后再將結(jié)果進行融合;而聯(lián)合訓(xùn)練會將wide和deep模型組合在一起,在訓(xùn)練時同時優(yōu)化所有參數(shù),并且進行加權(quán)求和,根據(jù)最終的loss計算出gradient,反向傳播到Wide和Deep兩部分中,分別訓(xùn)練自己的參數(shù)。也就是說,wide & deep 模型的權(quán)重更新會受到 wide 側(cè)和 deep 側(cè)對模型訓(xùn)練誤差的共同影響。在論文中,wide部分是使用L1正則化的Follow-the-regularized-leader(FTRL)算法進行優(yōu)化,deep部分使用的是AdaGrad完成優(yōu)化。
到此對 wide & deep 模型結(jié)構(gòu)的講解就結(jié)束了,它的核心思想是結(jié)合線性模型的記憶能力和 DNN 模型的泛化能力,從而提升模型的整體性能,也因此能夠同時兼顧推薦的準確性和多樣性。
wide & deep 模型在貝殼推薦場景的實踐
我們的推薦系統(tǒng)中,主要分為兩大階段:召回和排序。如圖 Figure 2 所示,其中召回階段負責從數(shù)據(jù)存儲系統(tǒng)中篩選出與用戶相關(guān)的一些房源,排序階段負責對這些召回的房源進行精準的排序和打分。
我們將wide&deep模型應(yīng)用在了貝殼首頁推薦場景下的排序階段,優(yōu)化目標定義為推薦 點擊率。排序階段模型的搭建主要包括了樣本構(gòu)建、特征工程、模型離線訓(xùn)練及線上化,其中樣本與特征是整個機器學(xué)習中最重要的兩個環(huán)節(jié),直接決定了模型效果的上限。接下來分別介紹下這幾個部分:
樣本構(gòu)建
推薦排序模型的目標是預(yù)測用戶是否點擊,我們的訓(xùn)練樣本采樣自用戶在首頁場景下對房源卡片的瀏覽和點擊數(shù)據(jù)。
原始樣本是一個三元組,包括userid,itemid和label。其中l(wèi)abel的定義如下:
-
正樣本:用戶點擊的房源。
-
負樣本:用戶點擊最大位置以上曝光未點擊的房源;從未點擊的用戶部分曝光未點擊的房源。
label為1時,代表用戶點擊,為0時代表用戶曝光未點擊。
在首頁場景下的正負樣本比例在1:12,為了解決正負樣本的不均衡問題,我們對負樣本進行下采樣,將正負比例控制在了1:8。在離線訓(xùn)練時,我們也嘗試對于商機樣本進行一定程度的加權(quán),使得模型能夠更充分的學(xué)到這部分樣本的特征。
此外,我們還對訓(xùn)練樣本進行了清洗,去除掉?Noise樣本,這里的Noise樣本指的是特征值近似或相同的情況下,分別對應(yīng)正負兩種樣本。在我們的業(yè)務(wù)場景下,用戶在不同時間對同一房源可能會存在不同的行為,導(dǎo)致采集的樣本中有正有負,而特征只存在微小的差異,模型是很難學(xué)到微小的特征差異對結(jié)果帶來的改變的,此類樣本送入到模型中會產(chǎn)生 "歧義"。因此,我們將Noise樣本進行清洗,去掉沖突,減少對模型的干擾。
特征工程
特征工程主要包括特征構(gòu)建,特征分析,特征處理,以及特征選擇等。特征構(gòu)建也主要是圍繞用戶和房源這兩個角色構(gòu)建相關(guān)的特征。我們主要用到了以下的特征:
-
用戶特征:注冊時長、上一次訪問距今時長等基礎(chǔ)特征,最近3/7/15/30/90天活躍/瀏覽/關(guān)注/im數(shù)量等行為特征,以及畫像偏好特征和轉(zhuǎn)化率特征。
-
房源特征:價格、面積、居室、樓層等基礎(chǔ)特征,是否地鐵房/學(xué)區(qū)房/有電梯/近醫(yī)院等二值特征,以及熱度值/點擊率等連續(xù)特征。
-
交叉特征:將畫像偏好和房源的特征進行交叉,主要包含這幾維度:價格、面積、居室、城區(qū)、商圈、小區(qū)、樓層級別的交叉。交叉值為用戶對房源在該維度下的偏好值。
在構(gòu)建完特征,拿到一份數(shù)據(jù)集后,需要先對數(shù)據(jù)進行EDA分析,包括查看數(shù)據(jù)的統(tǒng)計分布、類別概況與取值范圍等。對原始數(shù)據(jù)有了初步的認識與了解后,我們會進行特征處理將特征轉(zhuǎn)化為更容易被模型學(xué)習的數(shù)據(jù)形式,主要的特征分析和處理過程如下:
缺失值與異常值處理:首先我們會進行特征的缺失值分析,分析其缺失、異常、為0的比例,根據(jù)特征的類型(離散/連續(xù))與缺失的比例,進行不同方式的缺失值填充。此外,通過對樣本特征進行EDA分析可知,有些特征存在異常值,導(dǎo)致整體的數(shù)據(jù)分布出現(xiàn)嚴重偏差,這里通過四分位距(IQR)對異常值進行檢測,并將異常值進行截斷。
等頻分桶處理:對于一些連續(xù)特征,例如價格、面積等,我們對其分布進行畫圖分析。如圖 Figure 3 所示, 這里以價格特征為例:
通過畫圖分析可知,價格整體呈長尾分布,這就導(dǎo)致大部分樣本的特征值都集中在一個小的取值范圍內(nèi),使得樣本特征的區(qū)分度減小。因此,我們將這類連續(xù)特征進行等頻分桶,保證樣本的分布在每個區(qū)間是均勻的,從而保證樣本之間的區(qū)分度和數(shù)值的穩(wěn)定性。
此外,不同城市下的分布區(qū)間存在較大差異,如上圖中,天津的價格區(qū)間主要是分布在50-150萬,北京的價格區(qū)間主要是分布在100-350萬,如果對整體的訓(xùn)練集做等頻分桶,會導(dǎo)致不同城市下的特征存在偏差。針對這一問題,我們做特征處理時,是分城市進行處理的,從而保證每個城市下的特征都是均勻分布的。
歸一化處理:對取值較大的連續(xù)值特征使用了最大最小歸一化方法,將特征值都轉(zhuǎn)化為0-1之間的數(shù)值。該方法能夠使得特征之間擁有統(tǒng)一的標準,提升特征的區(qū)分度,并且將數(shù)據(jù)歸一化到0到1之間的數(shù)據(jù),能夠加快模型的訓(xùn)練速度,實驗也證明模型效果確實有顯著提升。
低頻過濾:對于離散型特征,我們對其取值分布進行統(tǒng)計,圖 Figure 4 中,以居室和樓層特征為例:
通過對居室和樓層級別進行分析可知,臥室數(shù)量大部分為兩居、三居。中樓層的房源最多,而底層和頂層的房源非常少。通過對此類特征的統(tǒng)計,我們能夠清楚的看出特征值的頻率分布情況,有些類別的取值比較低頻,存在分布不均的情況,因此我們將這部分特征進行了低頻過濾處理,將出現(xiàn)頻次小于閾值的值歸為一類。
embedding:對于一些高維稀疏的id類特征,例如小區(qū),商圈id等,可以作為deep模型的embedding輸入,通過embeding層轉(zhuǎn)換成低維且稠密的向量。降維后的特征具有較強的“擴展能力”,能夠探索歷史數(shù)據(jù)中從未出現(xiàn)過的特征組合,增強模型的表達能力。
這里需要注意的是,一些id類特征維度很高,呈長尾分布,可以將這部分特征進行低頻過濾,降維后再放入embedding中。
模型離線訓(xùn)練與線上化
離線訓(xùn)練?經(jīng)過上述的樣本構(gòu)建與特征工程,生成了訓(xùn)練集,作為wide & deep的訓(xùn)練樣本。我們使用的模型結(jié)構(gòu)如圖Figure 5所示,采用了三層的網(wǎng)絡(luò)結(jié)構(gòu)。
image
圖中的Hidden Layers為三個全連接層,每個layer后面連接Relu激活函數(shù),訓(xùn)練過程中,wdl是采用聯(lián)合訓(xùn)練的方式,將wide和deep模型組合在一起,在訓(xùn)練時同時優(yōu)化所有參數(shù),并且在訓(xùn)練時進行加權(quán)求和,根據(jù)最終的loss計算出gradient,反向傳播到Wide和Deep兩部分中,分別訓(xùn)練自己的參數(shù)。
模型訓(xùn)練過程中,我們將數(shù)據(jù)集按照時間順序切分,采用7天的數(shù)據(jù)作為訓(xùn)練集,1天的作為測試集。
在訓(xùn)練期間,wide側(cè)的輸入包含了一些交叉特征、離散特征及部分連續(xù)特征。deep側(cè)的輸入,主要是一些稠密的連續(xù)特征,我們也嘗試了將城市、城區(qū)、商圈等id特征進行embedding,但沒有取得效果上的提升,猜測是由于模型對這部分特征沒有學(xué)到很好的表達,無法發(fā)揮出embedding的優(yōu)勢,目前我們還在研究和探索好的embedding特征,也期待能和大家一起討論。
模型調(diào)優(yōu)?為了防止模型過擬合。我們加入了dropOut 與 L2正則;為了加快模型的收斂,引入了Batch Normalization(BN);并且為了保證模型訓(xùn)練的穩(wěn)定性和收斂性,嘗試不同的learning rate(wide側(cè)0.001,deep側(cè)0.01效果較好)和batch_size(目前設(shè)置的2048);在優(yōu)化器的選擇上,我們對比了SGD、Adam、Adagrad等學(xué)習器,最終選擇了效果最好的Adagrad。實驗證明,通過參數(shù)的調(diào)整,能夠明顯的影響模型的訓(xùn)練效果。
線上化?模型訓(xùn)練和驗證后,需要將它進行線上化,我們采用了TensorFlow Serving服務(wù)器。對于線上特征和離線特征的一致性問題,采取了redis存儲的方式,將離線特征處理的參數(shù)存儲在redis中,并且在上線之前,我們會進行特征一致性檢驗。為了提升模型的預(yù)測性能,我們使用多線程并行化的方式構(gòu)造tf-serving請求,最終能在10ms左右返回120個房源的預(yù)測結(jié)果。
線上效果
我們在10月中旬上線第一版wdl排序模型,線上效果如下:
image
Figure 6 和Figure 7 分別對應(yīng)線上CTR 和CVR的提升效果。第一版模型上線后,對比對照組CTR相對提升6.08%,CVR相對提升15.65%。目前我們正在探索新的特征,以及在樣本和特征工程上嘗試不同的方法,進行模型的二期優(yōu)化,提升模型的離線auc,爭取給線上效果帶來進一步的提升。
階段總結(jié)和未來規(guī)劃
本文主要介紹了深度學(xué)習模型 wide&deep 在貝殼排序場景中的實踐,包括根據(jù)業(yè)務(wù)場景構(gòu)建樣本、特征,以及搭建模型等工作,在線上也取得了正向收益。
目前我們正在進行模型的二期優(yōu)化,也在的不斷總結(jié)和嘗試。對于接下來的優(yōu)化方向,主要總結(jié)為以下幾個方面:
-
樣本精細化采樣代替隨機采樣(包括分城市、分用戶群體的采樣)。
-
為wide側(cè)挖掘更多有區(qū)分能力的特征,deep側(cè)加入有效的embedding特征。
-
引入實時特征,確保房源和用戶特征最新和最全。
-
優(yōu)化網(wǎng)絡(luò)結(jié)構(gòu),提升網(wǎng)絡(luò)學(xué)習能力。
-
優(yōu)化模型的訓(xùn)練效率,加快線上模型的更新速度,提升線上效果。
-
嘗試gAUC、MAP等評估指標,保證離線效果提升與線上效果提升的一致性。
此外,深度學(xué)習模型在推薦系統(tǒng)中的應(yīng)用還有更多價值等待我們一起去發(fā)掘,這條算法之路,還是十分漫長的,也希望能和大家一起討論,共同學(xué)習。
參考資料
[1]?https://arxiv.org/pdf/1606.07792.pdf
[2]?https://www.tensorflow.org/serving
總結(jié)
以上是生活随笔為你收集整理的widedeep 在贝壳推荐场景的实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 胆囊炎能不能吃桂圆
- 下一篇: 推荐场景中召回模型的演化过程