卷 I · 试错CH 04深度 4/24

探索与利用:为什么它必须先犯傻

上一章确定了「得探索」。这一章问一个更实际的问题:探索多少?把 ε 从 0 扫到 1,会画出一条 U 形曲线——而 U 形的底在哪,取决于一件你可能没想到的事。

ε 该设多少视野与探索量为什么会退火

两头都是坑

先把两个极端摆出来,因为它们的失败方式完全不同:

  • ε = 0(从不探索):上一章那个自我封闭的循环。后悔值 420,走丢率 100%。它的失败是看不见的——它一直很自信。
  • ε = 1(永远随机):它会把每台机器都试个够,估计得非常准。然后什么也不做。知道了哪台最好,却从来不去拉它。

第二种失败特别值得琢磨一下:它学得非常好,但一分钱也没多赚。「学到了」和「用上了」是两件事。

▶ 动手 · 先看 1000 步那一版,再改成 200 步和 5000 步

盯住最优的那个 ε 在哪一行。改总步数之后,它会移动。

U 形的底在哪,取决于你还剩多少局

这是这一章的核心,而且它一点也不显然。

探索是一笔投资:你现在花一次机会去试一台可能很差的机器,换来的是「以后所有机会都用在正确的机器上」。

那么这笔投资划不划算,取决于「以后」有多长

  • 还剩 10 步:花 3 步探索,只剩 7 步能用。多半不值。
  • 还剩 100 万步:花 1000 步探索,占比 0.1%,换来 99.9% 的步数都走对。血赚。

把 demo 的总步数从 200 改到 5000,你会看到最优的 ε 确实在往下走。这不是巧合,是上面这个账的直接后果。

◆ 于是「ε 应该衰减」就不需要背了

每走一步,你的剩余视野都在变短。开局的时候「以后」很长,探索的投资回报率高;快结束的时候「以后」很短,同样的探索就变亏了。

所以最优的 ε 本来就该随时间下降。这不是一个工程技巧,是上面那笔账的必然结论。

DQN 那篇论文里 ε 从 1.0 线性降到 0.1,用了一百万步——现在你知道那不是拍脑袋,是在跟着剩余视野走。

为什么不能「学完了再用」

一个自然的念头:那就干脆分两段——前 10% 的步数纯探索,后 90% 纯利用。这样不就两全其美了?

这个想法有个名字,叫 explore-then-commit,而且在老虎机这种简单问题上确实能用。但它在真正的强化学习里会碎掉,原因有两个:

① 你不知道该在哪儿切

切早了,估计不准,锁死在次优上;切晚了,白白浪费。而「什么时候估计够准了」这件事本身就需要估计——你得知道差距有多小才需要多少样本,可差距正是你要估的东西。

② 更要命的:环境会变,而且是被你自己变的

这一条老虎机看不出来,但从下一卷开始就绕不开了。

在真正的强化学习里,你的策略决定了你会走到哪些状态。策略变好了,你就走到了从前根本到不了的地方——而那些地方你一次都没探索过

想象学走路的小人:一开始它只会摔倒,所以它见过的全是「摔倒前那零点几秒」的状态。等它学会站住了,它突然面对一大片全新的状态——「站着的时候该怎么迈第一步」。这些状态在前 10% 的探索期里根本不存在。

所以探索不能一次性做完,它必须贯穿始终。这也是为什么实践中 ε 一般降到 0.05 或 0.01 就不再往下降了——留一条永远开着的缝。

✎ 「探索」不止 ε-greedy 一种

ε-greedy 是最原始的探索:随机。它有个明显的浪费——已经确认很差的动作,它还是照样以同等概率去试。

后面会遇到几种更聪明的:

  • UCB / Thompson(上一章):按不确定性来分配探索。缺点是在深度强化学习里很难算——神经网络给不出干净的「不确定性」。
  • 策略熵(第 17、18 章):策略本身就是随机的,往目标函数里加一项「鼓励策略别太确定」。这是 PPO 和 SAC 用的方式,探索被写进了目标函数里,不再是外挂的。
  • 好奇心 / 内在奖励(第 21 章):给「见到没见过的状态」本身发奖励。这是对付稀疏奖励的主力手段之一。
  • 参数空间噪声:不是给动作加噪声,是给网络权重加噪声。同一个状态下它会稳定地做同一件「怪事」,而不是每帧抖一下——探索得更连贯。

但注意:它们全都没有消灭那个矛盾,只是换了一种给它定价的方式。ε、UCB 的 c、熵系数、好奇心权重——每一个都是同一个旋钮的不同外壳。

一个真实世界的插曲

探索在纸上是「多试试」,在现实里是「故意做一件你知道大概率是错的事」

这在有些场景里是免费的(模拟器里摔一万次不要钱),在有些场景里贵得吓人:

  • 真机器人:探索意味着真的摔一次,可能摔坏一个几万块的关节。
  • 推荐系统:探索意味着给真实用户推一个你觉得他可能不喜欢的东西。
  • 医疗、金融:探索意味着拿真实后果做实验。这里的伦理边界是硬的。

这条现实约束催生了两个完整的子领域,都值得知道名字:安全强化学习(在探索时加硬约束,保证不越过某条红线)和离线强化学习(完全不探索,只从历史日志里学,代价是学不到日志里没有的行为)。

它也解释了第 13 章那个乍看奇怪的结果:为什么有时候我们宁愿要一个学得慢一点、但训练途中摔得少的算法。

⌗ 换成真机:这些旋钮长什么样

在 Stable-Baselines3 里,探索是这么几个参数:

from stable_baselines3 import DQN, PPO

# DQN 用 ε-greedy,三个参数控制退火
model = DQN("MlpPolicy", env,
            exploration_initial_eps=1.0,      # 开局全随机
            exploration_final_eps=0.05,       # 降到这里就不再降
            exploration_fraction=0.1)         # 用总步数的 10% 走完这段

# PPO 没有 ε。它的探索来自策略本身的随机性,
# 用熵系数控制「别太快变确定」
model = PPO("MlpPolicy", env, ent_coef=0.01)

两个值得记住的经验:

exploration_fraction 是相对总步数的比例。如果你把 total_timesteps 调大十倍却忘了这一项,探索期也会跟着变十倍长——很多人在这里困惑过「为什么训练久了反而更差」。

ent_coef 设成 0 通常收敛更快,但更容易早早锁死在一个次优策略上,而且你看不出来:曲线会很漂亮地平掉,看起来像收敛了。这又是一次「指标好看但结果是错的」。

↩ 回到那个视频

再看一遍那个学走路的视频的开头——那段大多数人会快进掉的部分。

小人在原地抽搐、四肢乱甩、以各种姿势脸着地。你现在知道那不是「还没学会」,那是探索。它在系统地采样「如果我这样动会发生什么」,而绝大多数答案是「会摔」。

那几万次摔倒不是学习过程的浪费,它们就是学习过程本身。价值函数里那个「这个姿态很危险」,正是从这几万次摔倒里长出来的。

而当你看到它开始能站住几秒的时候——注意它还在偶尔抽一下。那是 ε 没有降到 0,那条缝一直开着。

这一章的一句话

探索该做多少,取决于你还剩多少局。这就是为什么 ε 该衰减;而它不该衰减到 0,因为策略一变好,你就会走到从前根本到不了的地方。

卷 I 到这里结束。你手上有了一个循环,和一个关于「怎么试」的答案。

但老虎机有一个奢侈的性质:奖励是当场结清的。拉一下,立刻知道好不好。真实世界不是这样——你今天做的这一步,可能三十步之后才见分晓。下一卷全部在处理这件事:奖励是当场给的,但它必须为「以后」负责。