[ AI-GEN ] 强化学习基础:从马尔可夫决策过程到深度强化学习
这是一篇写给“已经学过基本机器学习和深度学习,但还没有把强化学习串起来”的读者的长文。文章不追求把所有前沿方向都讲成论文综述,而是试图建立一张可以反复定位的地图:强化学习到底在优化什么,Bellman 方程为什么重要,Monte Carlo、TD、Q-learning、DQN、Policy Gradient、Actor-Critic 和 PPO/SAC 之间究竟是什么关系,以及真正写代码时最容易在哪些地方出错。
先给结论:强化学习究竟在学什么
监督学习通常给模型一组输入和标签,模型学习“看到 x 应该输出 y”;强化学习面对的则是一个会随时间变化的世界。智能体在状态 s 下选择动作 a,环境返回奖励 r 并转移到下一个状态 s’。智能体的目标不是让某一次预测正确,而是让一串动作带来的长期累计收益最大。
可以把强化学习压缩成下面这个循环:
1 | 观察状态 s_t |
真正需要建立的核心直觉有四个:
- 奖励是即时反馈,return 才是优化目标。 一个动作的好坏不能只看眼前的奖励,还要看它对未来的影响。
- 价值函数把“未来”压缩成了一个当前的估计。 Bellman 方程正是把长期问题拆成“当前奖励 + 下一状态的价值”。
- 探索和利用无法同时完美满足。 只利用当前看起来最好的动作,可能永远发现不了更好的策略;只探索又不会真正完成任务。
- 深度网络只是函数逼近器,不是强化学习本身。 DQN、PPO、SAC 的差异,主要来自它们如何表示策略/价值、如何采样数据、如何处理估计误差和更新稳定性。
下面先给一张总地图。读完后再回来看这张表,很多算法会自然地落到对应的位置。
| 问题 | 典型方法 | 需要什么 | 主要优点 | 典型困难 |
|---|---|---|---|---|
| 已知环境模型,如何求最优策略 | 动态规划、策略迭代、价值迭代 | 状态转移和奖励模型 | 理论清楚、可以规划 | 状态空间必须可枚举或可计算 |
| 不知道模型,如何估计价值 | Monte Carlo、TD(0)、TD(λ) | 与环境交互得到的轨迹 | 从经验直接学习 | 长期信用分配、偏差/方差权衡 |
| 离散动作如何选 | SARSA、Q-learning、DQN | Q 函数 | 动作选择简单、容易解释 | 连续动作不适用,函数逼近可能不稳定 |
| 直接学习动作分布 | REINFORCE、PPO | 随机策略和轨迹 | 可以处理连续动作,优化目标直接 | 梯度方差大,通常样本效率低 |
| 策略和价值一起学 | A2C、A3C、PPO、DDPG、TD3、SAC | Actor + Critic | 兼顾策略表达能力和价值估计 | 训练目标更复杂,组件之间相互影响 |
| 使用环境模型进行想象或规划 | Dyna、MPC、MCTS、Dreamer、MuZero | 学到或已知的模型 | 样本效率高、可以做前瞻 | 模型偏差会被规划放大 |
本文会反复使用三个维度来分类算法:是否有模型(model-based / model-free)、是否使用旧数据(on-policy / off-policy)、主要优化策略还是价值(policy-based / value-based)。这三个维度不是互斥的标签,而是理解算法设计取舍的坐标轴。
1. 强化学习和其他机器学习范式有什么不同
1.1 强化学习不是“没有标签的监督学习”
把强化学习称为“没有标签的监督学习”很容易造成误解。监督学习的训练样本一般可以近似认为是独立同分布的,标签由数据集直接提供;强化学习的数据是智能体自己与环境互动生成的,而且动作会改变以后会看到的数据。
这会产生几个根本差异:
- 反馈可能延迟。 走迷宫时,最终到达出口的奖励要归因到很久以前的转弯动作。
- 数据分布由策略决定。 策略变化后,下一批状态也会变化,训练数据并不固定。
- 动作会影响未来数据。 一个“看起来不好的”动作可能是探索新区域的必要代价。
- 反馈通常不告诉你正确动作。 奖励只告诉你结果好不好,却不直接说“在这个状态应该选动作 3”。
- 目标是序列级别的。 一次动作的即时收益和整条轨迹的长期收益可能相反。
因此,强化学习既包含预测,也包含控制;既要估计世界中哪些状态/动作有价值,又要决定接下来如何行动。
1.2 一个最小例子:走格子
考虑一个 5×5 的网格:智能体从左下角出发,右上角是终点,某些格子有障碍。每走一步奖励 -1,到达终点奖励 +10。这个任务看起来很简单,却包含强化学习的全部骨架:
- 状态:当前所在的格子,也可以额外包含剩余步数。
- 动作:上、下、左、右。
- 转移:动作可能让智能体移动,撞墙时保持原地。
- 奖励:每走一步 -1,到达终点 +10。
- 目标:找到一条总回报最大的路径,而不是只追求某一步的奖励。
如果把每一步都设置成 0,只有终点有 +1,问题就变成稀疏奖励任务:智能体必须偶然走到终点,才能知道之前的动作是有用的。这个例子也说明了为什么奖励设计和探索机制会决定训练难度。
2. 马尔可夫决策过程:强化学习的共同语言
2.1 MDP 的五个要素
在最常见的形式化中,一个有限或无限时域的马尔可夫决策过程(Markov Decision Process, MDP)可以写作:
1 | M = (S, A, P, R, γ) |
其中:
S是状态空间,s ∈ S;A是动作空间,a ∈ A;P(s' | s, a) = Pr(S_{t+1}=s' | S_t=s, A_t=a)是转移概率;R(s, a)或R(s, a, s')是奖励函数;γ ∈ [0, 1]是折扣因子。
“马尔可夫”指的是:给定当前状态和当前动作后,下一状态与更早的历史无关。也就是:
1 | Pr(s_{t+1} | s_t, a_t, s_{t-1}, a_{t-1}, ...) = Pr(s_{t+1} | s_t, a_t) |
这不是说现实世界真的没有历史,而是说我们选择的状态表示已经包含了做出最优决策所需要的信息。比如在棋类游戏中,棋盘局面通常足以描述状态;在赛车游戏中,如果只输入一帧画面,速度和运动方向可能缺失,此时单帧观测就不是完整的 Markov state。
2.2 状态、观测与 POMDP
工程中经常混用“状态”和“观测”,但它们最好区分:
- 状态 state 是环境内部的完整信息;
- 观测 observation 是智能体实际能看到的信息,通常是状态的函数或带噪声的版本。
当观测不能唯一确定真实状态时,问题更接近部分可观测 MDP(POMDP)。处理方法包括:
- 把最近 k 帧堆叠起来;
- 使用 RNN、GRU、LSTM 或 Transformer 保存历史;
- 维护 belief state,即对隐藏状态的概率分布;
- 训练一个记忆或状态估计模块。
这也是为什么 Atari 的 DQN 不仅使用一张截图,而是通常把连续多帧作为输入:速度信息可以从帧间变化中恢复。
2.3 策略、轨迹和回报
策略(policy)记作 π(a | s),表示在状态 s 下选择动作 a 的概率。它可以是:
- 确定性策略:
a = π(s),例如一个连续控制网络直接输出转向角; - 随机策略:
a ~ π(· | s),例如输出离散动作的 softmax 概率或连续动作的高斯分布。
一条轨迹(trajectory)可以写成:
1 | τ = (s_0, a_0, r_1, s_1, a_1, r_2, ..., s_T) |
从时刻 t 开始的折扣回报(return)是:
1 | G_t = r_{t+1} + γ r_{t+2} + γ² r_{t+3} + ... |
如果是有限时域且一共只有 T 步,那么求和在终止处停止;如果是 continuing task,则通常使用 γ < 1 让无限和收敛。折扣因子还有一个直观含义:它控制智能体有多“短视”。γ 越小,越重视即时奖励;γ 越接近 1,越重视远期结果。
注意:折扣因子并不一定等于现实世界的时间偏好。它也常常是为了让目标稳定、降低方差、处理无限时域或与任务时间尺度匹配。
2.4 价值函数:把长期收益搬回当前
给定策略 π,状态价值函数是:
1 | V^π(s) = E_π[G_t | S_t = s] |
它回答:“如果从状态 s 出发,之后一直按照 π 行动,平均能得到多少回报?”
动作价值函数是:
1 | Q^π(s, a) = E_π[G_t | S_t = s, A_t = a] |
它回答:“现在在状态 s 先执行动作 a,之后按 π 行动,平均能得到多少回报?”
二者的关系是:
1 | V^π(s) = Σ_a π(a | s) Q^π(s, a) |
优势函数(advantage)定义为:
1 | A^π(s, a) = Q^π(s, a) - V^π(s) |
它表示动作 a 相对于“在当前策略下平均行动”的好坏程度。A 为正表示这个动作比平均水平好,A 为负表示比平均水平差。后面的 Policy Gradient、Actor-Critic、GAE 和 PPO 都会频繁使用这个概念。
2.5 Bellman 期望方程和最优性方程
回报可以递归拆开:
1 | G_t = r_{t+1} + γ G_{t+1} |
对它取期望,就得到 Bellman 期望方程:
1 | V^π(s) = Σ_a π(a | s) Σ_{s',r} p(s',r | s,a) [r + γ V^π(s')] |
对动作价值函数同样展开:
1 | Q^π(s,a) = Σ_{s',r} p(s',r | s,a) [r + γ Σ_{a'} π(a' | s') Q^π(s',a')] |
如果我们不再固定某个策略,而是希望得到所有策略中的最优值,则有 Bellman 最优性方程:
1 | V*(s) = max_a Σ_{s',r} p(s',r | s,a) [r + γ V*(s')] |
几乎所有经典强化学习算法都可以从这里找到影子:
- 动态规划直接利用完整的转移模型计算这些期望;
- Monte Carlo 用完整轨迹的实际回报估计
V或Q; - TD 用下一状态的当前估计来近似 Bellman 目标;
- Q-learning 直接逼近 Bellman 最优性方程;
- Actor-Critic 用 Critic 估计价值,再让 Actor 改进策略。
2.6 最优策略和最优价值
在有限 MDP 中,最优状态价值定义为:
1 | V*(s) = max_π V^π(s) |
最优动作价值定义为:
1 | Q*(s,a) = max_π Q^π(s,a) |
如果知道 Q*,最优策略可以直接贪心地选动作:
1 | π*(s) ∈ argmax_a Q*(s,a) |
这解释了 value-based 方法为什么只要学好 Q 函数就能选动作,也解释了它为什么更适合离散动作:argmax 可以遍历有限动作,但在连续动作中,求 argmax_a Q(s,a) 本身可能已经是一个困难的优化问题。
3. 先从多臂老虎机理解探索与利用
多臂老虎机(multi-armed bandit)可以看成没有状态转移的强化学习:机器有多个摇臂,每个摇臂的奖励分布不同,智能体每轮选一个摇臂并观察奖励。它没有长期信用分配,但已经包含探索—利用困境。
3.1 ε-greedy
维护每个动作的平均奖励估计 Q(a):
- 以
1 - ε的概率选择当前估计最好的动作; - 以
ε的概率随机探索。
更新可以写成增量平均:
1 | Q_{n+1}(a) = Q_n(a) + 1 / N(a) * [R_n - Q_n(a)] |
实际深度强化学习中常用的 ε 会随训练衰减:早期多探索,后期更多利用。但不要把 ε 衰减到严格的 0 太早,否则如果价值估计还不准确,策略可能会过早锁死。
3.2 UCB 和基于不确定性的探索
UCB(Upper Confidence Bound)在选择动作时加上不确定性奖励:
1 | a_t = argmax_a [ Q(a) + c * sqrt( ln(t) / N(a) ) ] |
访问次数越少,置信上界越大,因此系统性地偏向未充分尝试的动作。更复杂的 RL 探索方法也有类似思想:不是简单随机,而是优先探索模型不确定、信息量大或新颖的状态。
常见探索方式可以按信息来源分为:
| 方法 | 思路 | 适用特点 |
|---|---|---|
| ε-greedy | 以概率随机行动 | 简单,离散动作常用 |
| Boltzmann/softmax | 按价值的 softmax 概率采样 | 可以区分不同动作的价值差异 |
| 熵正则化 | 鼓励策略保持高熵 | PPO、SAC 等策略方法常用 |
| 乐观初始化 | 未知动作初始价值设高 | 表格方法简单有效 |
| 计数/伪计数 | 访问越少,内在奖励越大 | 状态空间较小或可构造表示 |
| Intrinsic Curiosity/RND | 对新颖或难预测状态奖励 | 稀疏奖励和长探索链 |
4. 有模型时:动态规划、策略迭代和价值迭代
动态规划(Dynamic Programming, DP)假设我们知道环境模型,也就是知道 p(s',r | s,a)。这在真实环境中往往不成立,但它是理解 Bellman 递归最干净的起点。
4.1 策略评估
给定一个固定策略 π,反复使用 Bellman 期望方程更新价值:
1 | V_{k+1}(s) ← Σ_a π(a|s) Σ_{s',r} p(s',r|s,a) [r + γ V_k(s')] |
当 V_{k+1} 和 V_k 足够接近时,就得到 V^π 的近似。这叫迭代策略评估。
4.2 策略改进
有了 V^π 后,可以对每个状态选择一步看起来最好的动作:
1 | π'(s) = argmax_a Σ_{s',r} p(s',r|s,a) [r + γ V^π(s')] |
策略改进定理保证,贪心改进后的策略不会比原策略差。在有限空间中,不断执行“评估 → 改进”,就得到策略迭代(Policy Iteration)。
4.3 价值迭代
策略迭代每轮需要把价值函数评估到收敛;价值迭代则把评估和改进合并:
1 | V_{k+1}(s) ← max_a Σ_{s',r} p(s',r|s,a) [r + γ V_k(s')] |
这就是 Bellman 最优性算子的反复应用。价值迭代通常更简单,但每次更新都需要遍历动作和后继状态。
DP 给出了一个重要的抽象:强化学习中的“学习”可以理解为不断寻找一个满足 Bellman 关系的固定点。区别只在于,现实中我们通常不知道模型,只能用采样经验估计右侧。
5. 不知道模型时:Monte Carlo 和 Temporal Difference
5.1 Monte Carlo:等一局结束再算账
Monte Carlo 方法不需要知道转移概率,只需要完整的 episode。对于在时刻 t 访问过的状态,使用实际观察到的回报 G_t 更新:
1 | V(S_t) ← V(S_t) + α [G_t - V(S_t)] |
这里的误差 G_t - V(S_t) 是 Monte Carlo 误差。它的优点是目标不依赖当前价值估计,因此在表格场景下较直观;缺点是必须等待 episode 结束,而且完整回报可能方差很大。
5.2 TD(0):走一步就更新
TD(0) 不等待最终结果,而是用一步奖励和下一状态的当前估计作为目标:
1 | V(S_t) ← V(S_t) + α [R_{t+1} + γ V(S_{t+1}) - V(S_t)] |
方括号里的量称为 TD error:
1 | δ_t = R_{t+1} + γ V(S_{t+1}) - V(S_t) |
TD 的关键是 bootstrapping:用一个估计去更新另一个估计。它不需要等待 episode 结束,适合 continuing task,通常比纯 Monte Carlo 更快得到学习信号,但目标会带来偏差。
从形式上看:
- Monte Carlo 使用
G_t作为目标,方差大、偏差小; - TD(0) 使用
R_{t+1} + γ V(S_{t+1}),方差小、可能有偏; - n-step 方法在二者之间取折中;
- TD(λ) 对不同步数的 return 做加权。
5.3 n-step return 和 TD(λ)
n-step return 把前 n 步真实奖励和 n 步后的价值估计结合起来:
1 | G_t^{(n)} = R_{t+1} + γ R_{t+2} + ... + γ^{n-1} R_{t+n} + γ^n V(S_{t+n}) |
当 n=1 时是 TD(0),当 n 足够大并到达终点时接近 Monte Carlo。TD(λ) 可以理解为对多种 n-step return 加权平均,也可以用 eligibility trace 在线实现。λ 越大,通常越接近 Monte Carlo;λ 越小,越接近短步 TD。
这组方法背后的核心取舍在现代算法中依然存在:目标越短,偏差可能越大但方差较小;目标越长,信用分配更直接但方差更高。
6. 价值函数控制:SARSA、Q-learning 和 Expected SARSA
预测只是在给定策略下估计价值;控制则要让策略变得更好。对于离散动作问题,最典型的做法是直接学习动作价值 Q(s,a)。
6.1 SARSA:按照实际策略学习
SARSA 的名字来自更新所用的五元组:
1 | (S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}) |
更新为:
1 | Q(S_t,A_t) ← Q(S_t,A_t) |
A_{t+1} 是按照当前行为策略实际选择的动作。如果行为策略是 ε-greedy,那么 SARSA 学到的是“带着探索行为执行时”的价值,因此它是 on-policy 方法。
在悬崖行走这类任务中,SARSA 会意识到靠近悬崖的路径虽然贪心最短,但探索时容易掉下去,于是可能选择更安全的路线。
6.2 Q-learning:向最优动作看齐
Q-learning 的更新为:
1 | Q(S_t,A_t) ← Q(S_t,A_t) |
关键区别是:下一步目标使用 max_a,而不是行为策略实际选到的 A_{t+1}。因此它可以用 ε-greedy 采集数据,却向贪心最优策略学习,是典型的 off-policy 方法。
把 Q-learning 的目标写成:
1 | y_t = r_{t+1} + γ max_{a'} Q(s_{t+1}, a') |
就会发现它其实是对 Bellman 最优性方程的随机近似。
6.3 Expected SARSA
Expected SARSA 不使用某一个实际采样的下一动作,而是对行为策略下的动作价值求期望:
1 | y_t = r_{t+1} + γ Σ_{a'} π(a'|s_{t+1}) Q(s_{t+1},a') |
它可以减少目标的采样噪声,介于 SARSA 和 Q-learning 之间。
6.4 三种方法的对比
| 算法 | 下一步目标 | 策略属性 | 直觉 |
|---|---|---|---|
| SARSA | Q(s', a'),a’ 为实际执行动作 |
On-policy | 学习“我真的会怎么做” |
| Q-learning | max_a Q(s',a) |
Off-policy | 学习“如果以后都选最好动作” |
| Expected SARSA | `Σ π(a’ | s’)Q(s’,a’)` | 通常 on-policy |
6.5 表格算法的边界
在有限状态、有限动作、满足适当学习率和探索条件时,表格 Q-learning 有漂亮的收敛理论。但把表格换成神经网络以后,情况会复杂很多:
- 不同状态的参数共享,某个样本的更新会影响很多其他状态;
- TD 目标本身由网络生成,目标会随网络移动;
- 连续采样的经验高度相关;
max会放大估计误差。
DQN 的历史贡献,正是用一组工程机制把这些问题控制在可训练范围内,而不是简单地“把 Q 表换成 CNN”。
7. DQN:从 Q-learning 到深度强化学习
7.1 DQN 解决了什么问题
DQN 用神经网络 Q_θ(s,a) 近似动作价值函数。给定状态,网络输出所有离散动作的 Q 值;选择动作时可以使用 ε-greedy。
单条转移 (s,a,r,s',done) 的 TD 目标为:
1 | y = r 如果 done |
训练损失是:
1 | L(θ) = E[(y - Q_θ(s,a))²] |
这和监督学习很像:网络预测一个 Q 值,目标由奖励和下一状态价值组成。但这个目标不是静态标签,而是网络自己参与生成的 bootstrap label。
7.2 经验回放:打破相关性并重复利用数据
智能体连续产生的样本具有强时间相关性:相邻帧的画面和动作往往很相似。如果直接按时间顺序训练,神经网络容易过拟合短期相关模式,梯度也不符合通常 SGD 所假设的随机采样。
经验回放(experience replay)维护一个 buffer:
- 与环境互动,把
(s,a,r,s',done)放入 buffer; - 从 buffer 中随机采样 mini-batch;
- 用这批样本更新 Q 网络;
- 同一条经验可以被多次使用。
这同时带来两个好处:降低样本相关性、提高样本利用率。代价是数据分布变成了历史行为策略的混合分布,因此 DQN 是 off-policy。
7.3 目标网络:让目标暂时稳定
如果用同一个网络同时计算当前值和目标值:
1 | y = r + γ max_a Q_θ(s',a) |
每次更新 θ,目标 y 也会跟着变化,容易产生震荡。DQN 引入一个延迟更新的目标网络 Q_{θ_target}:
1 | y = r + γ max_a Q_{θ_target}(s',a) |
在线网络每一步更新,目标网络每隔 C 步复制一次参数;或者用软更新:
1 | θ_target ← τ θ + (1 - τ) θ_target |
目标网络并没有让目标变成真正正确,只是让它在一段时间内变化得慢一些,降低自举反馈的剧烈程度。
7.4 DQN 的训练循环
1 | for each environment step: |
这里特意把 terminated 和 truncated 分开。Gymnasium 新 API 用 terminated 表示任务本身结束,用 truncated 表示时间限制等外部截断。对于 TD bootstrap,是否停止 bootstrap 取决于任务语义;把两者无脑合并成一个 done 可能造成价值估计偏差。
7.5 “致命三元组”
强化学习里有一个很有用的诊断框架:下面三个因素同时出现时,训练容易不稳定:
- 函数逼近:例如神经网络;
- bootstrapping:用估计目标更新估计值;
- off-policy:训练数据来自与当前目标策略不同的行为策略。
DQN 三者都有。经验回放处理样本相关性,目标网络处理目标移动,Double DQN 缓解最大化带来的过估计,梯度裁剪和奖励缩放处理数值问题。它们不是装饰,而是围绕这个三元组的稳定化设计。
7.6 DQN 家族的主要改进
Double DQN 把“选择动作”和“评价动作”分开:
1 | a* = argmax_a Q_online(s', a) |
这样可以减少因为对多个带噪声估计取最大值而产生的过估计。Double Q-learning 的核心问题就是:E[max X] 通常大于 max E[X]。
Dueling DQN 将 Q 值拆成状态价值和优势:
1 | Q(s,a) = V(s) + A(s,a) |
在很多动作都差不多的状态中,单独估计“这个状态有多好”会更有效。
Prioritized Experience Replay 按 TD error 的大小提高某些经验的采样概率,让网络更多关注“意外”或“学得不好的”样本,但需要重要性采样权重修正偏差。
Distributional RL 不只估计回报的均值,而是学习回报分布;这使模型能够表达风险、偏度和多峰结构。
Noisy Networks 把探索直接放进网络参数噪声中,替代或补充 ε-greedy。
将这些改进组合起来的 Rainbow 说明了一个事实:DQN 的性能不仅由网络深度决定,目标构造、数据分布和探索机制同样重要。
8. 策略梯度:直接优化策略
价值方法先估计 Q,再通过 argmax 选动作;策略梯度方法则直接用参数化策略 π_θ(a|s) 表示“应该怎么行动”,最大化期望回报:
1 | J(θ) = E_{τ ~ π_θ} [G_0] |
它的优势是:
- 天然支持连续动作;
- 可以直接表达随机策略;
- 可以把结构先验放进策略参数化;
- 不需要对动作空间做显式
argmax。
代价是梯度估计通常方差较大,且 on-policy 版本需要不断采集新数据。
8.1 从 log-derivative trick 得到 REINFORCE
轨迹概率可以分解为:
1 | p_θ(τ) = p(s_0) Π_t π_θ(a_t|s_t) p(s_{t+1}|s_t,a_t) |
环境转移不依赖 θ,因此对数轨迹概率的梯度只包含策略项:
1 | ∇_θ log p_θ(τ) = Σ_t ∇_θ log π_θ(a_t | s_t) |
于是得到经典的 REINFORCE 估计:
1 | ∇_θ J(θ) ≈ Σ_t ∇_θ log π_θ(a_t|s_t) G_t |
直观上:如果一条轨迹回报高,就提高这条轨迹中动作的概率;如果回报低,就降低它们的概率。它是无偏的(在满足条件时),但一条轨迹的回报会同时乘到很多动作上,导致方差很大。
8.2 Baseline 和 Advantage
可以从回报中减去一个不依赖动作的 baseline b(s_t),而不改变期望梯度:
1 | ∇_θ J(θ) ≈ Σ_t ∇_θ log π_θ(a_t|s_t) [G_t - b(s_t)] |
最常用的 baseline 是状态价值 V(s_t),此时括号中的量接近优势函数:
1 | A(s_t,a_t) ≈ G_t - V(s_t) |
baseline 的作用不是让“好动作变成坏动作”,而是让更新关注动作相对于当前状态平均水平的好坏,显著降低方差。
8.3 Actor-Critic
Actor-Critic 把两个角色分开:
- Actor:策略网络
π_θ(a|s),负责选动作; - Critic:价值网络
V_φ(s)或Q_φ(s,a),负责评价动作和产生学习信号。
Critic 可以用 TD error:
1 | δ_t = r_{t+1} + γ V_φ(s_{t+1}) - V_φ(s_t) |
Actor 更新大致为:
1 | θ ← θ + α ∇_θ log π_θ(a_t|s_t) δ_t |
Critic 则用 TD 目标回归:
1 | φ ← φ - β ∇_φ [r_{t+1} + γ V_φ(s_{t+1}) - V_φ(s_t)]² |
Actor-Critic 用较低方差的 TD 信号替代完整回报,但引入了 Critic 偏差。如果 Critic 估得很差,Actor 就会被错误的优势函数带偏。
8.4 GAE:优势估计的偏差—方差旋钮
定义一阶 TD residual:
1 | δ_t^V = r_{t+1} + γ V(s_{t+1}) - V(s_t) |
GAE(Generalized Advantage Estimation)将多个 residual 衰减加权:
1 | Â_t^GAE(γ, λ) = δ_t^V + (γλ) δ_{t+1}^V |
λ 是偏差—方差之间的重要旋钮:λ 较小更依赖短期 Critic,方差小但偏差可能大;λ 接近 1 更接近 Monte Carlo,偏差小但方差可能高。PPO 实现中经常配合 GAE 使用。
9. 从 TRPO 到 PPO:让策略更新不要迈太大步
9.1 为什么普通策略梯度会崩
一次策略梯度更新可能让动作概率发生巨大变化。旧数据是在旧策略下采集的,如果新策略与旧策略差别太大,旧数据对新策略的估计就不再可靠;同时策略性能对参数变化可能很敏感,稍大的更新就可能掉进很差的区域。
TRPO 的思路是:在提升代理目标的同时,约束新旧策略之间的 KL 散度,让更新处于一个信赖域(trust region)内。它理论上更稳,但需要处理二阶近似和约束优化,实现复杂。
9.2 PPO 的 clipped objective
PPO 使用概率比:
1 | r_t(θ) = π_θ(a_t|s_t) / π_{θ_old}(a_t|s_t) |
如果我们已有优势估计 Â_t,最朴素的 surrogate objective 是:
1 | L^PG(θ) = E[r_t(θ) Â_t] |
PPO 将比值截断到 [1-ε, 1+ε]:
1 | L^CLIP(θ) = E[min( |
当优势为正时,策略概率不能无限增大;当优势为负时,概率也不能无限减小。这样可以用普通 mini-batch SGD 做多轮更新,同时限制策略远离采样策略。
PPO 的常见总损失还包括:
1 | L = L_actor + c_v L_value - c_ent H(π) |
其中 L_value 是 Critic 回归损失,H(π) 是策略熵,熵项鼓励探索。实践中还要监控近似 KL,如果策略偏移过大,可以提前停止本轮更新。
9.3 PPO 的优点和边界
PPO 流行的原因是接口简单、实现相对稳健、对很多连续控制和离散动作任务都有效。但它不是万能算法:
- 它通常是 on-policy,旧数据不能长期重复使用,样本效率不如 off-policy 方法;
- 需要大量并行环境才能高效采样;
- clip 并不提供绝对的单调改进保证;
- 对奖励尺度、优势归一化、episode 截断处理、batch 大小和学习率仍然敏感。
10. 连续动作:DDPG、TD3 与 SAC
当动作是转向角、关节力矩或油门这类连续变量时,直接维护每个动作的 Q 值不可行。常见路线是使用 Actor 直接输出动作,同时用 Critic 评价它。
10.1 DDPG:连续动作版的深度 Q-learning 直觉
DDPG 使用确定性策略 a = μ_θ(s) 和 Q 网络 Q_φ(s,a)。Critic 的目标为:
1 | y = r + γ Q_φ_target(s', μ_θ_target(s')) |
Actor 通过最大化 Critic 给出的 Q 值更新:
1 | ∇_θ J ≈ E[ ∇_a Q_φ(s,a)|_{a=μ_θ(s)} ∇_θ μ_θ(s) ] |
DDPG 继承了 DQN 的经验回放和目标网络,也需要给动作加噪声以探索。它样本效率较高,但对超参数、奖励尺度和 Q 估计误差敏感。
10.2 TD3:针对函数逼近误差的三项修正
TD3 可以看成对 DDPG 的稳定化版本,主要有三项设计:
- Twin Critics:训练两个 Q 网络,目标时取较小值,缓解过估计;
- Delayed Policy Updates:Critic 更新多次后再更新 Actor,避免 Actor 追逐还不稳定的 Q;
- Target Policy Smoothing:给目标动作加小噪声并截断,避免 Critic 利用动作空间中的尖锐误差峰。
TD3 说明了一个重要经验:连续控制里 Actor 的梯度完全依赖 Critic 的局部形状,如果 Critic 存在尖锐或过高的错误估计,Actor 会主动把策略推向错误区域。
10.3 SAC:最大熵强化学习
SAC 不只最大化期望回报,还鼓励策略保持熵:
1 | J(π) = E[ Σ_t γ^t (r_{t+1} + α H(π(·|s_t))) ] |
其中 α 控制奖励和随机性之间的权衡。最大熵的直觉是:在完成任务的同时,保留多个合理动作,不要过早变成脆弱的确定性策略。对于机器人控制,这种随机性还可能帮助探索和提高鲁棒性。
现代 SAC 通常使用随机 Actor、双 Q 网络、目标价值网络和自动温度调节。温度参数可通过目标熵自动调整:策略过于确定时增加探索压力,策略过于随机时减少熵惩罚。
10.4 连续动作算法怎么选
| 算法 | 数据 | Actor | 主要特点 | 使用建议 |
|---|---|---|---|---|
| DDPG | Off-policy | 确定性 | 结构直观、较老 | 适合学习机制,不一定作为首选 |
| TD3 | Off-policy | 确定性 | 双 Critic、延迟更新、平滑目标 | 连续控制的强基线 |
| SAC | Off-policy | 随机性 | 最大熵、通常稳定、样本效率高 | 连续控制常用默认选择 |
| PPO | On-policy | 随机性 | 实现简单、调参经验多 | 有并行环境、希望训练流程简单时 |
11. Model-free 和 Model-based:要不要学习世界模型
11.1 Model-free
Model-free 方法不显式学习环境转移规律,只学习策略或价值。DQN、PPO、SAC 都属于这一大类。优点是目标直接、实现相对简单;缺点是通常需要很多真实交互,遇到奖励稀疏或样本昂贵的任务会很困难。
11.2 Model-based
Model-based 方法学习一个环境模型,例如:
1 | ŝ_{t+1} = f_ψ(s_t, a_t) |
也可以学习奖励模型 r̂ = r_ψ(s,a)。有了模型之后,可以:
- 在模型中模拟未来轨迹;
- 使用模型预测控制(MPC)在每一步做短期规划;
- 用模型生成虚拟数据辅助训练策略;
- 用 MCTS 做搜索;
- 学习 latent dynamics,让模型不必重建全部像素。
11.3 Dyna 的统一视角
Dyna 把真实经验和模型生成的经验放进同一个学习循环:
- 与真实环境互动,更新模型;
- 用真实样本更新价值或策略;
- 从模型中采样虚拟转移,再更新价值或策略;
- 重复。
它展示了 model-based 和 model-free 并不是二选一。模型可以作为规划器,也可以只是一个帮助生成额外训练数据的工具。
11.4 模型偏差是主要代价
如果模型有微小误差,短期预测可能还不错;但长时间 rollout 会把误差反复累积,甚至生成真实环境中不存在的状态。于是 model-based 方法通常采用短 rollout、随时间衰减模型样本权重、在真实数据上校正模型,或在 latent space 中学习更适合决策的表示。
12. 奖励设计、信用分配和探索
12.1 奖励不是评价指标的同义词
强化学习优化的就是你给出的奖励函数。如果奖励函数和真正目标不一致,智能体非常可能“投机取巧”:
- 游戏中刷一个容易获得但与胜利无关的分数;
- 机器人为了减少能耗而不再移动;
- 对话模型为了获得偏好模型高分而学会迎合,而不是提供真实可靠的信息。
因此在工程任务中要区分:
- 训练奖励:可以密集、平滑、适合优化;
- 评估指标:衡量最终真实目标,不能只看训练奖励;
- 安全约束:不能简单等价成可被钻空子的软奖励时,要考虑硬约束或安全层。
12.2 Reward shaping
最直接的 shaping 是把稀疏奖励变成稠密奖励,例如每靠近目标一点就加分。但任意 shaping 都可能改变最优策略。一个经典的安全构造是 potential-based shaping:
1 | F(s,a,s') = γ Φ(s') - Φ(s) |
在满足条件时,它可以改变学习速度而不改变最优策略集合。实践中仍然需要验证:潜势函数是否真的表达了“接近目标”,是否会与原始奖励的尺度冲突。
12.3 长期信用分配
如果最终奖励只在 episode 末尾出现,究竟是哪一步动作导致了成功?这是信用分配(credit assignment)问题。缓解方法包括:
- n-step return 和 TD(λ);
- GAE;
- 层级强化学习,把长任务拆成子目标;
- curriculum learning,逐渐增加任务难度;
- hindsight experience replay,把失败轨迹重新解释成到达了另一个目标;
- model-based planning,使用模型搜索中间结果。
13. 从算法到工程:真正训练一个智能体需要注意什么
13.1 先把任务定义完整
在写网络之前,先明确:
- 状态/观测是否包含做出决策所需信息?
- 动作空间是离散、连续,还是混合动作?
- episode 什么时候真正终止?时间限制是否只是 truncation?
- 奖励是稠密还是稀疏?正负号和尺度是否合理?
- 是否存在安全约束、动作边界和不可逆风险?
- 训练时能看到的信息是否与部署时一致?
很多所谓“算法不工作”的问题,实际是状态不满足 Markov 性、奖励定义有漏洞,或终止信号处理错误。
13.2 算法选择速查
| 任务特征 | 起步算法 |
|---|---|
| 小型离散状态和动作 | SARSA 或 Q-learning 表格版 |
| 图像输入、离散动作 | DQN 家族 |
| 低维状态、离散或连续动作,想先验证流程 | PPO |
| 连续控制、交互成本高 | SAC 或 TD3 |
| 已有大量固定轨迹、不能在线探索 | Offline RL 方法,先不要直接套在线 PPO |
| 环境模型可用或可以可靠学习 | Model-based、MPC 或混合方法 |
| 观测部分可见 | 先考虑帧堆叠、RNN 或状态估计 |
这只是起点,不是排行榜。一个简单、可解释的 baseline 往往比一开始堆复杂组件更有价值。
13.3 训练和评估必须分离
训练时需要探索,评估时通常关闭随机探索或固定随机种子。建议至少记录:
- 每个 episode 的 undiscounted return;
- episode 长度;
- 成功率、约束违反率和任务特定指标;
- Q 值均值/最大值、TD error 分布;
- Actor 的熵和动作分布;
- policy loss、value loss、entropy loss;
- 采样速度、环境步数和 wall-clock time;
- 多个随机种子的均值和方差。
不要只看训练曲线最后一个点。强化学习曲线通常方差很大,单个 seed 的漂亮结果很可能不可复现。
13.4 归一化和尺度
状态特征尺度差异过大时,网络优化会变困难;连续动作通常要归一化到 [-1, 1],再映射到环境动作范围。奖励尺度也会影响 TD target、Critic 梯度和熵系数。常见做法包括:
- 运行均值/方差归一化观测;
- 对奖励做固定缩放或裁剪;
- 对优势做 batch 标准化;
- 对梯度做裁剪;
- 对动作输出使用
tanh并正确处理 log probability 的变换。
归一化不是越多越好。要记录原始奖励,避免因为缩放后曲线看起来正常而掩盖真实问题。
13.5 终止状态和时间截断
这是最容易被忽略、却会系统性影响价值估计的一点。
- 任务真正失败或成功,下一状态没有可继续的未来:通常不 bootstrap;
- 只是因为达到最大步数而截断,任务本身可能还没结束:是否 bootstrap 要按环境任务定义处理。
如果把所有 terminated 和 truncated 都当成同一个 done,长时域任务的价值可能被低估。Gymnasium 的 step 返回值已经把二者拆开,应该在数据结构中保留这个区别。
13.6 常见失败模式诊断表
| 现象 | 可能原因 | 首先检查什么 |
|---|---|---|
| 奖励完全不涨 | 奖励太稀疏、探索不足、状态错误 | 随机策略是否偶尔成功,奖励是否真的可达 |
| 奖励突然爆炸后崩溃 | Q 过估计、学习率大、目标不稳定 | target network、双 Q、梯度和奖励尺度 |
| 训练奖励高但评估差 | 过拟合、探索导致的评估混淆、奖励漏洞 | 关闭探索的独立评估和真实指标 |
| 每个 seed 结果差很多 | 高方差、环境非确定性、超参数敏感 | 多 seed、记录环境和库版本 |
| PPO policy loss 很好但任务不进步 | Critic 错、优势估计错、策略偏移过大 | value loss、KL、advantage 分布 |
| SAC 动作几乎不动 | 熵系数、动作缩放或 log-prob 修正错误 | action range、alpha、entropy 曲线 |
| DQN 学到固定动作 | ε 衰减过快、Q 偏置、状态信息不足 | 探索率、Q 值分布和输入帧 |
13.7 可复现性清单
至少固定和记录:
- Python、PyTorch、Gymnasium 和环境版本;
- Python、NumPy、框架、环境的随机种子;
- CPU/GPU、确定性算法设置;
- 网络结构、初始化、优化器、学习率和 batch 大小;
- 训练总环境步数,而不是只记录 epoch;
- 评估协议、动作选择方式和环境 wrapper;
- checkpoint、配置文件和完整日志。
强化学习的“样本效率”应该以环境交互步数衡量;“训练速度”则应该同时报告 wall-clock time。两者不是一回事。
14. 一条从零到能读论文、能写代码的学习路线
阶段一:把符号和 Bellman 方程写熟
目标不是背定义,而是能解释以下每一项:
1 | V^π(s)、Q^π(s,a)、A^π(s,a)、G_t、δ_t、γ |
建议自己推一遍 Bellman expectation equation、Bellman optimality equation,并在一个小网格上手算几轮价值迭代。
阶段二:表格方法
按下面顺序实现:
- 多臂老虎机的 ε-greedy;
- GridWorld 的策略评估和价值迭代;
- Monte Carlo prediction;
- TD(0) prediction;
- SARSA;
- Q-learning。
每个实现都应该能画出 episode return,并比较不同 ε、α、γ 对结果的影响。
阶段三:最小深度强化学习
推荐实现顺序是:
- 用一个小 MLP 做 REINFORCE;
- 加入 value baseline,变成最简单的 Actor-Critic;
- 用经验回放和目标网络实现 DQN;
- 在 DQN 上加入 Double DQN;
- 实现 GAE 和 PPO;
- 选择 TD3 或 SAC 理解连续控制。
每次只增加一个机制。这样遇到问题时,才知道是 replay、target network、advantage、entropy 还是环境本身出了问题。
阶段四:从“能跑”到“可信”
接下来要学习的不是更多算法名字,而是实验方法:
- 多随机种子和置信区间;
- baseline 和 ablation;
- 超参数敏感性;
- 训练/评估分离;
- reward hacking 和安全约束;
- offline data 的分布外动作问题;
- sim-to-real 的模型偏差和现实约束。
15. 进阶方向的地图
15.1 离线强化学习
在线 RL 可以主动收集新数据;离线 RL 只有一个固定数据集。最大的困难是:策略可能选择数据集中没有覆盖的动作,而价值函数却对这些分布外动作产生过度乐观的估计。CQL、IQL 等方法通过保守估计、行为约束或隐式策略提取来缓解这个问题。
“有很多历史日志”并不等于可以直接训练 PPO。PPO 需要当前策略采集的 on-policy 数据;离线数据更适合专门的 offline RL、行为克隆或带约束的策略优化方法。
15.2 模仿学习和逆强化学习
模仿学习从专家动作中学习策略,行为克隆最简单:把 (state, expert_action) 当成监督学习数据。但分布偏移会让一个小错误把策略带到专家没覆盖的状态。DAgger 通过让专家纠正当前策略访问的状态来缓解。
逆强化学习则尝试从专家行为反推出奖励函数,再用 RL 优化这个奖励。它适合“知道专家怎么做,但不知道怎样定义奖励”的场景。
15.3 层级强化学习
长任务可以拆成高层选择子目标/技能,低层执行动作。Options framework、goal-conditioned policy 和 skill discovery 都属于这个方向。层级结构可以缩短信用分配距离,但同时要学习“什么时候切换技能”和“子目标怎样定义”。
15.4 多智能体强化学习
多个智能体一起学习时,环境对单个智能体看起来会不断变化,因为其他智能体的策略也在更新。合作、竞争、通信、信用分配和集中训练/分散执行(CTDE)是核心问题。单智能体算法的稳定性不能直接保证在多智能体场景中成立。
15.5 规划、世界模型和搜索
AlphaGo/AlphaZero、MCTS、Dreamer、MuZero 等工作展示了策略学习、价值学习、模型学习和搜索之间的不同组合方式。它们共同指向一个更广的观点:智能体不一定只靠“看到经验后立即更新参数”,也可以在内部进行预测、想象和规划。
15.6 RLHF 和偏好优化放在什么位置
RLHF 通常包含奖励建模和策略优化:先从人类偏好数据学习一个奖励/偏好模型,再用 PPO 等方法优化语言模型,或使用 DPO 等不显式在线 RL 的偏好优化方法。它和机器人控制里的 RL 共用 return、policy、value 等概念,但数据来源、动作空间、序列长度、奖励模型误差和安全问题都不同。不能把“用了偏好数据”简单等同于“已经解决了强化学习”。
16. 最后再把整条主线压缩一遍
可以用下面这条链条回忆强化学习:
1 | MDP |
如果只记住一个判断框架,可以在读任何新算法时问五个问题:
- 它优化的是
V、Q、π,还是环境模型? - 它的目标是 Monte Carlo、TD、n-step 还是某种模型 rollout?
- 它使用的是 on-policy 数据还是 replay/offline 数据?
- 它如何解决探索、估计偏差和更新不稳定?
- 它的动作空间、观测可见性和数据成本分别是什么?
当这五个问题可以回答时,绝大多数新算法都会变成已知组件的重新组合,而不是一串需要死记的缩写。
参考资料与延伸阅读
下面的资料按“基础教材 → 课程/教程 → 经典论文 → 工程接口”的顺序排列。链接在 2026 年 8 月整理,论文和课程的版本可能会更新。
- Richard S. Sutton, Andrew G. Barto, Reinforcement Learning: An Introduction, 2nd Edition:最重要的基础教材,覆盖 MDP、DP、Monte Carlo、TD、函数逼近、策略梯度和资格迹。
- MIT Press:Reinforcement Learning: An Introduction:教材的出版信息。
- David Silver 的强化学习课程入口:适合配合视频和讲义建立直觉。
- OpenAI Spinning Up in Deep RL:将基础概念、策略梯度、PPO、DDPG、TD3、SAC 和实验实践串在一起。
- Gymnasium 官方文档:当前常用的强化学习环境接口;重点关注
terminated与truncated的区别。 - Sutton, 1988, Learning to Predict by the Methods of Temporal Differences:理解 TD 学习起源和预测视角。
- Williams, 1992, Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning:REINFORCE 的经典论文。
- Sutton et al., 1999, Policy Gradient Methods for Reinforcement Learning with Function Approximation:策略梯度定理的经典来源。
- Mnih et al., 2015, Human-level control through deep reinforcement learning:DQN 将深度网络用于高维视觉输入的代表性工作。
- Hasselt, 2010, Double Q-learning:理解最大化导致的过估计。
- Schulman et al., 2015, High-Dimensional Continuous Control Using Generalized Advantage Estimation:理解 GAE 和优势估计。
- Schulman et al., 2015, Trust Region Policy Optimization:PPO 之前的信赖域策略优化路线。
- Schulman et al., 2017, Proximal Policy Optimization Algorithms:PPO 的原始论文。
- Lillicrap et al., 2015, Continuous control with deep reinforcement learning:DDPG 的代表性论文。
- Fujimoto et al., 2018, Addressing Function Approximation Error in Actor-Critic Methods:TD3 及其对 Critic 误差的处理。
- Haarnoja et al., 2018, Soft Actor-Critic Algorithms and Applications:最大熵强化学习与 SAC。
这篇文章适合作为目录和复习笔记,不替代对教材章节和原始论文的精读。最有效的下一步通常不是继续收藏资料,而是选一个很小的环境,把同一个任务分别用表格 Q-learning、REINFORCE、DQN 和 PPO 跑通,再对照日志解释每个曲线为什么变化。