🏠 总目录📚 本教程 06 · Q-learning 与 SARSA
📑 本页目录(点开跳转)

06 · Q-learning 与 SARSA

22 分钟 | ⭐ 第一个真正能用的算法


🎯 一句话

把上一章的 TD 从「估状态价值 V」换成「估动作价值 Q」, 你就得到了一个不需要知道环境规则、也能学出最优策略的算法。

悬崖(掉下去 −100,回起点)SG同一个问题,off-policy 和 on-policy 学出完全不同的路⭐ 不是谁更好 —— 训练中就要安全用 SARSA,只要最终最优策略用 Q-learningQ-learning贴着悬崖走学的是「不探索时的最优」SARSA绕远一格它知道自己会手抖
同一个问题,两种算法学出完全不同的路:Q-learning 贴着悬崖走(学「不探索时的最优」),SARSA 绕远一格(它知道自己会以 ε 概率手抖)。⭐ 不是谁更好 —— 它们在优化不同的东西。

🔑 一、为什么必须换成 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 的唯一区别
被换掉的那一项,含义就是「下一步假设我会选最好的」

💡 人话翻译

「我在 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

用两个 Q 表:一个【选动作】,另一个【评估价值】 ① 用 Q₁ 选动作 a* = argmax_{a'} Q₁(s',a') 只决定挑谁 ② 用 Q₂ 评估 Q₂(s', a*) 只给出分数 把选中的 a* 交给 Q₂ Q₁(s,a) ← Q₁(s,a) + α[r + γ·Q₂(s', argmax_{a'} Q₁(s',a')) − Q₁(s,a)] ⭐ 选和评估解耦 → 噪声不再同向叠加
分工只有一句话:挑动作用 Q₁、打分用 Q₂ —— 同一份噪声不再既挑又打分,max 的系统性高估就消失了

🔗 这个思路直接催生了 Double DQN(第 8 章),是 DQN 最重要的改进之一。


🔗 七、和站内其他章的关系

相关的地方 这里的位置
第 3 章贝尔曼最优方程 Q-learning 就是它的采样版
第 5 章 TD Q-learning = TD + max + 动作价值
推荐算法 13 ε-贪心 第 7 章会讲更好的办法
第 8 章 DQN Q-learning + 神经网络
第 11 章 PPO 的重要性采样 建立在 off-policy 性质上

✅ 检查点

  1. 为什么必须从 V 换成 Q?
  2. Q-learning 的更新公式是什么?它和贝尔曼最优方程什么关系?
  3. SARSA 和 Q-learning 在公式上唯一的区别是什么?
  4. Off-policy 和 on-policy 的本质区别是什么?
  5. 为什么说"off-policy 能用别人的数据"这一条是后面一切的基础?
  6. 悬崖行走里两个算法学出的路线为什么不同?各适合什么场景?
  7. Q-learning 收敛需要什么条件?这带来什么两难?
  8. 什么是最大化偏差?Double Q-learning 怎么解决的?
👀 答案
  1. 因为用 V 选动作还需要知道"做了这动作会到哪"(环境模型 P);有了 Q 直接 argmax 就行,完全不需要模型。
  2. Q(s,a) ← Q(s,a) + α[r + γ max_{a'}Q(s',a') − Q(s,a)]。它是贝尔曼最优方程把期望换成采样后的可迭代版本。
  3. Q-learning 用 max_{a'} Q(s',a')(假设下一步走最优);SARSA 用 Q(s',a'),a' 是实际会做的动作(包括探索时的随机动作)。
  4. Off-policy 学的是最优策略(不管你实际怎么走);on-policy 学的是你实际在执行的那个策略(含探索代价)。
  5. 因为经验回放(DQN)、离线强化学习、PPO 用旧策略数据训新策略全都建立在这个性质上。
  6. Q-learning 贴着悬崖走(学"不探索时的最优");SARSA 绕远路(它知道自己会以 ε 概率手抖,主动远离危险)。训练中就要安全 → SARSA;只要最终最优策略 → Q-learning。
  7. ①每个 (s,a) 访问无穷多次 ②α 满足 Σα=∞、Σα²<∞。两难:必须一直探索才收敛(ε 不能为 0),但探索太多又学得慢 —— 第 7 章解决。
  8. 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

打卡记录保存在你的浏览器里,首页能看到总进度