推薦系統,深度論文剖析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 排版