想象你是一位美食博主小Q,随身揣着一本探店手账。每个街区(状态 s)都有几家餐厅(动作 a),每次点一道菜会收获“幸福感”(即时奖励 r),吃完还会溜达到下一个街区(s')。你的目标不是只顾这一顿,而是知道每个街区点什么菜,未来能收获的总幸福感最大。但你不可能顿顿都试,所以每吃一顿,就在手账上把那一条记录“微调”一点点——把旧印象和新体验混合起来。这个“微调一点点”的过程,就是 Q 值更新;而那本手账,就是传说中的 Q 表。本文将带你从直觉到公式再到代码,完整拆解 Q 值到底是怎么更新的,以及为什么这样改着改着,手账就学会了最优决策。

岗位关联

职业价值:Q 值更新是 DQN、Double DQN 等现代强化学习的“心脏”,看懂它,你才能真正读懂推荐、广告竞价、自动驾驶、游戏 AI 等场景里智能体为什么越学越好。

目录
  1. 可视化演示
  2. 价值与回报
  3. 时序差分TD
  4. 贝尔曼最优方程
  5. 学习率α
  6. 更新公式拆解
  7. 代码实现
  8. 收敛与实战
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示Q-Learning中智能体在网格世界探索,通过贝尔曼方程迭代更新Q表值函数,逐步学习最优策略的过程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Q-Learning Q值更新 智能体在网格世界中探索,通过ε-贪婪策略选择动作 到达目标获得+10奖励,每步-0.1惩罚,引导智能体学习最短路径 Q(s,a) ← Q(s,a) + α[r + γ·max Q(s′,a′) - Q(s,a)]

价值与回报

小Q 的第一堂美食课,是搞懂手账上那一格 Q 值到底该记什么。它不记“这口饭香不香”,而记“这口饭之后幸福感的整条河流”:在街角奶茶店点一杯招牌奶茶,收获的不只是这一杯的甜,还有喝完踱步去公园的微风、明天回想起来的余味。Q 值,就是从“点了这道菜”那一刻起,后续所有幸福感的折扣总和。

在强化学习里,“幸福感”叫奖励 R,“从 t 时刻起的总幸福感”叫累积回报 G_t。未来充满不确定性,所以远处的奖励要打折:明天的一块钱不如现在的一块钱。折扣因子 γ 介于 0 和 1 之间,就是给未来定价的“时间汇率”。

所以 Q(s,a) 就是手账里“街区 s × 餐厅 a”那一格:它装的是这顿饭连同之后所有余味的折后总和,而不是这一口。理解了这笔账记的是“未来”,才能明白后面每一次“微调”改的究竟是什么。

Gt=Rt+1+γRt+2+γ2Rt+3+⋯=∑k=0∞γkRt+k+1G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \dots = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}
  1. 即时奖励 $R_{t+1}$这一步真正吃到的“幸福感”,是回报河流的第一块基石。
    Rt+1R_{t+1}
  2. 折扣因子 $\gamma^k$越远的未来,乘 γ 的次数越多、折扣越狠;γ 接近 1 代表有远见,接近 0 代表只看眼下。
    γk,0≤γ<1\gamma^k, \quad 0 \le \gamma < 1
  3. 无穷求和 $\sum$把从 t+1 开始每个时刻的“折后幸福感”累加,得到这个选择的长期总价值。
    ∑k=0∞γkRt+k+1\sum_{k=0}^{\infty} \gamma^k R_{t+k+1}

时序差分TD

小Q 不可能吃饱后坐在店里,把未来所有幸福全部算出来。她只做一件事:记下“这一口的感觉”,再瞥一眼下一街区的参考分,然后用这两样东西轻轻修正手账。这种“走一步、看一眼、改一笔”的做法,就是时序差分(Temporal Difference,简称 TD)。

TD 的核心思想是:用一步实测加一个估计,去改进另一个估计。以状态价值 V(s) 为例,饭后修正公式长这样:

换句话说,TD 不需要走完整条街再回头总结,每走一步就掏出小本子微调一格。这种“边走边改”比等到结尾再总结省事得多,也正是强化学习中几乎无处不在的发动机。

V(st)←V(st)+α[rt+1+γV(st+1)−V(st)]V(s_t) \leftarrow V(s_t) + \alpha \big[ r_{t+1} + \gamma V(s_{t+1}) - V(s_t) \big]
  1. 新观测 $r_{t+1}$这顿饭真实到手的奖励,是新鲜的证据。
    rt+1r_{t+1}
  2. 未来展望 $\gamma V(s_{t+1})$下一街区手账上的分数,打折后作为“未来的参考”。
    γV(st+1)\gamma V(s_{t+1})
  3. TD 误差新证据与旧印象的差距,决定了修正的方向和幅度。
    rt+1+γV(st+1)−V(st)r_{t+1} + \gamma V(s_{t+1}) - V(s_t)
  4. 步长 $\alpha$只吸收差距的一小部分,不因为一顿饭就全盘否定。
    α,0<α≤1\alpha, \quad 0 < \alpha \le 1

贝尔曼最优方程

手账的终极目标是什么?小Q 希望每一格都写着“最优选择”的分数。问题是怎么定义最优?答案藏在一条循环里:这格的分数 = 这口的感觉 + 到了下一街区后“最优那家店”的分数(再打折)。未来的最优,由未来的未来递归决定。这就是贝尔曼最优方程。

数学上,记 Q\*(s,a) 为状态 s 下动作 a 的最优动作价值,也就是“完美手账”里的数字。在确定性环境中,贝尔曼最优方程写作:

这就像小Q 在写一本“理想攻略”:每个街区该去哪家,取决于未来街区最好的那家。整本攻略环环相扣,而 Q-Learning 每天做的,就是拿现实中的一顿饭,让手账上的数字朝这本攻略微微靠拢。

Q∗(s,a)=Rt+1+γmax⁡a′Q∗(s′,a′)Q^*(s,a) = R_{t+1} + \gamma \max_{a'} Q^*(s', a')
  1. 最优价值 $Q^*(s,a)$完美手账上“街区 s 点菜 a”应得的分数。
    Q∗(s,a)Q^*(s,a)
  2. 即时奖励 $R_{t+1}$这一步的真实幸福感。
    Rt+1R_{t+1}
  3. max 选最优到了下一街区 s' 后,从所有动作里挑分数最高的,代表“未来一定选最好”。
    max⁡a′Q∗(s′,a′)\max_{a'} Q^*(s', a')
  4. 递归自举等式两边都有 Q\*,说明最优值是“自己定义自己”的不动点,要靠反复迭代逼近。
    Q∗=TQ∗Q^* = \mathcal{T} Q^*

学习率α

同样一顿饭,小Q 的性格不同,手账改动的幅度也不同。急性子 α=1:吃完立刻把这格改成“感受 + 未来估计”,彻底遗忘过去;固执鬼 α=0:吃多少顿都一字不动。正常人把 α 设在 0.1 到 0.3 之间,既听意见,又不被一次偶发的坏体验带偏。

把更新式改写成加权平均的样子,新旧印象的混合比例一目了然:

所以 α 很像口碑更新的火候:火太大,一家店偶尔失手就被一票否决;火太小,整条街换了菜单,你的手账还停留在十年前。工程上常用衰减策略:前期 α 大快速学习,后期 α 小精细收敛,就像先大火煮沸、再小火慢炖。

Q^新=(1−α) Q^旧+α (rt+1+γmax⁡a′Q(st+1,a′))\hat{Q}_{\text{新}} = (1-\alpha)\,\hat{Q}_{\text{旧}} + \alpha\,\big(r_{t+1} + \gamma \max_{a'} Q(s_{t+1},a')\big)
  1. 保留旧印象旧分数乘以 1−α,代表“还记得多少过去”。
    (1−α) Q^旧(1-\alpha)\,\hat{Q}_{\text{旧}}
  2. 吸收新证据TD 目标(实测 + 未来估计)乘以 α,代表“信多少新信息”。
    α (rt+1+γmax⁡a′Q(st+1,a′))\alpha\,\big(r_{t+1} + \gamma \max_{a'} Q(s_{t+1},a')\big)
  3. 加权混合新分 = 旧权重 + 新权重。α 大则反应快、易震荡;α 小则平滑、但学得慢。
    Q^新=(1−α) Q^旧+α×TD目标\hat{Q}_{\text{新}} = (1-\alpha)\,\hat{Q}_{\text{旧}} + \alpha \times \text{TD目标}

更新公式拆解

现在把整本手账的记账规则完整写出来。注意一个微妙之处:小Q 这次可能是被朋友拽进一家普通店(探索),但她更新手账时,参照的却是“下一街区最好的那家店”的分数——她的行动和她学习的目标,是两回事。这正是 off-policy(离线策略)的特征。

Q-Learning 的单步更新公式:

如果更新时把 max 换成“实际会走的下一步动作”,就变成 Sarsa(on-policy,在线策略):

把公式读成人话:手账新分 = 旧分 + 学习率 ×(这一口 + 未来街区“天花板”分 − 旧分)。行动归行动(这次吃什么无所谓),向往归向往(参照未来最好),Q-Learning 就这样“用探索的脚步,织出最优的梦想”。

Q(st,at)←Q(st,at)+α(rt+1+γmax⁡a′Q(st+1,a′)−Q(st,at))Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha \big( r_{t+1} + \gamma \max_{a'} Q(s_{t+1},a') - Q(s_t,a_t) \big)
  1. 实际动作 $a_{t+1}$换成“下一街区实际会点的菜”,而不是 max 的最优菜。
    Q(st+1,at+1)Q(s_{t+1}, a_{t+1})
  2. 行为依赖价值会随探索策略改变,探索率越高,学到的手账越保守。
    α(rt+1+γQ(st+1,at+1)−Q(st,at))\alpha \big( r_{t+1} + \gamma Q(s_{t+1},a_{t+1}) - Q(s_t,a_t) \big)

代码实现

手账变成程序里的 Q 表:一张以“状态 × 动作”为索引的二维表,Python 里常用字典加元组键实现。小Q 每次的探店决策 = ε-greedy 规则,也就是在“按手账选”和“随便逛逛”之间抛硬币:

和 Q 表配套的核心代码只有两件:一是用字典初始化全零 Q 表;二是在每次转移后执行更新公式(Python 演示里有完整实现)。训练循环就是“选择动作 → 环境给奖励 → 更新 Q → 移动”反复几千轮。所有更新都发生在“走完之后”,用刚拿到的 (s, a, r, s') 四元组——这就是强化学习里常说的“样本即老师”。

等到 Q 表写好,小Q 探店时只要做“查询-比较-选最大”三步就够了。一张表、一枚 ε 硬币、一行更新公式,跑上几千轮,手账就真正“活”了过来。

a={arg⁡max⁡aQ(s,a)概率 1−ε,随机动作概率 ε.a = \begin{cases} \arg\max_{a} Q(s,a) & \text{概率 } 1-\varepsilon, \\ \text{随机动作} & \text{概率 } \varepsilon. \end{cases}
  1. 利用分支查手账,选当前分数最高的动作。
    arg⁡max⁡aQ(s,a),概率 1−ε\arg\max_{a} Q(s,a), \quad \text{概率 } 1-\varepsilon
  2. 探索分支以概率 ε 随便选一个动作,防止手账“偏科”。
    ε,ε∈(0,1)\varepsilon, \quad \varepsilon \in (0,1)
  3. 两者结合ε 大 → 爱冒险、见得多;ε 小 → 爱利用、走得稳。
    a={arg⁡max⁡Q1−ε,随机εa = \begin{cases} \arg\max Q & 1-\varepsilon, \\ \text{随机} & \varepsilon \end{cases}

收敛与实战

手账什么时候才算“写好了”?不是凑够某个固定次数,而是要满足两条:每家店都被反复尝过(状态动作对充分访问),并且每次修改的幅度逐渐变小(α 逐渐衰减)。数学上,只要学习率序列满足 Robbins–Monro 条件,Q-Learning 就能以概率 1 收敛到最优 Q\*:

实战中还要警惕 max 带来的过估计:max 会放大噪声,DQN 系列用 Double DQN 把“选动作”和“打分”解耦来缓解。调参口诀也很朴素:α 取 0.1~0.5 并逐步衰减,γ 取 0.9~0.99,ε 从 1 左右衰减到 0.01,奖励做缩放归一。这些经验,全都生长在“手账微调”这个朴素动作之上。

所以“手账写好了”不是神话,而是一套明确条件:访问充分 + 步长衰减。就像小Q 熬了很久的高汤,火候到位、食材尝遍,汤味才稳定下来。理解这个收敛逻辑,调试强化学习模型时就不会盲目堆训练轮数,而是会先问:该尝的都尝了吗?步子小了吗?

∑t=1∞αt=∞,∑t=1∞αt2<∞\sum_{t=1}^{\infty} \alpha_t = \infty, \qquad \sum_{t=1}^{\infty} \alpha_t^2 < \infty
  1. 无穷累加 $\sum \alpha_t = \infty$步子总数要“走得到头”,保证经验覆盖所有格子。
    ∑t=1∞αt=∞\sum_{t=1}^{\infty} \alpha_t = \infty
  2. 平方有限 $\sum \alpha_t^2 < \infty$步子要“越来越小”,保证后期不被单次噪声带偏。
    ∑t=1∞αt2<∞\sum_{t=1}^{\infty} \alpha_t^2 < \infty
  3. 直觉含义像熬汤——持续加热(总热量无限),但不沸腾溢锅(平方之和有限)。
    αt=1t 是经典选择\alpha_t = \frac{1}{t} \ \text{是经典选择}

AI 应用场景

广告自动出价:用 Q 值决定每次加价多少

阶段:在线决策与预算分配(强化学习训练 + 部署)

解决的问题:广告主要在有限预算和剩余时间内动态出价。传统规则方法依赖人工设定阈值,无法适应竞价环境波动;Q-Learning 把“剩余预算、剩余时间、当前竞价水位”作为状态,把“加价档位”作为动作,把“转化收益 − 花费”作为奖励,用 Q 值更新学会长期投产比最大的出价策略。

具体案例:某电商广告平台每天有数亿次竞价请求,强化学习引擎在每次展示机会前查询当前状态下的 Q 表(或 DQN 网络),选择加价档位;每次竞价结束后用 TD 目标更新对应 Q 值。三周后相比人工规则,ROI 提升了 12%。

游戏 NPC 学会走位

阶段:仿真环境训练(off-policy 更新)

解决的问题:手写 NPC 行为树在面对玩家多变打法时非常僵硬。把 NPC 周围格子与敌人距离作为状态、移动方向作为动作、“被击中扣分 / 击杀加分”作为奖励,Q-Learning 的 off-policy 特性让 NPC 可以在和玩家对战中边打边学,而不需要先录好“标准答案”。

具体案例:某动作游戏用 Q-Learning 训练 BOSS 走位,每帧更新一次 Q 值,训练一万局后 BOSS 学会了绕后与拉扯,玩家通关时间平均延长了 40%。

仓储机器人路径规划

阶段:环境建模与训练(Q 表 / 值函数逼近)

解决的问题:仓库地图大、订单突发多,预计算最短路径容易失效。机器人把所在栅格作为状态、四个移动方向作为动作、“电量消耗 + 准时送达”作为奖励,Q 值更新让它在动态环境下不断微调“哪个方向的长期价值最高”。

具体案例:某电商仓库用 Q-Learning 调度 50 台 AGV,每台机器人维护自己的 Q 表,运行一周后平均取货时间下降 18%,并且对临时路障的自适应能力显著增强。

Python 演示

python85 行
import random  class GridWorld:    """5x5 网格街区: 左上角出发, 右下角为终点"""     def __init__(self, size=5):        self.size = size        self.goal = (size - 1, size - 1)        self.pos = None     def reset(self):        self.pos = (0, 0)        return self.pos     def step(self, action):        dx, dy = [(-1, 0), (1, 0), (0, -1), (0, 1)][action]        x = min(self.size - 1, max(0, self.pos[0] + dx))        y = min(self.size - 1, max(0, self.pos[1] + dy))        self.pos = (x, y)        done = self.pos == self.goal        reward = 10.0 if done else -0.1        return self.pos, reward, done  class QLearningAgent:    """用字典实现的 Q 表, 逐次执行 Q 值更新"""     def __init__(self, env, alpha=0.2, gamma=0.9, epsilon=0.1):        self.env = env        self.alpha = alpha        self.gamma = gamma        self.epsilon = epsilon        self.q_table = {}     def get_q(self, state, action):        return self.q_table.get((state, action), 0.0)     def choose_action(self, state):        if random.random() < self.epsilon:            return random.randint(0, 3)        scores = [self.get_q(state, a) for a in range(4)]        return scores.index(max(scores))     def update(self, state, action, reward, next_state):        target = reward + self.gamma * max(            self.get_q(next_state, a) for a in range(4)        )        old = self.get_q(state, action)        self.q_table[(state, action)] = old + self.alpha * (target - old)  def train(episodes=800):    env = GridWorld()    agent = QLearningAgent(env)    for _ in range(episodes):        state = env.reset()        done = False        while not done:            action = agent.choose_action(state)            next_state, reward, done = env.step(action)            agent.update(state, action, reward, next_state)            state = next_state    return agent  def show_policy(agent):    arrows = ['^', 'v', '<', '>']    for x in range(agent.env.size):        row = []        for y in range(agent.env.size):            if (x, y) == agent.env.goal:                row.append('G')                continue            best = 0            for a in range(1, 4):                if agent.get_q((x, y), a) > agent.get_q((x, y), best):                    best = a            row.append(arrows[best])        print(' '.join(row))  if __name__ == '__main__':    agent = train()    show_policy(agent)
目的:在 5×5 网格上跑 800 轮 Q-Learning,训练结束后打印每个格子应该走的方向,直观看到 Q 值更新如何“照亮”通往终点的路径。
  1. self.q_table.get((state, action), 0.0)Q 表用字典存,没见过的“街区-动作”默认记 0 分,不给任何偏见
  2. if random.random() < self.epsilon:抛 ε 硬币,决定这步是“随便逛逛”还是“按手账选”
  3. scores.index(max(scores))利用分支:从 4 个动作里找出分数最高的那个
  4. target = reward + self.gamma * max(...)计算 TD 目标:这一口的真实奖励 + 下一街区最优店的折后分
  5. self.q_table[(state, action)] = old + self.alpha * (target - old)核心更新公式落成一行:旧分 + α ×(目标 − 旧分)
  6. while not done:一个 episode 不停走,直到踩到终点才换一盘新棋
  7. reward = 10.0 if done else -0.1奖励设计:到终点 +10,其余每步 −0.1,逼智能体少绕路

常见误区

误区我以为 Q 值更新就像考试对答案,走完一步看到奖励,Q(s,a) 就应该立刻变成真实回报,所以总想多跑几轮看看它什么时候“猜中”。

正解Q-Learning 每次只挪 α 比例的一小步,Q 值是“无数顿饭一点一点喂出来的”。就像手账不是橡皮擦重写,而是每次用笔尖轻轻划一道痕迹,反复几百次才变成清晰的分值。

为何常见:因为很多人第一次接触的是监督学习里的“一次拟合”,天然以为每来一个样本就要把结果一次性改到位。

误区α 越大改得越多,肯定学得越快,所以我把 α 设成 1.0,结果 Q 值像过山车一样上下乱跳,奖励值反而不稳定。

正解α 大确实“反应快”,但也容易被单次噪声带偏。就像烧菜调味,全信这一口,菜会忽咸忽淡;真正稳妥的做法是小步快走,必要时让 α 随时间衰减。

为何常见:日常生活中“吸取教训”常被理解为“一次性彻底改变”,而强化学习恰恰相反,它更喜欢渐进式微调。

误区我以为 Q-Learning 也是“实际走哪就学哪”,跟 Sarsa 没区别,结果面试时被问到两者差异直接懵了。

正解Q-Learning 更新用的是 max 出来的“最优未来”,跟当前行为策略无关,所以是 off-policy;Sarsa 用实际走的下一步动作 a',所以是 on-policy。一个做“最优白日梦”,一个记“现实流水账”。

为何常见:因为从代码上看两者只有一行之差,不把“更新目标”和“行为策略”拆开看,很容易忽略这层本质区别。

误区我以为把训练轮数调到很大,Q 表就会自动收敛到最优值,结果某些格子永远是 0,性能卡在局部最优。

正解收敛需要同时满足“状态动作被充分访问”和“学习率逐渐衰减”。如果 ε 不衰减,Q 值会被探索噪声持续扰动;如果某些 (s,a) 从未被访问,它的 Q 值永远不会被修正。

为何常见:很多人把“轮数”当成万能药,忽略了探索率与学习率两个旋钮之间的配合。

面试题

Q1. Q(s,a) 记录的是什么?

单选题 · easy

  • A.状态 s 采取 a 得到的即时奖励
  • B.状态 s 所有动作的平均回报
  • C.状态 s 采取 a 的折扣累积回报估计← 正确答案
  • D.环境给出的全局最优回报值

答案:C。Q(s,a) 是从“状态 s 执行动作 a”开始,未来所有折扣奖励的期望和,对应手账里“街区 × 餐厅”那一格的长期分。A 只说即时奖励,B 漏掉了具体动作,D 与状态动作对无关。

Q2. 下列哪项是 TD 目标?

单选题 · easy

  • A.r + γ·maxQ(s',a')← 正确答案
  • B.maxQ(s,a) − Q(s,a)
  • C.r − γ·Q(s',a')
  • D.Q(s,a) + α·TD误差

答案:A。TD 目标 = 这一步的真实奖励 r + 下一状态最优估计的折后值 γ·maxQ(s',a'),相当于“这口的感觉 + 未来的参考分”。B 是 TD 误差的变形,C 符号不对,D 是更新后的结果不是目标。

Q3. 学习率 α 设得过大,主要风险是什么?

单选题 · easy

  • A.收敛速度变得非常慢
  • B.智能体彻底放弃探索
  • C.单次体验被过度放大引发震荡← 正确答案
  • D.奖励信号被系统完全忽略

答案:C。α 是“这顿饭信多少”的系数。α 过大等于把一次偶发体验全盘当真,Q 值会像过山车一样震荡,难以稳定收敛。A 是 α 过小的毛病,B 和探索率 ε 有关,与 α 无直接关系。

Q4. 为什么说 Q-Learning 是 off-policy?

单选题 · mid

  • A.它只能在离线数据上训练
  • B.更新目标跟实际行为策略无关← 正确答案
  • C.它完全不需要任何探索
  • D.它永远采用纯随机策略

答案:B。Q-Learning 更新时用 max 取最优未来,无论这次实际走了哪一步,学到的都是“最优策略”的价值,这正是 off-policy 的含义。A 混淆了 off-policy 与离线训练,C、D 与是否探索无关。

Q5. 折扣因子 γ = 0 时,Q 值只取决于什么?

单选题 · mid

  • A.当前动作的即时奖励← 正确答案
  • B.未来无穷步奖励之和
  • C.下一状态的 Q 值大小
  • D.环境给出的平均奖励

答案:A。γ=0 时,未来所有项的系数都变成 0,Q 值只看眼前这一口的奖励,相当于“今朝有酒今朝醉”。B 需要 γ 接近 1,C 和 D 都与折扣因子无关。

Q6. 更新 Q(s,a) 时,max 是在哪里取的?

单选题 · mid

  • A.当前状态 s 的所有动作
  • B.下一状态 s' 的所有动作← 正确答案
  • C.初始状态 s0 的所有动作
  • D.目标状态 g 的所有动作

答案:B。贝尔曼方程把“吃完这顿后,在下一街区选最好的那家”作为未来参考,所以 max 一定作用在下一状态 s' 的动作集合上,而不是当前状态或其他特殊状态。

Q7. 贝尔曼最优方程的核心思想是什么?

单选题 · hard

  • A.用历史平均估计未来价值
  • B.当前值与未来最优值递归自举← 正确答案
  • C.用梯度下降直接求最优值
  • D.用蒙特卡洛跑完整条轨迹

答案:B。Q\(s,a) 右侧又出现 Q\,说明最优价值是“自己定义自己”的递归不动点,靠迭代逼近求解。A 是平均回报思路,C 是函数逼近的优化手段,D 是蒙特卡洛方法,都不是贝尔曼方程的本质。

Q8. 下列哪些因素会影响 Q 值收敛到最优?

多选题 · mid

  • A.学习率随时间逐步衰减← 正确答案
  • B.探索率逐步减小到较低值← 正确答案
  • C.每个状态动作对都被充分访问← 正确答案
  • D.环境奖励必须全部为正数

答案:ABC。收敛需要“步子越来越小”(α 衰减)、“从探索切换为利用”(ε 衰减)、“每个格子都被尝过”(充分访问)。奖励全为正不是收敛条件,只是奖励设计的风格,D 错误。

Q9. 关于 Q-Learning 与 Sarsa 的比较,正确的是?

多选题 · hard

  • A.Sarsa 按实际走的动作来更新← 正确答案
  • B.Q-Learning 更新时使用 max← 正确答案
  • C.两者都属于时序差分方法← 正确答案
  • D.两者都是 off-policy 算法

答案:ABC。Sarsa 用实际下一步动作 a' 更新,是 on-policy;Q-Learning 用 max 更新,是 off-policy,所以 D 错误。两者都基于 TD 目标“奖励 + 折扣下未来估计”,因此 C 正确。

Q10. 缓解 max 带来过估计的可行手段有哪些?

多选题 · extreme

  • A.用 Double Q-Learning 两表分离← 正确答案
  • B.把学习率 α 直接设为 0
  • C.增加各状态动作对的访问次数← 正确答案
  • D.把折扣因子 γ 设为 0

答案:AC。过估计来自“对带噪声的估计取 max”,Double Q-Learning 用两张 Q 表把“选动作”和“打分”分开,能直接去偏;增加访问次数能降低估计噪声,间接缓解过估计。α=0 直接停止学习,γ=0 放弃未来,都是破坏性做法。