上一篇结尾留了一个问题:如果不知道环境的转移概率和 Reward 函数,应该怎么利用 Bellman Equation 学习策略?
那篇从 Policy Iteration 走到 Value Iteration,用 A/B 两状态的例子跑完了整个过程。最后得到了最优策略,A 选择前往 B,B 选择 \(b_1\),\(V^*(A) = 2.7\)。
但整个过程有一个前提:环境模型完全已知。我需要知道"A 前往 B 时 Reward 是 0"和"B 选 \(b_1\) 时 Reward 是 3"这些信息,才能计算 Bellman 更新。
继续跟 MIT 6.S191 Lecture 5 往下走,发现这个前提在大多数实际问题里都不成立。
环境模型未知时怎么办#
先说清楚"环境模型未知"到底是什么意思。
Value Iteration 的更新公式:
$$ V_{k+1}(s) = \max_a \sum_{s'} P(s' \mid s, a)\bigl[r(s, a, s') + \gamma\, V_k(s')\bigr] $$这里 \(r(s, a, s')\) 是给定转移 \((s, a, s')\) 的即时奖励,\(P(s' \mid s, a)\) 是转移概率。要算右边的期望,必须对所有可能的下一状态 \(s'\) 求加权和——这需要知道 \(P(s' \mid s, a)\) 的完整分布以及对应的即时奖励。
“环境模型未知"指的是 Agent 不知道 \(P(s' \mid s, a)\) 和 \(r(s, a, s')\)。它不知道在某个状态执行某个动作后,下一状态的概率分布是什么。
这不是说环境不满足 MDP 假设。环境本身可能完全是一个合法的 MDP——有确定的状态集合、动作集合、转移概率和奖励函数。只是 Agent 不掌握这些信息。
那 Agent 能做什么?它可以和环境交互。在状态 \(s\) 执行动作 \(a\),环境返回即时奖励 \(r\) 和下一状态 \(s'\)。Agent 拿到的是一条经验:
$$ (s, a, r, s') $$一次采样,一个具体的转移结果。不是概率分布,不是所有可能结果的加权和。
Model-Based 方法(如 Value Iteration)知道环境模型,可以直接算期望。Model-Free 方法不知道模型,只能从交互样本中学习。
这里有一个我最初搞混的地方。Model-Free 不是说"不需要状态、动作或奖励”。Agent 仍然观察状态、执行动作、接收奖励。它缺少的是转移概率和奖励函数的解析形式——没有办法对所有可能的下一状态求加权和。
为什么要用 Q 而不是 V#
上一篇的 Value Iteration 围绕 \(V(s)\) 展开。我最初的想法是:能不能也用采样的方式更新 V?
问题出在"选动作"这件事上。
假设我已经有了一个估计的 \(V(s)\)。在状态 \(s\),我要选择最优动作。Value Iteration 的做法是:
$$ \pi^*(s) = \arg\max_a \sum_{s'} P(s' \mid s, a)\bigl[r(s, a, s') + \gamma\, V(s')\bigr] $$即使 V 已经精确了,我仍然需要 \(P(s' \mid s, a)\) 才能比较各动作的期望。 不知道转移概率,就没办法算"执行动作 \(a\) 之后各个下一状态的加权和"。
换成 Q 就不一样了。之前的文章定义过 Q-Function:在状态 \(s\) 执行动作 \(a\)、后续遵循某策略时 Return 的期望。
最优 Q-Function 的 Bellman Optimality Equation:
$$ Q^*(s, a) = \mathbb{E}\bigl[R_{t+1} + \gamma \max_{a'} Q^*(S_{t+1}, a') \mid S_t = s, A_t = a\bigr] $$如果我已经知道精确的 \(Q^*(s, a)\),选动作只需要:
$$ \pi^*(s) = \arg\max_a Q^*(s, a) $$直接对 Q 值取 argmax。不需要转移概率,不需要遍历所有可能的下一状态。 Q 已经把"执行这个动作之后的长期期望"编码进去了。
这是 Q-Function 在 Model-Free 场景下的关键优势。
那问题变成:没有环境模型,怎么学到 \(Q^*\)?
从一次采样构造更新目标#
假设 Agent 在状态 \(s\) 执行了动作 \(a\),环境返回了即时奖励 \(r\) 和下一状态 \(s'\)。
Bellman Optimality Equation 说的是期望关系。但这一次交互只有一个具体的 \((s, a, r, s')\)。不过我可以用它构造一个更新目标:
$$ y = r + \gamma \max_{a'} Q(s', a') $$这个 \(y\) 不是完整的数学期望,而是基于一次采样构造的目标。\(r\) 是真实的即时奖励,\(\max_{a'} Q(s', a')\) 是对 \(s'\) 处最优后续价值的当前估计。
然后用这个目标去更新 \(Q(s, a)\) 的估计。经典的 Tabular Q-Learning(表格 Q-Learning)更新公式:
$$ Q(s, a) \leftarrow Q(s, a) + \alpha\bigl[r + \gamma \max_{a'} Q(s', a') - Q(s, a)\bigr] $$逐项拆开:
- \(Q(s, a)\):当前对这个状态-动作对的价值估计。
- \(r\):从环境中实际观察到的即时奖励。
- \(\max_{a'} Q(s', a')\):下一状态中各动作 Q 值的最大值——对后续最优价值的当前估计。
- \(r + \gamma \max_{a'} Q(s', a')\):更新目标(TD Target)。
- \(r + \gamma \max_{a'} Q(s', a') - Q(s, a)\):当前估计与新目标之间的误差。
- \(\alpha\):学习率,控制每次更新的步长。
为什么不需要转移概率? 不是说概率消失了。转移概率仍然存在于环境中——Agent 每次和环境交互时,环境按照自身的概率分布返回下一状态。Agent 通过反复采样,让不同结果逐渐反映到 Q 的估计中。不是一次性算出精确期望,而是用很多次经验逐步逼近。
如果转移是确定性的,一次采样就得到了唯一的下一状态。如果转移是随机的,反复访问同一个 \((s, a)\) 会得到不同的 \((r, s')\),多次更新之后,Q 的估计会综合这些不同结果。
没有真实标签,训练目标从哪来#
到这里我卡了很久。
在普通的监督学习中,Loss 看起来像这样:
$$ L = (f_\theta(x) - y)^2 $$\(y\) 是训练标签,是独立于模型的真实值。模型 \(f_\theta(x)\) 要做的就是逼近这个 \(y\)。
Q-Learning 的更新目标 \(r + \gamma \max_{a'} Q(s', a')\) 里,第二项 \(\max_{a'} Q(s', a')\) 是模型自身对下一状态的估计。如果这个估计本身不准确,用它构造的目标也不准确。
这不是在拿自己的预测结果训练自己吗?
我用上一篇的 A/B 环境重新走一遍这个过程,看看到底发生了什么。
用 A/B 例子手算 Q-Learning#
环境和上一篇完全一样。状态 A 有两个动作:直接结束(Reward 1)和前往 B(Reward 0)。状态 B 有两个动作:\(b_0\)(Reward 0,结束)和 \(b_1\)(Reward 3,结束)。\(\gamma = 0.9\)。所有转移确定性。
假设 Q 表初始全为 0。学习率 \(\alpha = 1\)(只为便于手算,不是通常的设置)。
第一步: Agent 在 B 选择 \(b_1\),环境返回 \(r = 3\),游戏结束。
终止状态没有后续价值,更新目标就是即时奖励:
$$ Q(B, b_1) \leftarrow Q(B, b_1) + 1 \times [3 + 0 - Q(B, b_1)] = 0 + [3 - 0] = 3 $$这一步没有 Bootstrapping——目标完全来自真实的环境奖励。
第二步: Agent 在 A 选择前往 B,环境返回 \(r = 0\),到达 B。
现在 B 已经有了 Q 值。\(\max_{a'} Q(B, a') = \max(0, 3) = 3\)。
$$ Q(A, \text{前往B}) \leftarrow 0 + 1 \times [0 + 0.9 \times 3 - 0] = 2.7 $$A 的更新目标是 \(0 + 0.9 \times 3 = 2.7\)。其中 0 是真实的即时奖励,3 是之前学到的 B 的 Q 值。
第三步: 假设 Agent 也在 A 选择直接结束,环境返回 \(r = 1\),游戏结束。
$$ Q(A, \text{结束}) \leftarrow 0 + 1 \times [1 + 0 - 0] = 1 $$现在比较 A 的两个动作:\(Q(A, \text{前往B}) = 2.7\),\(Q(A, \text{结束}) = 1\)。Agent 可以判断前往 B 更好。
这个过程和上一篇 Policy Iteration 最终得到的结果完全一致——最优策略是 A 前往 B,B 选 \(b_1\),\(V^*(A) = 2.7\)。但 Q-Learning 不需要知道转移概率,它只用了三条交互样本。
几个需要注意的地方:
- 这里的学习顺序是精心安排的——先让 B 学到准确的 Q 值,再更新 A。实际 Q-Learning 中 Agent 的探索顺序是随机的。
- \(\alpha = 1\) 意味着旧的估计完全被新的目标覆盖。通常 \(\alpha\) 远小于 1,每次只做部分更新。
- 这个例子因为环境很小且转移确定性,几步就收敛了。一般问题需要大量交互。
- 只有实际访问过的状态-动作对才会被更新。没去过的状态,Q 值不会改变。
但如果 B 的 Q 值不准确呢#
前面的例子里,B 的 Q 值在第一步就变成了正确的 3。但假设 Agent 只部分学习了——当前 \(Q(B, b_1) = 1.5\),不是真正的最优值 3。
这时候更新 A:
$$ y_A = 0 + 0.9 \times 1.5 = 1.35 $$A 的更新目标是 1.35。但真正的最优值是 2.7。
Bootstrapping 构造的更新目标可能是错的。它不是 Ground Truth。
那为什么反复学习仍然有可能改善估计?
因为 B 的终止动作有真实的环境奖励作为纠正信号。Agent 每次在 B 执行 \(b_1\) 并获得 \(r = 3\) 时,\(Q(B, b_1)\) 都会朝着 3 的方向更新。随着 B 的估计逐步改善,A 使用 B 的估计构造的目标也会逐步改善。
这和上一篇的价值传播思想是一回事——B 的价值变化"传回"A,使 A 的估计跟着改善。区别在于 Value Iteration 通过对所有后继状态求期望来传播,Q-Learning 通过逐次采样来传播。
关键的逻辑链条:终止状态有真实 Reward → 相邻状态通过 Bootstrapping 利用这些信息 → 信息逐步向前传播 → 反复更新使估计逐渐接近真实值。
需要补充一个重要的边界。经典表格 Q-Learning 在满足特定条件时(学习率适当衰减、所有状态-动作对被无限次访问),可以证明收敛到 \(Q^*\)。这个收敛保证不能直接推广到使用神经网络的情况——后面会再说。
Bootstrapping 到底是什么#
走到这里,可以给 Bootstrapping(自举)一个准确的描述了。
Bootstrapping 是指利用当前已有的价值估计,来构造另一个价值估计的更新目标。
Q-Learning 里,\(Q(s', a')\) 本身是估计值,被用来构造 \(Q(s, a)\) 的更新目标。这就是 Bootstrapping。
几个容易搞混的地方:
- Bootstrapping 不是统计学里的 Bootstrap Resampling(Bootstrap 重采样)。名字相似但含义完全不同。
- Bootstrapping 不限于神经网络。前面的表格 Q-Learning 例子没有用到任何神经网络,同样使用了 Bootstrapping。
- Bootstrapping 的目标不等于真实值。它是"当前最好的估计 + 一步真实奖励"的组合,随着学习推进逐步改善。
TD Error 到底在度量什么#
前面 Q-Learning 更新公式里方括号中的那个差值:
$$ \delta_t = r + \gamma \max_{a'} Q(s', a') - Q(s, a) $$它有一个名字:TD Error(Temporal Difference Error,时序差分误差)。
Q-Learning 的更新可以简写成:
$$ Q(s, a) \leftarrow Q(s, a) + \alpha\, \delta_t $$Temporal Difference(时序差分)这个名字一开始让我困惑——我以为它是说"Reward 关于时间的导数"之类的东西。实际上它描述的是:利用相邻时间步之间价值估计的关系来构造更新信号。
当前时刻在 \(s\),Q 值是 \(Q(s, a)\)。执行动作后到了 \(s'\),用 \(r + \gamma \max_{a'} Q(s', a')\) 构造了一个新的目标。两者之间的差值 \(\delta_t\) 就是驱动学习的信号。
如果 \(\delta_t \gt 0\),说明新目标比当前估计高——“往好的方向修正”。如果 \(\delta_t \lt 0\),说明当前估计过于乐观。如果 \(\delta_t = 0\),当前估计与目标一致,不需要更新。
和 Monte Carlo 方法比较#
TD 不是唯一的学习方式。还有一种思路:不用 Bootstrapping,直接等一条完整轨迹结束,用实际采样到的 Return 做更新目标。这就是 Monte Carlo(蒙特卡洛)方法。
Monte Carlo 的更新目标:
$$ G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots $$从时刻 \(t\) 一直累加到轨迹结束。\(G_t\) 是实际走出来的 Return,不依赖任何价值估计。
TD 的更新目标(以 Q-Learning 为例):
$$ y_t = R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a') $$只看了一步真实 Reward,后面的部分用当前 Q 估计补上。
| Monte Carlo | TD(如 Q-Learning) | |
|---|---|---|
| 更新目标 | 实际采样的完整 Return \(G_t\) | \(r + \gamma \max_{a'} Q(s', a')\) |
| 何时可以更新 | 必须等轨迹结束 | 每一步都可以更新 |
| 是否使用 Bootstrapping | 否 | 是 |
| 偏差 | 无偏(\(G_t\) 是 Return 的一次实现) | 有偏(目标包含估计成分) |
| 方差 | 高(一条轨迹的随机波动大) | 低(只依赖一步转移) |
几个需要保持清醒的区分:
- Monte Carlo 使用的 \(G_t\) 是一条轨迹的实际采样 Return。它是 Return 这个随机变量的一次实现,不等于真实的期望价值 \(V^*(s)\) 或 \(Q^*(s, a)\)。
- TD 的目标包含估计成分,因此引入了偏差。这个偏差会随着 Q 估计的改善逐步减小。
- 不能简单断言 TD 在所有问题上都优于 Monte Carlo,或反过来。它们有各自适用的场景。
走到这里,概念之间的关系可以理清了。
TD Learning(时序差分学习)是一类使用 Bootstrapping 进行更新的方法。Q-Learning 是 TD Learning 的一种具体算法——它面向最优 Q 值,使用 \(\max_{a'} Q(s', a')\) 构造 TD Target。 Q-Learning 和 TD Learning 不是同义词:TD Learning 是更大的框架,Q-Learning 是其中一个实例。
Q 表装不下的时候#
前面所有讨论都假设 Q 用一张表来存储——每个状态-动作对有一个独立的数值。
但如果状态空间很大呢?
游戏画面是高维图像输入——一帧 84×84 的灰度图就有 \(256^{84 \times 84}\) 种可能的像素组合。连续状态空间更不用说。为每一个可能的状态-动作对单独存一个 Q 值,完全不现实。
而且 Q 表还有一个更根本的问题:它没有泛化能力。 状态 A 的 Q 值更新了,和状态 A 极其相似的状态 A’ 不会受到任何影响——因为在表格里它们是完全独立的条目。
一个自然的想法:既然 Q-Function 是一个从状态-动作对到实数的映射,能不能用一个参数化的函数去近似它?
$$ Q_\theta(s, a) \approx Q^*(s, a) $$如果用神经网络作为这个函数,参数 \(\theta\) 在所有状态之间共享。更新一个状态的 Q 值时,参数变化会影响网络对其他相似状态的预测——这就是泛化。
对于有限个离散动作的情况,一种常见的网络结构是:
- 输入:状态 \(s\)
- 输出:每个动作对应一个 Q 值,即 \([Q_\theta(s, a_1), Q_\theta(s, a_2), \ldots, Q_\theta(s, a_n)]\)
- 选择动作:\(a^* = \arg\max_a Q_\theta(s, a)\)
一次前向传播,所有动作的 Q 值同时算出来。
这就是 DQN(Deep Q-Network)的基本思路。不是所有 Q 网络都必须用这种"输入状态、输出所有动作 Q 值"的结构——也可以输入 \((s, a)\) 输出单个 Q 值。但前者在离散动作空间中更常用,因为取 argmax 只需要比较一个向量。
需要强调一点:神经网络的近似能力不等于保证预测正确。 泛化意味着相似状态会得到相似的 Q 值,但"相似"的度量由网络的架构和训练过程决定,不一定符合任务的真实结构。函数近似引入了新的问题——下一节会讲。
用神经网络之后,训练过程怎么变了#
从表格 Q-Learning 过渡到 DQN,核心的 Bellman 递归关系没有变。变的是 Q 的表示方式和更新机制。
从更新公式到 Loss#
表格 Q-Learning 直接修改 Q 表中的数值:
$$ Q(s, a) \leftarrow Q(s, a) + \alpha [\underbrace{r + \gamma \max_{a'} Q(s', a')}_{\text{TD Target}} - Q(s, a)] $$用神经网络之后,Q 值由参数 \(\theta\) 决定。不能直接"改 Q 表里的一个格子",需要通过梯度下降更新 \(\theta\)。
Agent 与环境交互,获得一条经验 \((s, a, r, s', d)\),其中 \(d\) 表示 \(s'\) 是否为真正的终止状态。
构造训练目标:
$$ y = r + \gamma (1 - d) \max_{a'} Q_{\theta^-}(s', a') $$- 如果 \(d = 1\)(终止状态),\(y = r\)。终止后没有后续价值,只有即时奖励。
- 如果 \(d = 0\)(非终止),\(y = r + \gamma \max_{a'} Q_{\theta^-}(s', a')\)。
这里 \(\theta^-\) 是用于计算目标的参数——后面会解释为什么它和当前训练的参数 \(\theta\) 需要区分。
Loss:
$$ L(\theta) = \bigl(Q_\theta(s, a) - y\bigr)^2 $$这看起来和普通的回归 Loss 一样:预测值 \(Q_\theta(s, a)\),目标值 \(y\),最小化两者的平方差。然后对 \(\theta\) 求梯度、反向传播、更新参数。
但"看起来像"不代表"本质相同"。
在普通监督学习中,\(y\) 是固定的训练标签,不随模型参数变化。在 DQN 中,\(y\) 通过 \(\max_{a'} Q_{\theta^-}(s', a')\) 包含了模型自身的估计。即使用了 \(\theta^-\) 做一定程度的分离,目标仍然不是独立于学习过程的 Ground Truth。
构造目标时应当把 \(y\) 视为固定值(常数),不让梯度沿 \(y\) 一侧反向传播。原因是:如果 \(y\) 也随 \(\theta\) 更新而变化,优化目标本身在移动,训练过程会变得不稳定。
为什么神经网络会使训练变得不稳定#
表格 Q-Learning 更新一个 \(Q(s, a)\),不会影响其他状态-动作对的 Q 值。但神经网络的参数是共享的——更新 \(\theta\) 以改善某个 \((s, a)\) 的 Q 值,可能同时改变了其他所有状态-动作对的预测。
再加上两个问题:
目标在移动。 \(y\) 依赖 Q 网络的输出。参数变了,目标也变了。模型在追一个自己不断推开的靶子。
连续样本高度相关。 Agent 与环境顺序交互,相邻时间步的 \((s, a, r, s')\) 来自几乎相同的局部环境区域。连续的训练样本之间不是独立的。
经典 DQN 用两个技巧来缓解这些问题。
Experience Replay(经验回放): 把每次交互得到的 \((s, a, r, s', d)\) 存入一个缓冲区。训练时不用最新的样本,而是从缓冲区中随机采样一个 batch。随机采样打破了时间上的相关性,并且允许同一条经验被多次复用。
Target Network(目标网络): 维护一份参数 \(\theta^-\) 的副本,用于计算 TD Target。这份副本不实时更新——每隔一段时间才把在线网络的参数复制过来(或者按某个比例缓慢更新)。这样在一段时间内,训练目标是相对稳定的。
这两个技巧不能完全解决问题——函数近似下的训练稳定性仍然是一个活跃的研究方向。但它们是 DQN 能够在 Atari 游戏上工作的关键组成部分。
Q-Learning 和 DQN 到底是什么关系#
我在学习过程中好几次把 Q-Learning 和 DQN 混为一谈。整理一下它们的关系。
| 维度 | Tabular Q-Learning | DQN |
|---|---|---|
| Q 的表示 | 表格(每个状态-动作对一个数值) | 神经网络 |
| 训练信息 | 环境交互样本 \((s,a,r,s')\) | 环境交互样本 \((s,a,r,s')\) |
| 核心递归关系 | Bellman Optimality Equation | Bellman Optimality Equation |
| 更新方式 | 直接修改 Q 表中的数值 | 梯度下降更新网络参数 |
| 泛化能力 | 没有——每个条目独立 | 有——参数共享使相似状态获得相似 Q 值 |
| 主要挑战 | 状态空间太大时存不下 | 函数近似带来的训练稳定性问题 |
Q-Learning 本身不是神经网络算法。 它是一种利用 TD 更新学习最优 Q 值的方法,可以用表格实现。DQN 是用神经网络作为 Q-Function 的近似器,再加上 Experience Replay 和 Target Network 等稳定性技巧。
还有一个特性值得一提。Q-Learning 是 Off-Policy(离策略)的。
Agent 在收集数据时可以使用 \(\epsilon\)-greedy 策略——大部分时间选当前估计最优的动作(exploitation),偶尔随机选一个动作(exploration)。但在计算 TD Target 时,用的是 \(\max_{a'} Q(s', a')\)——这是完全贪心的选择,不管 Agent 实际用了什么探索策略。
也就是说,收集数据的策略(behavior policy)和算法试图学习的策略(target policy)可以不同。 前者需要探索,后者是纯贪心的最优策略。Off-Policy 这个性质也是 Experience Replay 能够成立的原因之一——缓冲区里存储的旧数据来自之前的行为策略,仍然可以用来更新当前的 Q 估计。
写在最后#
从上一篇的 Value Iteration 走到这里,整条路线大致是这样的:
Value Iteration 能工作,但需要已知的环境模型。去掉这个前提之后,需要一种能从交互样本中学习的方法。Q-Function 天然适合 Model-Free 场景——学到 Q 之后,选动作只需要 argmax,不需要转移概率。
Q-Learning 利用 Bellman Optimality Equation 的递归结构,从每次交互中构造 TD Target 来更新 Q 值。TD Target 包含当前的 Q 估计——这就是 Bootstrapping。Bootstrapping 的目标不是 Ground Truth,但真实环境奖励提供了锚点,反复更新使估计逐步改善。
当状态空间太大时,Q 表不可行,神经网络作为函数近似器登场。DQN 保留了 Q-Learning 的核心递归关系,用梯度下降替代了直接修改表格,再加上 Experience Replay 和 Target Network 来对抗训练不稳定性。
回到最初的问题——如果没有人提供正确的 Q 值作为标签,Agent 怎么学习?
真实环境反馈提供了锚点(终止状态的 Reward),Bellman 递归关系提供了在状态之间传播价值信息的结构,Bootstrapping 利用当前估计构造更新目标,反复交互和更新使整个 Q-Function 逐步逼近最优。 不需要事先知道答案,也不需要一次性算出精确值。
参考资料#
- 从 Policy Improvement 到 Value Iteration:Bellman Equation 如何找到最优策略? — Policy Iteration、Value Iteration 与 A/B 例子
- 从 Return 到 Q-Function:强化学习如何评价一个尚未发生的决策 — V、Q 的定义与 Policy Evaluation/Improvement
- 理解 Bellman Equation:从条件期望到概率 DP — Bellman Equation 推导
- Watkins & Dayan, Q-learning, Machine Learning, 1992 — https://doi.org/10.1007/BF00992698
- Mnih et al., Playing Atari with Deep Reinforcement Learning, 2013 — https://arxiv.org/abs/1312.5602
- Sutton & Barto, Reinforcement Learning: An Introduction (2nd edition), Chapter 6
- MIT 6.S191: Introduction to Deep Learning — https://introtodeeplearning.com/