主流 CTR 模型綜述

1. CTR 模型建模

在講 CTR 模型之前,我們首先要清楚 CTR 模型是什麼,用來解決什麼問題。所以我們先描述 CTR 問題,並對其進行數學建模。

一個典型的推薦系統架構如下圖所示:
在這裏插入圖片描述

一般會劃分爲召回排序兩層。

  • 召回負責從百萬級物品中粗選出千級數量物品,常用算法有協同過濾、用戶畫像等,有時候也叫粗排層
  • 排序負責對召回層召回的千級物品進行精細排序,也叫精排層

CTR,Click-Through-Rate,也就是點擊率預估,指的是精排層的排序。所以 CTR 模型的候選排序集一般是千級數量。

CTR 模型的輸入(即訓練數據)是:大量成對的 **(features, label) **數據。

何爲 features?可以分爲如下四類:

  1. 用戶本身特徵,例如用戶的年齡、性別等;
  2. 用戶行爲特徵,例如點擊過的物品、購買過的商品等;
  3. 上下文特徵,例如用戶登錄設備(IOS or Android)、當前時間等;
  4. 待排序物品特徵,例如物品 ID、物品被點擊次數、物品的點擊率等;

可以看到,上面所有的 features 都是我們能夠收集到的信息,其中有離散型特徵(如物品 ID),也有連續型特徵(如點擊率)。

但是,計算機只能處理數字編碼,所以需要對 features 進行編碼。常用的編碼手段有:

  • 離散型特徵使用 one-hot 或** embedding**;
  • 連續型特徵可以不處理,也可以分段離散化,再使用 one-hot 編碼;

關於 one-hot 和 embedding,這裏不召開講,不瞭解的同學可以根據關鍵詞進行搜索。

何爲 label

  • label 即爲模型的預測目標,CTR 場景預測點擊率,label 即爲用戶對該物品是否產生點擊行爲,點擊則 label 爲 1,不點擊則 label 爲 0;

在明確了 features 和 label 的定義之後,我們就可以構造對應的訓練樣本:

  • 負樣本 (不點擊):([**0,0,0,1,0,0,**0.12,0.13,0.05, …, ], 0)
  • 正樣本 (點擊):(**[0,0,1,0,0,0,**0.04,0.02,0.11, …, ], 1)

所以訓練時 CTR 模型輸入即爲:特徵向量和其對應的 0, 1 標籤。

預測時,輸入只有特徵向量,模型輸出一個 0~1 之間的數字,代表預估的 CTR 值,可以用來做排序。

所以,建模之後,本質上 CTR 預估問題是一個二分類問題


在繼續介紹具體的 CTR 模型之前,我們先來看一看 CTR 模型的基本架構,如下圖,最底層是原始特徵,然後對原始特徵進行篩選清洗,再進行編碼轉換(包括特徵交叉),最後生成一個特徵向量,輸入到 model 中,model 輸出 CTR 預測值。

在這裏插入圖片描述

實際中最主要的工作都在從原始特徵生成特徵向量這一步,這一步也叫數據處理,這一步的好壞決定了天花板的高度。至於模型,其實主要工作是調參,包括模型的種類也是一個參數,其實是最簡單的一步,只是可能比較費時費力。

當然,實際中還有可能遇到超大規模數據的問題,這需要分佈式訓練,甚至最後的模型沒辦法在單機中加載,也需要分佈式。

這篇文章的重點不是數據處理,也不是分佈式訓練,而是介紹業界**最主流的 CTR model **是什麼樣的。

下面開始進入正題。

2. LR

對機器學習有過了解的同學應該都知道 LR,也就是邏輯迴歸,可以算是一個非常經典的模型。

在 CTR 問題中,LR 也可以算是最經典的模型之一。

我們的問題是二分類,輸入是一個向量,LR 的思想最樸素:對向量的每一個維度賦予一個權重,然後加權求和,又因爲輸出需要是 0~1 之間的浮點數,所以求和之後套用一個 sigmoid 函數(不瞭解該函數的同學請自行 google),將值域壓縮在 0~1 之間,完畢。

下面這個例子比較形象:
在這裏插入圖片描述

LR 的數學公式:

在這裏插入圖片描述

其中 x 是特徵向量,w 是權重向量。

優點:簡單,容易實現;
缺點:易學難精,需要手工構造特徵(特徵交叉),需要大量領域內知識;另外,LR 非常適合處理離散特徵,而對於連續特徵,需要手工分段或歸一化處理。

LR 非常簡單,以至於很難讓人相信它能有很好的效果。但事實就是,即使是現在,有很多公司仍然在使用 LR 模型做 CTR 預估。爲什麼呢?祕訣在於手工構造特徵(特徵交叉)

特徵交叉是什麼?

  • 組合特徵的方式,例如有兩個原始特徵:年齡和性別。對應於 LR 就只有 2 個權重,但事實上我們可以將 “年齡x性別” 作爲一個組合特徵,構造出第三個特徵,這樣 LR 就有 3 個權重了。“18歲的男性” 就是組合特徵 “年齡x性別” 的一種情況。

爲什麼需要手工構造特徵(交叉特徵)?

  • LR 本質上是線性模型,只能捕捉到低階特徵,無法表達高階特徵信息,特徵交叉本質是手工構造高階特徵的過程(特徵的階數可以類比代數幾何中多項式的階數)。

只要特徵交叉做的足夠好,簡單的 LR 就可以取得非常好的效果。

3. GBDT

Gradient Boosting Decison Tree,梯度提升決策樹。是算法比賽中使用最多的模型之一。

核心思想:用迴歸樹(CART 樹)來擬合殘差
常用工具包:Xgboost,Lightgbm。

GBDT 使用的是 CART 樹,是迴歸樹的一種,如下圖所示,迴歸樹最後的預測結果是一個浮點數。

在這裏插入圖片描述

GBDT 使用多顆 CART 樹,每棵樹都是擬合前面樹模型的殘差。

在這裏插入圖片描述

限於篇幅,這裏不展開講 GBDT 的具體原理,建議不瞭解的同學深入學習一下,擬合殘差的思想是非常經典的。

優點:得益於 CART 樹,可以方便地處理連續特徵;另一個重要用處是輸出特徵重要性;
缺點:比較容易過擬合,不是很適合處理離散特徵。

3. GBDT + LR

問題背景:前面提到,LR 不適合處理連續型特徵(如物品點擊率、播放次數等),但實際應用場景中,連續型特徵非常常見。

但是 GBDT 又非常適合處理連續特徵,於是 Facebook 提出一種解決方案:GBDT + LR。核心思想是利用 GBDT 來自動對連續特徵離散化

如右圖所示,可以通過 GBDT 中葉子節點的索引位置獲得輸入特徵的離散化編碼,可以看到,結果分別落在第 2 和第 1個葉子節點,轉換特徵編碼爲 [0, 1, 0] + [1, 0],即 [0, 1, 0, 1, 0],之後再將該編碼輸入到 LR 中訓練。

在這裏插入圖片描述

優點:無需對連續特徵手工處理;
缺點:需要預訓練 GBDT 模型;

4. FM (Factorization Machines)

問題背景:前面提到 LR 還有一個缺點,就是需要很多領域知識做人工特徵交叉

有沒有辦法將特徵交叉這一過程自動化呢?

FM 就是爲解決一個問題提出來的。

先看 LR 的線性部分:

在這裏插入圖片描述

可以看到,LR 沒有考慮特徵之間的相關性;例如 18 歲的男性相對於 18 歲的人和男性,喜歡電子遊戲的概率明顯要更大。LR 使用人工的方法,手動挖掘這類關聯特徵。

考慮極端情況,對所有特徵進行二階交叉:

在這裏插入圖片描述
但這裏會有一個問題:若特徵數是 100w 級別,那麼全交叉之後,特徵數爲 10000億級別,對應的權重也有 10000億,用單精度浮點數存儲,需要 1TB,明顯是不可能實現的。

所以,在 FM 提出之前,需要專家從海量可能的交叉特徵中選取部分,然後實驗,接着再選取。

FM 解決全交叉導致權重爆炸的核心思想是:權重的分解共享,這也是其命令的由來。

先看分解,FM 提出將交叉特徵的權重 wij 做一次分解,分解爲兩個隱向量(lantent vector)的乘積,如下:

在這裏插入圖片描述
其中,

在這裏插入圖片描述
< ,> 代表向量乘法,k 是超參數,即 lantent vector 的維度。

光分解還是不夠,因爲權重爆炸的問題並沒有解決,所以接下來就是共享隱向量:每個原始特徵都對應同一個隱向量,這個隱向量是被所有該特徵的交叉特徵權重共享的。這樣一來,若有 N 個基本特徵,共享之後的參數量就爲 N*k,而不是 N*N 了,一般情況 k << N。

交叉特徵權重分解爲兩個隱向量的乘積是 FM 的思想精華所在,通過這種方式,我們可以對原始特徵進行全交叉,省去了手工交叉特徵的麻煩。

5. FFM (Field-aware Factorization Machines)

FFM 可以理解爲 FM 的一個 trick:跟 FM 的全局共享不一樣,FFM 中隱向量不是全局共享的,而是在特徵域內共享

FFM 公式:

在這裏插入圖片描述
其中,fj 是第 j 的特徵所屬的字段。如果隱向量的長度爲 k,那麼 FFM 的二次參數有 n*f*k 個,遠多於 FM 模型的 n*k 個。

6. Wide & Deep

問題背景:FM 雖然解決了 LR 手工交叉特徵的問題,但由於複雜度的原因,FM 只支持二階特徵的交叉,無法引入更高階的交叉特徵;

Wide & Deep 的核心思想就是:Wide 部分通過手工交叉特徵提取低階特徵,Deep 部分通過神經網絡提取高階特徵。

wide 部分等價於 LR,如下圖:
在這裏插入圖片描述

deep 部分爲全連接網絡,如下圖:
在這裏插入圖片描述

最後,結合 wide 和 deep 兩部分,如下圖:
在這裏插入圖片描述
整體是非常直觀清晰的,在實際中也取得了非常好的效果。

看一下 wide&deep 的數學公式:
在這裏插入圖片描述

Note:wide&deep 是思想非常重要,它首次將神經網絡引入了 CTR 模型,並且將模型分爲 wide 和 deep 兩部分的思路也啓發了很多人,後面的模型本質上都可以算它的變種。

7. DeepFM

問題背景:wide & deep 模型中,wide 部分仍然需要人工交叉特徵。

所以,很自然的,將 wide&deep 中的 **wide 部分替換成 FM **就好了。

DeepFM 模型:

在這裏插入圖片描述

思想是借鑑自 wide&deep,模型本身沒什麼好說的。

8. Deep&Cross

也是 wide&deep 的思路,跟 DeepFM 類似,也是改動了 wide 部分,模型如下:

在這裏插入圖片描述
Cross layer 的公式:

在這裏插入圖片描述
借鑑了殘差思想:
在這裏插入圖片描述

9. NFM

同樣是 wide&deep 思路,不過改進的是 deep 部分,模型公式如下:
在這裏插入圖片描述
前兩項是 wide 部分,f(x) 爲其核心部分,如下圖所示。

在這裏插入圖片描述

10. DIN

Deep Interest Network,來自阿里媽媽的精準定向檢索及基礎算法團隊,已應用於實際業務,非常具有參考價值。

DIN 原始的應用場景爲淘寶購物,作者在實踐中觀察到用戶的兩個特點:

  • **Diversity:**用戶的購物興趣是非常廣泛的;
  • **Local Activation:**一個愛游泳的人,他之前購買書籍、冰激凌、薯片、游泳鏡。當前給他推薦的護目鏡。那麼他是否會點擊這次廣告,跟他之前是否購買過薯片、書籍、冰激凌一點關係也沒有,而是與他之前購買過游泳帽有關係。也就是說在這一次 CTR 預估中,部分歷史數據 (游泳鏡) 起了決定作用,而其他的基本都沒用。

如何來建模 Local Activation 這一行爲呢?
答:引入起始於機器翻譯中的 Attention 機制;

核心思想:將待排序物品和單個歷史購買物品輸入進神經網絡,神經網絡的輸出爲單個數值,就是該歷史購買物品的注意力權重。

DIN 中的 Attention 網絡結構如下圖:

在這裏插入圖片描述
DIN 整體結構如下圖:

在這裏插入圖片描述

效果也是非常好,原始論文給出了一個實際的例子,將 Attention 權重可視化後如下圖:

在這裏插入圖片描述
可以看到,Attention 權重非常符合我們的直覺。


11. YouTube Deep Ranking

前面講的都是標準的 CTR 模型,但事實上,有時候我們預測的目標並不是 CTR,比如在視頻推薦中,如果僅僅預測 CTR,那很有可能會推出大量的標題黨,我們可能希望預測的是用戶觀看該視頻的時長。YouTube 給出了一個很好的解決方案。

核心思想是:使用帶權重的 LR,對於正樣本,權重爲用戶觀看時長,對於負樣本,權重爲 1,這樣就將預測目標由 CTR 變爲了預測用戶觀看該視頻的期望時長。

網絡結構如下,其實就是普通的 deep 網絡,只是最後使用了帶權重的 LR loss。
在這裏插入圖片描述

我個人認爲這個改動非常精巧,簡單而且有效,完美的解決了從 CTR 轉換到時長預測的問題。

關於問什麼這樣取權重就可以達到預測時長的目的,我這裏簡單解釋一下。

這種帶權情況下 LR 學到的 odds 爲

在這裏插入圖片描述
其中 Ti 表示正樣本視頻 i 時長,N 爲樣本總數,k 爲正樣本數。

可以這樣來解釋,odds 表示 p/(1-p),其中 p 可以認爲是正樣本的比例。帶權重的 LR 實現時是在梯度上乘以權重 w,可以理解爲相當於把對應的樣本數目複製 w 倍(即上採樣),以這種假想的樣本空間來看,就可以得到上面的式子。

當正樣本比例比較小,即 k/N 很小時(點擊率比較低的情況,大多數場景都滿足),近似有

在這裏插入圖片描述
上式也就是期望觀看時長

參考論文:https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf


12. FTRL

Follow The Regularized Leader Proximal,簡稱 FTRL。

前面介紹的模型基本都是需要先離線訓練,然後再提供在線服務。大家都希望離線模型的更新速度越快越好,那麼快的極致是什麼呢?是實時!

實時更新的模型又叫做在線模型 (Online model ),在線模型思路是拋棄離線訓練模型這一步,而是直接對模型進行流式更新,線上用戶產生行爲,日誌系統直接生成樣本,等待一定數量後直接輸入到在線模型進行更新。

在線模型相對於離線模型會遇到更多的問題,比如:

  1. 如何處理新特徵?用戶和其行爲都是未知的,一個好的在線模型應該能夠恰當的處理新特徵,即當新特徵出現次數極少時應當拋棄,次數大於一定閾值時,應當加入到模型中。
  2. 如何實時構造樣本?這需要非常強的工程實現,搭建完整在線模型的工程量遠比使用離線模型大。

目前 CTR 預估領域應用比較廣的在線模型應該只有 FTRL LR 了,FTRL 實際上只是一個梯度更新算法,跟 SGD, Momentum, Adam 類似,不過一般是和 LR 一起用,因爲通過 L1-正則化,它可以很好的產生稀疏化特徵,非常適合超大規模 LR。

FTRL 算法背後的思想和原理是非常複雜的,也經過了很長時間的進化纔到達了目前的版本,這裏不詳細展開,有興趣的同學可以自行搜索研究,我自己也總結了一篇筆記,僅供參考:https://note.youdao.com/ynoteshare1/index.html?id=2275adcfede430be65385b9ea5b594cf&type=note#/

TensorFlow 提供了FTRL 算法的實現:FtrlOptimizazer,可以用來 train 任何深度模型,不過實際中更多還是用來 train LR 模型。

13. Tips

不要迷戀複雜模型,把特徵工程做好纔是最重要的,結合業務實際情況多思考。最後選用哪個模型其實只是個調參工程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章