推薦系統(tǒng) CTR預(yù)估 CVR預(yù)估
0巴碗、概述
線性模型被廣泛地應(yīng)用于回歸和分類(lèi)問(wèn)題蚪腋,具有簡(jiǎn)單耸棒、快速和可解釋性等優(yōu)點(diǎn)荒澡,但是線性模型的表達(dá)能力有限,經(jīng)常需要人工選擇特征和交叉特征才能取得一個(gè)良好的效果与殃,但是實(shí)際工程中的特征數(shù)量會(huì)很多单山,并且還會(huì)有大量的稀疏特征捏肢,人工篩選特征和交叉特征會(huì)很困難,尤其是交叉高階特征時(shí)饥侵,人工很難實(shí)現(xiàn)鸵赫。DNN模型可以很容易的學(xué)習(xí)到高階特征之間的作用,并且具有很好的泛化能力躏升。同時(shí)辩棒,DNN增加embedding層可以很容易的解決稀疏特征的問(wèn)題。文章將傳統(tǒng)的LR和DNN組合構(gòu)成一個(gè)wide&deep模型膨疏,既保留了LR的擬合能力一睁,又具有DNN的泛化能力,并且不需要單獨(dú)訓(xùn)練模型佃却,可以方便模型的迭代者吁。
1、Wide&Deep解決什么問(wèn)題
在推薦系統(tǒng)(包括推薦饲帅、計(jì)算廣告)中复凳,當(dāng)用戶來(lái)到平臺(tái)時(shí),需要向用戶展示適合用戶的物品(商品灶泵、廣告等)育八,通常的做法是先從海量的物品庫(kù)(通常是上億數(shù)量)中,篩選出一些跟用戶興趣最相關(guān)的物品(通常是千級(jí)規(guī)模)赦邻,這個(gè)過(guò)程叫做召回髓棋,召回可以是機(jī)器學(xué)習(xí)模型或者規(guī)則;然后再對(duì)這上千的物品進(jìn)行排序惶洲,從而展示給用戶按声。因此推薦系統(tǒng)也經(jīng)常被叫做搜索排序系統(tǒng)。整個(gè)系統(tǒng)流程如圖:
排序的規(guī)則有很多恬吕,主要是依據(jù)業(yè)務(wù)的目標(biāo)而言签则,例如點(diǎn)擊、購(gòu)買(mǎi)等币呵。wide&deep可以應(yīng)用到此類(lèi)目標(biāo)的排序問(wèn)題中怀愧,最經(jīng)典的就是CTR預(yù)估。
2余赢、現(xiàn)有模型的問(wèn)題
提到CTR預(yù)估,最經(jīng)典的應(yīng)該是LR模型了哈垢,LR模型簡(jiǎn)單妻柒、快速并且模型具有可解釋?zhuān)兄芎玫臄M合能力,但是LR模型是線性模型耘分,表達(dá)能力有限举塔,泛化能力較弱绑警,需要做好特征工程,尤其需要交叉特征央渣,才能取得一個(gè)良好的效果计盒,然后工業(yè)中,特征的數(shù)量會(huì)很多芽丹,可能達(dá)到成千上萬(wàn)北启,甚至數(shù)十萬(wàn),這時(shí)特征工程就很難做拔第,并且特征工程是一項(xiàng)很枯燥乏味的工作咕村,搞得算法工程師暈頭轉(zhuǎn)向,還不一定能取得更好的效果蚊俺。
DNN模型不需要做太精細(xì)的特征工程懈涛,就可以取得很好的效果,已經(jīng)在很多領(lǐng)域開(kāi)始應(yīng)用了泳猬,DNN可以自動(dòng)交叉特征批钠,學(xué)習(xí)到特征之間的相互作用,尤其是可以學(xué)到高階特征交互得封,具有很好的泛化能力价匠。另外,DNN通過(guò)增加embedding層呛每,可以有效的解決稀疏數(shù)據(jù)特征的問(wèn)題踩窖,防止特征爆炸。推薦系統(tǒng)中的泛化能力是很重要的晨横,可以提高推薦物品的多樣性洋腮,但是DNN在擬合數(shù)據(jù)上相比較LR會(huì)較弱。
為了提高推薦系統(tǒng)的擬合性和泛化性手形,可以將LR和DNN結(jié)合起來(lái)啥供,同時(shí)增強(qiáng)擬合能力和泛化能力,wide&deep就是將LR和DNN結(jié)合起來(lái)库糠,wide部分就是LR伙狐,deep部分就是DNN,將兩者的結(jié)果組合進(jìn)行輸出瞬欧。
3贷屎、Wide&Deep模型
wide&deep模型主要分成兩部分,wide部分就是傳統(tǒng)的LR模型艘虎,deep部分就是DNN唉侄,整個(gè)模型的結(jié)構(gòu)如下圖:
上圖中最左邊是傳統(tǒng)的LR模型,最右邊是DNN模型野建,中間的是將LR和DNN結(jié)合起來(lái)的wide&deep模型属划。
3.1 Wide部分
wide部分就是LR模型恬叹,傳統(tǒng)的LR模型:
用X=[x_1,x_2,x_3,...,x_d]表示一個(gè)有d個(gè)特征的樣本,W=[w_1,w_2,w_3,...,w_d]表示模型的參數(shù)同眯,b表示bia绽昼,y表示預(yù)測(cè)值,有 y=W^TX+b须蜗。
在實(shí)際中往往需要交叉特征硅确,對(duì)于這部分定義如下:
\phi_k(X)=\prod_{i=1}^d x_i^{C_{ki}}, c_{ki}\in {0,1}
用\phi_k表示第k個(gè)交叉特征,C_{ki}表示是第k個(gè)交叉特征的一部分唠粥。
最終的wide部分為:
y=W^TX+b+\sum_{k=1}^N w_{d+k}\phi_k
3.2 Deep部分
deep部分就是一個(gè)普通的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)疏魏,只不過(guò)在這個(gè)網(wǎng)絡(luò)中增加embedding層用來(lái)將稀疏、高維的特征轉(zhuǎn)換為低維晤愧、密集的實(shí)數(shù)向量大莫,可以有效地解決維度爆炸。先將原始特征經(jīng)過(guò)embedding層轉(zhuǎn)化后官份,再送入DNN的隱藏層只厘,隱藏層之間的關(guān)系定義為:
a^{l+1}=f(W^l a^l + b^l)
上面l表示隱藏層數(shù),f表示激活函數(shù)舅巷,可以是sigmoid羔味、Relu、than等钠右,目前最常用的是Relu函數(shù)赋元。
3.3 Wide join Deep
將wide部分的輸出和deep部分的輸出相加通過(guò)sigmoid函數(shù)輸出進(jìn)行預(yù)測(cè)。整個(gè)模型的預(yù)測(cè)定義如下:
P(Y=1|X)=\sigma(W_{wide}^T[X,\phi(X)]+W_{deep}^Ta^l+b)
3.4 wide&deep的訓(xùn)練方式
wide&deep模型中飒房,wide部分和deep部分是同時(shí)訓(xùn)練的搁凸,不需要單獨(dú)訓(xùn)練任何一部分。GBDT+LR模型中GBDT需要先訓(xùn)練狠毯,然后再訓(xùn)練LR护糖,兩部分具有依賴(lài)關(guān)系,這種架構(gòu)不利于模型的迭代嚼松。
Join training和ensemble training的區(qū)別:(1)ensemble中每個(gè)模型需要單獨(dú)訓(xùn)練嫡良,并且各個(gè)模型之間是相互獨(dú)立的,模型之間互相不感知献酗,當(dāng)預(yù)測(cè)樣本時(shí)寝受,每個(gè)模型的結(jié)果用于投票,最后選擇得票最多的結(jié)果凌摄。而join train這種方式模型之間不是獨(dú)立的羡蛾,是相互影響的,可以同時(shí)優(yōu)化模型的參數(shù)锨亏。(2)ensemble的方式中往往要求存在很多模型痴怨,這樣就需要更多的數(shù)據(jù)集和數(shù)據(jù)特征,才能取得比較好的效果器予,模型的增多導(dǎo)致難以訓(xùn)練浪藻,不利于迭代。而在wide&deep中乾翔,只需要兩個(gè)模型爱葵,訓(xùn)練簡(jiǎn)單,可以很快的迭代模型反浓。
3.5 工程上的實(shí)現(xiàn)
目前Tensorflow中已經(jīng)提供了wide&deep模型的API,參見(jiàn) https://www.tensorflow.org/tutorials/wide_and_deep萌丈,并且官方提供了一個(gè)Demo,工程上可以很快的搭建起wide&deep模型雷则。
4 思考
如果你是為業(yè)務(wù)第一次做CTR預(yù)估模型辆雾,建議嘗試先用交叉特征+LR經(jīng)典模型取得一個(gè)良好的效果,之后可以引入FM來(lái)替換交叉特征部分月劈。最后可以考慮采用以下模型優(yōu)化:
- GBDT+LR:Facebook提出的CTR預(yù)估方法
- wide&deep:Google 2016年提出的CTR預(yù)估方法度迂,目前最主流的方法,很多公司都在用猜揪,建議一定去嘗試
- DeepFM:華為諾亞方舟實(shí)驗(yàn)室和哈工大 2017年提出的CTR預(yù)估方法
- Deep&Cross:Google 2017年提出CTR預(yù)估方法惭墓,據(jù)說(shuō)會(huì)比wide&deep更好,目前還沒(méi)有大量應(yīng)用
- FFM:臺(tái)灣大學(xué)提出的對(duì)FM進(jìn)行優(yōu)化的方法而姐,F(xiàn)M可以看成是FFM的一個(gè)特例