Skip to content

两台老虎机:RL 的最小问题

本节导读

核心内容

  • 掌握多臂老虎机这个无状态决策问题,理解探索与利用的基本矛盾。
  • 学会用期望回报比较随机、已知最优、先试后定等策略。
  • 理解 Regret 如何衡量探索策略相对最优策略损失了多少。

核心公式

E[Ra]=pa(+1)+(1pa)(1)=2pa1(单臂期望奖励:计算单次平均收益)\mathbb{E}[R_a] = p_a \cdot (+1) + (1-p_a)\cdot(-1) = 2p_a - 1 \quad \text{(单臂期望奖励:计算单次平均收益)}

单臂期望奖励 (Expected Reward of an Action):

  • E\mathbb{E}:期望(Expectation),表示多次尝试后的平均结果。
  • RaR_a:选择动作 aa(比如拉动某根摇杆)后得到的真实奖励。
  • pap_a:动作 aa 带来正收益(赢钱)的真实概率。

E[RT]=t=1TE[Rat](T 轮期望总回报:衡量策略整体表现)\mathbb{E}[R_T] = \sum_{t=1}^{T} \mathbb{E}[R_{a_t}] \quad \text{(T 轮期望总回报:衡量策略整体表现)}

T 轮期望总回报 (Expected Total Return over T steps):

  • TT:总共尝试的轮数。
  • ata_t:在第 tt 轮选择的具体动作。
  • RTR_T:玩了 TT 轮之后累积的总奖励。

Regret(T)=Tμt=1Tμat(Regret:衡量探索损失)\mathrm{Regret}(T) = T\mu^* - \sum_{t=1}^{T}\mu_{a_t} \quad \text{(Regret:衡量探索损失)}

遗憾值 (Regret):

  • Regret(T)\mathrm{Regret}(T):遗憾值,玩了 TT 轮后,你比“上帝视角”少赚了多少钱。
  • μ\mu^*:理论上最好那台机器的单步期望收益。
  • μat\mu_{a_t}:你第 tt 轮选的那台机器的单步期望收益。

为什么需要这些公式

这一节先把问题故意变得很小:没有地图,没有局面变化,只有两台老虎机。这样大家可以先看清 RL 最基本的矛盾:我不试,就不知道哪台好;我一直试,又会浪费机会。期望奖励把"这台好像更赚"变成一个可以算的数,TT 轮总回报让我们比较一整套玩法,Regret 则告诉你:因为一开始不知道答案,我到底多亏了多少。读到这里应该有第一个"哦":探索不是随便乱试,而是为了以后少亏一点,先有代价地买信息。下一节把"老虎机没有状态"这件事放开,问题就会变成"在不同局面下怎么选"。

前两章你跑通了 CartPole 和 DPO,但有一个问题一直藏在库的背后:智能体怎么知道"哪个动作更好"? 如果连"两个选项选哪个"都回答不了,面对 CartPole 里连续变化的状态就更无从下手了。这一节故意去掉所有复杂因素——没有状态变化,没有多步规划——只保留 RL 最核心的两个问题。

想象你走进一家赌场,面前只有两台老虎机。你有 100 枚硬币,不知道哪台更容易中奖——只能亲手去试。每试一次少一枚硬币,继续试不确定的那台,还是锁定目前看起来更好的那台?

这就是 探索与利用(Exploration vs. Exploitation) 困境,学名叫"多臂老虎机问题"(Multi-Armed Bandit, MAB)[1][2]。它无处不在:选餐厅(老店还是新店)、看电影(熟悉类型还是陌生推荐)、科研选题(深耕还是跨界)。RL 做的事,就是把这类日常决策变成可分析、可优化的问题。

这个设定之所以关键,是因为它去掉了状态——不管上一轮选了什么,这一轮面对的局面完全相同。CartPole 不是这样:你推了一下小车,杆子的角度变了,整个局面都变了。老虎机故意拿掉"状态变化"这个干扰因素,让我们先集中精力解决两个最基本的问题:

  1. 如何评估一个策略好不好? → 期望回报
  2. 如何在"尝试新选项"和"利用已知信息"之间权衡? → 探索策略

这两个问题是所有 RL 算法的基础——无论环境有没有状态、动作是离散还是连续,你永远在回答"哪个更好"和"要不要试试新的"。

两台老虎机

你面前有两台老虎机。每台投 1 枚硬币,中奖吐出 2 枚(净赚 +1),不中奖吞掉(净亏 -1)。你有 100 次机会。你不知道两台机器的出奖概率。

这个设定看似简单,但它精确地描述了 RL 的核心矛盾:前几轮你得两边都试试,才能搞清楚谁更好;但试出结果之后,你应该把剩余的硬币全投给那台更准的机器。 试太多,浪费硬币在差机器上;试太少,可能永远不知道另一台其实更赚。

三种策略,三种结局

为使讨论更具体,我们设定一个前提:A 台出奖率 60%,B 台出奖率 40%。这一事实仅用于计算期望值,玩家在游戏中并不知晓,只能通过尝试来估计。

由此可以算出每台机器投一次的期望收益

E[RA]=0.6×(+1)+0.4×(1)=+0.2\mathbb{E}[R_A] = 0.6 \times (+1) + 0.4 \times (-1) = +0.2

E[RB]=0.4×(+1)+0.6×(1)=0.2\mathbb{E}[R_B] = 0.4 \times (+1) + 0.6 \times (-1) = -0.2

也就是说,A 台平均每次投币赚 0.2,B 台平均每次投币亏 0.2。后面所有策略的比较都基于这两个数字。以下比较三种典型策略在 100 轮内的表现。

策略 1:均匀随机

每轮以等概率随机选择一台,100 轮中约 50 次选 A、50 次选 B。期望总回报为

E[R100]=50×0.2+50×(0.2)=1010=0\mathbb{E}[R_{100}] = 50 \times 0.2 + 50 \times (-0.2) = 10 - 10 = 0

总回报在 0 附近波动。一半时间选 A(每次期望赚 0.2),一半时间选 B(每次期望亏 0.2),两者抵消。均匀随机策略完全不利用观测信息,因此无法从环境结构中获益。

策略 2:始终选 A(已知最优)

假设玩家已知 A 的出奖率更高,100 轮全部选择 A:

E[R100]=100×(0.6×(+1)+0.4×(1))=100×0.2=20\mathbb{E}[R_{100}] = 100 \times \big(0.6 \times (+1) + 0.4 \times (-1)\big) = 100 \times 0.2 = 20

期望净赚 20。这是理论最优策略,但前提是已知哪台更好——在实际问题中这一信息必须通过尝试来获取。

策略 3:先试后定(Explore-then-Commit)

前 20 轮交替尝试 A 和 B,记录各自的胜率;后 80 轮始终选择观测胜率更高的那台。

分两段计算期望总回报。前 20 轮交替选 A 和 B,各 10 次:

E[R前20]=10×0.2+10×(0.2)=22=0\mathbb{E}[R_{\text{前20}}] = 10 \times 0.2 + 10 \times (-0.2) = 2 - 2 = 0

后 80 轮锁定 A(假设探索阶段正确识别了更优机器):

E[R后80]=80×0.2=16\mathbb{E}[R_{\text{后80}}] = 80 \times 0.2 = 16

100 轮总期望回报为

E[R100]=0+16=16\mathbb{E}[R_{100}] = 0 + 16 = 16

低于理论最优的 20——差额 4 就是探索成本。

真实场景:观测可能骗人

前面的计算做了一个乐观假设:探索阶段能正确识别 A 更优。但在真实场景中,我们并不知道哪台机器更好——这正是需要探索的原因。那么问题来了:只有 10 次样本,估计真的可靠吗?

考虑一个具体的场景:A 的真实出奖率是 60%,但你选了 10 次 A,恰好只中了 4 次(观测出奖率 40%)。这完全可能——就像抛硬币 10 次,正面不一定刚好 5 次。同时 B 的真实出奖率只有 40%,但你选了 10 次 B,恰好中了 5 次(观测出奖率 50%)。此时你会判断 B 比 A 好,后 80 轮全部锁定在 B 上。

这种误判有多大概率发生?我们来算一下。A 投 10 次,每次中奖概率 60%,可能中 0 次、1 次……一直到 10 次。每种结果出现的概率由二项分布给出。例如,A 恰好中 4 次:

P(nA=4)=(104)×0.64×0.4611.1%P(n_A = 4) = \binom{10}{4} \times 0.6^4 \times 0.4^6 \approx 11.1\%

同理,A 恰好中 3 次:(103)×0.63×0.474.2%\binom{10}{3} \times 0.6^3 \times 0.4^7 \approx 4.2\%;恰好中 5 次:(105)×0.65×0.4520.1%\binom{10}{5} \times 0.6^5 \times 0.4^5 \approx 20.1\%

B 投 10 次,每次中奖概率 40%,也可以列出所有结果的概率。误判的条件是 A 的中奖次数 nAn_A 小于 B 的中奖次数 nBn_B,即 (nA,nB)(n_A, n_B) 的所有组合中满足 nA<nBn_A < n_B 的情况。把每种组合的概率相加:

P(nA<nB)=nA<nBPA(nA)×PB(nB)18.5%P(n_A < n_B) = \sum_{n_A < n_B} P_A(n_A) \times P_B(n_B) \approx 18.5\%

大约每 5 次实验就有 1 次会误判。一旦误判,后 80 轮全部投给 B,期望总回报变为

E[R100误判]=0+80×(0.2)=16\mathbb{E}[R_{100} \mid \text{误判}] = 0 + 80 \times (-0.2) = -16

策略 3 最终拿多少分,取决于你"运气好不好":有 81.5% 的概率猜对了(拿 16 分),有 18.5% 的概率猜错了(亏 16 分)。期望回报就是把这两种结果按概率加权平均:

E[R100]=81.5%×16+18.5%×(16)10.1\mathbb{E}[R_{100}] = 81.5\% \times 16 + 18.5\% \times (-16) \approx 10.1

比不考虑误判的 16 低了将近 6 分。注意,这只是 A 和 B 差距较大的情况(60% vs 40%)。如果两台机器的差距更小,比如 52% vs 48%,误判概率会飙升到接近 50%——几乎等于抛硬币决定后 80 轮的命运。

这说明探索阶段的样本量直接决定了最终回报。样本太少,误判概率高,"先试后定"的优势会被严重削弱;样本太多,探索成本又吃掉了利润。如何在两者之间取得平衡,正是强化学习中探索策略设计的核心问题。

探索策略的对比

"先试后定"只是探索策略的一种。不同策略有不同的探索机制和代价:

策略做法探索机制缺点
纯随机均匀采样永远学不到最优
贪心永远选当前估计最优可能锁定次优
ε-贪婪以 ε 概率随机,1-ε 选最优固定比例探索ε 不随时间衰减
先试后定前 N 步探索后利用预算制N 不好选
UCB选"估计均值 + 不确定性"最高的不确定性驱动需要维护置信区间
Thompson Sampling从后验分布采样概率匹配需要贝叶斯更新

其中 UCB(Upper Confidence Bound [3])和 Thompson Sampling [1:1] 是理论上最优的策略。如何衡量"最优"?学界使用一个叫 Regret(遗憾值) 的指标——本节末尾会简单介绍。

用 Python 搭建老虎机

python
import random

class TwoArmedBandit:
    """两台老虎机:最简 RL 环境"""

    def __init__(self, prob_a=0.6, prob_b=0.4):
        self.prob_a = prob_a
        self.prob_b = prob_b

    def step(self, action):
        """选择某一台机器,返回奖励"""
        if action == "A":
            return 1 if random.random() < self.prob_a else -1
        else:
            return 1 if random.random() < self.prob_b else -1

这个环境没有"状态"——不管你上一步选了哪台机器,这一步面对的情况一模一样。这就是老虎机的特点:它是一个单状态 MDP。后面我们会看到 CartPole 和 LLM 就不是这样了——它们的状态会随着动作而改变。

三种策略的 Python 实现

将上面的三种策略用代码实现,观察实际运行结果与理论期望的对比。以下代码均基于前面定义的 TwoArmedBandit 类,需先执行该类的定义代码。

策略 1:均匀随机

python
from random import choice
env = TwoArmedBandit()
total = sum(env.step(choice(["A", "B"])) for _ in range(100))
print(f"均匀随机 100 轮总回报: {total},平均: {total/100:.2f}")

运行结果

均匀随机 100 轮总回报: -2,平均: -0.02

理论期望为 0,实际结果在 0 附近波动,符合预期。

策略 2:始终选 A(已知最优)

python
env = TwoArmedBandit()
total = sum(env.step("A") for _ in range(100))
print(f"始终选 A 100 轮总回报: {total},平均: {total/100:.2f}")

运行结果

始终选 A 100 轮总回报: 18,平均: 0.18

理论期望为 20,实际 18——单次实验会有随机波动,但接近期望值。

策略 3:先试后定

python
env = TwoArmedBandit()
rewards_a, rewards_b = [], []
total = 0
for i in range(100):
    if i < 20:
        action = "A" if i % 2 == 0 else "B"
    else:
        avg_a = sum(rewards_a) / len(rewards_a) if rewards_a else 0
        avg_b = sum(rewards_b) / len(rewards_b) if rewards_b else 0
        action = "A" if avg_a >= avg_b else "B"

    reward = env.step(action)
    total += reward
    (rewards_a if action == "A" else rewards_b).append(reward)

print(f"先试后定 100 轮总回报: {total},平均: {total/100:.2f}")

运行结果

先试后定 100 轮总回报: 14,平均: 0.14

理论期望为 16(不考虑误判),实际 14——低于"始终选 A"的 18,因为前 20 轮的探索没有产出收益。

结果对比

策略理论期望实际结果说明
均匀随机0−2在 0 附近波动,不亏不赚
始终选 A2018接近期望,但需要事先知道 A 更好
先试后定1614比始终选 A 少 4 分,差额来自探索成本

三种策略,同一组机器,结果差异显著。策略决定了你能从环境中拿走多少价值。

期望回报:衡量策略的标尺

期望回报 E[R]\mathbb{E}[R] 把"策略好不好"从一个模糊的感觉变成了一个精确的数字:

策略计算期望回报
随机 50/500.5 × 0.2 + 0.5 × (-0.2)0
永远选 A0.6 × 1 + 0.4 × (-1)+0.2
永远选 B0.4 × 1 + 0.6 × (-1)-0.2

期望回报越高,策略越好。这个数字不是某一次的运气,而是大量实验的平均趋势——就像掷骰子的期望值是 3.5,你永远掷不出 3.5,但大量实验的平均会趋近它。

一个重要洞察:同样是"永远选 A",如果两台机器出奖率都是 50%,期望回报变成 0——和随机选没区别。策略的好坏取决于环境有没有可以被利用的结构。 如果环境是公平的,再聪明的策略也没用;如果环境有偏(A 比 B 好),好策略才能体现优势。RL 的本质,就是发现并利用环境的结构。

Agent-Environment 交互循环

不管你是在老虎机中选动作、控制 CartPole、还是训练大模型,RL 的交互模式都遵循同一个循环:

智能体选择动作,环境给出奖励和新状态,循环往复。在老虎机中,动作是"选 A 或选 B",奖励是 ±1。在 CartPole 中,动作是"左推或右推",状态是 4 个物理量,奖励是每步 +1。在 DPO 对齐大模型时,动作是"下一个 token",奖励是"人类偏好打分"。表面上千差万别,底层是同一个循环。

第 2 章做 DPO 时,模型就是那个智能体。它选 token(动作),被偏好信号(奖励)引导,最终学会了"说什么更受欢迎"。你其实已经做过 RL 了——只不过当时被封装在 TRL 库的黑盒里。

延伸阅读:Regret——衡量探索策略的通用标尺

以下内容供有兴趣的读者深入,初读可跳过。

前面我们用期望回报比较了三种策略。但期望回报依赖于具体的老虎机参数(A 台 60%、B 台 40%),换一组参数数字就全变了。学界需要一个通用的评价指标:不管几台机器、不管出奖率是多少,都能用同一个标准衡量"这个策略有多好"。这个标准就是 Regret(遗憾值)

Regret 的定义很直觉:假设你从一开始就知道哪台机器最优,100 轮全选它,能拿满分。但你不知道,所以用了某个策略,实际拿的分比满分少。少拿的部分就是 Regret:

Regret = 最优策略的回报 − 你的策略的回报

用我们的老虎机算一笔账(最优策略 100 轮全选 A,总期望 20 分):

策略实际总期望Regret
均匀随机0 分20 − 0 = 20
始终选 A20 分20 − 20 = 0
先试后定16 分20 − 16 = 4

Regret 越小,策略越好。均匀随机每 100 轮"白亏" 20 分,先试后定只亏 4 分,始终选 A 不亏——但前提是你得一开始就知道 A 更好,现实中不可能。

RL 的目标,就是设计出 Regret 增长尽可能慢的策略。 前面提到的 UCB 和 Thompson Sampling,正是学界在这条路上找到的最优解——它们的 Regret 随时间以对数速率增长,达到了理论下界 [4]。感兴趣的同学可以进一步阅读参考文献。

本节收获

至此,你已经具备了两个核心能力:用期望回报 E[R]\mathbb{E}[R] 判断一个策略好不好,以及分析探索阶段的样本量如何影响最终回报

这两个问题看似简单,但它们是 RL 的永恒主题——无论环境有多复杂,你永远在回答"哪个更好"和"要不要试试新的"。老虎机只有一个遗憾:它的状态永远不变,而真实问题(CartPole、大模型)的状态每步都在变。要处理这种情况,需要一套更强大的数学框架。下一节将把"状态、动作、奖励"这些直观概念提炼成精确的数学定义。MDP 五元组、折扣回报与策略

参考文献


  1. Thompson, W. R. (1933). On the likelihood that one unknown probability exceeds another in view of the evidence of two samples. Biometrika, 25(3/4), 285-294. ↩︎ ↩︎

  2. Robbins, H. (1952). Some aspects of the sequential design of experiments. Bulletin of the American Mathematical Society, 58(5), 527-535. ↩︎

  3. Auer, P., Cesa-Bianchi, N., & Fischer, P. (2002). Finite-time analysis of the multiarmed bandit problem. Machine Learning, 47(2-3), 235-256. ↩︎

  4. Lai, T. L., & Robbins, H. (1985). Asymptotically efficient adaptive allocation rules. Advances in Applied Mathematics, 6(1), 4-22. ↩︎

Built for reusable bilingual course delivery