用Python代码和老虎机游戏,5分钟搞懂强化学习的‘探索与利用’核心矛盾

张开发
2026/4/15 13:40:37 15 分钟阅读

分享文章

用Python代码和老虎机游戏,5分钟搞懂强化学习的‘探索与利用’核心矛盾
用Python代码和老虎机游戏5分钟搞懂强化学习的‘探索与利用’核心矛盾假设你走进一家赌场面前有10台老虎机每台的中奖概率不同。你既想快速找到最赚钱的那台又担心过早锁定选择会错过隐藏的幸运之王。这正是强化学习中的经典困境——探索未知可能还是利用已知最优今天我们用Python代码和老虎机游戏带你亲手破解这个智能体学习的核心密码。1. 老虎机强化学习的微观实验室拉斯维加斯的老虎机Multi-armed Bandit在AI领域有个更学术的名字多臂赌博机问题。它完美模拟了智能体在未知环境中做决策的场景每个拉杆arm代表一个可选动作每次拉动获得随机奖励reward目标是通过有限尝试最大化总收益import numpy as np class Bandit: def __init__(self, arms10): self.true_means np.random.normal(0, 1, arms) # 各臂真实收益均值 self.best_arm np.argmax(self.true_means) # 最优臂编号 def pull(self, arm): return np.random.normal(self.true_means[arm], 1) # 带噪声的奖励这个简单的类模拟了老虎机的核心机制。true_means决定了每台机器的良心程度而每次拉杆获得的奖励会有正态分布的波动。就像真实赌场你永远无法直接看到机器内部的概率设置。2. Epsilon-Greedy简单却有效的平衡术面对未知的老虎机阵列人类通常会采用这样的策略先随机试几台机器探索阶段记录各机器的平均收益逐渐偏向表现最好的机器利用阶段偶尔再试试其他机器持续探索这正是ε-greedy算法的核心思想。让我们用代码实现这个策略class EpsilonGreedyAgent: def __init__(self, epsilon0.1, arms10): self.epsilon epsilon # 探索概率 self.arms arms # 可选动作数 self.Q np.zeros(arms) # 各臂价值估计 self.N np.zeros(arms) # 各臂尝试次数 def choose_action(self): if np.random.random() self.epsilon: return np.random.randint(self.arms) # 随机探索 return np.argmax(self.Q) # 选择当前最优 def update(self, arm, reward): self.N[arm] 1 self.Q[arm] (reward - self.Q[arm]) / self.N[arm] # 增量式更新均值关键参数epsilon控制着探索与利用的平衡ε值行为模式适用场景0.0纯利用环境完全稳定时0.1适度探索大多数推荐系统0.5强探索快速变化的动态环境1.0纯探索完全未知的初期阶段3. 实战演练可视化学习过程让我们运行1000次实验观察不同ε值下的表现差异def simulate(epsilon, steps1000): bandit Bandit() agent EpsilonGreedyAgent(epsilon) rewards [] optimal_rates [] for _ in range(steps): arm agent.choose_action() reward bandit.pull(arm) agent.update(arm, reward) rewards.append(reward) optimal_rates.append(arm bandit.best_arm) return np.array(rewards), np.array(optimal_rates)使用Matplotlib绘制结果曲线import matplotlib.pyplot as plt plt.figure(figsize(12, 5)) # 测试三种ε值 for eps in [0.01, 0.1, 0.5]: rewards, optimal simulate(eps) plt.plot(rewards.cumsum() / np.arange(1, 1001), labelfε{eps}) plt.xlabel(尝试次数) plt.ylabel(平均累积奖励) plt.legend() plt.show()你会明显看到ε0.01收敛慢但后期稳定ε0.1平衡性最佳ε0.5波动大但发现最优臂更快4. 进阶技巧动态调整探索率固定ε值并非最优方案。更聪明的做法是随着经验积累动态降低探索率class DecayingEpsilonGreedy(EpsilonGreedyAgent): def __init__(self, start_eps1.0, min_eps0.01, decay0.999): super().__init__(start_eps) self.start_eps start_eps self.min_eps min_eps self.decay decay self.steps 0 def choose_action(self): self.epsilon max(self.min_eps, self.start_eps * (self.decay ** self.steps)) self.steps 1 return super().choose_action()这种衰减策略模拟了人类学习过程初期广泛尝试高ε中期聚焦有潜力的选项后期微调最优选择低ε提示衰减系数需要根据问题规模调整。对于1000步的实验0.999是不错的选择更长的训练则需要更缓慢的衰减。5. 现实世界的应用变体虽然我们以老虎机为例但ε-greedy的思想广泛应用于推荐系统90%推荐已知用户喜欢的商品10%尝试新品类广告投放主要投放CTR高的广告偶尔测试新广告位效果游戏AI平衡已知最优策略与尝试新战术的可能性自动化交易在已验证策略与实验性策略间取得平衡实际工业级实现还会考虑# 添加乐观初始值鼓励早期探索 self.Q np.ones(arms) * 5.0 # 添加UCB上限置信区间 confidence np.sqrt(2 * np.log(self.steps 1) / (self.N 1e-5)) return np.argmax(self.Q confidence)这些变体都在解决同一个本质问题如何在有限尝试中获得最大累积收益。下次当你在Netflix看到既熟悉又新鲜的推荐组合时或许就能会心一笑——那背后正是ε-greedy在默默工作。

更多文章