对应:Stanford CS234 Lecture 4 前半(Model-Free Control) 配套代码:
code/lecture04/预计阅读时间:4 小时(第一遍通读 1.5 小时,第二遍推导 + 跑代码 2.5 小时)
0. 本讲导航
0.1 本讲要回答的问题
不知道世界如何运转,只能通过交互收集经验。怎样找到最优策略?
前三讲的拼图已经齐了:
| 模型已知 | 模型未知 | |
|---|---|---|
| 评估(给定策略有多好) | 第 2 讲:策略评估 | 第 3 讲:MC、TD |
| 控制(找最优策略) | 第 2 讲:策略迭代、价值迭代 | 本讲:MC 控制、SARSA、Q-learning |
本讲把第 3 讲的”无模型评估”和第 2 讲的”策略改进”拼在一起。拼的过程中会遇到一个第 2 讲从未出现过的难题——探索。
0.2 学完本讲,你应该能够
- 解释为什么无模型控制要学习 而不是 。
- 解释为什么”贪心 + 无模型评估”会失败,以及 -贪心如何解决这个问题。
- 陈述并证明 -贪心策略改进定理。
- 说出 GLIE 条件的含义,并理解”理论保证”与”有限数据下的实际表现”的差距。
- 写出 MC 控制、SARSA、Q-learning、Expected SARSA 的算法,说清楚它们的 TD 目标有何不同。
- 解释**同策略(on-policy)与异策略(off-policy)**的区别;用悬崖行走的例子说明它们各自学到了什么。
- 解释最大化偏差的来源,写出 Double Q-learning 算法。
- 把本讲的算法与第 2 讲的动态规划算法一一对应起来。
0.3 先修知识
| 知识点 | 用在哪里 | 最低要求 |
|---|---|---|
| 第 2 讲:、策略改进定理、策略迭代、价值迭代、贝尔曼最优方程 | 全讲 | 必须 |
| 第 3 讲:MC、TD(0)、增量更新、常数步长 vs 、Robbins–Monro 条件 | 全讲 | 必须 |
| 第 1 讲 04 代码:-贪心、平局随机打破 | 第 2 节 | 看过即可 |
| 期望的基本性质、Jensen 不等式(凸函数的期望 ≥ 期望的函数值) | 第 6 节 | 知道结论即可,讲义会解释 |
0.4 本讲地图
第1节 从评估到控制:为什么学 Q?为什么需要探索?
│
第2节 蒙特卡洛控制:ε-贪心、ε-贪心策略改进定理、GLIE
│
第3节 SARSA:把 TD 用到控制上(同策略)
│
第4节 Q-learning:不知道模型时的价值迭代(异策略);Expected SARSA
│
第5节 同策略 vs 异策略:悬崖行走
│
第6节 最大化偏差与 Double Q-learning
│
第7节 实践要点:探索方案、步长、初始化、多个随机种子
│
第8节 全景:动态规划 ↔ 采样算法的对应关系
1. 从评估到控制
1.1 回顾:广义策略迭代
第 2 讲的策略迭代交替进行两件事:
- 策略评估:计算当前策略 的价值;
- 策略改进:对价值贪心,得到更好的策略。
第 2 讲 9.2 节提到,这两步不必”做到底”——评估一半就改进、改进之后再评估一点,只要两者不断交替,最终仍会走向最优。这个框架叫广义策略迭代(GPI):
评估:让价值更接近 V^π
┌───────────────────────────────┐
│ ▼
策略 π 价值 V
▲ │
└───────────────────────────────┘
改进:让策略对价值贪心
几乎所有 RL 控制算法都是 GPI 的某种实现。本讲要做的,就是把”评估”换成第 3 讲的无模型方法。
1.2 第一个问题:改进步骤需要模型
对 贪心:
这需要 和 ——而我们不知道它们。
对 贪心:
完全不需要模型。这就是第 2 讲 5.4 节埋下的伏笔:无模型控制要直接估计 。
估计 的方法和第 3 讲估计 完全一样,只是把”状态”换成”状态–动作对”:
- MC: = 在 执行 之后的回报的平均;
- TD:。
1.3 第二个问题:贪心策略看不到其他动作
假设我们有了 的估计,对它贪心得到确定性策略 ,然后用 收集数据来评估 。问题来了:
确定性策略在每个状态只做一个动作。其他动作的 值永远得不到任何数据。
如果某个没被选中的动作其实更好,我们永远不会知道。这就是第 1 讲 2.3 节说的”数据是被审查的”——你只能看到自己所选之事的后果。
在第 2 讲(模型已知)中不存在这个问题:有了模型,可以直接计算每个动作的 值,不需要去”试”。无模型之后,探索才成为必需。
代码验证:
01_mc_control.py演示 2 让纯贪心()的 MC 控制在网格世界上学了 3000 个回合。9 个普通格子 × 4 个动作 = 36 个 对中,有 3 个一次都没被试过,27 个被试过不到 5 次。学到的策略只有 6/9 个格子与最优一致。
2. 蒙特卡洛控制
2.1 一个不现实的办法:探索性起点
如果每个回合都能从随机的 对开始(第一步强制执行一个随机动作),那么所有 都会被尝试。这叫探索性起点(exploring starts)。
它在理论上可行,但在现实中通常做不到:你没法让机器人”从任意姿态、执行任意动作”开始,也没法让一个病人”从任意病情”开始接受治疗。
2.2 -贪心策略
更实用的办法:让策略本身保持一点随机性。
即:以 的概率选当前最好的动作,以 的概率在所有动作中均匀随机选。注意”随机选”也可能选到最好的那个,所以最好动作的总概率是 。
这样每个动作都有至少 的概率被选到,只要数据足够多,所有 都会被尝试到。
像这样”每个动作的概率都至少是 “的策略叫 -软(-soft)策略。
2.3 -贪心策略改进定理
换成 -贪心以后,改进步骤还能保证”不变差”吗?能:
定理:设 是一个 -软策略, 是对 的 -贪心策略。那么 对所有 成立。
证明:由第 2 讲 7.3 节的策略改进定理,只需证明对每个状态 :
(左边是”在 按新策略选一步、之后按旧策略”的价值。)展开左边:
关键在第二步:权重 都是非负的(因为 是 -软的,),并且加起来等于 1()。所以 是 的一个加权平均,而最大值不小于任何加权平均。
直觉:-贪心策略的”随机部分”( 的均匀分布)在新旧策略中是一样的;区别只在”剩下的 概率”怎么分配。新策略把这部分全部给了当前最好的动作,旧策略按某种方式分散——集中到最好的动作上当然不会更差。
但要注意:这个定理说的是”在 -软策略中不断改进”。它最终收敛到的是最好的 -软策略,而不是真正的最优策略 ——因为 -软策略永远有 的概率”乱走”。要得到 , 必须逐渐趋于 0。
2.4 GLIE:最终变贪心,但永远在探索
我们想要两件看起来矛盾的事:
- 为了学到正确的 ,要一直探索;
- 为了最终执行最优策略,要最终变成贪心的。
GLIE(Greedy in the Limit with Infinite Exploration,极限贪心且无限探索) 条件把两者统一起来:
- 无限探索:每个 都被访问无穷多次,;
- 极限贪心:策略收敛到对 的贪心策略,。
例子:( 是回合数)。 保证了极限贪心;(调和级数发散)保证了每个动作被尝试无穷多次。 同样满足 GLIE。
定理:GLIE 蒙特卡洛控制收敛到最优动作价值函数 。
2.5 算法
算法:GLIE 蒙特卡洛控制(同策略,首次访问)
初始化:Q(s,a) = 0,N(s,a) = 0,对所有 s, a
对第 k 个回合(k = 1, 2, ...):
ε ← 1/k(或其他 GLIE 方案)
用"对 Q 的 ε-贪心策略"生成一个回合:s_0, a_0, r_0, s_1, a_1, r_1, ..., s_T
对回合中每个 (s,a) 的首次出现,计算回报 G:
N(s,a) ← N(s,a) + 1
Q(s,a) ← Q(s,a) + α (G - Q(s,a)) (α = 1/N(s,a) 时就是增量平均)
(策略改进是隐式的:下一个回合直接用新的 Q 做 ε-贪心)
2.6 理论保证 vs 实际表现
在第 2 讲的 4×3 网格世界(,最优策略从起点出发的价值 0.705)上,每种设置用 5 个随机种子各训练 20000 个回合(代码 01 演示 3):
| 设置 | 5 个种子学到的贪心策略的真实价值 | 训练最后 1000 回合的平均回报 |
|---|---|---|
| 固定 , | 0.470, 0.691, 0.705, 0.705, 0.705 | 0.603 |
| GLIE , | −1.034, −1.073, 0.305, 0.374, 0.705 | −0.214 |
| GLIE , | 0.470, 0.340, 0.705, 0.672, 0.705 | 0.577 |
| GLIE , | 0.705, 0.705, 0.705, 0.705, 0.705 | 0.706 |
这张表包含三个重要教训:
- “理论上收敛”不等于”有限数据下表现好”。 满足 GLIE,但它衰减得太快:第 100 个回合时 就只剩 0.01,很多动作还没被充分尝试,探索就几乎停止了。有两个种子甚至学会了走进 −1!定理说的是 的极限,而我们只有有限的数据。
- 控制问题中常数步长往往更好。 会把所有历史回报平均进来,包括早期那个很差的策略产生的回报——策略已经改进了, 却被”过时”的数据拖住。常数步长会逐渐遗忘旧数据,让 跟上当前策略(回忆第 3 讲 2.3 节:“被评估的对象本身在变化时,遗忘旧数据反而是好事”)。
- 一定要用多个随机种子。同样的算法,换一个种子可能从”学到最优”变成”学得很差”。只看一次运行很容易得出错误结论。
3. SARSA:同策略 TD 控制
3.1 算法
MC 控制要等回合结束才能更新。把第 3 讲的 TD(0) 用到 上,每走一步就能更新:
更新用到了五个量:——这就是名字 SARSA 的来历(State, Action, Reward, State, Action)。
算法:SARSA
初始化:Q(s,a) 任意(例如 0),Q(终止, ·) = 0
对每个回合:
s ← 初始状态
a ← 对 Q 的 ε-贪心动作(在 s)
直到回合结束:
执行 a,观察 r, s'
a' ← 对 Q 的 ε-贪心动作(在 s') ← 先把下一个动作选好
Q(s,a) ← Q(s,a) + α [ r + γ Q(s',a') - Q(s,a) ]
s ← s';a ← a' ← 下一步真的执行 a'
关键细节:TD 目标里的 是下一步真正要执行的动作(由同一个 -贪心策略选出)。所以 SARSA 在评估的,就是它自己正在执行的那个 -贪心策略。这叫同策略(on-policy)。
SARSA 就是 GPI 的一种极致形式:每走一步就评估一点(一次 TD 更新)、改进一点(下一步用更新后的 做 -贪心)。
3.2 收敛性
定理(表格型 SARSA):如果策略序列满足 GLIE,且步长满足 Robbins–Monro 条件(,),那么 SARSA 以概率 1 收敛到 。
两个条件分别保证:GLIE 让评估的策略最终变成贪心策略(所以学到的是 而不是某个 -贪心策略的 );Robbins–Monro 让估计的噪声最终消失。
3.3 固定 时,SARSA 学到的是什么?
如果 固定不变(实践中很常见),SARSA 评估的始终是 -贪心策略,它会收敛到最好的 -贪心策略的价值 ,而不是 。
用真实模型可以精确算出这两个标准答案(代码 02:对 用价值迭代;对 用”改进步骤为 -贪心”的策略迭代)。在网格世界中, 时:
- 起点处 = 0.705;
- 起点处 = 0.666(因为有 10% 的时间在乱走,价值更低)。
实验结果见 4.4 节的表格。
4. Q-learning:不知道模型时的价值迭代
4.1 算法
与 SARSA 的唯一区别:TD 目标里用 代替了 。
算法:Q-learning
初始化:Q(s,a) 任意(例如 0),Q(终止, ·) = 0
对每个回合:
s ← 初始状态
直到回合结束:
a ← 对 Q 的 ε-贪心动作(在 s) ← 行为策略:用来收集数据
执行 a,观察 r, s'
Q(s,a) ← Q(s,a) + α [ r + γ max_a' Q(s',a') - Q(s,a) ] ← 目标策略:贪心
s ← s'
4.2 为什么说它是”采样版的价值迭代”?
回忆第 2 讲的贝尔曼最优方程( 版本):
价值迭代用模型精确计算右边的期望;Q-learning 用一个采样 代替这个期望,再用步长 慢慢平均。这就是 Q-learning 的全部思想:不知道模型时的价值迭代。
4.3 异策略:行为策略 vs 目标策略
Q-learning 里有两个策略:
- 行为策略(behavior policy):实际用来与环境交互、收集数据的策略(这里是 -贪心);
- 目标策略(target policy):我们想要学习其价值的策略(这里是对 的贪心策略——TD 目标中的 max 对应的就是它)。
两者不同,所以叫异策略(off-policy)。Q-learning 学的是贪心策略(最终是最优策略)的价值,不管自己实际上是怎么行动的。
异策略的好处很大:可以用任何方式收集数据(随机探索、人类示范、旧策略的历史数据),同时学习最优策略的价值。第 5 讲 DQN 的”经验回放”、第 10 讲的离线 RL 都建立在这个性质上。
为什么 Q-learning 不需要重要性采样? 一般的异策略学习需要用”重要性权重”修正两个策略的分布差异(第 10 讲)。Q-learning 不需要,因为它学习的是 :给定 ,下一状态 的分布只由环境决定,与策略无关;而下一步的动作不是采样的,而是直接取 max。整个目标中没有任何”由行为策略采样的动作”需要修正。
定理(Watkins & Dayan, 1992):如果每个 都被访问无穷多次,且步长满足 Robbins–Monro 条件,那么表格型 Q-learning 以概率 1 收敛到 。
注意这个条件比 SARSA 弱:不需要 GLIE。行为策略可以一直保持 ,Q-learning 学到的仍然是 。(但如果你想让智能体执行最优策略,最终还是要贪心地行动。)
4.4 Expected SARSA
介于两者之间:TD 目标对下一个动作按策略取期望,而不是采样一个:
- 若 是 -贪心(与行为策略相同),它和 SARSA 学的是同一个东西,但消除了”下一个动作碰巧选到哪个”带来的方差;
- 若 是贪心策略,,它就变成了 Q-learning。
同一次转移,三种目标对比(代码 02 演示 1):智能体滑到了 −1 左边的危险格子 (1,2),此时 (上 右 下 左),,:
| 算法 | TD 目标 |
|---|---|
| SARSA(若下一个动作碰巧是”右”,掉进 −1 的方向) | |
| SARSA(若下一个动作是贪心的”上”) | |
| Q-learning | |
| Expected SARSA |
实验:它们分别收敛到哪里?(代码 02 演示 2:固定 、,20000 个回合,5 个种子平均;,在 9 个普通格子上与两个标准答案比较)
| 算法 | 平均 | 平均 | 起点 | 贪心策略的真实价值 |
|---|---|---|---|---|
| SARSA | 0.053 | 0.024 | 0.664 | 0.705 |
| Expected SARSA | 0.046 | 0.023 | 0.666 | 0.705 |
| Q-learning | 0.023 | 0.037 | 0.708 | 0.705 |
- SARSA 和 Expected SARSA 的价值更接近 (起点 ≈ 0.666),Q-learning 的价值更接近 (起点 ≈ 0.705)。同策略学习”自己的”价值,异策略学习”最优”价值。
- 三者学到的贪心策略都是最优的(真实价值都是 0.705)。
为什么要用 这么小的步长? 常数步长下,估计会一直在收敛点附近抖动; 大到一定程度(比如 0.1),抖动会淹没两个标准答案之间的差别(0.705 vs 0.666),就看不清”它到底在向哪个答案收敛”了。
4.5 让 衰减:SARSA 向 移动
代码 02 演示 4(,20000 回合,5 个种子):
| 探索方案 | 第 20000 回合时 | 5 个种子的起点 | |
|---|---|---|---|
| 固定 (对照) | 0.1 | 0.053 | ≈ 0.664 |
| 0.007 | 0.055 | 0.685, 0.487, 0.677, 0.463, 0.678 | |
| 0.027 | 0.036 | 0.678, 0.659, 0.691, 0.674, 0.706 |
- 衰减太快:有 2 个种子在探索还不充分时就”定型”了,学会了沿下排走、再从 −1 旁边上去的冒险路线,之后 太小,再也纠正不回来。
- 从 0.3 缓慢衰减时,5 个种子都没有被困住,价值整体从 向 移动。但 20000 回合后 仍有 0.027,还没完全变成贪心,所以还没到达 。
“探索衰减得多快”是一个需要小心调节的实际问题,没有放之四海而皆准的答案。第 11–13 讲会研究更有原则的探索方法。
5. 同策略 vs 异策略:悬崖行走
5.1 问题设定
Sutton & Barto 例 6.6:
行\列 0 1 2 3 4 5 6 7 8 9 10 11
0 . . . . . . . . . . . .
1 . . . . . . . . . . . .
2 . . . . . . . . . . . .
3 S C C C C C C C C C C G
- 每走一步奖励 −1;掉下悬崖(C)奖励 −100,并被送回起点 S(回合不结束);
- 动作是确定性的(没有噪声);
- 最短路线:沿着悬崖边走,13 步,回报 −13。
用 、 训练 500 个回合。
5.2 结果
训练过程中的平均回报(50 次运行平均,代码 03 演示 1):
| 算法 | 第 1–25 回合 | 第 26–50 回合 | 第 51–100 回合 | 第 101–200 回合 | 第 201–500 回合 |
|---|---|---|---|---|---|
| SARSA | −173.5 | −46.8 | −34.0 | −28.3 | −28.0 |
| Expected SARSA | −150.7 | −33.4 | −23.0 | −21.4 | −20.6 |
| Q-learning | −177.9 | −50.3 | −48.7 | −47.6 | −49.3 |
学到的贪心路线(* 为经过的格子):
SARSA(17 步) Expected SARSA(15 步) Q-learning(13 步)
* * * * * * * * * * * * . . . . . . . . . . . . . . . . . . . . . . . .
* . . . . . . . . . . * * * * * * * * * * * * * . . . . . . . . . . . .
* . . . . . . . . . . * * . . . . . . . . . . * * * * * * * * * * * * *
S C C C C C C C C C C G S C C C C C C C C C C G S C C C C C C C C C C G
5.3 解读
- Q-learning 学到了最优路线:紧贴悬崖走。它学的是”如果以后每一步都选最好的动作”的价值,不考虑自己训练时会乱走。但训练时它真的会乱走——在悬崖边,每一步有 的概率随机选到”下”而掉下去(−100)。所以训练回报很差(约 −49)。
- SARSA 学到了安全路线:离悬崖远远的。它学的是”它自己的 -贪心策略”的价值,把”自己会乱走”这件事也算了进去,知道走在悬崖边太危险。路线更长,但训练时几乎不会掉下去(约 −28)。
- Expected SARSA 介于两者之间,而且训练回报最好(约 −21):它的目标没有”下一个动作碰巧选到哪个”的随机性,可以放心使用 这样的大步长。
哪个”更好”?取决于你关心什么:
- 关心学习过程中的表现——比如真实机器人边学边干活,掉下去代价很大——SARSA 更稳妥。
- 关心学完之后用贪心策略执行的表现——Q-learning 学到的路线更好。
5.4 如果 逐渐衰减到 0 呢?
,训练 2000 个回合,10 次运行(代码 03 演示 3):
| 算法 | 贪心路线长度(10 次) | 最后 100 回合平均回报 |
|---|---|---|
| SARSA | 17, 17, 17, 17, 15, 17, 17, 17, 17, 17 | −17.0 |
| Q-learning | 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 | −15.1 |
Q-learning 的训练回报随 减小接近最优的 −13。SARSA 却仍然停留在较安全的路线上!它的 值是在”自己还会经常乱走”的时期学到的;探索减少后,它几乎不再去悬崖边的格子,那里的 值很少被更新,“悬崖边其实已经安全了”这个信息迟迟传不过来。理论上(GLIE + 合适的步长)SARSA 最终也会收敛到最优,但可能需要多得多的数据。
这再次说明:同策略方法学到什么,很大程度上取决于它在学习过程中探索了什么。
6. 最大化偏差与 Double Q-learning
6.1 问题:对噪声估计取最大值会高估
Q-learning 的目标里有 。当 是带噪声的估计时,这个 max 会系统性地高估真实的最大值。
直觉:10 个同学的真实水平都是 60 分,但每次考试有随机波动。“这次考试的最高分”几乎总会高于 60 分——max 挑中的恰好是”运气最好”的那个人。如果你拿”最高分”当作”最强者的真实水平”,就高估了。
数学上:设 是 的无偏估计,。因为 max 是凸函数,由 Jensen 不等式:
每个估计单独都是无偏的,但它们的最大值是有偏的。 这叫最大化偏差(maximization bias)。
实验(代码 04 实验 1):所有动作的真实价值都是 0,每个动作用若干个标准差为 1 的噪声样本取平均来估计:
| 动作数 | 每个动作的样本数 | 单估计器 | 双估计器 |
|---|---|---|---|
| 1 | 1 | +0.011 | +0.001 |
| 2 | 1 | +0.577 | −0.001 |
| 10 | 1 | +1.536 | +0.000 |
| 10 | 10 | +0.481 | +0.007 |
| 100 | 1 | +2.509 | −0.027 |
| 100 | 10 | +0.792 | −0.003 |
真实最大值是 0。动作越多、样本越少(噪声越大),高估越严重;只有 1 个动作时没有”挑选”,也就没有偏差。
6.2 解决:双估计器
偏差来自”用同一份带噪声的估计,既挑选最大的动作,又评估它的价值”——被挑中的恰好是噪声为正的那个,然后又用这个正的噪声来评估它。
双估计器:用两组独立的数据分别得到两个估计 、。用 挑动作,用 评估它:
因为 的噪声与” 是怎么被挑出来的”无关,——不会高估(可能轻微低估,因为挑出的不一定是真正最好的动作)。上表最后一列证实了这一点。
6.3 Double Q-learning
把双估计器用到 Q-learning 上:维护两张独立的 Q 表 、。
算法:Double Q-learning
初始化:Q1(s,a) = Q2(s,a) = 0
对每个回合,每一步:
a ← 对 (Q1 + Q2) 的 ε-贪心动作;执行 a,观察 r, s'
以 1/2 的概率:
a* ← argmax_a' Q1(s', a')
Q1(s,a) ← Q1(s,a) + α [ r + γ Q2(s', a*) - Q1(s,a) ] (Q1 挑、Q2 评)
否则:
a* ← argmax_a' Q2(s', a')
Q2(s,a) ← Q2(s,a) + α [ r + γ Q1(s', a*) - Q2(s,a) ] (Q2 挑、Q1 评)
每次只更新一张表,两张表得到的数据是不同的(由抛硬币决定),因此近似独立。
6.4 实验:最大化偏差导致错误决策
Sutton & Barto 例 6.7:
终点 ◄── B 的 10 个动作 ── [B] ◄── 左,奖励 0 ── [A] ── 右,奖励 0 ──► 终点
(奖励 ~ N(-0.1, 1))
- 从 A 出发:向右直接结束(奖励 0);向左到 B(奖励 0);
- 在 B 有 10 个动作,都直接结束,奖励从 中随机抽取;
- 真实价值:,,最优是向右。
在 A 选择”左”的比例(1000 次运行平均; 下的最低可能比例是 5%,代码 04 实验 2):
| 回合 | 1 | 5 | 10 | 20 | 50 | 100 | 200 | 300 |
|---|---|---|---|---|---|---|---|---|
| Q-learning | 49.7% | 66.4% | 86.0% | 93.9% | 82.4% | 44.6% | 15.6% | 11.5% |
| Double Q-learning | 50.0% | 50.3% | 44.8% | 31.8% | 14.1% | 8.2% | 7.2% | 6.9% |
- 两者都从 50% 起步(初始估计都是 0,平局随机选)。
- Q-learning 随后越来越偏爱”左”,第 20 回合高达约 94%:B 的 10 个动作估计里总有几个碰巧偏高,max 把它们挑出来,让 看起来比 0 还好。直到第 100 回合以后才慢慢回落。
- Double Q-learning 从 50% 稳步下降,从未被”骗”去更多地选左。
在学习早期、动作很多、奖励噪声很大的问题中,最大化偏差可能造成严重后果。第 5 讲的 Double DQN 就是把这个思想用到了深度 Q 网络上。
7. 实践要点
7.1 探索方案
| 方案 | 做法 | 特点 |
|---|---|---|
| 固定 | 如 | 简单;学到的是 -贪心策略的价值(同策略算法) |
| 线性 / 指数衰减 | 如从 1.0 线性降到 0.05 | DQN 等深度 RL 中最常用;不满足严格的 GLIE(没有降到 0),但实用 |
| GLIE(如 、) | 趋于 0 但总和发散 | 有理论保证;衰减速度需要仔细调节 |
| 乐观初始化 | 把 初始化成一个很大的值 | 没被尝试过的动作”看起来很好”,于是会被尝试;适合确定性、状态少的问题 |
乐观初始化的直觉:如果 初始都是 +10(远高于实际可能的回报),贪心智能体选了某个动作后发现”没那么好”,估计下降,于是转而去试其他”看起来还是 +10”的动作——即使 ,所有动作也都会被尝试。这是”面对不确定性时保持乐观”思想的最简单形式,第 11 讲的 UCB 算法会把它严格化。
7.2 步长
- 表格型、平稳问题: 或满足 Robbins–Monro 的衰减步长可以精确收敛。
- 控制问题(策略在变):常数步长往往更好(2.6 节)。
- 步长太大:估计抖动大;太小:学得慢。本讲的实验中, 从 0.02 到 0.5 都有用到,取决于问题的噪声大小。
7.3 一定要用多个随机种子
本讲几乎每个实验都显示:同一个算法,不同的随机种子,结果可能天差地别。比较算法时,至少要用 5 个以上的种子,并报告平均值和波动范围。这在深度 RL 中尤其重要(第 5 讲以后)。
8. 全景:动态规划 ↔ 采样算法
本讲和第 3 讲的所有算法,都可以看成”用采样代替第 2 讲某个贝尔曼备份中的期望”:
| 第 2 讲(需要模型) | 贝尔曼方程 | 本讲 / 第 3 讲(不需要模型) |
|---|---|---|
| 迭代策略评估 | TD(0): | |
| 的策略迭代 | SARSA: | |
| 的价值迭代 | Q-learning: |
把这张表记住,你就能从一个统一的视角理解大部分表格型 RL 算法。
本讲各算法对比:
| 算法 | 更新时机 | TD 目标 | 同/异策略 | 固定 时收敛到 | 收敛到 的条件 |
|---|---|---|---|---|---|
| MC 控制 | 回合结束 | 同策略 | GLIE | ||
| SARSA | 每一步 | 同策略 | GLIE + RM 步长 | ||
| Expected SARSA | 每一步 | 同/异策略均可 | 取决于 | 同上 | |
| Q-learning | 每一步 | 异策略 | 无限访问 + RM 步长 | ||
| Double Q-learning | 每一步 | 异策略 | 同上 |
9. 本讲总结
9.1 核心概念清单
- 无模型控制学 而不是 :对 贪心不需要模型。
- 探索是必需的:贪心策略只能看到自己所选动作的后果,其他动作永远学不到。
- -贪心:以 的概率随机探索;-贪心策略改进定理保证改进不变差。
- GLIE:无限探索 + 极限贪心;理论上保证收敛,但衰减速度在有限数据下至关重要。
- 控制问题中常数步长往往更好:策略在变,旧数据会”过时”。
- SARSA(同策略):目标用实际的下一个动作;学的是自己的 -贪心策略的价值。
- Q-learning(异策略):目标用 max;学的是最优策略的价值,是采样版的价值迭代。
- Expected SARSA:对下一个动作取期望,方差更小。
- 悬崖行走:SARSA 学安全路线(训练表现好),Q-learning 学最优路线(训练中常掉下去)。
- 最大化偏差:;Double Q-learning 用两张表分别”挑”和”评”来消除它。
- 用多个随机种子评价算法。
9.2 公式速查表
| 名称 | 公式 |
|---|---|
| -贪心 | |
| -贪心改进 | |
| GLIE 例子 | |
| MC 控制 | |
| SARSA | |
| Q-learning | |
| Expected SARSA | |
| Double Q-learning | |
| 最大化偏差 |
9.3 中英术语对照表
| 中文 | 英文 | 中文 | 英文 |
|---|---|---|---|
| 无模型控制 | Model-free control | 广义策略迭代 | Generalized policy iteration (GPI) |
| 探索性起点 | Exploring starts | -贪心 | -greedy |
| -软策略 | -soft policy | 极限贪心且无限探索 | GLIE |
| 同策略 | On-policy | 异策略 | Off-policy |
| 行为策略 | Behavior policy | 目标策略 | Target policy |
| SARSA | State-Action-Reward-State-Action | Q 学习 | Q-learning |
| 期望 SARSA | Expected SARSA | 悬崖行走 | Cliff walking |
| 最大化偏差 | Maximization bias | 双 Q 学习 | Double Q-learning |
| 双估计器 | Double estimator | Jensen 不等式 | Jensen’s inequality |
| 乐观初始化 | Optimistic initialization | 随机种子 | Random seed |
| 重要性采样 | Importance sampling | 经验回放 | Experience replay |
10. 练习题
练习 1(概念):为什么在第 2 讲(模型已知)中不需要探索,而在本讲中需要?如果我们有一个不完全准确的模型呢?
参考答案
模型已知时,可以直接用 计算每个动作的价值,不需要亲自去试。无模型时,动作的价值只能通过尝试它来获得数据,不试就永远不知道。
如果模型不完全准确,基于模型的规划可能对某些动作给出错误的估计;如果智能体从不尝试这些动作,模型的错误就永远不会被发现和纠正。所以即使有模型,只要模型可能不准,探索仍然有价值——这是第 13、15 讲基于模型的探索要讨论的问题。
练习 2(-贪心):在一个有 4 个动作的状态中,,。写出 -贪心策略下每个动作的概率(平局时把贪心的概率平分给并列最大的动作)。
参考答案
每个动作都有 的”随机部分”。贪心部分 平分给动作 1 和 3(都是 3.0),各 0.4。 所以:,和为 1 ✓。
练习 3(手算更新):,。当前 ,。智能体在 执行动作 0,得到 ,到达 ;按 -贪心选出的下一个动作是 1(一次探索)。分别用 SARSA 和 Q-learning 更新 。
参考答案
SARSA:目标 ;。 Q-learning:目标 ;。
SARSA 因为”下一步探索到了一个差动作”而下调了估计;Q-learning 忽略下一步的探索,按”下一步最优”来估计,所以上调了估计。
练习 4(证明):在 2.3 节的证明中,为什么要求 是 -软的?如果 是一个任意的策略(比如确定性策略),证明中哪一步会失败?
参考答案
需要权重 非负。如果 在某个动作上的概率小于 (比如确定性策略中未被选中的动作概率为 0),那个权重就是负的, 不再是加权平均,“最大值 ≥ 加权平均”的论证就不成立了。
直觉上:如果旧策略是一个确定性的最优策略,新的 -贪心策略会在 的时间里乱走,当然可能比旧策略差。
练习 5(同策略 vs 异策略):在悬崖行走中,如果把 从 0.1 改成 0.3,你预计 SARSA 学到的路线会怎样变化?Q-learning 呢?训练回报呢?
参考答案
预测:SARSA 乱走的概率更大,走在离悬崖近的地方更危险,它会更加小心;Q-learning 学的是贪心策略的价值,与 无关,路线仍然是紧贴悬崖的最短路线,但训练时掉下去的概率大大增加(悬崖边每步 )。
实测(训练 1000 回合,6 个种子):
- Q-learning:6 个种子的贪心路线全部是 13 步的最短路线,但训练回报从 时的约 −49 暴跌到约 −180。
- SARSA:大多数种子仍走最上面一行(17 步,本来就已经离悬崖最远了),训练回报约 −40 到 −75。有的种子学到的贪心路线甚至走不到终点:终点就在悬崖旁边,最后”下去”的那一步离悬崖太近,按 的策略来评估显得太危险,贪心策略在终点上方来回徘徊。
这说明 SARSA 学到的是”-贪心策略”的价值: 越大,它越悲观;对这样的 取贪心,有时会得到一个过于保守、甚至无法完成任务的确定性策略。修改方法:在 03_cliff_walking.py 中调用 train(algo, 1000, epsilon=0.3)。
练习 6(最大化偏差):两个动作的真实价值都是 0,估计 ,其中 独立且都等概率取 或 。计算 。
参考答案
四种等可能情况:;;;。期望 。每个估计单独都是无偏的,但它们的最大值高估了 0.5。
练习 7(算法对应):Expected SARSA 在目标策略为贪心策略时变成了 Q-learning。那么当 (完全随机的行为策略),SARSA 学到的是什么策略的价值?这个价值有用吗?
参考答案
时 SARSA 评估的是均匀随机策略的 值。对这个 贪心,相当于做了一步策略改进(第 2 讲 7.2 节),得到的策略比随机策略好,但一般不是最优的。而 Q-learning 即使用完全随机的行为策略收集数据,只要每个 被访问足够多次,仍然能学到 ——这正是异策略学习的威力。
练习 8(动手)★:修改 02_sarsa_qlearning.py,给 Q-learning 加上乐观初始化(把 Q = np.zeros(...) 改成 Q = np.full(..., 1.0)),并把 设为 0。它能学到最优策略吗?和演示 5 中 、 初始化为 0 的结果比较。
提示
网格世界中所有回报都不超过 1,所以初始值 1.0 是”乐观”的。每个 被尝试之后,估计会降下来,贪心策略于是转去尝试其他仍是 1.0 的动作。(注意把吸收状态 END 的 设回 0。)
参考结果(2000 回合,,5 个种子):
- 乐观初始化 + :与最优动作一致的格子数为 7、8、8、9、8,其中 4 个种子的贪心策略真实价值达到最优的 0.705。
- + :一致格子数为 5、7、7、7、7,真实价值只有 0.668~0.691。
乐观初始化明显更好,但它的作用只在早期:一旦所有动作都被试过若干次,它就退化为纯贪心,仍可能被不幸的早期样本误导(所以不是每个种子都达到最优)。
11. 延伸阅读
- Sutton & Barto,Reinforcement Learning: An Introduction(第 2 版):第 5.3–5.5 节(MC 控制)、第 6.4–6.7 节(SARSA、Q-learning、Expected SARSA、Double Q-learning;悬崖行走和最大化偏差的例子都来自这里)。
- CS234 Spring 2024 Lecture 4 录像与课件。
- Watkins & Dayan (1992),Q-learning:Q-learning 收敛性的经典证明。
- Singh, Jaakkola, Littman & Szepesvári (2000),Convergence Results for Single-Step On-Policy Reinforcement-Learning Algorithms:SARSA 在 GLIE 下的收敛性。
- van Hasselt (2010),Double Q-learning:最大化偏差与双估计器。
12. 下一讲预告
本讲的所有算法都用一张表存储 ——每个状态–动作对一个格子。网格世界有 12 × 4 = 48 个格子,没问题。但如果状态是一张 Atari 游戏画面(210 × 160 像素)、一个机器人的连续关节角度、一段对话的上下文呢?表格存不下,而且每个状态几乎只会出现一次,必须能从见过的状态推广到没见过的状态。
下一讲我们引入函数逼近:用一个带参数的函数(线性函数、神经网络)来表示 。你会看到:
- 把 MC、TD、Q-learning 改写成”梯度下降”的形式;
- 为什么 TD + 函数逼近 + 异策略会导致发散(“致命三角”);
- DQN 如何用经验回放和目标网络驯服这个不稳定性,第一次让 RL 从原始像素学会玩 Atari 游戏。
下一讲之前,建议你:跑通 code/lecture04/ 下的所有脚本(先运行 python gridworld.py 看标准答案),完成练习 3、5、6,尝试练习 8。