Facebook经典CTR预估模型
這里是「王喆的機器學習筆記」的第九篇文章,今天我們重讀一篇經典的CTR預估領域的論文,Facebook在2014發表的“Practical Lessons from Predicting Clicks on Ads at Facebook”。
在這篇文章中,Facebook提出了經典的GBDT(Gradient Boosting Decision Trees)+LR(Logistics Regression)的CTR模型結構,可以說開啟了特征工程模型化、自動化的新階段。此外其在五年前就采用的online learning,online data joiner,negative down sampling等技術時至今日也有極強的工程意義。下面我們就一起回顧一下這篇當時紅極一時,現在仍常看常新的論文吧。
用戶場景
文章的用戶場景是一個標準的點擊率預估的場景,需要強調的只有一點,因為我們需要利用CTR計算精準的出價、ROI等重要的后續預估值,因此CTR模型的預估值需要是一個具有物理意義的精準的CTR,而不是僅僅輸出廣告排序的高低關系。所以文中不僅把CTR calibration作為重要的評價指標,更是在最后介紹了模型校正的相關方法。
模型結構
計算廣告方向的同學應該都對GBDT+LR這個模型有所了解,這一點也無益是這篇文章最大的貢獻。雖然文章其他部分的價值絲毫不遜于該模型,但再次回顧該模型,清楚知道其技術細節還是必要的。
簡而言之,文章提出了一種利用GBDT自動進行特征篩選和組合,進而生成新的feature vector,再把該feature vector當作logistic regression的模型輸入,預測CTR的模型結構。
GBDT+LR模型結構
這里需要強調的是,用GBDT構建特征工程,和利用LR預測CTR兩步是獨立訓練的。所以自然不存在如何將LR的梯度回傳到GBDT這類復雜的問題,而利用LR預測CTR的過程是顯然的,在此不再贅述,我們著重講一講如何利用GBDT構建新的特征向量。
大家知道,GBDT是由多棵回歸樹組成的樹林,后一棵樹利用前面樹林的結果與真實結果的殘差做為擬合目標。每棵樹生成的過程是一棵標準的回歸樹生成過程,因此每個節點的分裂是一個自然的特征選擇的過程,而多層節點的結構自然進行了有效的特征組合,也就非常高效的解決了過去非常棘手的特征選擇和特征組合的問題。
我們利用訓練集訓練好GBDT模型,之后就可以利用該模型構建特征工程。具體過程是這樣的,一個樣本在輸入GBDT的某一子樹后,會根據每個節點的規則最終落入某一葉子節點,那么我們把該葉子節點置為1,其他葉子節點置為0,所有葉子節點組成的向量即形成了該棵樹的特征向量,把GBDT所有子樹的特征向量concatenate起來,即形成了后續LR輸入的特征向量。
舉例來說,比如GBDT由三顆子樹構成,每個子樹有4個葉子節點,一個訓練樣本進來后,先后落到了“子樹1”的第3個葉節點中,那么特征向量就是[0,0,1,0],“子樹2”的第1個葉節點,特征向量為[1,0,0,0],“子樹3”的第4個葉節點,特征向量為[0,0,0,1],最后concatenate所有特征向量,形成的最終的特征向量為[0,0,1,0,1,0,0,0,0,0,0,1],我們再把該向量作為LR的輸入,預測CTR。
引入了GBDT+LR的模型后,相比單純的LR和GBDT,提升效果是非常顯著的。從下表中可以看到,混合模型比單純的LR或Trees模型在loss上減少了3%。
LR+Trees模型的Loss對比
為了確定最優的GBDT子樹規模,facebook繪出了子樹規模和loss的關系曲線如下:
GBDT子樹數量與loss的關系
可以看到,在規模超過500棵子樹后,增加子樹規模對于loss下降的貢獻就微乎其微了。特別是最后1000棵子樹僅貢獻了0.1%的loss下降,最終facebook選擇了600作為其子樹規模。
該模型的優勢我們上面已經提到,即可以自動進行特征組合和特征篩選,但在實踐過程中,模型的缺陷也比較明顯,相比FTRL,FM,NN等能夠通過梯度下降訓練的模型來說,GBDT缺乏online learning的能力,因此我們往往只能相隔一天甚至幾天才能夠update GBDT模型,勢必影響模型的實效性,那么Facebook是如何解決模型更新的問題的呢?
模型的實效性問題和更新策略
雖然我們的直覺是模型的訓練時間和serving時間之間的間隔越短,模型的效果越好,但為了證明這一點,facebook的工程師還是做了一組實效性的實驗,在結束模型的訓練之后,觀察了其后6天的模型loss(這里采用normalized entropy作為loss)
模型更新延遲與loss的關系
可以看出,模型的loss在第0天之后有所上升,特別是第2天過后顯著上升。因此daily update的模型相比weekly update的模型效果肯定是有大幅提升的。
但囿于facebook巨大的數據量以及GBDT較難實施并行化的原因,GBDT的更新時間往往超過24小時,所以為了兼顧data freshness和客觀的工程要求,facebook采取了下面的模型更新方法:
The boosted decision trees can be trained daily or every couple of days, but the linear classifier can be trained in near real-time by using some flavor of online learning.就是說GBDT的部分幾天更新一次,而LR的部分進行準實時的更新,這無疑是很好的工程實踐經驗。時至今日,我們已經開始使用大量不同的embedding方法進行特征編碼,facebook當時的做法也對我們現在的工程實踐有重要的參考價值。因為大量深度學習embedding方法的更新計算開銷也非常大,但對實效性要求并不高,我們也完全可以低頻更新embedding,高頻或實時更新基于embedding特征的LR,NN等預測模型。
facebook的實時數據流架構
為了實現模型的準實時訓練,facebook專門介紹了其基于Scribe的數據流架構,文中稱其為online data joiner。
該模塊最重要的作用是準實時的把來自不同數據流的數據整合起來形成sample features,并最終與click數據進行join,形成完整的labeled sample。在整個過程中,我認為最應該注意的有三點:
降采樣和模型校正
對于巨型互聯網公司來說,為了控制數據規模,降低訓練開銷,降采樣幾乎是通用的手段,facebook實踐了兩種降采樣的方法,uniform subsampling和 negative down sampling
uniform subsampling是對所有樣本進行無差別的隨機抽樣,為選取最優的采樣頻率,facebook試驗了0.001,0.01, 0.1, 0.5 和1五個采樣頻率,loss的比較如下:
可以看到當采樣率是10%時,相比全量數據訓練的模型,僅損失了不到1%的效果。
另一種方法?negative down sampling?保留全量正樣本,對負樣本進行降采樣。除了提高訓練效率外,負采樣還直接解決了正負樣本不均衡的問題,facebook經驗性的選擇了從0.0001到0.1的一組負采樣頻率,試驗效果如下:
大家可以看到,當負采樣頻率在0.025時,loss不僅優于更低的采樣頻率訓練出來的模型,居然也優于負采樣頻率在0.1時訓練出的模型,雖然原文沒有作出進一步的解釋,但推測最可能的原因是解決了數據不均衡問題帶來的效果提升。
負采樣帶來的問題是CTR預估值的漂移,比如真實CTR是0.1%,進行0.01的負采樣之后,CTR將會攀升到10%左右。而為了進行準確的競價以及ROI預估等,CTR預估模型是要提供準確的有物理意義的CTR值的,因此在進行負采樣后需要進行CTR的校正,使CTR模型的預估值的期望回到0.1%。校正的公式如下:
其中q是校正后的CTR,p是模型的預估CTR,w是負采樣頻率。大家可以利用簡單的轉換關系就可以得出上述公式,有興趣的同學可以手動推導一下。
?
至此,我們介紹完了facebook這篇經典的CTR預估論文,可以看到雖然五年過去了,我們仍能從中汲取不少模型改造和工程實現的經驗,就我個人來言,最值得學習的有下面三點:
最后慣例提出兩個問題供大家討論:
歡迎大家關注我的微信公眾號?王喆的機器學習筆記(wangzhenotes)一起交流,水平有限,歡迎大家拍磚、吐槽、討論。感覺文章有價值的同學也歡迎點贊鼓勵,謝謝。
參考資料:
總結
以上是生活随笔為你收集整理的Facebook经典CTR预估模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精益软件过程中七大浪费的应对之道
- 下一篇: 腾讯 VS 阿里 VS 携程消息中间件设