探索与利用(Explore-Exploit, EE)是推荐系统的核心权衡:利用已知最优策略获得高回报,还是探索新策略寻找更优解?多臂老虎机(Multi-Armed Bandit, MAB)是EE问题的经典框架。
| 策略 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|
| ε-greedy | 以ε概率随机探索 | 简单 | 探索效率低 |
| UCB | 选择置信上界最大的 | 理论保证 | 假设有界 |
| Thompson | 从后验采样选最大 | 贝叶斯最优 | 需共轭先验 |
arm = argmax(x̄_i + c·√(ln(t)/n_i))
θ_i ~ Beta(α_i, β_i)
arm = argmax θ_i
UCB: O(√(KT·lnT))
Thompson: O(√(KT·lnT))
import numpy as np
np.random.seed(42)
print("="*60+"\n探索与利用(EE)\n"+"="*60)
n_arms=10;n_rounds=1000
true_probs=np.random.random(n_arms)
print(f"臂数:{n_arms} 最优臂概率:{max(true_probs):.4f}")
print(f"各臂真实概率: {[f'{p:.3f}'for p in true_probs]}")
# ε-greedy
def epsilon_greedy(true_probs,n_rounds,epsilon=0.1):
n_arms=len(true_probs)
counts=np.zeros(n_arms);rewards=np.zeros(n_arms)
total_reward=0;regrets=[]
for t in range(n_rounds):
if np.random.random()<epsilon:
arm=np.random.randint(n_arms)
else:
arm=np.argmax(rewards/(counts+1e-10))
reward=1 if np.random.random()<true_probs[arm] else 0
counts[arm]+=1;rewards[arm]+=reward;total_reward+=reward
regrets.append(max(true_probs)-true_probs[arm])
return total_reward,np.cumsum(regrets),counts
# UCB
def ucb(true_probs,n_rounds,c=2):
n_arms=len(true_probs)
counts=np.zeros(n_arms);rewards=np.zeros(n_arms)
total_reward=0;regrets=[]
for t in range(n_rounds):
if t<n_arms:arm=t
else:
avg=rewards/(counts+1e-10)
ucb_vals=avg+c*np.sqrt(np.log(t+1)/(counts+1e-10))
arm=np.argmax(ucb_vals)
reward=1 if np.random.random()<true_probs[arm] else 0
counts[arm]+=1;rewards[arm]+=reward;total_reward+=reward
regrets.append(max(true_probs)-true_probs[arm])
return total_reward,np.cumsum(regrets),counts
# Thompson Sampling
def thompson_sampling(true_probs,n_rounds):
n_arms=len(true_probs)
alpha=np.ones(n_arms);beta_param=np.ones(n_arms)
total_reward=0;regrets=[]
for t in range(n_rounds):
samples=[np.random.beta(alpha[i],beta_param[i])for i in range(n_arms)]
arm=np.argmax(samples)
reward=1 if np.random.random()<true_probs[arm] else 0
alpha[arm]+=reward;beta_param[arm]+=1-reward
total_reward+=reward;regrets.append(max(true_probs)-true_probs[arm])
return total_reward,np.cumsum(regrets),(alpha-1)/(alpha+beta_param-2+1e-10)
# 运行实验
r_eg,reg_eg,c_eg=epsilon_greedy(true_probs,n_rounds,0.1)
r_ucb,reg_ucb,c_ucb=ucb(true_probs,n_rounds)
r_ts,reg_ts,c_ts=thompson_sampling(true_probs,n_rounds)
print(f"\n{'方法':<20}{'总奖励':<10}{'最终累计遗憾':<15}{'最优臂次数'}")
print("-"*65)
best_arm=np.argmax(true_probs)
print(f"{'ε-greedy(ε=0.1)':<20}{r_eg:<10}{reg_eg[-1]:<15.2f}{int(c_eg[best_arm])}")
print(f"{'UCB(c=2)':<20}{r_ucb:<10}{reg_ucb[-1]:<15.2f}{int(c_ucb[best_arm])}")
print(f"{'Thompson Sampling':<20}{r_ts:<10}{reg_ts[-1]:<15.2f}{int(c_ts[best_arm])}")
# 不同ε影响
print("\nε对ε-greedy的影响:")
for eps in [0.01,0.05,0.1,0.2,0.5]:
r,reg,_=epsilon_greedy(true_probs,n_rounds,eps)
print(f" ε={eps}:奖励={r} 遗憾={reg[-1]:.2f}")
# 推荐场景应用
print("\n--- 推荐场景EE应用 ---")
n_users=5;n_items_new=5;n_items_pop=15
item_scores=np.random.random(n_items_pop)*5+3 # 热门物品分数3-8
new_item_scores=np.random.random(n_items_new)*5+1 # 新物品分数1-6
print(f"热门物品平均分:{item_scores.mean():.2f} 新物品平均分:{new_item_scores.mean():.2f}")
# ε-greedy推荐
eps=0.2
rec_list=[]
for _ in range(10):
if np.random.random()<eps:
item=f"新物品{np.random.randint(n_items_new)}"
else:
item=f"热门{np.argmax(item_scores)}"
rec_list.append(item)
print(f"ε-greedy推荐: {rec_list}")
# UCB推荐
all_scores=np.concatenate([item_scores,new_item_scores])
counts=np.ones(len(all_scores))
for i in range(len(item_scores)):counts[i]=10
ucb_vals=all_scores/counts+2*np.sqrt(np.log(100)/counts)
print(f"UCB推荐Top-5: {np.argsort(-ucb_vals)[:5]}")
✅ 验证通过
本课代码涵盖了从数据生成、模型训练到效果评估的完整流程。以下是关键步骤的详细解读:
代码设计原则:简洁可读、关键步骤有注释、结果可复现(固定随机种子)。
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.8+ | 推荐3.10版本 |
| NumPy | 1.21+ | 核心数值计算库 |
| SciPy | 1.7+ | 统计检验(部分课程) |
考虑上下文(用户特征/场景)的MAB:
本课是第17课:探索与利用(EE),属于排序与重排阶段。我们系统学习了本课的核心概念、数学原理和代码实现,并通过实机运行验证了算法的正确性。
练习1:实现Contextual Bandit(LinUCB)
练习2:对比不同ε值的长期效果
练习3:实现非平稳MAB(物品概率随时间变化)
练习4:实现多目标EE(同时优化点击和多样性)
| 公司 | 场景 | 核心技术 |
|---|---|---|
| 字节跳动 | 抖音/TikTok | 多目标排序+实时特征+双塔召回 |
| 阿里巴巴 | 淘宝推荐 | DIN/DIEN序列模型+MIND多兴趣 |
| 腾讯 | 微信看一看 | DeepFM+图神经网络召回 |
| 美团 | 本地生活推荐 | 多场景多目标+时空特征 |
| Netflix | 视频推荐 | 矩阵分解+深度学习混合 |
✅ 理解Explore-Exploit权衡的核心意义
✅ 掌握ε-greedy/UCB/Thompson Sampling
✅ 实现多臂老虎机并对比策略
✅ 理解EE在推荐冷启动中的应用