1. 程式人生 > >關於點選率模型,你知道這三點就夠了

關於點選率模型,你知道這三點就夠了

說到廣告,或者運營,關注的最多的就是點選率了。我們經常能聽說某某科學家通過建立更好的點選率預測模型,為公司帶來上億的增量收入。點選率這麼簡單直接的統計量,為什麼要用複雜的數學模型來刻畫呢?

說到計算廣告,或者個性化推薦,甚至一般的網際網路產品,無論是運營、產品還是技術,最為關注的指標,就是點選率。業界也經常流傳著一些故事,某某科學家通過建立更好的點選率預測模型,為公司帶來了上億的增量收入。點選率這樣一個簡單直接的統計量,為什麼要用複雜的數學模型來刻畫呢?這樣的模型又是如何建立與評估的呢?我們這一期就來談談這個問題。

一、為什麼要建立一個點選率模型?

無論是人工運營還是機器決策,我們都希望對某條廣告或內容可能的點選率有一個預判,以便判斷哪些條目應該被放在更重要的位置上。這件事兒看起來並不難,比如說我有十條內容,在歷史上呈現出來的點選率各個不同,那麼只需要根據歷史點選率的統計做決策即可,似乎並沒有什麼困難。

然並卵。直接統計歷史點選率的方法,雖然簡單易操作,卻會碰到一個非常棘手的問題。首先,大家要建立一個概念:不考慮位置、時間等一系列環境因素,絕對的點選率水平是沒有什麼太大意義的。比方說,下面的一個廣告,分別被放在圖中的兩個位置上,統計得到前者的點選率是2%,後者的點選率是1%,究竟哪個廣告好一些呢?其實我們得不出任何結論。

於是,聰明的運營想到一個辦法,乾脆我在不同的位置上分別統計點選率,然後分別排序。這個思路從道理上來說無懈可擊,相當於直接求解聯合分佈;不過,其實用價值並不高:在每個位置上分別統計,大多數廣告或內容條目的資料都太少,比如說100次展示,產生了一次點選,這難道能得出1%點選率的結論麼?

那能不能再換一個思路,找到一些影響點選率的一些關健因素,對這些因素分別統計?這實際上已經產生了“特徵”這樣的建模思路了。比如說,廣告位是一個因素,廣告本身是一個因素,使用者的性別是一個因素,在每個因素上分別統計點選率,從資料充分性上是可行的。不過這又產生了一個新的問題:我知道了男性使用者的平均點選率、廣告位S平均點選率、某廣告A的平均點選率,那麼如何評估某男性使用者在廣告位S上看到廣告A的點選率呢?直覺的方法,是求上面三個點選率的幾何平均。不過這裡面有一個隱含的假設:即這三個因素是相互獨立的。然而當特徵多起來以後,這樣的獨立性假設是很難保證的。

特徵之間獨立性,經常對我們的結論影響很大。比如說,中國的癌症發病率上升,到底是“中國”這個因素的原因呢?還是“平均壽命”這個因素的原因呢?顯然這兩個因素有一些相關性,因此簡單的分別統計,往往也是行不通的。

那麼怎麼辦呢?這就要統計學家和電腦科學家出馬,建立一個綜合考慮各種特徵,並根據歷史資料調整出來的點選率模型,這個模型既要考慮各種特徵的相關性,又要解決每個特徵資料充分性的問題,並且還要能在大量的資料上自動訓練優化。這就是點選率模型的意義,這是一項偉大的、光榮的、正確的、有著極大實用價值和戰略意義的網際網路+和大資料時代的重要工作。那位說了,有必要擡得這麼高麼?當然有必要!因為這門手藝我也粗通一點兒,不吹哪行。

二、怎樣建立一個點選率模型?

這個問題比較簡單,我們就不多談了。(想罵街的讀者,請稍安勿躁,繼續往下看。)

三、如何評估一個點選率模型?

評估點選率模型的好壞,有各種定性的或定量的、線上的或線下的方法。但是不論什麼樣的評測方法,其本質都是一樣,就是要看這個模型區別被點選的展示與沒被點選的展示之間的區別。當然,如果能找到一個離線可以計算的量化指標,是再好不過了。

這樣的指標是有一個,就是如下圖所示的ROC曲線下的面積,術語上稱為AUC。(關於ROC和AUC的詳細介紹,請大家參考《計算廣告》第*章。)AUC這個數值越大,對應的模型區別能力就越強。

好了,為了讓大家深入理解點選率模型評測的關鍵,我們要談到一個常見的口水仗:有一天,有兩位工程師在閒談,一位叫小優,一位叫小度。他們分別負責某視訊網站和某網盟廣告的點選率建模。小優說:最近可把我忙壞了,上線了個全新的點選率模型,把AUC從0.62提高到0.67,效果真不錯!哪知道小度聽了哈哈大笑:這資料你也好意思拿出來說,我們的AUC早就到0.9以上了!

那麼,是不是小度的模型比小優真的好那麼多呢?當然不是,我們看看該視訊網站和網盟的廣告位分佈,就一目瞭然了。

什麼?你還沒有明白,那麼我建議你自己好好把這個問題想清楚。不論你是運營還是產品,經過了這樣的思考,你的資料解讀能力會上一個臺階。

好了,三個關鍵點說完了,我知道有的讀者還會對第二點表示沒看懂,那乾脆我們就再多說一點兒,將2015年11月15日王超在計算廣告讀者微信群裡所做的題為“點選率預估趨勢淺析”的分享內容整理髮布在下面。沒有堅持到這裡就把文章關掉的碼農們,讓他們後悔一輩子去吧!

今天分享一下點選率預估近年來的一些趨勢。主要結合劉鵬老師的一些指導,以及自身工作的一些經驗,有偏頗的地方請大家多多指正。

在計算廣告第一版的書裡,主要講到了經典的點選率預估模型邏輯迴歸,特徵工程,模型的評估等,相信對大多數場景來說這一步是必做的基線版本。後續可以在此基礎上做一些更細緻的特徵工程和模型工作。考慮到群裡的朋友都已經拿到了這本書,今天先跳過書裡覆蓋的內容,講一些目前書裡沒有提及的部分。如果對書裡內容還不夠了解的朋友,建議第一步還是把書中基礎性的內容仔細掌握。

LR+人工特徵工程風光不再

講近年來點選率預估的發展趨勢,我想先從近年來一次最具參考意義和號召力的criteo舉辦的點選率預估比賽作為切入點說起。

為什麼要拿這次比賽來說?首先criteo是全球一家專注在效果廣告的公司,在業界很有影響力,計算廣告書中對其也有介紹,比賽的資料質量不錯。其次前三名有10w美金的激勵,繼KDD cup 2012 track2之後,算是點選率預估問題上最知名的一次比賽,很多kdd cup的往屆冠軍都前來參加。最後呢這次比賽都是脫敏過的特徵,沒有具體的特徵含義,使得難以結合領域知識做更細緻的特徵工程,更多考量模型的工作,比較適合我們今天討論的話題,另外比賽時間是從去年6月到9月三個月的時間,參賽者們的方案相對也會比較細緻。

從leadboard中可以看到在700多支team裡,Kdd 2012年起的各屆冠軍,這些比賽型的選手,基本佔據了前十的位置,我是第7。其次,從使用的模型上,基本以fm和gbdt,還有神經網路這些非線性模型為主。可以這麼說,在比賽裡,邏輯迴歸加大量的人工特徵工程的方案已經很難排到比賽前列,靠邏輯迴歸一個模型包打天下,已經成為過去時。

特徵,特徵

在接下來講具體模型之前,先來回顧一下我們為什麼要做大量的特徵工程。點選率預估的主要場景,是在各種長尾的流量上,對一個給定的<使用者,廣告,上下文>三元組做出精準估計。在這種long tail的場景下,使用者或上下文對廣告的偏好,基本都是一些相對weak的signal,我們需要把這些弱訊號package在一起,才能去更好的發現當前場景下使用者感興趣的廣告。

特徵工程是各個公司相對模型來說更看重保密的部分,因為從其中會大致瞭解到該公司的資料分佈,這方面的公開資料不會太多。大體來說,有這麼倆部分工作:

首先了解行業的領域知識,去尋找和設計強訊號依然重要,比如搜尋廣告裡query和廣告創意的相關性是強訊號,電商領域圖片和價格特徵是強訊號等。這部分工作是和各家公司業務緊密相關的。

其次如果採用的是邏輯迴歸這種廣義線性模型,需要手動構造特徵變換,才能更好處理非線性問題。常見的特徵變換方法比如特徵組合,特徵選擇,特徵離散化歸一化等,多數時候通過eyeballing和統計學的方法來完成。工程師自然是希望能將更多的精力放在設計業務上的強訊號特徵上面,而特徵變換自動的由模型來完成。出於這樣的考慮,非線性模型逐漸在取代LR,比如通過FM,GBDT去自動挖掘組合特徵,通過GBDT去做特徵選擇,離散化等,正如上述比賽中看到的。

最後基於一些深度學習的方法,也能夠做一些特徵發現的事情,舉個典型的例子就是語音識別裡,dnn已經把MFCC這種人工特徵取代了,wer有顯著的降低。而在廣告領域,DNN目前基本在百度等大公司也正在探索中,發展比較快,這部分今天簡單提一下。

模型選擇

點選率預估的模型,如果包括各個模型的變種,可能不下數十種。根據自己的業務如何選擇相關的模型,我想從三個維度說下個人選擇模型時候的觀點,偏頗之處請大家多多指正。

第一,線性模型還是非線性模型。一般在模型的初期線性模型會作為首選方法採用,有經驗的工程師對業務領域中的強訊號比較熟悉,能夠快速rush完幾個版本的特徵工程後達到一個不錯的基線水平。而當從業務中抽象出強訊號越來越困難時,往往就會伴隨著比較暴力的特徵工程去捕捉業務裡的弱訊號。隨著這一過程的深入,模型訓練的代價在快速增長,而收益卻逐漸逼近上限。而非線性模型的長期優勢則比較明顯,模型泛化能力強,調參成本相對較小,能在訓練代價和模型精度上達到更好的tradeoff,百度等大公司都已經從LR過渡到了DNN。

第二,基於Sparse的特徵(靜態特徵)建模,還是Dense的特徵(動態特徵)建模。這一點可能沒有細看書的朋友不太熟悉,簡單說就是當某個特徵被觸發時,不再用1,而是用這個特徵歷史上一段時間(或者多個時間視窗)的點選率作為其特徵取值。當特徵動起來以後,通過特徵側捕捉動態訊號,模型就不用快速更新了,可以說dense建模的方案相對更加簡單優雅。曾經做過這樣的實驗,當採用動態特徵加Offline模型,和靜態特徵加Online模型,倆者收益是相當的。

這裡補充重點說明一點,如果基於sparse特徵建模的話,knowledge完全儲存在模型處,而基於dense特徵建模,知識存放在模型和特徵(點選率)倆處,餵給模型的點選率特徵是否置信,直接決定了這個方案的魯棒性。這裡有倆個問題,一個是在某些場景下,點選率是有bias的,比如展示廣告裡,頭部流量上點選率被高估,點選率高是因為其廣告位置比較好,如果不消去bias,則會產生強者愈強的馬太效應。另一個問題是長尾流量上,對於某個特徵值的pv較少,ctr不再置信,也需要去平滑。計算廣告書中針對這倆個問題介紹了相關的方案COEC+平滑可供參考。

第三,應用Online的更新方式去更新模型,還是batch的方式。Online的方式對應的最優化演算法主要是minibatch sgd,Offline的方式可以應用計算廣告書裡說的LBFGS,Trust region這些。按我個人經驗,minibatch sgd的更新方式對頭部的資料學習的會更快更充分,因此更善於fine tuning the head part。而Offline的方式全域性優化歷史資料,對於長尾稀疏特徵,就比sgd的方式要精細些了。如果業務場景時效性較強,更關注頭部,用一個Online keep更新的模型就足夠了,比如新聞推薦的場景。但是如果業務場景有很多長尾流量,需要精細的預估,一個batch的Offline model是必要的,為了業務的時效性考慮,可以用batch的模型結果去初始化Online的模型更新,定期的batch結合Online的delta更新,比如搜尋廣告的場景。

模型演進概述

上述的模型選擇都是結合業務場景做出的選擇,這裡按我個人理解給出一個連貫一些的點選率預估模型演進的過程:

之前提及過,一般會以高維sparse特徵的LR模型作為基線模型,也有用dense特徵直接結合LR來建模的。由於LR是線性分類器,後者需要對dense特徵手工加各種非線性變換,遇到瓶頸後會轉向前者,或者改成使用GBDT,NN等非線性模型。而高維sparse特徵結合LR的方案,人工在特徵工程遇到一定瓶頸後,會採用FM等方案自動做特徵發現,為了解決時效性的問題,會結合batch的訓練加上Online的更新方式,或者直接轉向完全Online的方案如ftrl。還有一個方向是會結合自身的業務場景,對模型的損失函式做一些創新,比如yahoo的laser,阿里的coupled group lasso,比賽裡的field aware的ffm等等。

在比賽裡為了提升效果,很常見的一個策略是把各個模型融合在一起,最簡單的有把各個模型的結果做線性加權,也有把各個模型進行stacking的方案,比如Facebook的gbdt+lr,再有把各個模型的資訊餵給dnn去學習的。對這三種方案來說,效果最好的,我個人比較相信,是用dnn去做模型的blending(融合)。注意這裡說的DNN不是指具體的某個模型dbn,cnn,而是指將各種淺層模型的中間權重,預估結果,原始的靜態,動態特徵等作為DNN的輸入,使用dnn後饋的輸入梯度來聯合更新這些結構的引數。對DNN大家可能比較詬病的是其訓練效率,但我覺得在大公司可能還好,聽在百度的朋友說DNN的開發代價和訓練開銷隨著探索在逐步降低,不一定比gbdt等非線性模型代價高很多。

當然,對小公司來說,直接走到DNN有點用力過猛,我在這裡簡要介紹一下FM+gbdt去融合的方案:第一步當然也是基於大規模稀疏特徵LR。第二步,為了更好的刻畫長尾,自動發現組合特徵,採用了FM。在同樣的訓練時間下,AUC提升,模型泛化效能可控。第三步:為了更好的fine tuning頭部和提升時效性,採用了用gbdt加動態特徵的模型。最後呢,把這兩個模型簡單的做線性融合,由於倆個模型的特徵和模型差異性較大,融合後auc也有顯著的提升。

對於gbdt,開源的實現有很多,但效果差別比較大,這裡推薦一個開源實現xgboost,很多kaggle上的比賽藉助這個工具都拿到了好名次。之前我寫過一篇叫做xgboost導讀和實戰的文章,對原始paper中的公式給出了一些推導細節,這裡不再詳述。簡單的說原始paper裡是在函式空間上梯度下降求解,在求解步長時一般都是固定學習率。而xgboost對損失函式做了二階的泰勒展開,考慮了損失函式的二階梯度資訊,並加入了正則項整體求最優解,有比較好的泛化效能。另外在具體建樹的分裂節點過程也不是大多數實現裡基於資訊增益等,而是結合具體目標函式的真實下降量。有人做過各實現的評測,xgboost在效能和效果上都是相當不錯的。

BSP->SSP

幾個典型的模型基本就簡要講到這裡,最後講一下模型求解的優化演算法,計算廣告書裡給出了不少經典的優化凸優化演算法的原理和實現程式碼,LBFGS,trust region等,這些凸優化演算法基本上都是掃一遍樣本,迭代的更新一次模型引數,想要提升模型訓練收斂的效率,主要思路是降低掃樣本的成本,比如把樣本cache在記憶體裡,另外就是降低迭代輪數,比如書裡提到的admm。

這樣的batch做迭代的優化方法現在被稱為一種叫做BSP(Bulk Synchronous Parallel)的方式,與之相對應的叫做SSP(StalenessSynchronous Parallel),主要是基於非同步的minibatch sgd的優化演算法來更新,加上了一個bounded的一致性協議來保證收斂。補充一點的是,很多實現中其實是完全非同步來實現的,更為簡單一些。SSP的方式雖然單輪迭代的網路開銷不小,但是掃一遍樣本,minibatch sgd可以更新很多次模型,迭代的次數相對LBFGS會降低很多,所以整體的時間開銷相對也會少很多,另外可以結合online更新進一步降低訓練時間。從底層訊息通訊的工程架構上來說,ssp的方式主要是非同步的push pull,基於訊息佇列如zeromq等去實現,相對bsp的這樣的同步原語,實現起來相對簡單優雅些,也有一些不錯的開源實現比如李沐的dmlc。

ssp方式的缺點是資料量少的時候minibatch sgd的優勢相對不明顯,需要多調調引數,沒有batch演算法省事。總體說來,趨勢是在從bsp的架構往ssp的架構在轉,包括一些dnn的實現,基於SSP的方式加Online更新後訓練模型的開銷相對已經較小了。

·END·