計算廣告CTR預估系列(七)--Facebook經典模型LR+GBDT理論與實踐
計算廣告CTR預估系列(七)–Facebook經典模型LR+GBDT理論與實踐
一、介紹
本文主要介紹Facebook提出的CTR預估模型LR(Logistic Regression)+GBDT。當時深度學習還沒有應用到計算廣告領域,Facebook提出利用GBDT的葉節點編號作為非線性特征的表示,或者說是組合特征的一種方式。
LR+GBDT相比於單純的LR或者GBDT帶來了較大的性能提升,論文中給出數據為3%,這在CTR預估領域確實非常不錯。除此之外,Facebook還在在線學習、Data freshness、學習速率、樹模型參數、特征重要度等方面進行了探索。
相比於搜索廣告領域,根據用戶query來給出候選廣告,然后利用Rank模型對候選廣告進行排序。這些廣告要么顯式要么隱式的和用戶query相關聯。但是在Facebook這樣的社交場合中,廣告並沒有和用戶query相關聯,但是用戶看到的廣告一定程度上反映了用戶的人口統計特性和興趣特性。基於這個原因,在Facebook上展示的廣告相比於搜索廣告中的要多一些。
在實際的生產環境中,Facebook做了多個分類器,並把他們級聯起來。但是論文中分析的是最后的那一個prediction模型。它直接給出最后的CTR概率。
二、評估函數
論文目的是分析機器學習模型的影響因素,所以沒有使用實際利益相關的評測函數。而是主要從以下兩方面進行:
- Normalized Cross-Entropy 或者叫做 Normalized Entropy, 縮寫NE
- Calibration 校准
2.1 Normalized Cross-Entropy(NE)
NE的公式如下:
- NE等於預測的log loss除以background CTR的熵
- NE越小模型性能越好
- 除以了background CTR的熵,使得NE對background CTR不敏感
- p代表平均經驗CTR
2.2 Calibration
- Calibration校准是期待或預測的點擊數除以實際的點擊數。它是一個比例。
- Calibration越接近1,模型性能越好
AUC也是一個非常不錯的評價指標,但是它有個問題。比如當我們的模型預測的CTR概率都偏高了2倍,我們可以通過Calibration校准,使用一個全局的0.5的系數來修正。修正之后NE也會提高,而AUC卻保持不變。
在實際工作中,我們希望得到的是盡可能准確的預測每個廣告被點擊的概率,而不是僅僅得到相對的概率排序。所以AUC不如上面的NE、Calibration合適。
三、模型架構
經過多次實驗,FB得出結論:正確的模型 + 強特征是提升模型性能的核心。相比於這兩點,其他的因素的影響就小很多,比如學習速率、采樣率等。當數據量足夠大時,一個好的模型應該是穩定的,也就說參數的調整不會導致模型性能出現劇烈的震盪。
這里面,正確的模型就是指:Logistic Regression + Boosting Decision Tree。特征的話包含兩方面的特征:用戶或廣告的歷史信息特征、上下文特征。其中,用戶或廣告的歷史信息特征取決定性作用。
學習算法是用的是Stochastic Gradient Descent(SGD),或者Bayesian online learning scheme for probit regression(BOPR)都可以。但是最終選擇的是SGD,原因是資源消耗要小一些。
SGD和BOPR都可以針對單個樣本進行訓練,所以他們可以做成流式的學習器(stream learner)。
3.1 決策樹Feature Transforms
為了提升線性分類器的准確度,有兩種方法進行特征變換:
-
對於連續特征。先進行離散化bin,然后把bin的編號作為離散型特征。這樣的話,線性模型可以分段的學習到一個非線性的映射,在每一段內的映射是不變的。另外,對於bin邊界的學習非常重要
-
對於離散特征。做笛卡爾積,生成的是tuple input features。笛卡爾積窮舉了所有的特征組合,其中也包含部分沒用的組合特征,不過可以篩選出來。
提升決策樹(boosted decision tree)就可以很方便很好的實現上面我們說的這種非線性和tuple特征變換。對於一個樣本,針對每一顆樹得到一個類別型特征。該特征取值為樣本在樹中落入的葉節點的編號。舉例來說:
上圖中的提升決策樹包含兩棵子樹,第一棵樹包含3個葉節點,第二棵樹包含2個葉節點。輸入樣本x,在兩棵樹種分別落入葉子節點2和葉子節點1。那么特征轉換就得到特征向量[0 1 0 1 0]
。也就是說,把葉節點編號進行one-hot編碼。
那么, 怎么樣直觀的理解這種特征變化:
-
看做是一種有監督的特征編碼。把實值的vector轉換成緊湊的二值的vector。
-
從根節點到葉節點的一條路徑,表示的是在特征上的一個特定的規則。所以,葉節點的編號代表了這種規則。表征了樣本中的信息,而且進行了非線性的組合變換。
-
最后再對葉節點編號組合,相當於學習這些規則的權重。
從最后的實驗結果來看:將LR和GBDT進行組合模型的性能提升了很多。
3.2 Data freshness
論文里的數據取2013年某一周內的實際數據,並且盡可能的保證線上線下的數據分布是一致的。訓練集、測試集的划分基本都是按照時間來的,比如選一天的數據作為訓練集,其后的一天或者幾天作為測試數據。
CTR系統的環境經常變化,數據的分布也經常隨着時間變化而變化。為了驗證data freshness對模型的影響,實驗中訓練集固定為某一天的數據,然后分別測試在之后連續幾天的模型的表現。
可以發現隨着天數的增加,data freshness也變得越來越差,模型的性能也越來越差。所以,針對每天的偏差進行重新訓練就非常有必要。
一種做法是說每天都重新訓練。即使是mini-batch來訓練,也會非常耗時。提升樹的訓練時間受很多因素的影響,比如:樣本數量、樹深度、樹數量、葉子節點個數等。為了加快速度,可以在多CPU上通過並行化來實現。
那么現在我們給出一種新的方法,可以做到:
- 提升樹可以一天或者幾天來訓練一次
- LR可以實現在線學習online learning,幾乎是實現實時的訓練
3.3 LR線性分類器
為了最大化data freshness,我們采取的措施是針對Logistic Regression進行在線增量訓練。也就是說只要用戶點擊了廣告,生成了新的樣本,就進行增量訓練。
為此,Facebook針對SGD-based online learning研究了5中學習速率的設置方式,如下:
- 前三種使得不同的參數有不同的學習速率
- 后兩種對於所有的參數都是用相同的學習速率
最終的實驗結果是:Per-coordinate learning rate效果最好:
這個跟Adagrad的做法幾乎一樣,分母上使用梯度的平方進行累加,然后開根號。使得不同的參數具有不同的學習速率。順便提一句,Adagrad也有缺點:隨着迭代不斷進行,學習速率無限的減小,直到模型無法進行學習。
下圖是實驗中的參數設置,以及實驗結果,供大家參考:
其他的學習速率的問題大多在於:由於模型收斂於一個局部最優解導致學習很快就停止了。另外,之前提到的BOPR和使用per-coordinate的SGD是非常相似的。他們的效果也非常接近,但是BOPR需要計算均值和方差,計算量更大。兩者效果比較如下:
四. 線上模型架構
這部分主要是說明online data joiner。前面我們研究過data freshness對於模型的訓練是非常重要的。那么新的訓練數據是怎么產生的那,這就是online data joiner的作用。
這個名字主要是來自於,這里最關鍵的步驟就是把labels(click/no-click)和訓練輸入(ad impressions)以一種在線的方式連起(join)起來。所以系統被稱為online data joiner。
4.1 label標注
首先設定一個足夠長的閾值。一個廣告展示給用戶之后,如果用戶在閾值的時間內沒有點擊廣告就標記為no-click,點擊了的話就標記為click。這個等待的時間窗口需要非常小心的調整。
如果太長了,會增加緩存impression的內存消耗,而且影響實時數據的產生;如果太短了則會導致丟失一部分的點擊樣本,會影響click converage 點擊覆蓋。
click converage 點擊覆蓋表示有多少個點擊行為被記錄了下來生成了樣本。online data joiner必須保證盡可能高的點擊覆蓋,也就是盡可能多的來記錄下來所有的點擊行為。但是如果等待太久就會增加緩存開銷等影響。所以online data joiner必須在click converage和資源消耗之間做出平衡,又一個trade-off。
如果點擊覆蓋比較低,意味着很多用戶的點擊不但沒有記錄下來,而是變成了沒有點擊。造成數據分布發生偏差,結果就是:模型學習到的CTR值要比真實值低很多。不過實際情況中,問題比較好解決:增大等待時間窗口,只要內存消耗還可以接受就行。
4.2 模型架構
online data joiner系統結構如下:
廣告展示生成特征,用戶給出反饋:點擊或者未點擊。Online Joiner捕獲反饋生成新的訓練樣本,訓練樣本經過Trainer的學習得到新的模型。模型反過來影響Ranker系統對展示的廣告進行選擇排序,用戶又看到了新的廣告,決定是否要點擊。一直這樣下去,形成一個閉環系統。
4.3 挑戰
系統異常是在線學習系統的一大挑戰。這里的異常就是指系統異常,比如系統出現問題導致stream data是老數據。可能分類器就會學習到錯的數據,針對所有的點擊率都給出一個非常低甚至是0的概率。這顯然不是我們想看到的。可以依靠一些保護機制來解決,比如:當發現實時的訓練數據分布發生比較大變化的時候,就把onliner trainer和online joiner自動斷開,防止Trainer學習到壞的數據分布。
五、處理大量訓練數據
很多的計算廣告領域的訓練數據量都是非常巨大的,那么如何有效的控制訓練帶來的開銷就非常重要。常用的辦法是采樣,分為:
- Uniform Subsampling
- Negative down sampling
5.1 Uniform subsampling
均勻采樣非常的簡單,易於實現。而且使用均勻采樣沒有改變訓練數據的分布,所以模型不需要修改就可以直接應用於測試數據上。
下圖給出了不同采樣率對模型性能的影響:
可以看到更高的采樣率使用了更多的訓練數據,提升了模型的效果。從圖中可以看到使用10%的數據,相比於使用100%的數據,僅僅造成了1%的性能降低。是非常小的。
對於Calibration校准,均勻采樣不會造成影響。
5.2 Negative down sampling
計算廣告中大部分的訓練樣本都極度不平衡,這對模型會造成很大影響。一種解決辦法就是對負樣本進行欠采樣。實驗結果如下:
可以看到采樣率不同,對模型性能影響很大。采樣率為0.025的時候取得最好結果。
5.3 Model Re-Calibration
負樣本欠采樣可以加快訓練速度並提升模型性能。但是同樣帶來了問題:改變了訓練數據分布。所以需要進行校准。
舉例來說,采樣之前CTR均值為0.1%,使用0.01采樣之后,CTR均值變為10%。我們需要對模型進行Calibration(校准)使得模型在實際預測的時候恢復成0.1%。調整公式如下:
其中:
- w是采樣率
- p是在采樣后空間中給出的CTR預估值
- 計算得到的q就是修正后的結果
六、各種實驗結果
所有的這些探索都是為了能夠平衡模型性能(accuracy)和資源消耗(內存、CPU)。只有當你充分了解模型和數據每個部分后,才能根據實際情況做出最佳的取舍。
6.1 Number of boosting trees
下圖給出了,boosting trees對模型的影響:
boosting tree數量從1到2000,葉節點個數被限制為最大12個。submodel之間的區別在於訓練數據大小的不同,比如submodel 2的訓練數據只有前面兩個的1/4。
可以看到隨着boosting tree數量的增加,模型的性能有所提升。但是幾乎所有的提升都來自於前500個trees,而后面的1000個trees的提升甚至都不到0.1%。submodel 2在1000顆trees甚至模型效果在變差,原因是過擬合。
6.2 Boosting feature importance
為了在資源消耗和模型性能之間做到平衡,可以通過控制Feature Count來調節。如果想刪掉一些特征的話,那么就需要研究這些特征的重要程度的分布,並研究刪除部分特征后的效果。
下圖給出了特征重要程度的分布情況:
上圖首先對特征按照重要程度來進行排序,編號后再畫圖。特征重要程度按照使用該特征進行分裂,所帶來的loss減小的累積量。因為一個特征可以在多顆樹上進行使用,所以累積要在所有的樹上進行。
上圖中,黃線表示對特征進行累加后的值,然后進行log變換。可以看到最終結果是1,表示所有特征的重要度總和是1. 最重要的是期初非常陡峭,上升的非常快,說明特征重要度主要集中在top10這些特征中。前10個特征,貢獻了50%的重要度,后面300個特征,貢獻了1%的重要度。
那么能否全部去掉后面這些看起來不是那么重要的特征那?試一試:
顯然,全部去掉是不行的。說明大量弱特征的累積也是很重要的,但是去掉部分不那么重要的特征,對模型的影響比較小,比如從400到200。
6.3 Historical features VS Context features
針對兩大類特征:歷史信息特征(用戶+廣告)、上下文特征。論文還研究了這兩類特征對模型性能的貢獻程度。先給出結論:歷史信息特征占主導地位。
實驗結果如下:
同樣,先把特征按照重要程度排序,再畫圖。橫軸是特征數量,縱軸是historical特征在top k個重要特征中所占的百分比。可以看到前10個特征中,全是歷史信息特征;前20個特征中,只有2個上下文特征。所以:歷史信息特征比上下文特征重要太多了。
- 歷史信息特征。主要是指用戶或者廣告之前的一些信息,比如:該廣告上周的CTR值、該用戶的歷史平均CTR值等
- 上下文特征。比如:用戶使用的設備、當前頁面、時間、一周第幾天等
由於Facebook的數據非常敏感,論文里不能提供具體的特征都有哪些。
論文中還研究了單獨使用這兩類特征的效果:
和之前的結論保持一致。而且還可以發現使用Historical特征的模型,對data freshness的依賴相對要小一些。這也和我們的直觀理解是相符的:歷史信息特征包含用戶長時間的行為特征,相比於上下文特征更加穩定。
但是,上下文特征在解決冷啟動問題上有優勢。對於新的用戶或者廣告,上下文特征對於給出一個合理的CTR預測是必不可少的。
七、總結
Facebook提出的LR + GBDT來提取非線性特征進行特征組合的方式非常經典,主要特性總結如下:
- Data Freshness很重要。模型至少一天需要重新訓練一次
- 使用Boosted Decision Tree進行特征轉換很大程度上提高了模型的性能
- 最好的在線學習方法:LR + per-coordinate learning rate
關於平衡計算開銷和模型性能所采用的技巧:
- 調整Boosted decision trees數量
- 去掉部分重要性低的特征,對模型的影響比較小。但是不能全去掉
- 相比於上下文特征,用戶/廣告歷史特征要重要的多
- 針對大量訓練數據可以進行欠采樣
八、代碼實踐
所有的代碼都放到了github上,后台可以獲取。這里針對關鍵代碼給出截圖:
訓練數據對負樣本進行欠采樣:
特征處理:
GBDT給出葉節點編號,生成新特征:
LR + GBDT組合:
實驗結果部分截圖如下:
GBDT單模型:
LR+GBDT模型:
Reference
- Practical Lessons from Predicting Clicks on Ads at Facebook
計算廣告CTR預估系列往期回顧
計算廣告CTR預估系列(一)–DeepFM理論
計算廣告CTR預估系列(二)–DeepFM實踐
計算廣告CTR預估系列(三)–FFM理論與實踐
計算廣告CTR預估系列(四)–Wide&Deep理論與實踐
計算廣告CTR預估系列(五)–阿里Deep Interest Network理論
計算廣告CTR預估系列(六)–阿里Mixed Logistic Regression