1. 程式人生 > >Practical Lessons from Predicting Clicks on Ads at Facebook 論文閱讀總結

Practical Lessons from Predicting Clicks on Ads at Facebook 論文閱讀總結

Abstract

Online advertising allows advertisers to only bid and pay for measurable user responses, such as clicks on ads. As a consequence, click prediction systems are central to most online advertising systems. With over 750 million daily active users and over 1 million active advertisers, predicting clicks on Facebook ads is a challenging machine learning task. In this paper we introduce a model which combines decision trees with logistic regression, outperforming either of these methods on its own by over 3%, an improvement with significant impact to the overall system performance. We then explore how a number of fundamental parameters impact the final prediction performance of our system. Not surprisingly, the most important thing is to have the right features: those capturing historical information about the user or ad dominate other types of features. Once we have the right features and the right model (decisions trees plus logistic regression), other factors play small roles (though even small improvements are important at scale). Picking the optimal handling for data freshness, learning rate schema and data sampling improve the model slightly, though much less than adding a high-value feature, or picking the right model to begin with.

1. 介紹

1.1 論文背景

本文主要介紹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概率。

1.2 研究背景

CTR預估(Click-Through Rate Prediction)是網際網路計算廣告中的關鍵環節,預估準確性直接影響公司廣告收入。CTR預估中用的最多的模型是LR(Logistic Regression),LR是廣義線性模型,與傳統線性模型相比,LR使用了Logit變換將函式值對映到0~1區間,對映後的函式值就是CTR的預估值。LR這種線性模型很容易並行化,處理上億條訓練樣本不是問題,但線性模型學習能力有限,需要大量特徵工程預先分析出有效的特徵、特徵組合,從而去間接增強LR的非線性學習能力。

LR模型中的特徵組合很關鍵, 但又無法直接通過特徵笛卡爾積解決,只能依靠人工經驗,耗時耗力同時並不一定會帶來效果提升。如何自動發現有效的特徵、特徵組合,彌補人工經驗不足,縮短LR特徵實驗週期,是亟需解決的問題。Facebook 2014年的文章介紹了通過GBDT(Gradient Boost Decision Tree)解決LR的特徵組合問題,隨後Kaggle競賽也有實踐此思路,GBDT與LR融合開始引起了業界關注。
GBDT(Gradient Boost Decision Tree)是一種常用的非線性模型,它基於整合學習中的boosting思想,每次迭代都在減少殘差的梯度方向新建立一顆決策樹,迭代多少次就會生成多少顆決策樹。GBDT的思想使其具有天然優勢可以發現多種有區分性的特徵以及特徵組合,決策樹的路徑可以直接作為LR輸入特徵使用,省去了人工尋找特徵、特徵組合的步驟。

這種通過GBDT生成LR特徵的方式(GBDT+LR),業界已有實踐(Facebook,Kaggle-2014),且效果不錯,是非常值得嘗試的思路。

2. 評估函式

論文目的是分析機器學習模型的影響因素,所以沒有使用實際利益相關的評測函式。而是主要從以下兩方面進行:

  • Normalized Cross-Entropy 或者叫做 Normalized Entropy, 縮寫NE
  • Calibration 校準

2.1 Normalized Cross-Entropy (NE)

NE的公式如下:

N E = 1 N i = 1 n ( 1 + y i 2 l o g ( p i ) + 1 y i 2 l o g ( 1 p i ) ) ( p l o g ( p ) + ( 1 p ) l o g ( 1 p ) ) NE = \frac{ -\frac{1}{N} \sum_{i=1}^{n}(\frac{1+y_i}{2}log(p_i) + \frac{1-y_i}{2}log(1-p_i))}{-(p * log(p) + (1 - p) * log(1-p))}

引數解釋: N N : 樣本數; y i y_i : 訓練集標籤; p p : 平均歷史點選率;

  • NE等於預測的log loss除以background CTR的熵
  • NE越小模型效能越好
  • 除去background CTR的熵,使得NE對background CTR不敏感
  • p代表平均經驗CTR

2.2 Calibration

  • Calibration校準是平均預測CTR與經驗CTR的比值,它是一個比例。
  • Calibration越接近1,模型效能越好

AUC也是一個非常不錯的評價指標,但是它有個問題。比如當我們的模型預測的CTR概率都偏高了2倍,我們可以通過Calibration校準,使用一個全域性的0.5的係數來修正。修正之後NE也會提高,而AUC卻保持不變。
在實際工作中,我們希望得到的是儘可能準確的預測每個廣告被點選的概率,而不是僅僅得到相對的概率排序。所以AUC不如上面的NE、Calibration合適。

3. 模型架構

經過多次實驗,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

為了提升線性分類器的準確度,有兩種方法進行特徵變換:

  1. 對於連續特徵。先進行離散化bin,然後把bin的index作為離散型特徵。這樣的話,線性模型可以分段的學習到一個非線性的對映,在每一段內的對映是不變的。另外,對於bin邊界的學習非常重要;
  2. 對於離散特徵。做笛卡爾積,生成的是tuple input features。笛卡爾積窮舉了所有的特徵組合,其中也包含部分沒用的組合特徵,不過可以篩選出來(只有那些不能被修剪掉的特徵組合才是有用的);其次,如果輸入特徵是連續的,也可以使用聯合分箱,如使用k-d tree。

笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積表示為X × Y,第一個物件是 X 的成員而第二個物件是 Y 的所有可能有序對的其中一個成員。
假設集合A={a, b},集合B={0, 1, 2},則兩個集合的笛卡爾積為{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

笛卡兒積得名於笛卡兒,因為這概念是由他建立的解析幾何引申出

提升決策樹(boosted decision tree)就可以很方便很好的實現上面我們說的這種非線性和tuple特徵變換。對於一個樣本,針對每一顆樹得到一個類別型特徵。該特徵取值為樣本在樹中落入的葉節點的編號。 舉例來說:

上圖中的提升決策樹包含兩棵子樹,第一棵樹包含3個葉節點,第二棵樹包含2個葉節點。輸入樣本x,在兩棵樹種分別落入葉子節點2和葉子節點1。那麼特徵轉換就得到特徵向量 [0 1 0 1 0]。也就是說,把葉節點編號進行one-hot編碼。

那麼, 怎麼樣直觀的理解這種特徵變化:

  1. 看做是一種有監督的特徵編碼。把實值的vector轉換成緊湊的二值的vector。
  2. 從根節點到葉節點的一條路徑,表示的是在特徵上的一個特定的規則。所以,葉節點的編號代表了這種規則。表徵了樣本中的資訊,而且進行了非線性的組合變換。
  3. 最後再對葉節點編號組合,相當於學習這些規則的權重。

從最後的實驗結果來看:將LR和GBDT進行組合模型的效能指標(NE)相比於沒有經過數進行特徵轉化的標準交叉熵(NE)提升超過了3.4%(相比於特徵工程只能在千分位上對NE進行降低,可以看出,GBDT+LR這種組合具有一個非常顯著的提升)!

GBDT模型的特點,非常適合用來挖掘有效的特徵、特徵組合。業界不僅GBDT+LR融合有實踐,GBDT+FM也有實踐,2014 Kaggle CTR競賽冠軍就是使用GBDT+FM,可見,使用GBDT融合其它模型是非常值得嘗試的思路。

3.2 Data freshness

論文裡的資料取2013年某一週內的實際資料,並且儘可能的保證線上線下的資料分佈是一致的。訓練集、測試集的劃分基本都是按照時間來的,比如選一天的資料作為訓練集,其後的一天或者幾天作為測試資料。

CTR系統的環境經常變化,資料的分佈也經常隨著時間變化而變化。為了驗證 data freshness 對模型的影響,實驗中訓練集固定為某一天的資料,然後分別測試在之後連續六天的模型的表現。

可以發現隨著天數的增加,data freshness 也變得越來越差,模型的效能也越來越差。所以,針對每天的偏差進行重新訓練就非常有必要。

一種做法是說每天都重新訓練。即使是mini-batch來訓練,也會非常耗時。提升樹的訓練時間受很多因素的影響,比如:樣本數量、樹深度、樹數量、葉子節點個數等。為了加快速度,可以在多CPU上通過並行化來實現。

那麼現在我們給出一種新的方法,可以做到:

  1. 提升樹可以一天或者幾天來訓練一次
  2. LR可以實現線上學習online learning,幾乎是實現實時的訓練

3.3 LR線性分類器

為了最大化data freshness,我們採取的措施是針對Logistic Regression進行線上增量訓練。也就是說只要使用者點選了廣告,生成了新的樣本,就進行增量訓練。

為此,Facebook針對SGD-based online learning研究了5中學習速率的設定方式,如下:

  1. Per-coordinate learning rate: The learning rate for feature i i at iteration t t is set to:
    η t , i = α β + j = 1 t j , i 2 \eta_{t,i} = \frac{\alpha}{\beta + \sqrt{\sum_{j=1}^{t} \nabla_{j,i}^2 }}
    α , β \alpha, \beta 是兩個可調引數;

  2. Per-weight square root learning rate:
    η t , i = α n t , i \eta_{t,i} = \frac{\alpha}{ \sqrt{n_{t,i} }}
    其中 n t , i n_{t,i} 特徵為 i i 直到迭代輪 t t 的總的訓練例項;

  3. Per-weight learning rate:
    η t , i = α n t , i \eta_{t,i} = \frac{\alpha}{n_{t,i}}

  4. Global learning rate:
    η t , i = α t \eta_{t,i} = \frac{\alpha}{\sqrt{t}}

  5. Constant learning rate:
    η t , i = α \eta_{t,i} = \alpha

  6. 前三種使得不同的引數有不同的學習速率

  7. 後兩種對於所有的引數都是用相同的學習速率

最終的實驗結果是:Per-coordinate learning rate效果最好

這個跟Adagrad的做法幾乎一樣,分母上使用梯度的平方進行累加,然後開根號。使得不同的引數具有不同的學習速率。

順便提一句,Adagrad也有缺點:隨著迭代不斷進行,學習速率無限的減小,直到模型無法進行學習。

實驗引數設定及對應結果:

其中,global learning rate失敗主要是由於訓練樣本在特徵上分佈不平衡造成。

因為每個訓練例項包含不同特徵,而一些比較popular的特徵相比於其他特徵可以對應更多的訓練例項,在global learning rate策略下,會造成對只有很少例項在該特徵上為非零值的特徵學習率下降太快,阻止了該特徵收斂到最佳權重。

而對於per-weight learning rate策略本身是用於解決馴良樣本在特徵上分佈不平衡問題的,這裡依舊失敗的原因是對於所有特徵,學習率下降太快,訓練在模型收斂到次優點的情況下過早終止。

另外,之前提到的BOPR和使用per-coordinate的SGD的表現是非常相似的。他們的效果也非常接近,但是BOPR需要計算均值和方差,計算量更大。兩者效果比較如下:

SGD + pre-coordinate learning rate 和BOPR的效果差不多,但勝在策略簡單,時間複雜度空間複雜度都完勝BOPR。

LR 相比 BOPR的優勢:

考慮在LR中,每個稀疏要素值只有一個權重, 而不是一個平均值和方差,LR model size只有BOPR的一半。

BOPR 相比於 LR的優勢:

它提供了一個完整的預測分佈的概率點選。這可用於計算預測分佈的百分位數, 可用於探索學習方案 [3]。

4. 線上模型架構

這部分主要是說明 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的概率。這顯然不是我們想看到的。可以依靠一些 保護機制來解決,比如:當發現實時的訓練資料分佈發生比較大變化的時候,就把 online trainer 和 online joiner 自動斷開,防止Trainer學習到壞的資料分佈。

5. 記憶體佔用和延遲

所有的這些探索都是為了能夠平衡模型效能(accuracy)和資源消耗(記憶體、CPU)。只有當你充分了解模型和資料每個部分後,才能根據實際情況做出最佳的取捨。

5.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甚至模型效果在變差,原因是出現過擬合。

5.2 Boosting feature importance

為了在資源消耗和模型效能之間做到平衡,可以通過控制Feature Count來調節。如果想刪掉一些特徵的話,那麼就需要研究這些特徵的重要程度的分佈,並研究刪除部分特徵後的效果。

下圖給出了特徵重要程度的分佈情況:

上圖首先對特徵按照重要程度來進行排序,編號後再畫圖。特徵重要程度按照使用該特徵進行分裂,所帶來的loss減小的累積量。因為一個特徵可以在多顆樹上進行使用,所以累積要在所有的樹上進行。

上圖中,黃線表示對特徵進行累加後的值,然後進行log變換。可以看到最終結果是1,表示所有特徵的重要度總和是1. 最重要的是期初非常陡峭,上升的非常快,說明特徵重要度主要集中在top10這些特徵中。前10個特徵,貢獻了50%的重要度,後面300個特徵,貢獻了1%的重要度。

作者又做實驗驗證了只保留前10、20、50、100以及200特徵時,模型表現如下:

當我們包含了更多的特徵時候, 標準交叉熵(NE)具有相似的遞減迴歸屬性(即隨著特徵的增大,NE降低速率逐步降低至0)。

5.3 Historical features VS Context features

針對兩大類特徵:歷史資訊特徵(使用者+廣告)、上下文特徵。論文還研究了這兩類特徵對模型效能的貢獻程度。先給出結論:歷史資訊特徵占主導地位

實驗結果如下:

同樣,先把特徵按照重要程度排序,再畫圖。橫軸是特徵數量,縱軸是 historical 特徵在 top k 個重要特徵中所佔的百分比。可以看到前10個特徵中,全是歷史資訊特徵;前20個特徵中,只有2個上下文特徵。所以:歷史資訊特徵比上下文特徵重要太多了

  • 歷史資訊特徵。主要是指使用者或者廣告之前的一些資訊,比如:該廣告上週的CTR值、該使用者的歷史平均CTR值等
  • 上下文特徵。比如:使用者使用的裝置、當前頁面、時間、一週第幾天等

由於Facebook的資料非常敏感,論文裡不能提供具體的特徵