想象你是一位刚拿到美食城畅吃卡的美食寻宝员阿尝。你的目标不是把每家店都吃一遍,而是在有限饭量里吃出最多的快乐。如果每顿都去已经验证过的牛肉面馆,你会错过转角那家可能惊艳的甜品店;如果每天盲试新店,又会频繁踩雷。这个两难,就是强化学习里的探索与利用困境:继续选择已知最好的动作,还是尝试从未验证过的动作?只会利用的 Agent,像只认老店的阿尝,收益天花板一眼望得到头;只会探索的 Agent,像失去菜单的游客,辛苦却吃不饱。现代强化学习给出了四类主流解法:ε-greedy 像“九分经验一分天意”的随机探店,UCB 像拿着小本本计算“谁最可能被低估”的乐观精算师,Thompson Sampling 像按口味信念掷骰子的贝叶斯赌徒,PSE/NGU 则像会给状态贴“新鲜度标签”的好奇心引擎。这些策略各有性格,适合不同场景。读完这篇文章,你会像阿尝一样,在利用与探索之间找到属于自己的最佳平衡。
对 AI 从业者来说,探索策略直接决定强化学习模型的样本效率和最终性能。掌握这四类方法,就是掌握了训练智能 Agent 时绕不开的“点菜智慧”。
目录
可视化演示
可视化对比强化学习主流探索策略:epsilon-greedy随机探索、UCB不确定性驱动与Thompson Sampling贝叶斯采样,交互切换理解探索与利用平衡核心方法。
本节配有交互动效(进入视口后自动加载,约 3KB)。
\u03b5-greedy随机探索 以\u03b5概率随机探索未知动作 1-\u03b5概率利用当前最优 a = \u03b5 ? random : best 简单有效但探索效率较低
探索与利用困境
阿尝发现,美食城最让人纠结的不是哪家店难吃,而是“熟悉的稳妥”和“未知的惊喜”之间的取舍。天天吃同一家,虽然不会踩雷,但菜单再好吃也会腻;天天换新店,消耗完餐券却没吃到几道可口菜。这种两难构成了他探店计划的第一课。
在强化学习中,Agent 面对的正是同样的选择。环境像一座美食城,动作像走进一家餐厅;Agent 根据估计的 Q 值决定去哪里。“利用”是选择当前 Q 值最高的动作,“探索”是尝试 Q 值不确定的动作。我们既想最大化近期收益,又想获得足够信息改进未来判断。
评估这种平衡的常用指标是累积遗憾(regret)。把每一步“最优动作本应得到的回报”与“实际动作得到的回报”之差累加起来,遗憾越小说明策略越好。
阿尝把「遗憾」记成小账本:每次没选到最好吃的店,就记一笔。有了账本,他就能判断哪套探店策略更划算。接下来四种策略,本质上都是不同风格的「点菜方法」。
- 最优回报$r^{\star}$ 表示每个时刻最优动作对应的期望奖励,是理论上的“满分答案”。
- 实际回报$r_t$ 是第 $t$ 步 Agent 实际选择动作后获得的奖励,可能低于满分。
- 累加差距$\sum_{t=1}^{T}\left(r^{\star}-r_t\right)$ 把每一步的遗憾值相加,得到整个过程的累积遗憾。
ε-greedy 策略
为了让阿尝不落下宝藏小店,最简单粗暴的办法是:大部分时间凭经验去老店,但留出一小部分餐券,闭着眼睛随机推开一家店的门。这就是 ε-greedy 的直觉。
ε 是一个介于 0 和 1 之间的小概率,比如 0.1。Agent 每一步有 ε 概率随机选动作,有 1-ε 概率选当前 Q 值最大的动作。随机性保证每个动作都有机会被尝试,避免了“永远吃同一家”的路径依赖。
ε 的选择很有讲究。ε 太大,Agent 像一个永远不听劝的游客,浪费经验;ε 太小,探索不足,容易陷在局部最优。实践中常用衰减 ε:训练初期多探索,后期多利用。
阿尝称这套方法为「九分经验一分天意」:既不会错过整座美食城,也不至于每顿都冒险。它简单可靠,但随机乱走没有方向,样本效率不算高。接下来 UCB 会给他一本更聪明的小本本。
- 贪婪动作当随机数落在 $1-\varepsilon$ 区间时,选择当前估计价值最高的动作 $\arg\max_a Q(a)$。
- 随机动作当随机数落在 $\varepsilon$ 区间时,在动作空间 $\mathcal{A}$ 中做均匀随机选择。
- 概率控制$\varepsilon$ 是随机探索的比例开关,$\varepsilon=0$ 时退化为纯利用。
UCB 置信上界
阿尝发现,纯随机探店缺乏针对性——那些已确认很难吃的店也会被反复抽到。他开始拿小本本记录每家店的平均美味分和「还没吃透」的程度。与其盲目乱走,不如优先去那些「可能被严重低估」的店。这就是 UCB 的乐观主义。
UCB(Upper Confidence Bound,置信上界)给每个动作的价值估计加一个不确定性奖励项。访问次数很少的动作,不确定性大,bonus 就高;被验证过的动作,bonus 慢慢变小。Agent 每一步选择「平均分 + bonus」最大的动作。
这让探索不再是随机撒网,而是集中火力进攻最有潜力的未探店。经典 UCB1 公式如下。
阿尝把 UCB 叫「小本本乐观法」:它记得住每家店被冷落了多久,并主动补偿它们。不过它需要维护计数和均值,适合动作数有限的情况。要面对不确定的「口味变化」,还有更贝叶斯的玩法。
- 经验平均分$Q_t(a)$ 是到第 $t$ 步为止动作 $a$ 获得的平均奖励,代表“已知美味程度”。
- 不确定性上界$c\sqrt{\frac{\ln t}{N_t(a)}}$ 中,$N_t(a)$ 是动作 $a$ 被选中的次数;访问越少,这个数越大,相当于给“可疑的好店”加分。
- 乐观选择$\arg\max_a$ 同时考虑平均值和 bonus,选出当前最值得试的动作。
Thompson Sampling 贝叶斯抽样
阿尝后来换了一种思路:不再算「上界」,而是对每家店建立一个「口味信念」的分布,然后掷骰子决定去哪家。如果一家店被多次验证好吃,它的分布会集中在一个高分区域;如果一家店数据少,分布又宽又低。这种「按信念概率随机选」的方法就是 Thompson Sampling。
形式上,TS 为每个动作维护一个后验分布(常用 Beta 分布),每次决策时先从每个分布中采样一个 θ,然后选择 θ 最大的动作。它天然地融入了不确定性:不确定的动作经常因为抽到高 θ 而被选中,确定差的动作很少被选中。
相比 UCB 的确定性规则,TS 的随机采样让它在并行化和处理噪声环境时更有韧性。
阿尝把这比作「摇骰子探店」:信念越强,骰子越稳;信息越少,骰子越飘。多试几次,那些真正好吃的店自然会因为高采样值被频繁选中。接下来,当美食城的店铺多到地图都画不下时,计数法也要升级了。
- 后验采样对每个动作 $a$,从 Beta 分布抽样,$S_a$ 是历史成功次数,$F_a$ 是失败次数。
- 样本即一次“掷骰结果”$\theta_a$ 代表这次采样中该动作的“中奖率”猜想。
- 选最大样本$a_t=\arg\max_a\theta_a$ 选的是本次骰子掷出的最高分,而不是长期均值。
计数与伪计数
阿尝在小本本上给每家店盖「去过的章」,章越少代表越陌生,下次去的新鲜感就越大。这种「访问次数越少,越应该鼓励探索」的直觉,是计数探索的起点。
但真正的强化学习环境里,状态空间大到不可能为每个状态单独记一个数字。比如 Atari 游戏的画面有无数种组合,同一个「画面」稍有变化就变成新状态。于是研究者提出伪计数:用一个概率模型估计「这个状态出现一次的概率」,再反推它大约相当于被访问了多少次。
伪计数可以被转成内在奖励(intrinsic reward),鼓励 Agent 去访问估计访问次数少的状态。一个常见形式是给奖励加上与伪计数平方根成反比的 bonus。
阿尝的「章」升级成了「新鲜度传感器」:不用逐家计数,靠概率模型就能估计哪里还没吃透。PSE 和 NGU 就是在这一思想上的深度强化学习工程化。
- 访问概率估计$\rho(x)$ 是密度模型对状态 $x$ 出现概率的预测,出现概率越低说明越陌生。
- 伪计数反推$\hat{N}(x)=1/\rho(x)$ 把概率转成“等效访问次数”,概率越低,等效次数越少。
- 内在奖励加成$r^{i}_t=\beta/\sqrt{\hat{N}(s_t)}$ 让未知状态获得额外的奖励引导,鼓励 Agent 前往新鲜区域。
PSE 与 NGU 扩展
阿尝的新鲜度传感器不仅能感知「这个店去没去过」,还能感知「和上一周比,它是不是依旧新鲜」。这就是 PSE/NGU 带给我们的新维度:既要模型估计伪计数,也要让探索奖励随生命周期动态变化。
PSE 一类方法用密度模型直接为状态估计伪计数,把「陌生度」压缩成一个标量;NGU(Never Give Up)则在深度强化学习中进一步结合两种模块:一个模块计算「与新近记忆的相似度」,另一个模块计算「与长期经验的差异」,两者共同决定内在奖励。这样可以避免 Agent 反复刷同一个房间刷出虚假的新鲜感。
在实际集成时,总奖励通常由环境给的外在奖励和探索用的内在奖励加权相加。
阿尝总结:PSE 像一本「全局探店热度榜」,NGU 像「短期新鲜感闹钟」,两者叠加,让 Agent 在稀疏奖励的迷宫中也愿意不断走向新房间。
- 外在奖励$r^{e}_t$ 是环境本身给出的任务奖励,例如通关得分。
- 内在探索奖励$r^{i}_t$ 由新奇度模型产生,指导 Agent 去未探索区域。
- 权重系数$\beta$ 控制探索奖励的强度,太大 Agent 只顾探险,太小则退回纯利用。
对比与调参
四种策略各有性格。ε-greedy 简单直接,像阿尝的「九分经验一分天意」,适合快速基线;UCB 像个精算师,小本本上算置信上界,适合动作数量有限的多臂老虎机;TS 像个贝叶斯赌徒,靠后验采样平衡探索,对嘈杂反馈更稳;PSE/NGU 则像自带好奇心引擎的探险家,专治稀疏奖励和超大状态空间。
选型时要看三个维度。样本效率:TS 和 UCB 通常高于 ε-greedy;计算开销:ε-greedy 几乎为零,UCB 和 TS 需要维护统计量或分布,PSE/NGU 需要额外模型;稳定性:UCB 决定论强,TS 带随机采样,在并行训练中反而更平滑。
调参时最常用的是衰减系数。以 ε-greedy 为例,指数衰减公式如下。UCB 的常数 c、TS 的先验参数、内在奖励的权重 β,都要结合具体任务反复扫描。
阿尝的小结:没有「最好的策略」,只有「最适合当下场景的策略」。先用 ε-greedy 跑通流程,再按问题换上 UCB/TS,最后用内在奖励处理稀疏反馈,这就是他从美食城悟出的工程路线。
- 初始探索率$\varepsilon_0$ 是训练开始时的探索概率,通常设为 0.1~1.0。
- 衰减底数$\alpha$(如 0.995)是接近 1 的常数,每步让 ε 缩小一点。
- 逐步降温$\alpha^{t}$ 随步数 $t$ 指数衰减,让 Agent 从爱探险慢慢变成老食客。
AI 应用场景
推荐系统冷启动
阶段:在线学习与决策
解决的问题:传统推荐系统只推头部热门商品,新品和新用户几乎没有曝光机会,陷入“越热越推、越冷越不推”的马太效应。用 Thompson Sampling 对每个候选商品的点击率后验分布采样,既保留最优商品的曝光,又让不确定商品持续获得试吃机会。
具体案例:某新闻 App 冷启动新栏目时,算法把每篇文章看成一个「餐厅」,用 Beta 分布记录点击/不点击,每次请求先采样再展示。实验表明新品曝光量提升 37%,同时整体点击率不降。
广告竞价出价优化
阶段:在线竞价
解决的问题:广告出价需要在转化最优和尝试新素材之间找平衡,固定出价会错失低价高质流量。ε-greedy 可作为简单可靠的探索开关。
具体案例:广告平台用 ε-greedy 以 5% 流量随机尝试新的出价档位,95% 流量沿用当日最优档位,训练中 ε 随预算消耗衰减,既控制成本又积累了新素材数据。
稀疏奖励游戏 AI 训练
阶段:训练环境奖励设计
解决的问题:游戏迷宫奖励稀疏,Agent 常困在出生点附近,只靠外在奖励无法有效学习。PSE/NGU 的内在奖励可以引导 Agent 探索新房间。
具体案例:在 3D 寻物游戏中,给 Agent 叠加 PSE/NGU 内在奖励,探索覆盖率从 12% 提升至 61%,最终通关速度提升 3 倍。
Python 演示
import mathimport random class Bandit: def __init__(self, k=10): self.k = k self.means = [random.random() for _ in range(k)] self.opt = max(self.means) def pull(self, a): return 1.0 if random.random() < self.means[a] else 0.0 def run_eps(bandit, steps, eps=0.1): q = [0.0] * bandit.k n = [0] * bandit.k regret = [] total = 0.0 for t in range(1, steps + 1): if random.random() < eps: a = random.randrange(bandit.k) else: a = max(range(bandit.k), key=lambda i: q[i]) r = bandit.pull(a) n[a] += 1 q[a] += (r - q[a]) / n[a] total += bandit.opt - bandit.means[a] regret.append(total) return regret def run_ucb(bandit, steps, c=1.0): q = [0.0] * bandit.k n = [0] * bandit.k regret = [] total = 0.0 for t in range(1, steps + 1): a = max(range(bandit.k), key=lambda i: q[i] + c * math.sqrt(math.log(t) / (n[i] + 1e-6))) r = bandit.pull(a) n[a] += 1 q[a] += (r - q[a]) / n[a] total += bandit.opt - bandit.means[a] regret.append(total) return regret def run_ts(bandit, steps): alpha = [1] * bandit.k beta = [1] * bandit.k regret = [] total = 0.0 for t in range(1, steps + 1): samples = [random.betavariate(alpha[a], beta[a]) for a in range(bandit.k)] a = max(range(bandit.k), key=lambda i: samples[i]) r = bandit.pull(a) alpha[a] += r beta[a] += 1 - r total += bandit.opt - bandit.means[a] regret.append(total) return regret def run_count(bandit, steps, bonus=0.5): q = [0.0] * bandit.k n = [0] * bandit.k regret = [] total = 0.0 for t in range(1, steps + 1): a = max(range(bandit.k), key=lambda i: q[i] + bonus / math.sqrt(n[i] + 1e-6)) r = bandit.pull(a) n[a] += 1 q[a] += (r - q[a]) / n[a] total += bandit.opt - bandit.means[a] regret.append(total) return regret def main(): bandit = Bandit(10) steps = 2000 eps_regret = run_eps(bandit, steps) ucb_regret = run_ucb(bandit, steps) ts_regret = run_ts(bandit, steps) cnt_regret = run_count(bandit, steps) for name, reg in [("eps", eps_regret), ("ucb", ucb_regret), ("ts", ts_regret), ("count", cnt_regret)]: print(name, "final regret:", round(reg[-1], 2)) if __name__ == "__main__": main()
q[a] += (r - q[a]) / n[a]增量式更新平均奖励,不需要保存全部历史奖励。q[i] + c * math.sqrt(math.log(t) / (n[i] + 1e-6))UCB 在平均奖励上叠加不确定性上界,让冷门动作有机会被选中。samples = [random.betavariate(alpha[a], beta[a]) for a in range(bandit.k)]从每个动作的 Beta 后验中采样,体现 Thompson Sampling 的“掷骰子”思想。q[i] + bonus / math.sqrt(n[i] + 1e-6)模拟基于计数的内在奖励 bonus,访问次数越少,越容易被选到。total += bandit.opt - bandit.means[a]每步用最优均值减去当前动作均值,累加得到累积遗憾。
常见误区
误区把 ε 调大就能探索更多,学习效果一定更好。于是给 Agent 设置 ε=0.5,希望它“多看看世界”。
正解ε 太大意味着 Agent 有一半时间在随机乱走,已经学到的经验被大量浪费,累积回报反而下降。更好的做法是初期用中等 ε,随训练衰减到很小值,让 Agent 先广撒网,再精耕细作。
为何常见:“探索”这个词听起来越多越好,忽略了探索与利用必须动态平衡的本质。
误区UCB 的每一步都是确定计算,没有随机动作,所以很多人认为它只是一种“改进的贪心”。
正解UCB 的不确定性 bonus 在随着访问次数动态变化,它会主动转向那些还没被充分验证的动作,这种“差异化的选择顺序”本身就是探索。随机不是探索的唯一形式,信息增益才是核心。
为何常见:把探索狭隘地理解为“随机”,忽略了不确定性建模带来的定向探索。
误区看到某些实验里 TS 表现好,就认为它可以无脑替换 UCB。
正解两者在渐近遗憾上有相同的理论阶数,实际胜负取决于奖励分布、并行程度和实现细节。UCB 决策确定且计算简单,适合对可解释性要求高的场景;TS 的随机采样在分布式训练中更平滑。
为何常见:用少数实验结论做全场景外推,忽略了方法背后的假设条件。
误区认为伪计数只是把“状态访问次数”放进字典里,和普通计数没有本质区别。
正解高维连续状态无法直接查表,伪计数会用密度模型估计“这个状态出现过一次的概率”,再把概率转换成等效次数。它能泛化到相似状态,给出平滑的新奇度估计。
为何常见:表格型强化学习里的直观计数经验,让人误以为深度 RL 中也能简单照搬。
误区看到 DeepMind 的演示多是 Atari 游戏,就认为内在奖励探索是游戏 AI 的专利。
正解稀疏奖励场景在机器人控制、自动驾驶、推荐系统中同样常见。只要设计好状态编码和密度模型,PSE/NGU 的新奇度奖励就能迁移到这些任务上。
为何常见:被演示案例的“游戏画面”带偏,忽略了其底层是通用的伪计数与新奇度算法。
面试题
Q1. 探索与利用的核心矛盾是什么?
- A.模型参数过多导致训练慢
- B.坚持已知最优与尝试未知的冲突← 正确答案
- C.环境奖励稀疏导致无法收敛
- D.动作空间过大导致超时
答案:B。探索与利用的矛盾是“已知的好”和“未知的可能”之间的权衡。A、C、D 都是训练中的问题,但不是探索与利用这对矛盾本身。
Q2. ε-greedy 中 ε 的含义是什么?
- A.选择随机动作的概率← 正确答案
- B.学习率的大小
- C.折扣因子的大小
- D.奖励值的上限
答案:A。ε 是随机探索概率,Agent 以 ε 概率随机选动作,以 1-ε 概率贪婪选择。学习率、折扣因子和奖励上限都与 ε 无关。
Q3. UCB 中“置信上界”指的是什么?
- A.对奖励上限的先验假设
- B.平均值加上不确定度估计← 正确答案
- C.所有动作的最大奖励值
- D.神经网络层数的上限值
答案:B。UCB 把平均奖励和不确定性 bonus 相加,得到一个乐观估计。它不是一个固定的奖励上限,而是随数据变化的置信区间上界。
Q4. Thompson Sampling 的核心思想是什么?
- A.对后验分布采样并取最大← 正确答案
- B.直接选平均奖励最高的动作
- C.用小概率随机动作强制探索
- D.每步选择访问次数最多的动作
答案:A。TS 维护每个动作的后验分布,每次先采样再选最大样本。B 是纯利用,C 是 ε-greedy,D 是另一种计数启发式。
Q5. 以下哪些是 ε-greedy 的改进思路?
- A.将 ε 随训练逐步衰减← 正确答案
- B.初期多探索后期多利用← 正确答案
- C.用神经网络替代 Q 表
- D.完全去掉随机性策略
答案:AB。衰减 ε 和“先探索后利用”是 ε-greedy 的经典改进。用神经网络替代 Q 表是函数逼近方向,不是针对探索策略的改进;完全去掉随机性会退化为纯利用。
Q6. PSE/NGU 中的内在奖励主要目的是什么?
- A.缓解稀疏奖励问题← 正确答案
- B.替代所有外在奖励
- C.增加动作空间大小
- D.消除环境随机干扰
答案:A。内在奖励给陌生状态加分,引导 Agent 探索,进而缓解稀疏奖励下难以学习的问题。它不会替代外在奖励,也不改变动作空间。
Q7. 关于伪计数估计,下列说法正确的有?
- A.用密度模型估计访问概率← 正确答案
- B.高维状态也能平滑估计新奇度← 正确答案
- C.直接维护一张访问次数表
- D.伪计数一定等于真实计数
答案:AB。伪计数的核心是用概率模型把访问概率转换为等效次数,适用于高维状态。直接维护次数表是表格型计数,不等于伪计数;伪计数是估计值,不一定等于真实计数。
Q8. 在美食寻宝员的比喻中,以下对应关系正确的有?
- A.经常帮衬老店对应利用← 正确答案
- B.随机进新店对应探索← 正确答案
- C.记录等位时间对应价值估计← 正确答案
- D.评价星级对应折扣因子
答案:ABC。老店高收益对应利用,新店尝试对应探索,记录等位时间是在学习动作价值。折扣因子是未来回报的折算系数,与星级评价没有直接对应。
Q9. UCB 与 Thompson Sampling 的主要区别是什么?
- A.UCB 基于置信区间而 TS 基于采样← 正确答案
- B.UCB 一定比 TS 方法效果更好
- C.TS 只能处理二值奖励信号
- D.UCB 无法处理多臂老虎机
答案:A。UCB 通过置信上界做确定性选择,TS 通过后验采样做随机选择。效果优劣由任务决定,TS 也不限于二值奖励,UCB 最早就是为多臂老虎机设计的。
Q10. 在稀疏奖励环境中想鼓励 Agent 探索新状态,最适合的做法是?
- A.PSE/NGU 内在奖励配合基线算法← 正确答案
- B.固定 ε=0.5 的 ε-greedy
- C.只靠规划模块搜索全局路径
- D.完全关闭探索只做利用
答案:A。稀疏奖励下需要额外的新奇度激励,PSE/NGU 的内在奖励正好为此设计。固定大 ε 随机乱走效率低,只靠规划缺少学习闭环,完全不探索则会卡在局部最优。