引文
點擊率預估系統最早是由谷歌實現,并應用在其搜索廣告系統。在看到這一大殺器為谷歌帶來滾滾財源之后,其他公司也紛紛效仿。直到今日,大大小小的“互聯網廣告公司”,都宣稱自己掌握了基于人工智能的精準定向,實際上大多講的就是這個點擊率預估系統。而點擊率預估的應用場景也從最開始的搜索廣告,擴展到展示廣告、信息流廣告等等廣告形態,甚至于在商品推薦系統中都能看到其蹤影。
點擊率預估系統的核心是機器學習算法,不過我們也應該知道,算法所處理的對象往往是抽象的,是優雅的,而現實中的任務卻是具體的,充滿缺陷的。那么如何用抽象的算法來解決具體的業務問題,是本文所要介紹的內容。本文會分成日志系統、特征工程、模型選擇與訓練、在線服務四個部分,主要介紹點擊率預估系統的數據流程以及系統框架。而模型與算法原理、模型調優、在線學習這些主題,本文只做簡要介紹或不涉及。
1.日志系統
點擊率預估用到的是監督學習算法,所以我們需要由日志來提供如下表形式的數據。
這里面的每一行,都是一次廣告展示的完整記錄。其記錄了這次廣告展示所對應的廣告、用戶、上下文三類特征,以及用戶對這次廣告展示的行為反饋,即是否點擊了廣告。
但是實際上,用戶訪問一個網站或App而觸發廣告請求時,在服務器會生成一條日志,廣告曝光、點擊的上報又各自產生了相應的日志。對于這些各自獨立的日志,我們要把他們關聯起來,把廣告的請求、展示、點擊三個事件串起來,才能形成上述提到的記錄形式。為實現這一點,對每個廣告請求,我們要為其生成唯一的id,并在后續的曝光和點擊上報時,將這一id一起上報,再通過這一id來關聯日志。具體的日志關聯過程,可以采取離線批處理(如MapReduce),也可以采用流式處理(如Spark Streaming),這個根據業務情況酌情選擇。前面提到,處理之后的記錄包含廣告、用戶、上下文三類特征,那么在打印日志時,特別是請求日志,需要注意將相關信息打印完備。
2.特征工程
點擊率預估算法處理是數字形式的輸入,所以在日志處理完之后,需要通過特征工程來將文本形式的信息轉換成數字形式的信息,即建立索引。建立索引有兩種常見做法,一是對特征簡單計數,一是對特征取值做哈希處理。如果采用簡單計數,需要將所有特征都枚舉出來,這在日志量和特征空間龐大的時候會是一個問題。而采用哈希處理則相對簡單,而且有一些團隊通過哈希碰撞的方式來縮小特征空間,降低訓練難度,不過這個做法是否不影響預測性能是因業務而異的。如果接入的是線性模型,那么在建索引時還需要對分類類型特征做one-hot編碼。
在建索引之前,還有很多事情要做。有一些特征并不會在日志中出現,比如統計數據,這些特征需要通過各種id去做關聯。日志中往往會存在一些異常值,比如說有一些刷單數據,或是特征取值明顯偏離正常范圍,我們需要對這些數據做過濾。而對于實值特征,往往會做歸一化或是離散化(如果使用線性模型),以免由于實值特征取值范圍嚴重偏離[0,1]區間,而給模型訓練和預測帶來困難。樣本中的特征還有可能獲取不到觀測值,或者是觀測值出現次數過少,對于這些情況,可以賦予缺省值。而有些特征的覆蓋率太低,則可以選擇放棄。如果想要為線性模型引入非線性,則需要做交叉特征設計,這是一件很依賴領域知識的事情。總之,特征工程這件事情,花樣很多。
我們知道,廣告的點擊率一般是顯著低于50%的,會存在樣本不平衡的問題,那么對于這個問題,我們可以采用負例欠采樣的處理方式。通過觀察不同欠采樣比例下的模型預測性能,可以獲取最佳的采樣比例。欠采樣方法有可能導致丟失一些負例的信息,對于這個問題,可以嘗試[1]所提出的Easy Ensemble,就是對負例進行N次不重復的隨機采樣,并分別與所有正例組成N個訓練集,分別訓練出N個模型,然后對預測值做平均。這個做法簡單有效,不過對于在線服務來說,N個模型就意味著N倍的計算量,需要權衡這個做法的收益。
3.模型選擇與訓練
點擊率預估算法,最經典的莫過于LR(Logistic Regression,邏輯回歸),作為一個線性模型,他的特點是易實現,易解釋,還有Google背書提出FTRL(Follow
The [Proximally] Regularized Leader)優化算法,再說他能夠給“特征工程師”提供存在感:)。
近年來的趨勢是FM(Factorization
Machine)/FFM(Field-aware Factorization Machine),DNN(深度神經網絡)。FM算法為各個特征生成一個Embedding Vector,并且通過不同特征對應的Embedding的內積來表達交叉特征,這對于訓練樣本稀疏的交叉特征有明顯更好的學習能力。FFM則是對FM的一小步改進,他為每個特征生成的Embedding不只有一個,而是根據不同的互作用field生成不同的Embedding,這里的field指的是一個特征在one-hot編碼之前所屬的分類類型特征[2]。FFM算法因為在Kaggle比賽中連續兩次取勝而引起關注,有趣的是,第一次比賽中臺大的團隊使用了FFM并取勝之后,第二次比賽各個團隊也都紛紛使用該算法。FFM在在線服務中的嘗試以及效果的提升也已有相關報道[3,4]。至于DNN,按Bing團隊的說法:在各種使用DNN的嘗試中,其帶來的效果提升都是marginal的,而其對計算機資源的消耗則大幅增加,而且在線效果并不穩定[5]。當然了,有些公司確實在點擊率預估的生產環境中使用了DNN,甚至提供了云服務,對于他們是否也碰到前面所述的問題,是否有從DNN中獲得不那么marginal的提升,我很感興趣。
接下來聊聊模型集成。通過模型集成來降低預測的偏差或方差,是機器學習中的通用做法。集成方法有stacking、cascading、boosting等等,而大名鼎鼎的GBDT就是boosting的產物,這里要聊的模型集成都跟GBDT有關系。前面提到Kaggle比賽的獲勝者用了FFM,其實他們使用了模型集成,具體做法是GBDT+FFM,將GBDT的輸出接入到FFM的輸入特征,這個做法很可能是受啟發于Facebook提出的GBDT+LR。Facebook提出這個方法,是基于這樣的考慮:在特征工程中往往需要做兩件事情,一是將實值特征打散,一是生成交叉特征,而他們注意到GBDT恰好可以自動完成這兩件事情[6]。這個集成模型是一個cascading的做法。我最近注意到另外一個很有意思的做法,則是基于boosting的。這個做法本質上也是GBDT,但是與通常的GBDT不同的是,其第一個分類器不是決策樹,而是用其他模型來代替,比如LR、NN、DNN等等,然后在這個基礎上再用決策樹做boosting。這個做法從Bing的實驗結果來看效果的提升是非常明顯的[5]。
講了這么多的模型,那么我從零開始搭建系統,應該選哪一個呢?我個人比較信賴所謂“AK-47”原則,就是在實現一個東西的時候,應該首先選擇簡單有效的方式。那么基于這個原則我們應該首先考慮單模型,即LR、GBDT、FM/FFM等模型。而在這里面,我個人傾向于選擇FFM,這個模型把我們從交叉特征的藝術創造中解放出來,其有效性已有多方背書,還可以online-training。要說有什么缺點,一個是容易過擬合,一個是相對LR、FM消耗更多資源。對付第一個問題用early-stopping,而第二個問題,在這個DNN都可以上的年代,多消耗點資源就消耗吧。當然,最好把LR、GBDT這些也弄上做baseline,再說這里面很多說不準,效果這東西得試試才知道。
聊完模型,來聊聊訓練。訓練時,我們需要為模型的性能確定指標,通過性能指標來選擇最合適的模型。最常用的是AUC(Area Under ROC Curve),指的是ROC(Receiver Operating Characteristic)曲線下的面積,衡量的是對于不同廣告的排序質量,這也恰恰是大多廣告點擊率系統最關心的。除此之外還有LogLoss、RIG(衡量點擊率預估值的準確率)、Utility(衡量模型帶來的收益提升)等等指標,可以根據業務需求酌情選取。不同的模型都有各自的超參數需要去做調優,這里不做展開。
4.在線服務
在線服務有三個關鍵環節,分別是分流實驗、特征轉換和pCTR(predicted click through rate,預估點擊率)計算,這里分段簡要介紹。
點擊率預估系統往往需要做線上實驗來驗證模型的效果,所以在線服務首先需要一個實驗層來對流量進行配置,將流量分發給不同的模型,并且跟蹤不同模型的實時效果。需要注意的是,良好的離線效果并不意味著線上效果就一定好。
特征轉換對應的是離線處理時的特征工程環節,是為了將廣告請求的數據轉換成模型的輸入特征。在特征轉換的過程中,往往從廣告請求中拿到的特征并不全,還需要去做進一步的關聯。互聯網廣告一般對實時性要求比較高,而pCTR計算環節已經是計算密集的,為了提高響應速度,在特征轉換環節應該減少甚至避免IO帶來的延遲,所以這些關聯信息最好提前加載到應用內存或者緩存中,并通過定時任務進行更新。
通過特征轉換得到的輸入特征,會交給pCTR計算模塊去做最后的計算,這個模塊加載了訓練好的模型。模型的訓練都會以一定的頻率進行(甚至是一直在進行,即所謂在線學習),而訓練好的模型也都會以一定的頻率更新到線上,以便計算模塊及時利用到較新的信息。那么計算模塊應該妥當設計,使其能夠對模型進行熱更新而不影響服務。模型本身由于采樣的問題,或是模型自身的局限,還會帶來預測值的整體偏差,這個偏差對于需要進行競價的業務會產生影響,這種情況下計算模塊還需要對預測值進行校準。
寫在最后
與點擊率預估類似的還有轉化率預估,這兩者是相通的,區別在于預測目標不一樣。
點擊率預估是一個很大的話題,本文也只是對這個話題的一點介紹,篇幅所限,很多問題只是浮光掠影而過,作者后面會選擇其中一些主題再行展開成文。由于本人經驗所限,文中所述難免存在錯誤或紕漏,各位看官不吝批評指正。
[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原理與實踐.
[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.
公眾號機器決策