ESC
输入关键词搜索文章
目录

无模型方法

模块 03 · 蒙特卡洛、时序差分、SARSA 与 Q-Learning
不知道环境模型,如何仅靠'做了再说'学会最优策略?
为什么需要无模型方法?

动态规划的前提是已知环境模型$P(s'|s,a)$$R(s,a)$)。但现实中,你通常不知道"在这个状态下做这个动作,转移到那个状态的概率是多少"。

无模型方法的核心思路:不知道模型,就去做实验。智能体通过与环境交互,收集真实的经验数据 $(s_t, a_t, r_{t+1}, s_{t+1})$,然后从中学习价值函数和最优策略。

方法需要模型?数据来源代表算法
动态规划✅ 需要模型推演策略迭代、价值迭代
蒙特卡洛❌ 不需要完整回合采样MC 预测
时序差分❌ 不需要单步交互SARSA、Q-Learning
Section 01
蒙特卡洛方法(Monte Carlo)

蒙特卡洛方法的思想极其朴素:多次采样取平均

对状态 $s_t$ 进行 $n$ 次采样,得到 $n$ 个真实回报 $g_t^1, g_t^2, \ldots, g_t^n$。根据大数定律:

$$V_\pi^n(s_t) = \frac{1}{n} \sum_{i=1}^{n} g_t^i \xrightarrow{n \to \infty} V_\pi(s_t)$$

增量更新形式

为了不保存所有历史值,使用增量形式:

$$V_\pi^n(s_t) = V_\pi^{n-1}(s_t) + \frac{1}{n}\bigl[g_t^n - V_\pi^{n-1}(s_t)\bigr]$$

$\frac{1}{n}$ 作为学习率有个问题:随着 $n$ 增大,新数据对均值的影响越来越小。因此实际中常用固定学习率 $\alpha \in (0, 1]$

$$V_\pi(s_t) \leftarrow V_\pi(s_t) + \alpha\bigl[g_t - V_\pi(s_t)\bigr]$$
蒙特卡洛的局限:必须等到整个回合结束才能更新。只适用于有限任务(必须有终止状态)。没有偏差,但方差很大。
Section 02
时序差分学习(TD Learning)

时序差分(Temporal Difference, TD)解决了蒙特卡洛"必须等回合结束"的问题:走一步就能更新

生活类比:从昆明开车去北京。出发前导航预计 20 小时。开了 10 小时到西安后,这 10 小时是真实值,你可以用"实际行驶的 10 小时 + 折扣后的剩余估计"来更新总时长预测。

TD(0) 更新公式

$$V(s_t) \leftarrow V(s_t) + \alpha\bigl[r_{t+1} + \gamma V(s_{t+1}) - V(s_t)\bigr]$$

其中 $r_{t+1} + \gamma V(s_{t+1})$ 叫做TD 目标$\delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t)$ 叫做TD 误差

MC vs TD 对比

维度MCTD(0)
更新时机回合结束后每一步
目标真实回报 $G_t$$r_{t+1} + \gamma V(s_{t+1})$
偏差无偏差有偏差(自举)
方差
适用任务仅有限任务有限 + 无限
从预测到控制:学习 Q 函数

无模型方法的目标是找到最优策略。因为没有模型,所以学习状态价值 $V$ 没用(你不知道转移到哪个状态才能算出最优动作)。必须学习动作价值函数 $Q(s,a)$

表格型方法中,直接维护一张 Q 表:行是状态,列是动作,单元格是该状态-动作对的价值估计。

Section 03
SARSA:On-Policy 的 TD 控制

SARSA 的名字来源于其更新所需的五元组:$S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}$

更新公式

$$Q(S, A) \leftarrow Q(S, A) + \alpha\bigl[R + \gamma Q(S', A') - Q(S, A)\bigr]$$

其中 $A'$由当前执行的策略$S'$ 下实际选出的动作。

算法流程

  1. 初始化 $Q(s,a) = 0$ 对所有 $s, a$
  2. 对每个回合:
    1. 获取初始状态 $S$,用 $\epsilon$-Greedy 选择动作 $A$
    2. 循环每一步:
      1. 执行 $A$,获取 $R$$S'$
      2. $\epsilon$-Greedy 选择 $A'$
      3. 更新 $Q(S, A)$
      4. $S \leftarrow S'$$A \leftarrow A'$
On-Policy:SARSA 评估的策略和执行的策略是同一个。如果用 $\epsilon$-Greedy,Q 值反映的是"在 $\epsilon$-Greedy 下的真实动作价值",所以 SARSA 更保守——它会考虑探索带来的风险。
Section 04
Q-Learning:Off-Policy 的 TD 控制

Q-Learning 是最经典的无模型 RL 算法。你可以把它想象成训练一只小狗:做对了给饼干(正奖励),做错了就没有。

Q 值是什么?

"Q" 代表 Quality(质量)。$Q(s,a)$ 衡量在状态 $s$ 下采取动作 $a$ 后,预期能获得的长期奖励总和。

Q 表是智能体的"大脑"——一张查找表,横轴是动作,纵轴是状态。智能体查表选 Q 值最高的动作。

更新公式

$$Q(s, a) \leftarrow Q(s, a) + \alpha\bigl[r + \gamma \max_{a'} Q(s', a') - Q(s, a)\bigr]$$

注意与 SARSA 的区别:这里用的是 $\max_{a'} Q(s', a')$,而不是 $Q(s', A')$。也就是说:

  • 与环境交互用 $\epsilon$-Greedy(探索)
  • 更新 Q 表用贪婪策略($\max$,利用)

On-Policy vs Off-Policy

On-Policy(SARSA):采样策略和评估改进的策略是同一个。"老师批评小明,小明改之。"

Off-Policy(Q-Learning):采样策略和评估改进的策略不同。"老师批评小明,其他人改之。" Q 表里的价值绑定的是贪婪策略(最优策略的估计),而与环境交互用的是 $\epsilon$-Greedy。

Worked Example 01
例题:Q-Learning 完整多步更新

环境设定:4 状态线性 MDP。

状态动作转移奖励
$s_1$$s_2$(确定)$-1$
$s_2$$s_3$(确定)$-1$
$s_3$$s_4$(终止)$+10$
$s_4$(终止)

参数:$\gamma = 0.9$$\alpha = 0.5$$\epsilon = 0$(纯贪婪,简化演示)。

初始 Q 表

状态\动作
$s_1$0
$s_2$0
$s_3$0
$s_4$0

第一回合:$s_1 \to s_2 \to s_3 \to s_4$

步骤 1:在 $s_1$ 执行 →,获得 $r = -1$,到达 $s_2$

$$Q(s_1, →) \leftarrow 0 + 0.5 \times [-1 + 0.9 \times \max_{a'} Q(s_2, a') - 0] = 0.5 \times [-1 + 0 - 0] = -0.5$$

步骤 2:在 $s_2$ 执行 →,获得 $r = -1$,到达 $s_3$

$$Q(s_2, →) \leftarrow 0 + 0.5 \times [-1 + 0.9 \times 0 - 0] = -0.5$$

步骤 3:在 $s_3$ 执行 →,获得 $r = +10$,到达 $s_4$(终止)。

$$Q(s_3, →) \leftarrow 0 + 0.5 \times [10 + 0.9 \times 0 - 0] = 5.0$$

第一回合结束后的 Q 表

状态$Q(\cdot, →)$
$s_1$-0.5
$s_2$-0.5
$s_3$5.0
$s_4$0

第二回合

步骤 1$s_1$$s_2$$r = -1$。现在 $Q(s_2, →) = -0.5$

$$Q(s_1, →) \leftarrow -0.5 + 0.5 \times [-1 + 0.9 \times (-0.5) - (-0.5)] = -0.5 + 0.5 \times [-1 - 0.45 + 0.5]$$
$$= -0.5 + 0.5 \times (-0.95) = -0.5 - 0.475 = -0.975$$

步骤 2$s_2$$s_3$$r = -1$。现在 $Q(s_3, →) = 5.0$

$$Q(s_2, →) \leftarrow -0.5 + 0.5 \times [-1 + 0.9 \times 5.0 - (-0.5)] = -0.5 + 0.5 \times [4.0] = 1.5$$

步骤 3$s_3$$s_4$$r = +10$

$$Q(s_3, →) \leftarrow 5.0 + 0.5 \times [10 + 0 - 5.0] = 5.0 + 2.5 = 7.5$$

第二回合结束后的 Q 表

状态$Q(\cdot, →)$
$s_1$-0.975
$s_2$1.5
$s_3$7.5
$s_4$0

第三回合

步骤 1$s_1$$s_2$$r = -1$$Q(s_2) = 1.5$

$$Q(s_1, →) \leftarrow -0.975 + 0.5 \times [-1 + 0.9 \times 1.5 - (-0.975)] = -0.975 + 0.5 \times 1.325 = -0.3125$$

步骤 2$s_2$$s_3$$r = -1$$Q(s_3) = 7.5$

$$Q(s_2, →) \leftarrow 1.5 + 0.5 \times [-1 + 0.9 \times 7.5 - 1.5] = 1.5 + 0.5 \times 4.25 = 3.625$$

步骤 3$s_3$$s_4$$r = +10$

$$Q(s_3, →) \leftarrow 7.5 + 0.5 \times [10 + 0 - 7.5] = 7.5 + 1.25 = 8.75$$

收敛过程总结

回合$Q(s_1, →)$$Q(s_2, →)$$Q(s_3, →)$
0(初始)0.0000.0000.000
1-0.500-0.5005.000
2-0.9751.5007.500
3-0.3133.6258.750
41.1975.0889.375
............
$\infty$7.1009.00010.000

收敛值的验证

真实 $Q^*$ 值:$Q^*(s_3) = 10$(直接得到奖励 10),$Q^*(s_2) = -1 + 0.9 \times 10 = 8$$Q^*(s_1) = -1 + 0.9 \times 8 = 6.2$。可以看到 Q-Learning 的估计正在逐步逼近这些真实值。收敛速度取决于学习率 $\alpha$——$\alpha = 0.5$ 较大,每步更新幅度大,但波动也大。

Worked Example 02
例题:SARSA vs Q-Learning 在悬崖漫步中的行为差异

环境:简化的悬崖漫步。1×5 网格,5 个状态。

S(起点) 普通 悬崖(-100) 普通 G(终点)

状态编号:0(起点)、1(安全)、2(悬崖)、3(安全)、4(终点)。动作:左、右。每步奖励 -1。掉入悬崖奖励 -100 并重置到起点。

SARSA 的学习过程

SARSA 是 On-Policy 的。当智能体走到状态 3(紧邻悬崖右边),$\epsilon$-Greedy 有一定概率选择"左"——如果运气不好走进了悬崖,得到 -100 的惩罚。

这个惨痛经验被 SARSA 忠实记录在 Q 表中:$Q(s_3, \text{左})$ 会变得很低。结果:SARSA 学到的策略会刻意远离悬崖,选择一条更安全但可能更长的路径。

Q-Learning 的学习过程

Q-Learning 是 Off-Policy 的。即使 $\epsilon$-Greedy 偶尔走到悬崖,更新 Q 表时用的是 $\max_{a'} Q(s', a')$——即假设下一步选最优动作。这意味着偶尔的探索失败不会过度拉低 Q 值。

结果:Q-Learning 学到的策略会紧贴悬崖走最短路,因为在贪婪策略下($\epsilon = 0$),它不会真的掉下去。

关键区别总结

维度SARSAQ-Learning
策略类型On-PolicyOff-Policy
更新目标$R + \gamma Q(S', A')$$R + \gamma \max_{a'} Q(S', a')$
悬崖漫步行为走安全路径(远离悬崖)走最优路径(紧贴悬崖)
训练时性能更稳定(较少掉入悬崖)波动更大(但最终策略更优)
适用场景安全性优先(机器人导航)追求最优(游戏 AI)
代码实验:CliffWalking 环境中的 SARSA 和 Q-Learning

使用 Gymnasium 的 CliffWalking-v0 环境进行实验:

  • 网格:4×12(48 个状态)
  • 起点:(3, 0),即状态 36
  • 终点:(3, 11),即状态 47
  • 悬崖:(3, 1) 到 (3, 10),即状态 37-46
  • 奖励:每步 -1,掉入悬崖 -100

$\epsilon$-Greedy 策略实现

以概率 $\epsilon$ 随机选择动作(探索),以概率 $1-\epsilon$ 选择 Q 值最大的动作(利用)。通常 $\epsilon$ 从 1.0 衰减到 0.01。

SARSA 的更新核心:

$$\text{td\_target} = R + \gamma \times Q[S', A'] \times (1 - \text{done})$$
$$Q[S][A] \leftarrow Q[S][A] + \alpha \times (\text{td\_target} - Q[S][A])$$

Q-Learning 的更新核心:

$$\text{td\_target} = R + \gamma \times \max_{a'} Q[S', a'] \times (1 - \text{done})$$
$$Q[S][A] \leftarrow Q[S][A] + \alpha \times (\text{td\_target} - Q[S][A])$$

唯一的区别就是 $\text{td\_target}$ 中用的是 $Q[S', A']$(SARSA)还是 $\max_{a'} Q[S', a']$(Q-Learning)。

Supplementary 01
补充:TD($\lambda$) 与资格迹(Eligibility Traces)

MC 方法看完整的轨迹(无偏,高方差),TD(0) 只看一步(有偏,低方差)。TD($\lambda$) 在两者之间取折中:回看 $n$ 步,用 $n$ 步回报作为更新目标。

$n$ 步回报

$$G_{t:t+n} = R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{n-1} R_{t+n} + \gamma^n V(S_{t+n})$$

$n=1$ 时就是 TD(0),$n \to \infty$ 时就是 MC。

前向视角与后向视角

  • 前向视角:从当前状态向前看 $n$ 步,需要等 $n$ 步才能更新。
  • 后向视角(资格迹):维护一个"迹"(trace)$E_t(s)$,记录每个状态最近被访问的程度。每步更新所有状态的 V 值,但访问越久远的状态更新幅度越小。
$$E_t(s) = \gamma \lambda E_{t-1}(s) + \mathbf{1}(S_t = s)$$
$$V(s) \leftarrow V(s) + \alpha \delta_t E_t(s)$$

参数 $\lambda \in [0,1]$ 控制迹的衰减速度。$\lambda = 0$ 退化为 TD(0),$\lambda = 1$ 接近 MC。

Supplementary 02
补充:Double Q-Learning 与最大化偏差

标准 Q-Learning 使用 $\max$ 操作选择下一状态的 Q 值。这会导致最大化偏差(Maximization Bias):因为 max 选的是估计值中最大的,而估计本身有噪声,所以结果倾向于高估

Double Q-Learning 的解决方案

维护两张独立的 Q 表$Q_1$$Q_2$

  • 更新 $Q_1$ 时,用 $Q_2$ 来评估价值:$\text{target} = R + \gamma Q_2(S', \arg\max_{a'} Q_1(S', a'))$
  • 更新 $Q_2$ 时,用 $Q_1$ 来评估价值:对称操作

每次随机选择更新 $Q_1$ 还是 $Q_2$。这样,即使一个 Q 表高估了,另一个表提供无偏的价值评估,从而消除最大化偏差。

下一步

无模型方法解决了"不知道环境模型"的问题,但表格型方法在面对高维状态空间时会崩溃。下一节,我们引入深度学习 → 模块 04:深度强化学习

参考来源