排序模型#

排序模型用於對召回階段產生的候選集進行精細排序,是推薦系統中最關鍵的環節之一。

排序模型的演進#

LR → GBDT → LR+GBDT → FM → FFM → Deep Models

CTR 預估#

問題定義#

CTR (Click-Through Rate) 預估是一個二分類問題:

P(click=1 | user, item, context)

特徵工程#

特徵類別示例
用戶特徵年齡、性別、興趣標籤、歷史行為
物品特徵類別、品牌、價格、標題關鍵詞
上下文特徵時間、地點、設備、推薦位置
交叉特徵用戶 × 類別、性別 × 品牌

特徵工程是傳統機器學習排序模型的核心,好的特徵比好的模型更重要。

邏輯回歸 (LR)#

模型公式#

P(y=1|x) = σ(w^T x + b) = 1 / (1 + e^(-(w^T x + b)))

優缺點#

優點缺點
訓練快、可解釋只能學習線性關係
支援在線學習需要大量手工特徵工程
工業界廣泛驗證難以捕捉特徵交互

特徵處理#

# 連續特徵離散化
age_bucket = [0, 18, 25, 35, 45, 55, 65, float('inf')]
age_feature = np.digitize(age, age_bucket)

# 類別特徵 One-Hot 編碼
category_onehot = OneHotEncoder().fit_transform(category)

GBDT (梯度提升決策樹)#

原理#

GBDT 是加法模型,通過迭代添加決策樹來擬合殘差:

F_m(x) = F_{m-1}(x) + γ_m × h_m(x)

其中 h_m(x) 是擬合殘差的決策樹

優缺點#

優點缺點
自動發現特徵組合難以處理高維稀疏特徵
不需要特徵歸一化不支援在線學習
處理非線性關係訓練速度較慢

LR + GBDT#

Facebook 經典方案#

這是 Facebook 2014 年提出的經典方案,結合了 GBDT 的特徵發現能力和 LR 的在線學習能力。

流程#

1. 訓練 GBDT 模型
2. 將樣本輸入 GBDT,記錄落入的葉子節點
3. 將葉子節點編碼為新特徵
4. 用 LR 模型訓練這些新特徵
示例

假設 GBDT 有 3 棵樹,每棵樹有 4 個葉子節點:

輸入樣本 → 落入葉子 [1, 0, 3]
編碼為:[0,1,0,0] + [1,0,0,0] + [0,0,0,1] = [0,1,0,0,1,0,0,0,0,0,0,1]

這個 12 維向量作為 LR 的輸入。

工程實現#

# 使用 LightGBM
import lightgbm as lgb

# 訓練 GBDT
gbdt_model = lgb.LGBMClassifier(n_estimators=100)
gbdt_model.fit(X_train, y_train)

# 取得葉子節點編碼
leaf_indices = gbdt_model.predict(X_train, pred_leaf=True)

# 用葉子節點訓練 LR
from sklearn.linear_model import LogisticRegression
lr_model = LogisticRegression()
lr_model.fit(leaf_one_hot, y_train)

FM (Factorization Machines)#

動機#

LR 需要手動構造交叉特徵,而 FM 可以自動學習特徵之間的交互。

模型公式#

ŷ = w_0 + Σ w_i x_i + Σ Σ <v_i, v_j> x_i x_j

其中:
- w_0:偏置項
- w_i:一階權重
- <v_i, v_j>:二階交互,用隱向量內積表示

計算優化#

原始二階項複雜度 O(n²),通過變換可以降到 O(kn):

Σ Σ <v_i, v_j> x_i x_j = 1/2 [||Σ v_i x_i||² - Σ ||v_i||² x_i²]

優缺點#

優點缺點
自動學習特徵交互只能學習二階交互
處理稀疏特徵有效對於稠密特徵效果一般
計算效率高需要調整隱向量維度

FFM (Field-aware FM)#

改進#

FFM 認為一個特徵與不同 Field 的特徵交互時,應該使用不同的隱向量。

ŷ = w_0 + Σ w_i x_i + Σ Σ <v_{i,f_j}, v_{j,f_i}> x_i x_j

其中:
- f_i:特徵 i 所屬的 Field
- v_{i,f}:特徵 i 對 Field f 的隱向量

示例#

特徵Field
用戶 IDUser
廣告 IDAd
廣告主Advertiser

當計算「用戶」和「廣告」的交互時,使用 v_{user, Ad_field}。

工程實踐#

FFM 的參數量是 FM 的 Field 數倍,容易過擬合,需要更多正則化。

模型對比#

模型特徵交互計算複雜度在線學習適用場景
LR手動O(n)支援基線模型
GBDT自動O(n log n)不支援離線批量
LR+GBDT自動O(n)部分支援工業標準
FM二階O(kn)支援稀疏特徵
FFM二階O(kfn)支援多 Field

工程實踐要點#

1. 樣本構造#

正樣本:用戶點擊的物品
負樣本:曝光未點擊的物品

負樣本採樣:如果曝光量太大,可以對負樣本降採樣,但需要在預測時調整校準。

2. 特徵雜湊#

解決高維稀疏特徵的存儲問題:

# 特徵雜湊
def hash_feature(feature_name, value, n_bins=2**20):
    return hash(f"{feature_name}:{value}") % n_bins

3. 模型校準#

預測概率需要與真實 CTR 對齊:

校準 CTR = 預測 CTR × 採樣率

4. 評估指標#

指標說明
AUC排序能力,越接近 1 越好
Log Loss預測概率準確度
Calibration預測值與實際值的偏差
GAUC分用戶計算 AUC 再加權平均

總結#

要點說明
CTR 預估預測用戶點擊概率
LR簡單高效,需要手工特徵
GBDT自動特徵交互,離線訓練
LR+GBDT結合兩者優勢,工業標準
FM自動學習二階特徵交互
FFM考慮 Field 資訊的 FM
工程要點樣本構造、特徵雜湊、模型校準