一台老虎机,整门学科最小的样本
把上一章那个循环砍到不能再砍:没有状态,没有转移,一局就一步。剩下的东西看起来简单得不像个研究课题——但它里面藏着一个矛盾,那个矛盾会一路跟到最后一章。
砍到最小
拿掉状态:不管你做什么,下一刻的处境和现在一样。拿掉转移:没有「以后」,这一步就是全部。
剩下的问题长这样:你面前有五台老虎机,每台的中奖概率不同,但你不知道是多少。你有一千次机会。怎么拉,总收益最大?
这叫多臂老虎机(multi-armed bandit)。名字来自赌场——老虎机的拉杆叫「臂」,而它们被称为「独臂强盗」。
它简单到可以在一张餐巾纸上说完,但它是这门学科的最小完整样本:所有关于「学习」的矛盾都在,只是被剥掉了所有干扰。
那个矛盾
你拉了三次第一台,中了两次。估计胜率 67%,不错。
现在第四次。拉第一台,还是试试没碰过的第二台?
- 拉第一台(利用,exploitation):稳。按当前掌握的信息,这是最优选择。
- 试第二台(探索,exploration):可能更差,浪费一次机会。但也可能发现一台胜率 90% 的,那么剩下的九百多次全都受益。
这就是探索与利用的矛盾。它没有完美解——因为它本质上是在拿确定的当下换不确定的未来,而你永远不知道未来值不值。
训练一个图片分类器的时候,你不需要「探索」。数据集摆在那儿,你把每张图都看一遍就行。你的行为不影响你能拿到什么数据。
强化学习不是这样。你只能看见你走过的地方。没拉过的那台机器,你永远不知道它多好;没走过的那条路,Q 表里永远是初始值。
这个性质有个名字,叫数据分布依赖于策略。它是强化学习一切困难的根源,也是它区别于其他机器学习的那一条线。第 10 章那个「有两格从没走到过」,第 21 章那个「六百局都没找到终点」,都是它。
先看最笨的做法有多惨
「就一直拉当前估计最好的那台」——这叫全贪心。听上去很合理,毕竟你就是想赢钱。
下面这台是真的引擎。五台机器的真实胜率是 30%、50%、72%、45%、60%,第三台最好,但 agent 不知道。
然后依次点过去。盯住两个数字:「后悔值」(越低越好)和「彻底走丢的实验」(多少次实验最后卡死在错误的臂上)。
全贪心为什么必然完蛋
结果是:后悔值 420,拉中最优臂的比例 0.0%,200 次独立实验里有 100% 彻底走丢了。一次都没找对。
原因很朴素。所有臂的初始估计都是 0,第一次它随便拉一台,假设中了——那台的估计变成 1.0,其他还是 0。于是第二次它还拉那台,第三次还拉那台……
它再也不会去碰别的机器,所以它永远不会知道自己错了。
这是一个自我封闭的循环,而且它看起来完全正常:分数在涨,估计在收敛,一切指标都健康。这是这本书第一次遇到「指标好看但结果是错的」,后面还会遇到很多次。
后悔值(regret)的定义是:「如果我从一开始就知道哪台最好、一直拉它」能拿到的,减去「我实际拿到的」。
为什么不直接看总收益?因为总收益和问题难度绑死了——胜率 90% 的机器和胜率 10% 的机器,总收益差十倍,但那和你的算法好不好没关系。后悔值把「问题本身有多好赚」这一项减掉了,剩下的纯粹是「你亏在决策上的部分」。
理论上的好消息:有算法能做到后悔值随时间对数增长(O(log T)),也就是说时间越长,平均每步的损失越接近 0。UCB 就是其中之一,这是它有名的原因。
五种解法,五种思路
① ε-greedy:留一个固定的口子
最简单的修法:大部分时候贪心,但有 ε 的概率完全随机挑一台。ε = 0.1 就是「10% 的步数用来瞎试」。
def choose(Q, eps):
if random() < eps:
return randint(len(Q)) # 探索:随便来一台
return argmax(Q) # 利用:当前最好的
丑,但有效:后悔值从 420 降到 55.5,走丢率降到 0%。
它丑在哪?探索的时候完全不动脑子。一台你已经拉过三百次、确定它很差的机器,和一台你从没碰过的机器,被同等对待。
顺带看一眼 ε = 0.01:后悔值 182,走丢率 36.5%。探索得太少,三分之一的实验还是卡死了。「留了个口子」和「口子够大」是两回事。
② ε 衰减:开始猛试,后来收手
ε 不固定,随时间往下掉。直觉很对:开局你什么都不知道,值得多试;后期你已经知道了,试就是纯亏。
结果 55.1,比固定 ε 略好一点。这也是实践中最常见的做法——DQN 那篇论文里 ε 从 1.0 线性降到 0.1,花了整整一百万步。
③ 乐观初始值:让失望自己带来探索
一个很漂亮的小技巧:不改算法,只把所有臂的初始估计设成一个高得离谱的值(比如 1.0,而实际最高胜率只有 0.72)。
然后就用纯贪心。会发生什么?它拉第一台,实际胜率 30%,估计从 1.0 掉下来;于是第二台变成「最好的」,它去拉第二台,也掉下来……它会被迫把每台都试一遍,仅仅因为现实总是让它失望。
后悔值 85.9——比 ε-greedy 差一点,但代码量是零。它的问题是走丢率还有 42.5%:一旦所有估计都掉到真实值附近,探索就彻底停了,运气不好就锁死。这个技巧只在开局有效,撑不了长跑。
④ UCB:给「不确定」明码标价
前面几种都在拍脑袋决定探索多少。UCB 换了个思路:把不确定性算出来,直接加到估计上去。
选 argmax [ Q(a) + c · √( ln t / N(a) ) ]
└──── 不确定性加成 ────┘
那一项的行为很符合直觉:N(a) 是这台机器被拉过多少次,拉得越少,加成越大;t 是总步数,时间越久,所有没拉的臂加成都在缓慢上涨(「好久没试了,说不定我记错了」)。
这叫面对不确定性时保持乐观——一个在整个领域反复出现的原则。UCB 的后悔值 56.1(c=1),走丢率 0%。
注意那个 c:demo 里 c=2 的后悔值是 109.8,比 c=1 差了将近一倍。它把「探索多少」这个问题从「ε 设多少」变成了「c 设多少」——问题没有消失,只是换了个形状。这种事在强化学习里非常常见,值得早点习惯。
⑤ Thompson 采样:按「它是最好的」的概率去抽
最优雅的一个,而且是 1933 年提出来的——比这个领域本身还老。
思路是贝叶斯的:不维护一个点估计,维护一个分布。拉了 3 次中 2 次的机器,它的胜率不是「67%」,而是一条以 0.67 为中心、比较宽的概率曲线。拉了 300 次中 200 次,同样是 67%,但曲线窄得多。
然后每一步:从每台机器的分布里各抽一个样,选抽中最大的那台。
妙在哪?没试过的机器分布很宽,抽出高值的概率不小,所以它自然会被试到;试了很多次确认很差的机器分布很窄,几乎不可能抽出高值。探索和利用不是两个模式,它们从同一个动作里自然长出来。
结果:后悔值 28,最优臂占比 84.9%——本章最好的成绩,而且好得不止一点。
上面每个数字,都是 200 次独立实验的平均。这不是为了图表好看,是因为单跑一次的结论完全不可信。
我做这个 demo 的时候,随手用种子 7 跑了一次 ε=0.1,结果它一头扎进第五台(胜率 60%)再也没出来,最优臂占比 2.0%——比 ε=0.01 那次还惨。如果我拿这一次的结果写进书里,会得出「ε=0.1 不如 ε=0.01」这个完全错误的结论。
强化学习是出了名的方差大。你在论文和博客里看到的那些漂亮曲线,几乎都是几十上百次独立实验的平均加上置信区间。Sutton & Barto 书里那些经典图是 2000 次。
所以这本书立一条规矩,也建议你立:凡是给统计量,至少 5 个种子,报中位数和区间,不报最好那次。第 24 章那张排障表里,「每次跑结果都不一样」被明确归类为「RL 的正常状态」,不是 bug。
一张对照表
| 策略 | 后悔值 | 最优臂占比 | 走丢率 | 它的思路 |
|---|---|---|---|---|
| 全贪心 | 420 | 0.0% | 100% | 相信当前估计 |
| ε = 0.01 | 182 | 36.6% | 36.5% | 留个小口子(太小了) |
| ε = 0.1 | 55.5 | 72.9% | 0% | 留个固定口子 |
| ε 衰减 | 55.1 | 76.7% | 0% | 先猛试,后收手 |
| UCB(c=1) | 56.1 | 71.6% | 0% | 给不确定性加价 |
| 乐观初始 | 85.9 | 55.5% | 42.5% | 用失望驱动探索 |
| Thompson | 28 | 84.9% | 0% | 按后验概率抽样 |
这一章看起来最像玩具,实际上是本书里直接落地最多的一章。多臂老虎机是工业界用得最广的强化学习——比 DQN、PPO 加起来还广:
- A/B 测试的升级版:传统 A/B 测试把流量对半分,直到实验结束。老虎机算法会动态把流量往表现好的版本倾斜,同样的结论、更少的损失。这叫自适应实验设计。
- 推荐系统的冷启动:新内容没人点过,估计值是 0,纯贪心会让它永远不被推荐——这就是本章开头那个自我封闭的循环。所有推荐系统都得处理这个,用的多半是 Thompson 或 UCB 的变体。
- 超参数搜索:Hyperband、BOHB 这些方法的底子是「连续减半」,本质上是老虎机。
如果你只想从这本书里拿走一样能明天就用上的东西,那就是这一章。
你可能会想:老虎机和 QWOP 差太远了吧。
但那个学走路的小人,在每一帧都面对同一个矛盾:按当前策略走(利用),还是随机试一个没试过的动作组合(探索)?区别只是它面对的不是 5 台机器,而是「在这个状态下的所有可能动作」,而且状态还在变。
更直接的联系:DQN 的 ε 退火,就是这一章 ε-greedy 的原样搬运。一个能打通 49 个 Atari 游戏的算法,它的探索机制就是本章第一个、也是最丑的那个。
这一章的一句话
纯贪心必然完蛋,因为它没有机会发现自己错了。而探索不是浪费——是买保险,保的是「我现在相信的东西可能是错的」。
下一章:ε 到底该设多少?答案会告诉你一件不太舒服的事——这个数没有正确答案,它取决于你还剩多少局可以玩。