RL · Lecture 5 · Model-Free Control
21 点实验室 / 让 MC 与 SARSA 自己学会最优策略
lec4 只是评估 一个固定策略;这一讲要直接跑出最优策略 。下面两个算法都在真实的 21 点环境里在线学习,热力图会从一片混沌逐渐收敛成清晰的「要牌 / 停牌」阈值。
本讲两把刀:用 Q 代替 V (改进不需要模型) · 用 ε-greedy 代替纯贪心 (不停止探索)
骨架不变:评估 ↑ × 改进 ↓ = 广义策略迭代 GPI(来自 lec3)
00 环境:21 点是一个 MDP
要让算法学习,先把 21 点翻译成 状态 / 动作 / 奖励 。整局只有结束时才有奖励,中途全是 0——这正是 model-free 控制最干净的试验台。
状态 s =( 我的点数 12–21, 庄家明牌 A–10, 是否有可用 A) → 共 200 个状态
动作 a ∈ { STICK 停牌 , HIT 要牌 }
奖励:赢 +1 / 平 0 / 输 −1 (只在终局,γ = 1)
「可用 A」 :手里有 A 且当 11 用不会爆(=21 以内)。它能当 1 或 11,所以可以更激进地多要牌——这就是笔记里说的「有 A 时更激进」。
庄家策略写死 :点数 < 17 必要牌,≥ 17 必停牌。你(玩家)这一侧的策略,才是算法要学的东西。
点数 < 12 一定要牌(绝不会爆),所以决策只发生在 12–21。
动手玩:感受状态与奖励
发新牌
要牌 HIT
停牌 STICK
当前状态:点击「发新牌」开始。
注意 这一把是你手动操作。下面两节里,是算法通过成千上万把这样的对局、靠 ε-greedy 探索 + 更新 Q,自己把每个状态该 HIT 还是 STICK 学出来。
01 MC ε-greedy 控制(GLIE)
蒙特卡洛思路最直白:玩完一整局,看终局回报 G,回头把这局走过的每个 (s,a) 的 Q 往 G 上挪一点。 因为中途奖励都是 0、γ=1,所以一局里所有 (s,a) 的回报就等于同一个终局奖励 G ∈ {+1, 0, −1}。
每访问一次 (s,a):
N(s,a) ← N(s,a) + 1
Q(s,a) ← Q(s,a) + 1 / N(s,a) · ( G − Q(s,a) )
↑ 这就是「增量式求均值」:Q 永远是这个 (s,a) 历次回报的平均
怎么探索?—— GLIE 的 ε 自动衰减
纯贪心会把只试过一次的动作永久锁死(你前面问过的「左门悲剧」)。所以行动用 ε-greedy;而要最终收敛到最优 策略,ε 必须慢慢归零。这里用 David Silver 在 Easy21 里的经典 GLIE 方案——越熟悉的状态、探索越少 :
ε(s) = N0 / ( N0 + N(s) ) N(s)=该状态被访问次数,N0 =100
新状态 N(s)=0 → ε=1(纯探索);访问 900 次后 → ε≈0.1;→∞ 时 ε→0(纯贪心)
两个条件同时满足 = GLIE。 ① 无限探索:每个 (s,a) 被访问无限次(ε 不会突然变 0)。② 最终贪心:ε→0,策略塌缩成对 Q 的 argmax。于是 Q→Q*,策略→π*。
动手玩:跑 MC 控制,看策略热力图收敛
跑 1 局
跑 1,000 局
快进 50,000 局
自动跑到收敛
重置
视图:策略
HIT 要牌
STICK 停牌
颜色越深 = Q 差距越大 = 越确定
点「快进 50,000 局」最直观:无 A 一侧会浮现出「≥17 停牌」的硬边界。
02 SARSA:在线 TD 控制
MC 必须等一整局结束 才能更新。SARSA 不等——每走一步就更新一次 ,用「下一步自己的估计」来自举(bootstrap)。名字就是它更新时用到的五元组:S, A, R, S′, A′ 。
Q(S,A ) ← Q(S,A) + α · [ R + γ·Q(S′,A′ ) − Q(S,A) ]
A′ = 你的策略在 S′ 实际会选的动作(先 ε-greedy 采出来,再代入)→ 所以是 on-policy
在 21 点里,中途每一步 R=0、γ=1,所以非终局更新就是 Q(S,A) += α·(Q(S′,A′) − Q(S,A));终局那一步没有 S′,target 直接是真实奖励 R = ±1/0。
慢放一局:看 TD 更新逐步发生
慢放 1 局(逐步打印更新)
清空
点上面按钮,逐条看 S → A → R → S′ → A′ 如何改写一个 Q 值。
动手玩:跑 SARSA,看它学出和 MC 几乎一样的策略
学习率 α
1/N(s,a)
探索 ε
GLIE
跑 1 局
跑 1,000 局
快进 50,000 局
自动跑到收敛
重置
视图:策略
HIT 要牌
STICK 停牌
「vs MC 一致」需要先在上面把 MC 跑出来
把 α 拉到 1/N、ε 设 GLIE,跑 50k 局,结果会和 MC 这张图几乎重合——殊途同归。
03 MC vs SARSA:同一个 GPI,两种评估
两个算法骨架完全一样(评估→ε-greedy 改进→反复),只在「怎么估 Q」 这一处分叉:
MC Q ← Q + (1/N)·( G真实终局回报 − Q ) 等整局结束,无偏、方差大
SARSA Q ← Q + α·( R + γ·Q(S′,A′)自己的估计 − Q ) 每步更新,有偏、方差小
MC 用真实回报 G 当 target → 不偏,但要等到局终、且回报抖动大。
SARSA 用下一步的估计 当 target(自举)→ 每步就能学、更新更平滑,代价是初期估计不准会引入偏差。
两者都 on-policy :行动用的 ε-greedy 策略,就是被评估、被改进的那个策略。(把 A′ 换成 argmax Q 就变成 Q-learning = off-policy,那是本讲后半段。)
回到笔记里的结论
跑到收敛后看「无可用 A」那张图:底部一条清晰的橙蓝分界线落在 16/17 附近——点数 ≤16 要牌,≥17 停牌;唯独庄家明牌很烂(2–6)时,分界会下压,让你更早停牌等他爆。有可用 A 时整体更偏橙(更敢要牌)。这正是 David 那句 "this is the optimal way to behave" 的可视化。
一句话收口。 Model-free 控制 = GPI 骨架 + 两把刀(Q 代替 V、ε-greedy 代替纯贪心)。MC 和 SARSA 只是 GPI 里「评估」那一格的两种填法;它们各自跑出来的策略热力图几乎重合,因为它们逼近的是同一个 Q* 。