📑 本页目录(点开跳转)
06 · Q-learning 与 SARSA
⏱ 22 分钟 | ⭐ 第一个真正能用的算法
🎯 一句话
把上一章的 TD 从「估状态价值 V」换成「估动作价值 Q」, 你就得到了一个不需要知道环境规则、也能学出最优策略的算法。
🔑 一、为什么必须换成 Q
学会了 V(s) 之后,要选动作还得问:
「做这个动作会到哪个状态?」→ 需要环境模型 P 💀
学会了 Q(s,a) 之后:
直接 argmax_a Q(s,a) 就行 → 完全不需要模型 ⭐⭐
🔑 这就是第 3 章说"Q 比 V 有用得多"的兑现时刻。
🎯 二、Q-learning
$$Q(s,a) \leftarrow Q(s,a) + \alpha\Big[r + \gamma\max_{a'}Q(s',a') - Q(s,a)\Big]$$
- TD:更新目标里用的是
V(s') - Q-learning:换成了
max_{a'} Q(s',a')
💡 人话翻译:
「我在 s 做了 a,拿到 r,到了 s'。 假设我到了 s' 之后会做出最优选择,那这一步应该值 r + γ·(s' 处最好的 Q)。 把 Q(s,a) 往这个数调一点。」
⭐ 注意它和第 3 章贝尔曼最优方程长得一模一样: $Q^*(s,a) = R + \gamma\sum P \max_{a'}Q^*(s',a')$ Q-learning 就是把那个方程的期望换成采样,变成可迭代的更新式。
🔨 完整实现(真的就这么短)
import numpy as np
def q_learning(env, n_episodes=5000, alpha=0.1, gamma=0.9, eps=0.1):
Q = np.zeros((env.n_states, env.n_actions))
for _ in range(n_episodes):
s, done = env.reset(), False
while not done:
# ε-贪心:以 eps 概率随机探索(第 7 章详讲)
a = (np.random.randint(env.n_actions) if np.random.rand() < eps
else int(np.argmax(Q[s])))
s2, r, done = env.step(a)
target = r + gamma * (0 if done else Q[s2].max()) # ⭐ 核心
Q[s, a] += alpha * (target - Q[s, a])
s = s2
return Q
🐍 三、SARSA:一个字的差别,两种哲学
$$Q(s,a) \leftarrow Q(s,a) + \alpha\Big[r + \gamma\,Q(s',\underbrace{a'}_{\text{实际做的}}) - Q(s,a)\Big]$$
Q-learning: max_{a'} Q(s',a') ← 假设下一步走【最优】
SARSA: Q(s', a') ← 用下一步【实际会做】的动作 ⭐
(包括探索时的随机动作!)
名字来源:用到了 (S, A, R, S', A') 这五个量
⭐ 这个差别的真实含义:Off-policy vs On-policy
| Q-learning | SARSA | |
|---|---|---|
| 类型 | Off-policy(离策略) | On-policy(同策略) |
| 学的是 | 最优策略(不管你实际怎么走) | 你实际在执行的那个策略(含探索) |
| 探索的影响 | 不影响学到的目标 | 探索的代价会被算进去 ⭐ |
| 能否用别人的数据 | ✅ 能 ⭐ | ❌ 不能 |
🔑 「Off-policy 能用别人的数据」这一条,是后面一切的基础: 经验回放(第 8 章 DQN)、离线强化学习、 甚至 RLHF 里用旧策略采的数据训新策略(第 11 章 PPO 的重要性采样) —— 全都建立在 off-policy 这个性质上。
🧗 四、悬崖行走:一个能看出差别的经典实验
目标:从 S 走到 G,掉进悬崖 = −100 并回到起点
S . . . . . . . . . . G ← 上面这条是安全路线(远)
▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ← 悬崖(每格 −100)
↑ 沿着悬崖边走最短,但一旦探索时手抖就掉下去
两个算法学出来的路线完全不同:
| 算法 | 学到的路线 | 为什么 |
|---|---|---|
| Q-learning | 贴着悬崖走(最优路线) | 它学的是"如果不探索,最优怎么走" |
| SARSA | 绕远路,离悬崖一格 ⭐ | 它知道自己会以 ε 概率手抖,所以主动远离危险 |
💡 训练时 SARSA 的实际得分更高,但 Q-learning 学到的 Q 表更接近 Q*。
⭐ 实践结论: - 训练中就要保证安全(真实机器人、线上系统)→ SARSA / on-policy - 只要最终最优策略(模拟器里随便撞)→ Q-learning / off-policy
这不是谁更好,是你在优化不同的东西。
📐 五、收敛性
Q-learning 收敛条件(表格情形): ① 每个 (s,a) 被访问无穷多次 ② 学习率满足 Σα=∞, Σα²<∞
⭐ 注意第 ① 条:必须【一直探索】才能保证收敛
→ 所以 ε 不能设成 0
→ 但探索太多又学得慢
→ 这就是第 7 章要解决的问题
⚠️ 一个重要提醒:这个收敛保证只对「表格 Q」成立。 第 8 章换成神经网络之后,理论保证就没了 —— 那一章会讲这会带来什么麻烦。
⚠️ 六、Q-learning 的一个内在缺陷:最大化偏差
问题出在那个 max 上:
假设某个 (s',a') 的真实 Q = 0,但估计有噪声
→ 有时估成 +1,有时估成 −1
→ max 会【系统性地挑中那些被高估的】 ⭐
→ 于是 Q 值整体偏高
💡 一个数字直觉:
10 个真实价值都为 0 的动作,每个估计带 ±1 的噪声。 取 max 的期望明显大于 0 —— 因为 max 只会挑正的那些。 动作越多,高估越严重。
解法:Double Q-learning
🔗 这个思路直接催生了 Double DQN(第 8 章),是 DQN 最重要的改进之一。
🔗 七、和站内其他章的关系
| 相关的地方 | 这里的位置 |
|---|---|
| 第 3 章贝尔曼最优方程 | Q-learning 就是它的采样版 ⭐ |
| 第 5 章 TD | Q-learning = TD + max + 动作价值 |
| 推荐算法 13 ε-贪心 | 第 7 章会讲更好的办法 |
| 第 8 章 DQN | Q-learning + 神经网络 |
| 第 11 章 PPO 的重要性采样 | 建立在 off-policy 性质上 |
✅ 检查点
- 为什么必须从 V 换成 Q?
- Q-learning 的更新公式是什么?它和贝尔曼最优方程什么关系?
- SARSA 和 Q-learning 在公式上唯一的区别是什么?
- Off-policy 和 on-policy 的本质区别是什么?
- 为什么说"off-policy 能用别人的数据"这一条是后面一切的基础?
- 悬崖行走里两个算法学出的路线为什么不同?各适合什么场景?
- Q-learning 收敛需要什么条件?这带来什么两难?
- 什么是最大化偏差?Double Q-learning 怎么解决的?
👀 答案
- 因为用 V 选动作还需要知道"做了这动作会到哪"(环境模型 P);有了 Q 直接 argmax 就行,完全不需要模型。
Q(s,a) ← Q(s,a) + α[r + γ max_{a'}Q(s',a') − Q(s,a)]。它是贝尔曼最优方程把期望换成采样后的可迭代版本。- Q-learning 用 max_{a'} Q(s',a')(假设下一步走最优);SARSA 用 Q(s',a'),a' 是实际会做的动作(包括探索时的随机动作)。
- Off-policy 学的是最优策略(不管你实际怎么走);on-policy 学的是你实际在执行的那个策略(含探索代价)。
- 因为经验回放(DQN)、离线强化学习、PPO 用旧策略数据训新策略全都建立在这个性质上。
- Q-learning 贴着悬崖走(学"不探索时的最优");SARSA 绕远路(它知道自己会以 ε 概率手抖,主动远离危险)。训练中就要安全 → SARSA;只要最终最优策略 → Q-learning。
- ①每个 (s,a) 访问无穷多次 ②α 满足 Σα=∞、Σα²<∞。两难:必须一直探索才收敛(ε 不能为 0),但探索太多又学得慢 —— 第 7 章解决。
max会系统性挑中被噪声高估的动作,导致 Q 整体偏高,动作越多越严重。Double Q-learning 用两个 Q 表把"选动作"和"评估价值"解耦,噪声不再同向叠加。
🛑 可以停在这里
⚡ 走神救援
⭐从 V 换成 Q:用V选动作还需要环境模型P,有了Q直接argmax就行,完全不需要模型。Q-learning:
Q(s,a) ← Q(s,a)+α[r+γ**max**Q(s',a')−Q(s,a)],就是贝尔曼最优方程把期望换成采样。SARSA 只差一处:用实际会做的 a'(含探索的随机动作)而不是 max。⭐这个差别=off-policy vs on-policy:Q-learning学最优策略(不管你实际怎么走)、SARSA学你实际在跑的策略(探索代价算进去)。⭐⭐"off-policy能用别人的数据"是后面一切的基础——经验回放、离线RL、PPO用旧策略数据训新策略全靠它。悬崖行走:Q-learning贴着悬崖走,SARSA绕远路(它知道自己会手抖)→ 训练中就要安全用SARSA,只要最终最优策略用Q-learning。收敛需每个(s,a)访问无穷多次(所以ε不能为0)且这保证只对表格Q成立,第8章换神经网络后就没了。⚠️最大化偏差:max会系统性挑中被噪声高估的动作,动作越多越严重 → Double Q-learning用两个Q表把"选动作"和"评估"解耦。
下一节 👉 07-探索与利用.md ⭐