引文
點(diǎn)擊率預(yù)估系統(tǒng)最早是由谷歌實(shí)現(xiàn)枚驻,并應(yīng)用在其搜索廣告系統(tǒng)。在看到這一大殺器為谷歌帶來滾滾財(cái)源之后株旷,其他公司也紛紛效仿再登。直到今日,大大小小的“互聯(lián)網(wǎng)廣告公司”晾剖,都宣稱自己掌握了基于人工智能的精準(zhǔn)定向锉矢,實(shí)際上大多講的就是這個(gè)點(diǎn)擊率預(yù)估系統(tǒng)。而點(diǎn)擊率預(yù)估的應(yīng)用場(chǎng)景也從最開始的搜索廣告齿尽,擴(kuò)展到展示廣告沽损、信息流廣告等等廣告形態(tài),甚至于在商品推薦系統(tǒng)中都能看到其蹤影雕什。
點(diǎn)擊率預(yù)估系統(tǒng)的核心是機(jī)器學(xué)習(xí)算法缠俺,不過我們也應(yīng)該知道显晶,算法所處理的對(duì)象往往是抽象的贷岸,是優(yōu)雅的,而現(xiàn)實(shí)中的任務(wù)卻是具體的磷雇,充滿缺陷的偿警。那么如何用抽象的算法來解決具體的業(yè)務(wù)問題,是本文所要介紹的內(nèi)容唯笙。本文會(huì)分成日志系統(tǒng)螟蒸、特征工程、模型選擇與訓(xùn)練崩掘、在線服務(wù)四個(gè)部分七嫌,主要介紹點(diǎn)擊率預(yù)估系統(tǒng)的數(shù)據(jù)流程以及系統(tǒng)框架。而模型與算法原理苞慢、模型調(diào)優(yōu)诵原、在線學(xué)習(xí)這些主題,本文只做簡(jiǎn)要介紹或不涉及挽放。
1.日志系統(tǒng)
點(diǎn)擊率預(yù)估用到的是監(jiān)督學(xué)習(xí)算法绍赛,所以我們需要由日志來提供如下表形式的數(shù)據(jù)。
這里面的每一行辑畦,都是一次廣告展示的完整記錄吗蚌。其記錄了這次廣告展示所對(duì)應(yīng)的廣告、用戶纯出、上下文三類特征蚯妇,以及用戶對(duì)這次廣告展示的行為反饋敷燎,即是否點(diǎn)擊了廣告。
但是實(shí)際上侮措,用戶訪問一個(gè)網(wǎng)站或App而觸發(fā)廣告請(qǐng)求時(shí)懈叹,在服務(wù)器會(huì)生成一條日志,廣告曝光分扎、點(diǎn)擊的上報(bào)又各自產(chǎn)生了相應(yīng)的日志澄成。對(duì)于這些各自獨(dú)立的日志,我們要把他們關(guān)聯(lián)起來畏吓,把廣告的請(qǐng)求墨状、展示、點(diǎn)擊三個(gè)事件串起來菲饼,才能形成上述提到的記錄形式肾砂。為實(shí)現(xiàn)這一點(diǎn),對(duì)每個(gè)廣告請(qǐng)求宏悦,我們要為其生成唯一的id镐确,并在后續(xù)的曝光和點(diǎn)擊上報(bào)時(shí),將這一id一起上報(bào)饼煞,再通過這一id來關(guān)聯(lián)日志源葫。具體的日志關(guān)聯(lián)過程,可以采取離線批處理(如MapReduce)砖瞧,也可以采用流式處理(如Spark Streaming)息堂,這個(gè)根據(jù)業(yè)務(wù)情況酌情選擇。前面提到块促,處理之后的記錄包含廣告荣堰、用戶、上下文三類特征竭翠,那么在打印日志時(shí)振坚,特別是請(qǐng)求日志,需要注意將相關(guān)信息打印完備斋扰。
2.特征工程
點(diǎn)擊率預(yù)估算法處理是數(shù)字形式的輸入渡八,所以在日志處理完之后,需要通過特征工程來將文本形式的信息轉(zhuǎn)換成數(shù)字形式的信息褥实,即建立索引呀狼。建立索引有兩種常見做法,一是對(duì)特征簡(jiǎn)單計(jì)數(shù)损离,一是對(duì)特征取值做哈希處理哥艇。如果采用簡(jiǎn)單計(jì)數(shù),需要將所有特征都枚舉出來僻澎,這在日志量和特征空間龐大的時(shí)候會(huì)是一個(gè)問題貌踏。而采用哈希處理則相對(duì)簡(jiǎn)單十饥,而且有一些團(tuán)隊(duì)通過哈希碰撞的方式來縮小特征空間,降低訓(xùn)練難度祖乳,不過這個(gè)做法是否不影響預(yù)測(cè)性能是因業(yè)務(wù)而異的逗堵。如果接入的是線性模型,那么在建索引時(shí)還需要對(duì)分類類型特征做one-hot編碼眷昆。
在建索引之前蜒秤,還有很多事情要做。有一些特征并不會(huì)在日志中出現(xiàn)亚斋,比如統(tǒng)計(jì)數(shù)據(jù)作媚,這些特征需要通過各種id去做關(guān)聯(lián)。日志中往往會(huì)存在一些異常值帅刊,比如說有一些刷單數(shù)據(jù)纸泡,或是特征取值明顯偏離正常范圍,我們需要對(duì)這些數(shù)據(jù)做過濾赖瞒。而對(duì)于實(shí)值特征女揭,往往會(huì)做歸一化或是離散化(如果使用線性模型),以免由于實(shí)值特征取值范圍嚴(yán)重偏離[0,1]區(qū)間栏饮,而給模型訓(xùn)練和預(yù)測(cè)帶來困難吧兔。樣本中的特征還有可能獲取不到觀測(cè)值,或者是觀測(cè)值出現(xiàn)次數(shù)過少抡爹,對(duì)于這些情況掩驱,可以賦予缺省值芒划。而有些特征的覆蓋率太低冬竟,則可以選擇放棄。如果想要為線性模型引入非線性民逼,則需要做交叉特征設(shè)計(jì)泵殴,這是一件很依賴領(lǐng)域知識(shí)的事情∑床裕總之笑诅,特征工程這件事情,花樣很多疮鲫。
我們知道吆你,廣告的點(diǎn)擊率一般是顯著低于50%的,會(huì)存在樣本不平衡的問題俊犯,那么對(duì)于這個(gè)問題妇多,我們可以采用負(fù)例欠采樣的處理方式。通過觀察不同欠采樣比例下的模型預(yù)測(cè)性能燕侠,可以獲取最佳的采樣比例者祖。欠采樣方法有可能導(dǎo)致丟失一些負(fù)例的信息立莉,對(duì)于這個(gè)問題,可以嘗試[1]所提出的Easy Ensemble七问,就是對(duì)負(fù)例進(jìn)行N次不重復(fù)的隨機(jī)采樣蜓耻,并分別與所有正例組成N個(gè)訓(xùn)練集,分別訓(xùn)練出N個(gè)模型械巡,然后對(duì)預(yù)測(cè)值做平均刹淌。這個(gè)做法簡(jiǎn)單有效,不過對(duì)于在線服務(wù)來說讥耗,N個(gè)模型就意味著N倍的計(jì)算量芦鳍,需要權(quán)衡這個(gè)做法的收益。
3.模型選擇與訓(xùn)練
點(diǎn)擊率預(yù)估算法葛账,最經(jīng)典的莫過于LR(Logistic Regression柠衅,邏輯回歸),作為一個(gè)線性模型籍琳,他的特點(diǎn)是易實(shí)現(xiàn)菲宴,易解釋,還有Google背書提出FTRL(Follow
The [Proximally] Regularized Leader)優(yōu)化算法趋急,再說他能夠給“特征工程師”提供存在感:)喝峦。
近年來的趨勢(shì)是FM(Factorization
Machine)/FFM(Field-aware Factorization Machine),DNN(深度神經(jīng)網(wǎng)絡(luò))呜达。FM算法為各個(gè)特征生成一個(gè)Embedding Vector谣蠢,并且通過不同特征對(duì)應(yīng)的Embedding的內(nèi)積來表達(dá)交叉特征,這對(duì)于訓(xùn)練樣本稀疏的交叉特征有明顯更好的學(xué)習(xí)能力查近。FFM則是對(duì)FM的一小步改進(jìn)眉踱,他為每個(gè)特征生成的Embedding不只有一個(gè),而是根據(jù)不同的互作用field生成不同的Embedding霜威,這里的field指的是一個(gè)特征在one-hot編碼之前所屬的分類類型特征[2]谈喳。FFM算法因?yàn)樵贙aggle比賽中連續(xù)兩次取勝而引起關(guān)注,有趣的是戈泼,第一次比賽中臺(tái)大的團(tuán)隊(duì)使用了FFM并取勝之后婿禽,第二次比賽各個(gè)團(tuán)隊(duì)也都紛紛使用該算法。FFM在在線服務(wù)中的嘗試以及效果的提升也已有相關(guān)報(bào)道[3,4]大猛。至于DNN扭倾,按Bing團(tuán)隊(duì)的說法:在各種使用DNN的嘗試中,其帶來的效果提升都是marginal的挽绩,而其對(duì)計(jì)算機(jī)資源的消耗則大幅增加膛壹,而且在線效果并不穩(wěn)定[5]。當(dāng)然了琼牧,有些公司確實(shí)在點(diǎn)擊率預(yù)估的生產(chǎn)環(huán)境中使用了DNN恢筝,甚至提供了云服務(wù)哀卫,對(duì)于他們是否也碰到前面所述的問題,是否有從DNN中獲得不那么marginal的提升撬槽,我很感興趣此改。
接下來聊聊模型集成。通過模型集成來降低預(yù)測(cè)的偏差或方差侄柔,是機(jī)器學(xué)習(xí)中的通用做法共啃。集成方法有stacking、cascading暂题、boosting等等移剪,而大名鼎鼎的GBDT就是boosting的產(chǎn)物,這里要聊的模型集成都跟GBDT有關(guān)系薪者。前面提到Kaggle比賽的獲勝者用了FFM纵苛,其實(shí)他們使用了模型集成,具體做法是GBDT+FFM言津,將GBDT的輸出接入到FFM的輸入特征攻人,這個(gè)做法很可能是受啟發(fā)于Facebook提出的GBDT+LR。Facebook提出這個(gè)方法悬槽,是基于這樣的考慮:在特征工程中往往需要做兩件事情怀吻,一是將實(shí)值特征打散,一是生成交叉特征初婆,而他們注意到GBDT恰好可以自動(dòng)完成這兩件事情[6]蓬坡。這個(gè)集成模型是一個(gè)cascading的做法。我最近注意到另外一個(gè)很有意思的做法磅叛,則是基于boosting的屑咳。這個(gè)做法本質(zhì)上也是GBDT,但是與通常的GBDT不同的是宪躯,其第一個(gè)分類器不是決策樹乔宿,而是用其他模型來代替位迂,比如LR访雪、NN、DNN等等掂林,然后在這個(gè)基礎(chǔ)上再用決策樹做boosting臣缀。這個(gè)做法從Bing的實(shí)驗(yàn)結(jié)果來看效果的提升是非常明顯的[5]。
講了這么多的模型泻帮,那么我從零開始搭建系統(tǒng)精置,應(yīng)該選哪一個(gè)呢?我個(gè)人比較信賴所謂“AK-47”原則锣杂,就是在實(shí)現(xiàn)一個(gè)東西的時(shí)候脂倦,應(yīng)該首先選擇簡(jiǎn)單有效的方式番宁。那么基于這個(gè)原則我們應(yīng)該首先考慮單模型,即LR赖阻、GBDT蝶押、FM/FFM等模型。而在這里面火欧,我個(gè)人傾向于選擇FFM棋电,這個(gè)模型把我們從交叉特征的藝術(shù)創(chuàng)造中解放出來,其有效性已有多方背書苇侵,還可以online-training赶盔。要說有什么缺點(diǎn),一個(gè)是容易過擬合榆浓,一個(gè)是相對(duì)LR于未、FM消耗更多資源。對(duì)付第一個(gè)問題用early-stopping陡鹃,而第二個(gè)問題沉眶,在這個(gè)DNN都可以上的年代,多消耗點(diǎn)資源就消耗吧杉适。當(dāng)然谎倔,最好把LR、GBDT這些也弄上做baseline猿推,再說這里面很多說不準(zhǔn)片习,效果這東西得試試才知道。
聊完模型蹬叭,來聊聊訓(xùn)練藕咏。訓(xùn)練時(shí),我們需要為模型的性能確定指標(biāo)秽五,通過性能指標(biāo)來選擇最合適的模型孽查。最常用的是AUC(Area Under ROC Curve),指的是ROC(Receiver Operating Characteristic)曲線下的面積坦喘,衡量的是對(duì)于不同廣告的排序質(zhì)量盲再,這也恰恰是大多廣告點(diǎn)擊率系統(tǒng)最關(guān)心的。除此之外還有LogLoss瓣铣、RIG(衡量點(diǎn)擊率預(yù)估值的準(zhǔn)確率)答朋、Utility(衡量模型帶來的收益提升)等等指標(biāo),可以根據(jù)業(yè)務(wù)需求酌情選取棠笑。不同的模型都有各自的超參數(shù)需要去做調(diào)優(yōu)梦碗,這里不做展開。
4.在線服務(wù)
在線服務(wù)有三個(gè)關(guān)鍵環(huán)節(jié),分別是分流實(shí)驗(yàn)洪规、特征轉(zhuǎn)換和pCTR(predicted click through rate印屁,預(yù)估點(diǎn)擊率)計(jì)算,這里分段簡(jiǎn)要介紹斩例。
點(diǎn)擊率預(yù)估系統(tǒng)往往需要做線上實(shí)驗(yàn)來驗(yàn)證模型的效果库车,所以在線服務(wù)首先需要一個(gè)實(shí)驗(yàn)層來對(duì)流量進(jìn)行配置,將流量分發(fā)給不同的模型樱拴,并且跟蹤不同模型的實(shí)時(shí)效果柠衍。需要注意的是,良好的離線效果并不意味著線上效果就一定好晶乔。
特征轉(zhuǎn)換對(duì)應(yīng)的是離線處理時(shí)的特征工程環(huán)節(jié)珍坊,是為了將廣告請(qǐng)求的數(shù)據(jù)轉(zhuǎn)換成模型的輸入特征。在特征轉(zhuǎn)換的過程中正罢,往往從廣告請(qǐng)求中拿到的特征并不全阵漏,還需要去做進(jìn)一步的關(guān)聯(lián)》撸互聯(lián)網(wǎng)廣告一般對(duì)實(shí)時(shí)性要求比較高履怯,而pCTR計(jì)算環(huán)節(jié)已經(jīng)是計(jì)算密集的,為了提高響應(yīng)速度裆泳,在特征轉(zhuǎn)換環(huán)節(jié)應(yīng)該減少甚至避免IO帶來的延遲叹洲,所以這些關(guān)聯(lián)信息最好提前加載到應(yīng)用內(nèi)存或者緩存中,并通過定時(shí)任務(wù)進(jìn)行更新工禾。
通過特征轉(zhuǎn)換得到的輸入特征运提,會(huì)交給pCTR計(jì)算模塊去做最后的計(jì)算,這個(gè)模塊加載了訓(xùn)練好的模型闻葵。模型的訓(xùn)練都會(huì)以一定的頻率進(jìn)行(甚至是一直在進(jìn)行民泵,即所謂在線學(xué)習(xí)),而訓(xùn)練好的模型也都會(huì)以一定的頻率更新到線上槽畔,以便計(jì)算模塊及時(shí)利用到較新的信息栈妆。那么計(jì)算模塊應(yīng)該妥當(dāng)設(shè)計(jì),使其能夠?qū)δP瓦M(jìn)行熱更新而不影響服務(wù)厢钧。模型本身由于采樣的問題鳞尔,或是模型自身的局限,還會(huì)帶來預(yù)測(cè)值的整體偏差坏快,這個(gè)偏差對(duì)于需要進(jìn)行競(jìng)價(jià)的業(yè)務(wù)會(huì)產(chǎn)生影響铅檩,這種情況下計(jì)算模塊還需要對(duì)預(yù)測(cè)值進(jìn)行校準(zhǔn)。
寫在最后
與點(diǎn)擊率預(yù)估類似的還有轉(zhuǎn)化率預(yù)估莽鸿,這兩者是相通的,區(qū)別在于預(yù)測(cè)目標(biāo)不一樣。
點(diǎn)擊率預(yù)估是一個(gè)很大的話題祥得,本文也只是對(duì)這個(gè)話題的一點(diǎn)介紹兔沃,篇幅所限,很多問題只是浮光掠影而過级及,作者后面會(huì)選擇其中一些主題再行展開成文乒疏。由于本人經(jīng)驗(yàn)所限,文中所述難免存在錯(cuò)誤或紕漏饮焦,各位看官不吝批評(píng)指正怕吴。
[1] Liu et al., (2008). Exploratory
Undersampling for Class-Imbalance Learning.
[2] Juan et al., (2016). Field-aware
Factorization Machines for CTR Prediction.
[3] Juan et al., (2017). Field-aware Factorization
Machines in a Real-world Online Advertising System.
[4] del2z et al., (2016).深入FFM原理與實(shí)踐.
[5] Ling et al., (2017). Model Ensemble for
Click Prediction in Bing Search Ads.
[6] He et al., (2014). Practical Lessons fromPredicting Clicks on Ads at Facebook.
公眾號(hào)機(jī)器決策