排序模型#
排序模型用於對召回階段產生的候選集進行精細排序,是推薦系統中最關鍵的環節之一。
排序模型的演進#
LR → GBDT → LR+GBDT → FM → FFM → Deep ModelsCTR 預估#
問題定義#
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 |
|---|---|
| 用戶 ID | User |
| 廣告 ID | Ad |
| 廣告主 | 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_bins3. 模型校準#
預測概率需要與真實 CTR 對齊:
校準 CTR = 預測 CTR × 採樣率4. 評估指標#
| 指標 | 說明 |
|---|---|
| AUC | 排序能力,越接近 1 越好 |
| Log Loss | 預測概率準確度 |
| Calibration | 預測值與實際值的偏差 |
| GAUC | 分用戶計算 AUC 再加權平均 |
總結#
| 要點 | 說明 |
|---|---|
| CTR 預估 | 預測用戶點擊概率 |
| LR | 簡單高效,需要手工特徵 |
| GBDT | 自動特徵交互,離線訓練 |
| LR+GBDT | 結合兩者優勢,工業標準 |
| FM | 自動學習二階特徵交互 |
| FFM | 考慮 Field 資訊的 FM |
| 工程要點 | 樣本構造、特徵雜湊、模型校準 |