RL COLLECTION / 04 CONTROL / DEEP DIVE

Q-learning:
从最优 Bellman 方程到一行更新代码

不把公式当黑箱。我们从“想求什么”开始,推到“为什么这一条样本足以构造更新”,逐项审计伪代码,再划出它的理论保证和工程失效边界。

TARGET

读完后,你应能从零写出 Q-learning,并能解释每一个符号为何存在。

你要能做的事不是只会背什么现实中用来判断什么
从最优动作价值 Q* 的定义推导 Q-learning target。不是只记 r + γ max Q。target 是否写对、terminal 是否 mask、γ 是否改变任务含义。
分开 behavior policy 与 target policy。不是只知道它叫 off-policy。为什么 ε-greedy 收集的数据能用于学习 greedy 策略;何时这种迁移会变危险。
手算连续三次更新并解释信息怎样逆向传播。不是只会调用一个训练循环。调试 Q 值不动、异常高估、训练回报与评估回报背离。

0 · WHAT PROBLEM DOES IT SOLVE?

Q-learning 求的不是“当前策略的分数”,而是最优决策的动作价值。

在有限 MDP 中,给定当前 state s 并强制先做动作 a,之后每一步都可以自由选最优动作。该条件下的最佳期望回报叫最优动作价值:

Q*(s,a) = maxπ Eπ[Gt | st=s, at=a]maxπ 的意思是:第一步固定为 a 后,未来从所有可选策略中挑回报期望最大的那一个。Q* 是“世界里真正值得学的答案”,不是某一次轨迹的回报。

若有 Q*,控制就变得平凡:在每个状态选择 argmaxaQ*(s,a)。困难是我们通常不知道环境转移 P 和平均 reward,无法直接把 Q* 算出来。

Q-learning 的一句定义

Q-learning 是无模型(model-free)、离策略(off-policy)、表格型 TD 控制算法。“无模型”表示不需提前知道 P;“离策略”表示用一个行为策略收集数据,却学习另一个 greedy 目标策略;“TD”表示只看一步真实反馈,再用估计值补未来。

1 · THE EQUATION BEFORE THE ALGORITHM

先有最优 Bellman 方程,才有更新式。

如果环境模型 P(s′,r|s,a) 已知,我们可以枚举动作后的所有可能后继。最优性原理说:当前先拿到 r,抵达 s′ 后就再次选择最优动作。因此:

Q*(s,a) = Σs′,r P(s′,r|s,a) [r + γ maxa′Q*(s′,a′)]这不是启发式公式:左边是“先做 a 的最优长期价值”;右边把未来切成“一步真实 reward + 下一状态继续最优”的条件期望。max 出现在 s′,不是 s,因为 a 已经执行完。
符号在方程里的精确职责常见误读
s,a正在评估的当前状态和已选动作。max 不会重新选择当前 a;当前 a 已被条件固定。
s′,r环境对 (s,a) 的随机后继与单步反馈。r 不是整局 return,只是一小步证据。
γ把未来回报映射到今天的权重。不是“为了收敛随便调小”;它改变优化的长期偏好。
maxa′Q*(s′,a′)下一状态若从此以后完美决策,最好的继续价值。不是行为策略实际将选的动作价值。

这一方程定义了最优 Bellman 算子 T*。求解就是找固定点:Q*=T*Q*。已知模型时可用 value iteration;Q-learning 的工作是:没有 P 时,怎样用真实采样替代这层期望。

2 · FROM EXPECTATION TO ONE SAMPLE

一条 transition 为什么能参与学习?它是期望里的一个带噪样本。

在状态 s 做 a 后,环境实际只给你一份观测 (r,s′),而不是完整的 P 分布。把最优 Bellman 右侧中的随机变量记为:

Y = R + γ maxa′Q(s′,a′)
E[Y | s,a] = (T*Q)(s,a)一次交互得到的 y=r+γmax Q(s′,·) 不等于完整期望;它是该期望的单个样本。重复访问同一 (s,a) 才能逐步抵消抽样噪声。

于是我们不把 Q(s,a) 直接改成 y,而采取随机逼近的增量平均形式:

Qt+1(s,a) = Qt(s,a) + αt[yt − Qt(s,a)]
yt = rt+1 + γ maxa′Qt(st+1,a′)方括号是 TD error:若样本 target 高于当前估计,Q 上调;反之下调。α 控制本次样本的可信权重。其余表格格子在这一刻不变。
behavior με-greedy picks aenvironmentreturns r, s′optimal targetr + γ max Q(s′,·)write QQ(s,a) += αδupdated Q changes the next behavior decision; data distribution follows policy一条样本同时服务两个角色:真实 r,s′ 来自环境;未来最优部分来自当前 Q 表。

3 · WHY OFF-POLICY IS POSSIBLE

行为在探索,target 却假设贪心:这不是矛盾,而是刻意分工。

Q-learning 用 ε-greedy 行为策略 μ 收集 transition,以保证不是只反复走当前最爱的一条路;但 target 使用 maxa′Q(s′,a′),它学习的是确定性 greedy 目标策略 π*。于是:

对象写法它决定什么Q-learning 中的选择
行为策略 μa ~ μ(·|s)今天实际访问哪些 transition。通常 ε-greedy(Q),以维持覆盖。
目标策略 ππ(s)=argmaxaQ(s,a)我们最终想优化/部署谁。greedy(Q),不把探索失手写进 target。
学习目标r+γmax Q(s′,·)对 π 的一步最优性承诺。与实际 a′ 无关。

“离策略”不代表可以用任意历史数据、毫无条件地学任何目标。表格 Q-learning 仍需要覆盖:若 μ 永远不访问某个关键 (s,a),它的 Q 没有样本来修正。深度网络里,数据分布漂移、分布外动作、bootstrapping 会让这个问题更尖锐,这正是 offline RL 与 conservative value learning 的动机。

4 · THREE UPDATES BY HAND

只看公式仍抽象;用一个两步世界追踪 Q 的每一次变化。

环境:A 只有 go,到 B 得 r=0;B 有 safe(终止,r=+4)和 risky(终止,r=−6)。令 γ=0.9、α=0.5,所有 Q 初始为 0。行为策略在 B 先探索到 safe。

时间实际 transitiontarget 的计算TD error / 写回信息在哪里
t=0(A,go) → r=0,Bmax[Q(B,safe),Q(B,risky)]=max(0,0)=0
y=0+0.9×0=0
δ=0−Q(A,go)=0
Q(A,go) 仍是 0
终点 reward 尚未传回;这不是失败,是 bootstrap 的局部传播。
t=1(B,safe) → r=+4, terminalterminal 没有未来:y=4δ=4−0=4
Q(B,safe)=0+0.5×4=2
safe 的直接价值先被学到。
t=2(下一局)(A,go) → r=0,Bmax(2,0)=2
y=0+0.9×2=1.8
δ=1.8−0=1.8
Q(A,go)=0.9
B 的价值沿 transition 逆向传给 A。
t=3(再一局)(A,go) → r=0,By 仍为 1.8δ=1.8−0.9=0.9
Q(A,go)=1.35
固定 α=0.5 时,Q(A,go) 逐步靠近 1.8。
两个重要细节

第一,终止状态必须令未来项为 0;若错误地继续 max Q(terminal,·),会把不存在的未来收益泄漏进 target。第二,Q(A,go) 的真值应为 γ×4=3.6,而上表暂时只到 1.35,因为 Q(B,safe) 自己也还未收敛到 4;多次访问会继续推动两者。

5 · PSEUDOCODE, LINE BY LINE

每一行都对应前面的一个理论对象。

Q = zeros(num_states, num_actions)          # 当前近似 Q_t
for episode in range(num_episodes):
    s, info = env.reset()
    done = False
    while not done:
        a = epsilon_greedy(Q[s], epsilon)    # behavior policy μ
        s_next, r, terminated, truncated, info = env.step(a)
        done = terminated or truncated
        bootstrap = 0.0 if terminated else max(Q[s_next])
        target = r + gamma * bootstrap       # one sample of T*Q
        td_error = target - Q[s, a]
        Q[s, a] = Q[s, a] + alpha * td_error # stochastic approximation
        s = s_next
容易被略过的行原理解释常见 bug
a = epsilon_greedy(...)这是数据采集策略,不是 target policy。训练与评估都用 ε>0,导致看不出实际 greedy 能力。
terminated vs truncated自然终止表示没有未来;时间上限截断是否应 bootstrap 取决于任务定义与 API 语义。把所有 done 都 mask 掉,低估被时间上限截断的状态价值。
max(Q[s_next])实现最优 Bellman target 的 maxa′。错误写成 max(Q[s]),把当前 state 当成下一 state。
Q[s,a]表格法只更新刚访问的一个 state-action 单元。不小心整行广播更新,改变了未观察动作的价值。

6 · WHY IT CONVERGES — AND THE FINE PRINT

经典保证的骨架:压缩映射 + 足够访问 + 合适步长。

最优 Bellman 算子 T* 在最大范数下是 γ-压缩:||T*Q−T*Q′||∞≤γ||Q−Q′||∞,因此它有唯一固定点 Q*。Q-learning 的更新可以看成朝 T*Q 的带噪样本走。Watkins 与 Dayan 对有限、离散表格设置给出了几乎必然收敛的经典结果;其核心前提不是一句“多跑几轮”,而是:

前提它排除什么问题实践中的对应检查
有限、离散的 state-action 表每个值能被单独反复估计。连续状态需离散化或转向函数近似;不能把这条证明直接搬到 DQN。
每个相关 (s,a) 被无限次访问避免某些价值永远停留在初始化误差。看状态/动作覆盖计数,审查 ε 衰减是否过快。
有界 reward 与合适折扣/终止条件使长期回报和固定点定义良好。检查 reward scale、γ、自然终止与 time limit 的建模。
Robbins–Monro 步长长期不停止学习,但逐渐平均掉抽样噪声。典型理论条件为 Σαt=∞ 且 Σαt2<∞;固定 α 更适合持续适应而非精确极限收敛。

原始论文是 Watkins 与 Dayan 1992 年的 《Q-learning》↗;它讨论的正是离散 action-value、重复采样与收敛条件。不要把“表格 Q-learning 在这些假设下收敛”简化成“任何叫 Q-learning 的深度实现都稳定”。

7 · FAILURE MODES

当 Q 值看起来不对时,先定位是哪一层假设被破坏。

现象机制层原因先做的检查不是优先解法
Q 值几乎不变reward 太稀疏、状态未覆盖、α 太小或 transition 没真的写回。打印访问计数、TD error、非零 reward 的比例、Q 前后差值。盲目加大网络/增加 epoch。
训练 reward 忽高忽低ε-greedy 行为刻意探索;随机环境也有方差。另画 ε=0 的 greedy evaluation 与多个 seed 的均值区间。只看单条训练曲线下结论。
Q 明显高估max 会选择估计噪声中的幸运值(maximization bias)。比较 Q 尺度与真实/评估 return;测试随机 reward MDP。仅靠降低 α 掩盖系统偏差。
换成神经网络后发散函数近似 + bootstrap + off-policy 形成 deadly triad,更新会互相放大。检查 replay、target network、reward scale、学习率、分布覆盖。认为“表格收敛证明”仍自动成立。
连续动作无法 maxmaxa′Q(s′,a′) 需在无穷动作空间做优化。明确动作空间结构。在连续向量上枚举动作;应转向 actor-critic、SAC 等。

8 · TEST YOUR MODEL

能回答这些,才算真正理解了 Q-learning。

01 · Q-learning 实际在 B 选择了 left,但 target 使用 right 的 Q 值;这是 bug 吗?

不是。若 right 是 Q(B,·) 最大值,Q-learning 正是在用行为策略的 left 样本学习“未来改为 greedy 后”的目标策略。SARSA 才使用实际 next action 的 Q(B,left)。

02 · 为什么 terminal transition 的 target 不含 γmax Q?

自然终止后定义上没有未来 return,G 的后缀为 0;因此 target=r。若是仅因 time limit 截断,是否置零取决于它是不是任务真正终点,不能不加区分。

03 · 若 α=1,会发生什么?

每次访问直接覆盖为最新 target,适合某些确定性、一次即可准确的情形;随机环境中会高度跟随单次噪声,不再像样本平均一样稳定。

04 · 为什么 Q-learning 没有显式估计 P(s′|s,a),仍像动态规划?

它把 DP 的“对所有后继取期望”改为每次从环境拿一个后继样本,用随机逼近累积这些样本。它保留 Bellman backup 的结构,但不显式存模型。

WHERE THIS GOES NEXT

这条更新式将分化为现代深度 RL 的一整支谱系。