深度學習推薦#
深度學習在推薦系統中的應用日益廣泛,能夠自動學習複雜的特徵交互和序列模式。
Wide & Deep#
動機#
Wide & Deep 是 Google 2016 年提出的經典模型,結合了記憶能力(Wide)和泛化能力(Deep)。
| 組件 | 能力 | 特點 |
|---|---|---|
| Wide | 記憶 (Memorization) | 記住歷史中的高頻模式 |
| Deep | 泛化 (Generalization) | 發現新的特徵組合 |
模型結構#
Output
↑
Sigmoid
↑
┌─────────────┴─────────────┐
│ │
Wide Part Deep Part
↑ ↑
Cross-Product Hidden Layers
Features ↑
↑ Embedding
│ ↑
┌───┴───┐ ┌───────┴───────┐
Raw Features Categorical FeaturesWide 部分#
y_wide = w^T [x, φ(x)] + b
其中 φ(x) 是交叉特徵:
φ(x) = Π x_i^{c_ki} (c_ki ∈ {0, 1})例如: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),
# ... 更多 embedding
]
# Wide & Deep 模型
model = tf.estimator.DNNLinearCombinedClassifier(
linear_feature_columns=[crossed_feature],
dnn_feature_columns=embedding_columns,
dnn_hidden_units=[256, 128, 64])YouTube DNN#
系統架構#
YouTube 推薦系統分為兩個階段:
百萬級影片 → Candidate Generation → 數百影片 → Ranking → 數十影片
(召回層) (排序層)召回網路#
輸入特徵:
- 用戶觀看歷史(影片 embedding 平均)
- 搜尋歷史(query embedding 平均)
- 地理位置、年齡、性別
模型結構:
[video embeddings] → Average → ┐
[search embeddings] → Average → ├→ Concat → DNN → User Vector
[demographic features] ────────┘訓練目標:
max Σ log P(w_t | U, C)
其中:
- U:用戶向量
- C:上下文
- w_t:用戶下一個觀看的影片YouTube 使用 softmax 分類器訓練,但線上服務時使用近似最近鄰搜尋。
排序網路#
更豐富的特徵:
- 影片觀看歷史
- 用戶與影片的交互歷史
- 影片發布時間
- 影片元資料
輸出:
- 預測觀看時長(而非 CTR)
YouTube 發現優化觀看時長比優化點擊率更能提升用戶滿意度。
DeepFM#
動機#
DeepFM = FM + DNN,端到端學習低階和高階特徵交互。
模型結構#
Output
↑
Sigmoid
↑
┌────┴────┐
FM DNN
↑ ↑
Sparse Dense
Features EmbeddingFM 部分#
y_FM = <w, x> + Σ <v_i, v_j> x_i x_jDNN 部分#
y_DNN = σ(W^L ... σ(W^2 σ(W^1 e + b^1) + b^2) ... + b^L)
其中 e 是 embedding 層的拼接關鍵點#
FM 和 DNN 共享 embedding 層,減少參數量,避免過擬合。
序列推薦:RNN/LSTM#
應用場景#
- 音樂歌單生成
- 影片序列推薦
- 購物籃推薦
核心思想#
用戶的行為是有序的,後續行為依賴於之前的行為。
用戶行為序列:[item_1, item_2, ..., item_t] → 預測 item_{t+1}LSTM 結構#
h_t
↑
┌─────┴─────┐
│ LSTM │
└─────┬─────┘
↑
[h_{t-1}, x_t]LSTM 通過門控機制解決長序列依賴問題:
- 遺忘門:決定丟棄哪些資訊
- 輸入門:決定添加哪些新資訊
- 輸出門:決定輸出哪些資訊
示例:歌單生成#
# 輸入:歷史播放歌曲的 embedding 序列
# 輸出:下一首歌曲的概率分佈
model = Sequential([
Embedding(vocab_size, embedding_dim),
LSTM(128, return_sequences=True),
LSTM(64),
Dense(vocab_size, activation='softmax')
])Attention 機制#
動機#
不是所有歷史行為對當前推薦都同等重要。
Self-Attention#
Attention(Q, K, V) = softmax(QK^T / √d_k) V
其中:
- Q:查詢向量
- K:鍵向量
- V:值向量
- d_k:鍵向量維度在推薦中的應用#
用戶歷史行為:[item_1, item_2, ..., item_n]
候選物品:item_candidate
Attention 權重 = softmax(item_candidate · [item_1, ..., item_n])
用戶表示 = Σ attention_i × item_i阿里的 DIN (Deep Interest Network) 就是使用 Attention 機制根據候選物品動態計算用戶興趣表示。
模型對比#
| 模型 | 特點 | 適用場景 |
|---|---|---|
| Wide & Deep | 記憶 + 泛化 | 通用推薦 |
| YouTube DNN | 兩階段架構 | 大規模影片推薦 |
| DeepFM | FM + DNN | CTR 預估 |
| RNN/LSTM | 序列建模 | 序列推薦 |
| Attention | 動態興趣建模 | 長序列、多興趣 |
工程實踐#
Embedding 技巧#
| 技巧 | 說明 |
|---|---|
| 預訓練 | 使用 Word2Vec 或圖神經網路預訓練 |
| 共享 | 相關特徵共享 embedding |
| 維度選擇 | 根據類別數確定,通常 log₂(類別數) |
模型訓練#
# 使用 TensorFlow 分布式訓練
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
model = build_model()
model.compile(optimizer='adam', loss='binary_crossentropy')
model.fit(dataset, epochs=10)線上服務#
深度學習模型推理延遲較高,需要:
- 模型裁剪和量化
- 使用 TensorRT 等推理優化工具
- 特徵預計算和快取
總結#
| 要點 | 說明 |
|---|---|
| Wide & Deep | 結合記憶和泛化,Google 經典模型 |
| YouTube DNN | 兩階段架構,召回 + 排序 |
| DeepFM | FM 和 DNN 共享 embedding |
| 序列推薦 | RNN/LSTM 捕捉行為序列模式 |
| Attention | 動態計算用戶興趣表示 |
| 工程實踐 | Embedding 技巧、分布式訓練、推理優化 |