深度學習推薦#
深度學習在推薦系統中的應用日益廣泛,能自動學習複雜的特徵交叉與序列模式。本章介紹幾個代表性模型。
為什麼深度學習能取代傳統 LR / FM?
- Embedding 把高維稀疏的離散特徵壓成低維稠密向量,效率與表達力兼顧
- MLP 自動學習任意階的特徵交叉,免去人工設計
- 端到端訓練讓特徵抽取與預測共同優化
後續所有模型本質都在玩這三件事的組合與變體。
Wide & Deep#
動機#
Wide & Deep 是 Google 2016 年提出的經典模型,結合記憶能力(Wide)與泛化能力(Deep)。
| 組件 | 能力 | 特點 |
|---|---|---|
| Wide | 記憶(Memorization) | 記住歷史中已驗證的高頻組合 |
| Deep | 泛化(Generalization) | 透過 embedding 推廣到沒見過的組合 |
模型結構#
Output
↑
Sigmoid
↑
┌─────────────┴─────────────┐
│ │
Wide Part Deep Part
↑ ↑
Cross-Product Hidden Layers
Features ↑
↑ Embedding
│ ↑
┌───┴───┐ ┌───────┴───────┐
Raw Features Categorical FeaturesWide 部分#
y_wide = w^T [x, φ(x)] + bφ(x) 是人工設計的交叉特徵,例如:gender=Female AND language=English。
Deep 部分#
a^(0) = [e_1, e_2, ..., e_k] # 拼接所有 embedding
a^(l) = ReLU(W^(l) a^(l-1) + b^(l))
y_deep = W^(L) a^(L-1) + b^(L)聯合訓練#
P(Y=1|x) = σ(w_wide^T [x, φ(x)] + w_deep^T a^(L) + b)Wide 與 Deep 同時訓練、共享梯度。
TensorFlow 實作
import tensorflow as tf
# Wide 部分
crossed_feature = tf.feature_column.crossed_column(
['gender', 'language'], hash_bucket_size=100)
# Deep 部分
embedding_columns = [
tf.feature_column.embedding_column(
tf.feature_column.categorical_column_with_hash_bucket(
'user_id', hash_bucket_size=10000), dimension=32),
]
model = tf.estimator.DNNLinearCombinedClassifier(
linear_feature_columns=[crossed_feature],
dnn_feature_columns=embedding_columns,
dnn_hidden_units=[256, 128, 64])DeepFM#
動機#
Wide & Deep 的 Wide 部分還是要靠人工設計交叉。DeepFM 用 FM 取代 Wide,讓二階交叉也自動學。
模型結構#
Output
↑
Sigmoid
↑
┌────┴────┐
FM DNN
↑ ↑
Sparse Dense
Features Embedding
│ │
└────共享 Embedding 層────┘公式#
y_FM = <w, x> + Σ <v_i, v_j> x_i x_j
y_DNN = MLP(concat(embeddings))
ŷ = σ(y_FM + y_DNN)為什麼共享 Embedding 層很關鍵?#
FM 和 DNN 共用同一份 embedding,有三個好處:
- 參數量大幅減少,避免過擬合
- embedding 同時被低階(FM 二階)與高階(DNN)信號訓練,學得更好
- 不再需要 Wide & Deep 的人工交叉特徵,端到端
DeepFM 是工業界 CTR 預估的事實標準起點,後續的 xDeepFM、AutoInt 都是它的進化。
雙塔模型(Two-Tower)#
這是現代召回層的主流模型:把矩陣分解的「user / item 向量內積」搬到神經網路上做。前面 第 4 章 提的 ANN 召回流程在這裡才完整。
模型結構#
User Tower Item Tower
↑ ↑
MLP MLP
↑ ↑
Embedding Embedding
↑ ↑
User Features Item Features
└──────── 內積 ────────┘
↓
Logit訓練#
- 正樣本:用戶實際互動的 (user, item)
- 負樣本:In-batch 負採樣(同 batch 內其他 item)+ 全域熱門採樣
- Loss:Sampled Softmax 或對比學習(InfoNCE)
線上部署#
1. 離線:Item Tower 算出所有 item 的 embedding,存進 ANN 索引
2. 線上:User Tower 即時算出 user embedding
3. 用 user embedding 在 ANN 索引中查 TopK item雙塔的關鍵限制:user 與 item 在最後內積前不能交叉(否則無法離線預算 item embedding)。要做精細交叉只能交給後面的精排模型。
YouTube DNN#
系統架構#
YouTube 推薦系統分兩階段,是雙塔思想的早期工業實踐:
百萬級影片 → Candidate Generation → 數百影片 → Ranking → 數十影片
(召回層) (排序層)召回網路#
輸入特徵:
- 用戶觀看歷史(影片 embedding 平均池化)
- 搜尋歷史(query embedding 平均池化)
- 地理位置、年齡、性別
模型結構:
[video embeddings] → Average → ┐
[search embeddings] → Average → ├→ Concat → MLP → User Vector
[demographic features] ─────────┘訓練目標:
max Σ log P(w_t | U, C)訓練用 softmax 分類器(負採樣),線上服務改為向量檢索(ANN)。
排序網路#
排序層特徵更豐富,且 YouTube 把「預測觀看時長」當目標,而非 CTR:
YouTube 發現:優化觀看時長比優化點擊率更能反映「真實滿意度」,且能抑制 clickbait(標題殺人)。這是「業務目標選擇」勝過「模型結構優化」的著名案例。
序列建模#
用戶的行為是有序的,後續行為依賴之前的行為。
用戶行為序列:[item_1, item_2, ..., item_t] → 預測 item_{t+1}RNN / LSTM#
最早的序列模型,用門控機制處理長距離依賴。範例:歌單生成。
model = Sequential([
Embedding(vocab_size, embedding_dim),
LSTM(128, return_sequences=True),
LSTM(64),
Dense(vocab_size, activation='softmax')
])Self-Attention / Transformer#
Attention(Q, K, V) = softmax(QK^T / √d_k) VRNN 慢且難以平行化,現在序列推薦幾乎都改用 Transformer 系列:
- SASRec(2018):把 Transformer Decoder 套到推薦序列
- BERT4Rec(2019):用 Masked Language Model 思路訓練
- BST(阿里):把 Transformer 接在排序模型前處理用戶行為序列
DIN(Deep Interest Network,阿里)#
不是所有歷史行為對當前候選物品都同等重要:看候選是球鞋時,歷史中的「球鞋瀏覽」比「咖啡瀏覽」更有意義。
給定候選 item_candidate:
attention_i = f(item_i, item_candidate) # 計算相關度
user_repr = Σ attention_i × item_i # 加權聚合用戶歷史DIN 的核心貢獻:用戶表示是 query-aware 的——換個候選物品,user 表示就跟著變。這擺脫了「用戶有一個固定 embedding」的假設。
LLM 時代的新範式#
前面的模型都是「打分 ➡️ 排序」的判別式思路。大模型興起後,推薦開始出現幾個新方向,目前多屬前沿、尚未成為工業標準,但值得認識。
語義 ID(Semantic ID)#
傳統用 item_id=12345 這種沒有語意的整數 ID,新物品一出現就得重訓才有 embedding。語義 ID 改用「能反映內容的離散 token」來表示物品:
- 語意相近的物品,ID 在 token 空間中也相近。
- 對沒見過的新物品,能靠語意泛化,緩解冷啟動。
生成式推薦#
不再「對每個候選逐一打分」,而是讓模型直接生成下一個物品的(語義)ID 或自然語言建議:
| 範式 | 召回方式 | 特點 |
|---|---|---|
| 判別式排序 | 先召回候選,再逐一打分 | 成熟、可控、易校正 |
| 生成式推薦 | 直接生成目標物品 | 省去候選生成瓶頸、能對更豐富上下文推理 |
檢索增強推薦(RAG 式)#
借用 RAG 的思路:先檢索與用戶興趣相關的物品與外部知識(商品屬性、評論摘要、知識圖譜),再讓模型在這些上下文上做排序或生成。當物品元資料豐富、或冷啟動嚴重時特別有用。
生成式做法有個傳統排序沒有的風險——幻覺:模型可能生成根本不存在的物品、或杜撰物品屬性。務必拿生成結果去比對物品目錄做事實校驗,詳見下節。
模型對比#
| 模型 | 用途 | 特點 |
|---|---|---|
| Wide & Deep | CTR 排序 | 記憶 + 泛化,需人工 wide 特徵 |
| DeepFM | CTR 排序 | FM + DNN 共享 embedding |
| 雙塔模型 | 召回 | user / item 分開塔,靠 ANN |
| YouTube DNN | 召回 + 排序 | 兩階段架構,目標是觀看時長 |
| RNN / LSTM | 序列推薦 | 已被 Transformer 取代多數場景 |
| SASRec / BST | 序列推薦 | Transformer 結構,現代主流 |
| DIN | CTR 排序 | Query-aware 的用戶表示 |
工程實踐#
Embedding 技巧#
| 技巧 | 說明 |
|---|---|
| 預訓練 | 用 Word2Vec、圖神經網路預訓練再微調 |
| 共享 | 相關特徵共享 embedding(如同類目) |
| 維度選擇 | 經驗值 min(50, 類別數^(1/4) × 6) |
| 特徵雜湊 | 控制 vocabulary 上限,犧牲少量碰撞換工程簡潔 |
模型訓練#
# TensorFlow 分散式訓練
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
model = build_model()
model.compile(optimizer='adam', loss='binary_crossentropy')
model.fit(dataset, epochs=10)線上服務#
深度模型推理延遲較高,常用優化:
- 模型剪枝、量化(INT8、FP16)
- TensorRT、ONNX Runtime 等推理引擎
- 特徵預計算與快取(user 特徵離線批次更新)
- 召回 / 排序分離:召回靠雙塔 + ANN,排序才上深度模型
風險與限制#
深度(尤其生成式)模型威力強,但也帶來幾個必須正視的風險。
幻覺與事實性#
當系統用生成式模型來排序或解釋推薦時,可能推薦不存在的物品、誤植屬性、甚至杜撰用戶歷史。這與傳統「排錯順序」不同——是內容本身造假。防線:
- 把生成的物品 ID 比對物品目錄,不存在就丟棄。
- 對生成的描述,用真實元資料做事實校驗。
資料偏誤#
模型只會複製訓練資料裡的偏誤,且常被放大:
| 偏誤類型 | 表現 | 緩解 |
|---|---|---|
| 熱門偏誤 | 熱門物品訊號多,馬太效應越推越熱 | 多樣性正則、曝光去偏 |
| 群體偏誤 | 少數族群 / 新用戶推薦品質明顯較差 | 對弱勢群體上採樣 |
| 長尾覆蓋 | 長尾物品訓練訊號稀少,幾乎推不出來 | 內容特徵補強、探索策略 |
可解釋性#
深層網路是黑盒,用戶與監管都會問「為什麼推這個」。相較 FM / Wide & Deep 還能看特徵交叉,深度模型需額外手段:注意力權重視覺化(哪幾個歷史物品起了作用)、SHAP 局部解釋等。可解釋性提升信任、也利於合規(見 第 10 章)。
總結#
| 要點 | 說明 |
|---|---|
| 共通基底 | Embedding + 自動交叉 + 端到端 |
| Wide & Deep | 記憶 + 泛化的開山之作 |
| DeepFM | FM + DNN 共享 embedding,CTR 起點 |
| 雙塔模型 | 現代召回主流,配合 ANN |
| YouTube DNN | 召回 + 排序兩階段,目標選觀看時長 |
| 序列建模 | RNN ➡️ Transformer(SASRec、BST) |
| DIN | Query-aware 用戶表示 |
| LLM 新範式 | 語義 ID、生成式推薦、RAG 式檢索 |
| 風險與限制 | 幻覺、資料偏誤、可解釋性 |
| 工程實踐 | Embedding、分散式訓練、推理優化 |
下一章:系統架構