推薦系統,深度論文剖析GBDT+LR
今天我們來剖析一篇經典的論文:Practial Lessons from Predicting Clicks on Ads at Facebook。從這篇paper的名稱當中我們可以看得出來,這篇paper的作者是Facebook的廣告團隊。這是一篇將GBDT與LR模型結合應用在廣告點選率預測的方法,雖然距今已經有好幾年了,但是文中的方法仍然沒有完全過時,至今依然有一些小公司還在使用。
這篇paper非常非常經典,可以說是推薦、廣告領域必讀的文章,說是業內的常識也不為過。這篇文章的質量很高,內容也比較基礎,非常適合作為大家的入門paper。
本文有點長,建議先馬後看。
簡介
paper開頭的部分簡單介紹了一下當時網際網路行業當中廣告的地位以及當時Facebook的規模,當時Facebook有著7.5億的日活(日活躍使用者daily active users),超過一百萬有效的廣告商,因此對於Facebook來說選擇合適有效的廣告投放給使用者的重要性是非常巨大的。在此基礎上引出了Facebook的創新性做法,即將GBDT與邏輯迴歸模型進行組合,在真實的資料場景當中獲得了超過3%的收益。
在2007年的時候Google和Yahoo就提出了線上競價的廣告收費機制,但是Facebook和搜尋引擎的場景不一樣,在搜尋引擎的場景當中,使用者會有明確的搜尋意圖。引擎會先根據使用者的搜尋意圖去篩選廣告,所以候選的廣告集不會很大。但是Facebook不存在這樣的強意圖資訊,所以Facebook候選的廣告數量要大得多,因此對於系統的壓力以及要求也要更高。
但是本文(paper)並不會討論系統相關的內容,僅僅關注最後一部分排序模型的做法。雖然paper裡沒說,但是我們看得出來,Google和Yahoo這類搜尋引擎當中的廣告是搜尋廣告,而Facebook當中的這些廣告是推薦廣告。後者和前者最大的區別就是召回廣告的邏輯不一樣,有點類似於推薦系統和搜尋系統的區別。
這其中的核心是使用者意圖,雖然使用者登入Facebook的時候沒有強意圖,但是根據使用者之前的瀏覽行為以及習慣,我們是可以提取出一些弱意圖的。比如使用者在哪類商品上停留的時間最長,點選什麼樣的內容的次數最多,還有類似協同過濾的把使用者的行為抽象成向量的做法。其實這裡面的內容很多,也非常有價值,可見Facebook在寫論文的時候是留了一手的。
具體做法
說完了廢話我們來看具體的做法,具體的做法很多同學可能都有所耳聞也就是GBDT+LR的做法。說起來一句話好像就說完了,但是裡面的細節很多。比如為什麼要用GBDT,為什麼GBDT能夠起作用?這裡面生效的機制是什麼?paper裡寫的內容只是表面,這些細節的思考和分析才是關鍵。因為paper裡的做法並不是普適的,但是其中蘊含的道理往往是通用的。
首先來說說模型評估,paper當中提供了兩種新的評估模型的方法。一種是Normalized Entropy,另外一種是Calibration。我們先從模型評估說起。
Normalized Entropy
這個指標在實際場景當中算是蠻常用的,經常在各種大神的程式碼和paper當中看到。直譯過來是歸一化熵的意思,意思有點變了,可以理解成歸一化之後的交叉熵。它是由樣本的交叉熵均值和背景CTR的交叉熵的比值計算得到的。
背景CTR指的是訓練樣本集樣本的經驗CTR,可以理解成平均的點選率。但是這裡要注意,不是正負樣本的比例。因為我們在訓練模型之前都會做取樣,比如按照正負樣本比1:3取樣,這裡的背景CTR應該定為取樣之前的比例。我們假設這個比例是p,那麼我們可以寫出NE的公式:
這裡 的取值是 ,也就是點選是+1,沒有點選是-1。這個是paper裡面的公式,在實際應用當中,我們一般吧click寫成1,impression(沒有click)寫成是0。
Calibration
Calibration翻譯過來是校準刻度的意思,但是這裡我覺得應該理解成和基準線的偏差。這個指標是模型預測的平均CTR和背景CTR的比值,這個比值越接近1,說明我們的模型的基準偏差越小,越接近真實的情況。
這個公式可以寫成:
AUC
AUC是老生常談了,也是我們工業界最常用的指標,幾乎沒有之一。AUC我們在之前的文章當中介紹過,它表示的Aera-Under-ROC,也就是ROC曲線圍成的面積。ROC曲線是TPR(true postive rate)和FPR(false positive rate)組成的曲線。這個曲線面積越接大表明模型區分正負樣本的能力越強,在CTR排序場景當中,其實模型能否預測準確並不是最重要的,把正樣本篩選出來的能力才是最重要的,這也是AUC如此重要的原因。
但是AUC也不是沒有缺點,paper當中列舉了一個缺點。比如說假如我們把模型預測的CTR全部x2,然後再給所有的預測結果乘上0.5來校準,這樣AUC依然不會有變化。但是如果我們看NE的話,會發現NE上升了。
組合模型
終於到了重頭戲了,雖然這篇paper當中講了很多其他方面的內容,但是我們都知道GBDT+LR才是它的重點。GBDT和LR我們都很熟悉,但是它們兩個怎麼combine在一起呢?
其實這個問題本身就是錯的,所謂GBDT+LR並不是兩個模型的結合,而是一種特徵的轉化。也就是說這個問題我們需要從特徵的角度去思考而不是從模型。
paper當中先講了兩種常用的處理特徵的方法,第一種是叫做bin,也就是分桶的意思。比如說收入,這是一個連續性特徵。如果我們把它放入模型,模型學到的就是它的一個權重,也就說它是線性起作用的。然而在實際的場景當中,可能這完全不是線性的。比如有錢人喜歡的品牌和窮人可能完全不同,我們希望模型能夠學到非線性的效果。一種比較好的辦法就是人為將這個特徵進行分桶,比如根據收入分成年收入3萬以下的,3萬到10萬的,10萬到50萬的,和50萬以上的。落到哪個桶裡,哪個桶的值標為1,否則標為0。
第二種方法叫做特徵組合,這個也很好理解,比如性別是一個類別,是否是高收入群體是個類別。那我們排列組合一下,就可以得到男_低收入,男_高收入,女_低收入和女_高收入這四個類別。如果是連續性特徵,可以使用像是kd-tree這類的資料結構進行離散化。我們把類別特徵兩兩交叉就可以得到更多的特徵,但這些特徵並不一定都是有用的,有些可能沒用,還有些可能有用但是資料很稀疏。所以雖然這樣可以產生大量特徵,但是需要一一手動篩選,很多是無效的。
由於手動篩選特徵的工作量實在是太大,收益也不高,所以工程師就開始思考一個問題:有沒有辦法可以自動篩選特徵呢?現在我們都知道可以讓神經網路來做自動的特徵交叉和篩選,但是當時神經網路還沒有興起,所以還是隻能手動進行。為了解決這個問題,當時的工程師們想到了GBDT。
這才是會有GBDT+LR的原因,我們來看這張圖:
我們來簡單回顧一下GBDT的模型,首先GBDT是由多棵樹組成的森林模型。對於每一個樣本,它在預測的時候都會落到每一棵子樹的其中一個葉子節點上。這樣我們就可以使用GBDT來進行特徵的對映,我們來看個例子:
在上圖這個例子當中,GBDT一共有3棵子樹,第一棵子樹有3個葉子節點。我們的樣本落到了第一個,所以第一棵子樹對應的one-hot結果是[1, 0, 0],第二棵子樹也有3個節點,樣本落到了第二個節點當中,所以one-hot的結果是[0, 1, 0],同理可以得到第三棵子樹的結果是[0, 0, 1, 0]。
這樣我們最後把這些樹的向量合併在一起,就得到了一個新的向量:[1, 0, 0, 0, 1, 0, 0, 0, 1, 0],這個向量就是我們LR模型的輸入。
我們來分析一下細節,首先明確一點,GBDT只是用來進行了特徵轉化和處理,它的預測結果並不重要。通過使用GBDT我們同時完成了剛才提到的兩種操作,既把連續性特徵轉換成了離散型特徵,也自動完成了特徵的交叉。因為對於每一棵子樹而言,其實本質上是一棵CART演算法實現的決策樹,也就是說從樹根到葉子節點的鏈路代表了一種潛在的規則。所以我們可以近似看成使用了GBDT代替人工進行了規則的提取以及特徵的處理。
結果
最後我們來看下結果,原paper當中進行了分別進行了三組實驗,分別是僅有LR、僅有GBDT和GBDT+LR進行對比。衡量的標準是各自的NE,以NE最大的Trees-only作為參考,可以發現GBDT+LR組的NE下降了3.4%。
我們貼上paper當中的結果:
怎麼說呢,這個結果挺取巧的,因為對比的是NE,也就是說交叉熵下降了。但是AUC的情況不知道,paper當中沒有說。並且這個下降是以NE最大的結果作為參考的,有一點點人為誇大了的感覺。當然這也是paper的常用手段,我們心裡有數就好。
資料的實時性
除了模型和特徵的創新之外,這篇paper還探討了資料時效性的作用。
為了驗證資料新鮮程度和模型表現之間的關係,paper選擇了一條的資料用來訓練了trees-only和GBDT+LR這兩個模型,然後用這兩個模型分別去預測之後1天到6天的資料,將整體的情況繪製成圖表:
在這張圖當中,橫軸是預測資料距離訓練資料的天數,縱軸是模型的NE。NE越低表示模型的效果越好,從上圖我們可以發現第六天的結果和第0天的NE要相差大約1%。這也就意味著單純是維持資料的新鮮度,我們就可以獲得1%的提升。這也是為什麼各大公司要做online-learning的原因。
online learning
在接下來的內容當中,paper還為我們介紹了一些online learning的細節性問題。其中有一些已經過時了,或者是普適性不強,我挑選了幾個比較典型的有代表性的列舉一下。
時間視窗
在我們蒐集訓練資料的過程當中,點選是比較明確的,因為點選有一個具體的行為,但是impression(曝光)不是。因為使用者沒點選這並不是一個行為,所以我們沒辦法確定使用者到底是不想點還是等一會再點。比較常規的做法是維護一個定時視窗,規定一個時間,如果使用者看到了廣告在規定時間內沒有點選,那麼就認為這是一個非點選事件。
但是我們很容易發現,這麼做是有問題的,因為使用者可能反應遲鈍,或者是暫時還沒反應過來導致沒有點選。就可能出現時間已經過了,使用者點選了的情況。在這種情況下impression已經被記錄為一個負樣本了,那麼點選產生的正樣本就找不到對應的impression了。我們可以計算一個比例,有多少點選可以找得到impression,這個比例稱為click coverage,點選率的覆蓋率。
那是不是視窗時間越長越好呢?其實也不是,因為視窗過長可能會導致把一些不是點選的認為是點選。舉個例子,比如說一個商品,使用者第一次瀏覽的時候覺得不滿意,所以沒有點。過了一會,使用者回過來看的時候又改變了主意,發生了點選。那麼按照道理,我們應該把第一次沒有點的行為視作是負樣本,把第二次的行為認為是正樣本。如果我們時間視窗設定得很長,就會被認為是一個點選樣本。所以時間視窗到底應該設定得多長,這是需要調整的一個引數,不可以拍腦袋決定。
架構
streaming是業內常用的一種資料處理手段,稱為流式處理。可以簡單理解成佇列,也就是queue。但是當發生click的時候我們需要找到對應的impression樣本,將它改成正樣本,所以我們還需要查詢的功能。也就是說我們還需要一個hashmap來記錄隊列當中的節點。
當我們蒐集到了足夠資料,或者是蒐集了規定時間的樣本資料之後,我們會把視窗內的資料用來訓練模型。當模型完成訓練之後,會被推送到排序系統當中,實時更新排序需要呼叫的模型檔案,從而達到線上實時訓練的目的。我們來看下它的架構圖:
Ranker是排序系統,對候選的廣告進行排序之後展示給使用者,並且將這些廣告的特徵資料push給online joiner,也就是特徵處理系統。當用戶對廣告進行點選之後,點選的資料也會被傳入Joiner當中。Joiner會將使用者的點選資料和Ranker傳輸來的資料進行關聯,關聯之後把資料傳給Trainer系統進行模型的訓練。
這裡還涉及到一個細節,就是在joiner當中我們怎麼關聯呢?因為一個使用者可能會有多次觀看廣告的資料,同一個廣告也可能重新整理觀看多次。所以直接拿使用者id或者是廣告的id進行關聯是不行的,我們還需要一個和時間有關的id。這個id叫做requestid,當用戶每次重新整理頁面的時候,requestid都會重新整理,這樣我們就可以保證即使使用者重新整理網頁,我們也可以正確地將資料關聯上。
特徵分析
最後,paper當中還附上了對特徵的一些分析。雖然我們不知道它們到底都用了一些什麼樣的特徵,但是這些分析的內容對我們依然有借鑑意義。
行為特徵or上下文特徵
在CTR預估的場景當中,特徵主要可以分為兩種,一種是上下文特徵,一種是使用者歷史行為特徵。所謂的上下文特徵,其實是一個很大的概念。像是展示的廣告的資訊,使用者本身的資訊,以及當時的時間、頁面內的內容、使用者所在的地點等等這些當下的和場景有關的資訊都可以被認為是上下文資訊。歷史行為特徵也很好理解,也就是使用者之前在平臺內產生的行為。
paper當中著重分析了使用者行為特徵的重要性,其中的做法是將特徵按照重要性倒排,然後計算在topK重要的特徵當中使用者歷史行為特徵的佔比。在LR模型當中,特徵的重要性就等價於對應位置的權重,得到的結果如下圖:
從上圖的結果我們可以看到,使用者的歷史行為特徵在整體當中佔據到了非常大的權重。top20的feature當中,只有2個是上下文特徵。這也很符合我們的認知,我們投放的內容的質量遠遠不如使用者喜歡什麼重要。而使用者歷史上產生過行為的資料非常好地可以體現使用者喜好的情況。
重要性分析
除了分析了特徵的重要性之外,paper當中還實驗了只使用某一種型別的特徵進行預測,對比模型的效能。實驗的結果如下:
上圖當中紅柱展示的是隻使用上下文特徵的訓練結果,深藍色是隻使用使用者行為特徵的訓練結果。從這個結果上我們可以明顯地看到,只使用行為特徵訓練出來的模型效能要比使用上下文特徵的好至少3.5個點,這已經是非常大的差距了。所以我們也可以得出結論,相比於上下文特徵,使用者的行為特徵更加有用。
除此之外,paper當中還探討了negative down sampling(負取樣)和subsampling(二次取樣)對於模型效能的影響。其中二次取樣證明訓練資料量和模型效果總體呈正比,也就是說訓練資料量越大,模型的效果越好。而負取樣同樣對於提升模型的效果有所幫助,這也是目前廣告和推薦場景下的常規手段。
今天的文章就到這裡,衷心祝願大家每天都有所收穫。如果還喜歡今天的內容的話,請來一個三連支援吧~(點贊、關注、轉發)
原文連結,求個關注
本文使用 mdnice 排版