简介:《强化学习的数学原理》是西湖大学赵世钰教授撰写的英文专著,面向具备线性代数、概率论与优化基础的研究生及算法工程师,系统解决强化学习理论根基薄弱、公式推导模糊、算法理解流于表面等核心痛点。全书10章+附录,从网格世界直观示例切入,严格推导贝尔曼方程、贝尔曼最优方程、值迭代与策略迭代的收敛性,深入剖析蒙特卡洛、时序差分、策略梯度与Actor-Critic等主流方法的数学本质,并在附录中严谨论证序列收敛条件,为算法设计与改进提供可验证的理论支撑。资源为单文件PDF(18.9MB),内容完整覆盖全部章节与习题问答,排版清晰、公式规范、示例详实,便于精读推演与课堂讲授参考。目前已有837人学习下载,适合希望夯实RL数学基础、突破工程直觉局限、开展理论驱动型研究的学习者。
1. 这不是一本讲“怎么调参”的强化学习书:它专治数学直觉断层、公式推导卡壳、算法落地时突然不会写目标函数的痛
如果你在复现 DQN 时对着 loss = -log(π(a|s)) + α·H(π) 发呆,不确定熵项该不该求梯度;如果你读 Sutton 的《Reinforcement Learning: An Introduction》第 6 章贝尔曼方程时,反复画转移图却仍说不清为什么 v_π(s) = Σ_a π(a|s) Σ_{s',r} p(s',r|s,a)[r + γv_π(s')] 中的期望要套两层求和;如果你在调试 PPO 的 clip ratio 时,发现改了 ε 却对策略更新幅度毫无感知——这本书就是为你写的。赵世钰老师这本《强化学习的数学原理》不堆代码、不列超参表格、不教 PyTorch 怎么搭 Actor-Critic 网络,而是用连续三章(第 3–5 章)把马尔可夫决策过程(MDP)的测度定义、策略映射的可测性条件、值函数空间上的压缩映射范式,全拆成带 ε-δ 语言的严格陈述。它面向的是已经跑通过至少一个 RL 算法 demo、但一碰理论就掉链子的实践者:某高校强化学习课程助教、某自动驾驶仿真组刚接手 reward shaping 的工程师、某机器人控制方向研究生——你们缺的不是“再看一遍伪代码”,而是能让你在写 policy gradient 推导时,敢把 ∇_θ 𝔼_{τ∼π_θ}[R(τ)] 拆成 ∫ ∇_θ log π_θ(a|s) · Q^π_θ(s,a) dρ^π_θ(s,a) 并确认每一步积分换序是否合法的数学底气。这不是入门读物,是当你在 GitHub issue 里被问“你这个 advantage estimator 是不是有 bias?”时,能立刻翻到第 7 章第 4 节查清 GAE(λ) 的无偏性边界条件的工具书。
2. 从状态转移概率的测度定义出发:为什么 RL 理论必须先谈可测性与 σ-代数
2.1 为什么不能直接写 p(s′,r∣s,a),而要先定义 (S,ℱ_S) 和 (R,ℱ_R)?
很多初学者看到 MDP 定义里“状态集 S、动作集 A、奖励集 R”就默认它们是离散有限集合,于是把 p(s′,r∣s,a) 当作一个二维数组来理解。但赵世钰老师在第 2 章开篇就指出:当 S 是连续空间(如机械臂关节角向量 ∈ ℝ³)、R 是实数区间(如能耗值 ∈ [0,100])时,“概率”本身需要明确定义在哪个 σ-代数上。他没有跳过这一步,而是用具体例子说明后果:
# 错误示范:假设状态是连续的,却用离散方式采样并计算"概率" import numpy as np s = np.random.uniform(-1, 1, size=3) # 连续状态 s ∈ [-1,1]^3 # 若直接写 p_next = model.predict(s) → 得到一个 100 维向量,误以为是"100 个离散状态的概率" # 但真实物理系统中,s′ 落在某个小球 B_ε(s₀) 内的概率应为 ∫_{B_ε(s₀)} p(s′|s,a) ds′ # 这个积分存在,前提是 p(·|s,a) 是关于 Borel σ-代数 ℱ_S 的概率密度函数提示:这里的
p(s′|s,a)不是 Python 数组索引,而是 Radon-Nikodym 导数 dP_{s,a}/dμ 的具体表达式,其中 μ 是 S 上预先选定的参考测度(常取 Lebesgue 测度)。书中第 2.2.3 节明确指出:若未指定 μ,则“密度函数”无定义;若 μ 选错(如对高斯过程用计数测度),后续 KL 散度、策略优化中的变分推断全部失效。
2.2 策略 π(a|s) 的可测性:为什么神经网络输出 softmax 不自动满足理论要求?
书中第 3 章花了整整一节讨论“策略作为核(kernel)的可测性”。关键点在于:π 必须是从 (S,ℱ_S) 到 (A,ℱ_A) 的可测核,即对任意 B ∈ ℱ_A,映射 s ↦ π(B|s) 是 (S,ℱ_S)-可测函数。这对工程实现意味着什么?
- 若 A 是离散有限集(如 4 个动作),ℱ_A 取幂集,那么只要神经网络输出是连续函数(如 MLP+softmax),s ↦ π(a_i|s) 就自动可测(因连续函数必可测);
- 但若 A 是连续空间(如扭矩 ∈ ℝ),ℱ_A 取 Borel 集,此时标准高斯策略 π(a|s) = 𝒩(μ_θ(s), Σ_θ(s)) 要求 μ_θ 和 Σ_θ 都是可测函数——而实践中我们只保证它们是连续函数,书中第 3.4.2 节强调:“连续 ⇒ 可测”成立,但反过来不成立;因此用 ReLU/Softplus 构建的 μ_θ、Σ_θ 是安全的,但若用带 Dirac delta 的硬编码策略(如 a = argmax Q(s,·)),则需额外验证其可测性(通常不满足,故理论分析中需用 soft-argmax 近似)。
2.3 值函数空间的完备性:为什么 v ∈ ℬ(S) 而不是随便一个函数?
第 4 章引入值函数空间 ℬ(S) —— 所有有界可测函数构成的 Banach 空间,范数为 ‖v‖∞ = sup{s∈S} |v(s)|。这个设定不是炫技,而是为了启用压缩映射原理(Contraction Mapping Principle)证明贝尔曼最优算子 T^* 的不动点存在唯一。书中给出反例:若允许 v(s) = 1/(1−s) 在 s→1 时发散,则 T^*v 可能无定义;若 v 不可测,则 v∘f(如 v(s′) 在贝尔曼方程中)可能不可积。因此,所有后续算法(如值迭代、策略迭代)的收敛性证明,都依赖于初始猜测 v₀ ∈ ℬ(S)。实践中这意味着:你在初始化 critic 网络时,最后一层激活函数必须有界(如 tanh、sigmoid),且输出范围需显式裁剪(如 torch.clamp(v_pred, -V_max, V_max)),否则理论保障坍塌。
3. 贝尔曼方程的三种等价形式:从积分方程、泛函方程到随机近似视角的统一
3.1 积分形式:为什么 E_{s′,r} [...] 中的期望必须写成 ∫ r dF_{s,a}(r,s′)?
赵世钰老师在第 4.1 节强调:贝尔曼方程 v_π(s) = ∫ [r + γ v_π(s′)] dF_{s,a}(r,s′) 中的 dF_{s,a} 是联合分布函数,不是独立边缘分布的乘积。这是很多实现 bug 的根源。例如,在 off-policy 重要性采样中,若错误地将 dF_{s,a} 拆为 dF_s′(s′)·dF_r(r),就会忽略 r 与 s′ 的耦合关系(如碰撞时 r = −100 且 s′ 位于边界区域)。
# 正确:从经验回放缓冲区中按 (s,a,r,s′) 元组整体采样 batch = replay_buffer.sample(batch_size) # batch = {s, a, r, s_next, done} # 计算 target:r + γ * v_target(s_next) * (1 - done) # 这里 r 和 s_next 来自同一物理转移,保持了联合分布结构 # 错误:分别采样 r 和 s_next r_batch = np.random.choice(rewards_pool, batch_size) # 独立于 s_next s_next_batch = np.random.choice(states_pool, batch_size) # 独立于 r # 此时 E[r + γ v(s_next)] ≠ E_{真实转移}[r + γ v(s_next)],导致 bias3.2 泛函方程:T^π 作为 ℬ(S) 上的压缩映射,其 Lipschitz 常数为何严格等于 γ?
书中第 4.3 节给出关键推导:对任意 v₁,v₂ ∈ ℬ(S),
‖T^π v₁ − T^π v₂‖∞ = sup_s |∫ γ(v₁(s′) − v₂(s′)) dF{s,π(s)}(s′)| ≤ γ sup_s ∫ |v₁(s′) − v₂(s′)| dF_{s,π(s)}(s′) ≤ γ ‖v₁ − v₂‖∞
等号成立当且仅当 v₁ − v₂ 在 F{s,π(s)}-几乎处处同号且达到上确界。这个 γ 就是压缩比。它解释了为什么 γ=0.99 的训练比 γ=0.9 更慢(收敛阶数更高)、更不稳定(对初始 v₀ 更敏感)。实践中,若你观察到 value loss 下降极慢且震荡,先检查 γ 是否设得过大(>0.995),因为此时 (T^π)^k 的收缩率 (0.995)^k 在 k=1000 时仍有 ~0.006,远未进入线性收敛区。
3.3 随机近似视角:TD error δ_t = r_t + γ v(s_{t+1}) − v(s_t) 为何是鞅差序列?
第 5 章将 TD 学习置于随机逼近框架下。定义滤波流 ℱ_t = σ(s₀,a₀,…,s_t),则 δ_t 是 ℱ_{t+1}-可测的,且满足 𝔼[δ_t | ℱ_t] = 0 —— 这正是鞅差序列(martingale difference sequence)定义。书中指出:只有当 v 是 ℱ_t-可测(即 critic 网络输出只依赖当前 s_t,不偷看未来信息)且环境转移满足马尔可夫性时,该性质才成立。若你在 critic 输入中拼接了过去 5 帧状态(s_{t−4},…,s_t),则 δ_t 不再是 ℱ_t-鞅差,会导致 TD 更新偏差。解决方案是:要么改用 LSTM 并严格定义 ℱ_t 为隐藏状态历史,要么坚持马尔可夫假设,只输入 s_t。
4. 策略梯度定理的严格推导:从概率测度的参数化到 score function 的合法性
4.1 策略参数化 π_θ(a|s) 必须满足什么条件,才能对 ∇_θ log π_θ(a|s) 求期望?
第 6 章核心命题:若要使 ∇_θ 𝔼_{a∼π_θ(·|s)}[f(a)] = 𝔼_{a∼π_θ(·|s)}[∇_θ log π_θ(a|s) · f(a)] 成立,需满足Dominated Convergence Theorem(DCT)条件:存在可积函数 g(a),使得对所有 θ 在邻域内,|∇_θ log π_θ(a|s) · f(a)| ≤ g(a) 几乎必然成立。书中以高斯策略为例:π_θ(a|s) = 𝒩(μ_θ(s), σ²I),则 ∇_θ log π_θ = (a − μ_θ)ᵀ∇_θ μ_θ / σ²,此时若 f(a) 有界(如 reward bounded),且 ∇_θ μ_θ 有界(MLP 权重有界),则 DCT 成立;但若 σ² → 0(策略退化),则 ∇_θ log π_θ 爆炸,DCT 失效 —— 这解释了为何实际训练中必须加 entropy regularization 或固定最小方差。
4.2 REINFORCE 估计量的方差来源:为什么 baseline b(s) 必须是 s 的函数而非常数?
书中第 6.2.4 节给出方差分解:Var[∇_θ log π_θ(a|s) · (R − b)] = Var[∇_θ log π_θ(a|s) · R] − 2Cov[∇_θ log π_θ(a|s) · R, ∇_θ log π_θ(a|s) · b] + Var[∇_θ log π_θ(a|s) · b]。当 b 是常数时,后两项不抵消;而当 b = b(s) 是 s 的函数时,由于 𝔼_{a|s}[∇_θ log π_θ(a|s)] = 0,有 Cov[·, b(s)] = 0,从而方差降至最小。这就是为什么所有现代实现(如 A2C)的 baseline 都是 critic 网络 v_θ(s),而不是全局 reward 均值。书中还警告:若 b(s) 本身含 θ 参数(如用同一个网络输出 v_θ(s) 和 π_θ(a|s)),则 ∇_θ b(s) 项会引入额外 bias,需用 stop_gradient 处理。
4.3 Actor-Critic 的偏差-方差权衡:为什么 critic 更新滞后于 actor 是双刃剑?
第 7 章指出:Actor-Critic 中 critic 用于估计 Q^π(s,a),但实际用 v_φ(s) 近似 v^π(s),再通过 δ_t = r_t + γ v_φ(s_{t+1}) − v_φ(s_t) 更新 actor。此时 actor 梯度为 ∇_θ log π_θ(a_t|s_t) · δ_t。书中证明:该估计量有 bias,bias 大小正比于 ‖v_φ − v^π‖_∞;但方差比 pure REINFORCE 小 O(1/γ) 倍。因此,cirtic 训练不足(v_φ 偏差大)会导致 actor 收敛到次优策略;但 critic 过拟合(v_φ 方差大)又会使 δ_t 噪声放大,引发 actor 震荡。实践中我一般会:① 用更大的 batch 更新 critic(如 actor batch=64,critic batch=256);② critic 学习率设为 actor 的 0.5 倍;③ 每 10 次 actor 更新才同步一次 critic 目标网络(而非每次)。
5. 常见问题排查:5 个血泪经验总结出的 RL 理论落地黑匣子
5.1 现象:value loss 持续下降但 policy performance 不升反降
原因:critic 过拟合导致 v_φ(s) 对未见状态给出虚假高估值,actor 依据错误优势函数更新,陷入“自我欺骗”循环。书中第 7.3.1 节指出:当 v_φ 的均方误差(MSE)低于 0.01 但策略回报停滞时,大概率是过拟合。
解决:① 加 dropout(rate=0.1–0.3)到 critic 隐藏层;② 用 TD(λ) 替代单步 TD,λ=0.9 引入多步 bootstrap,平滑 v_φ;③ 每轮训练后,在 held-out 状态集上评估 v_φ 的泛化 MSE,若其高于训练集 3 倍则早停。
5.2 现象:entropy 持续衰减至接近 0,policy 变得确定性极强且卡在局部
原因:策略梯度中 ∇_θ log π_θ 的方差随 entropy 降低而增大(因 log π_θ 尾部陡峭),导致更新方向噪声主导;同时,低 entropy 区域的 Hessian 矩阵条件数恶化,SGD 易陷鞍点。书中第 6.4 节强调:entropy collapse 不是训练“成功”,而是优化失败。
解决:① 显式添加 entropy bonus 项:ℒ_actor = −𝔼[log π_θ(a|s)·A] − α·H(π_θ(·|s)),α 从 0.01 线性退火至 0.001;② 用 tanh-Gaussian 策略替代标准 Gaussian,约束输出范围;③ 每 100 步强制重置 policy 网络最后一层权重(保留前层特征提取能力)。
5.3 现象:multi-step return(n-step)训练初期 reward 剧烈震荡
原因:n-step return Gₜ^{(n)} = rₜ + γ r_{t+1} + … + γ^{n−1} r_{t+n−1} + γ^n v_φ(s_{t+n}) 中,若 n 过大(如 n>10)且 γ 接近 1,则 γ^n v_φ(s_{t+n}) 项权重虽小但方差极大(因 s_{t+n} 远离当前策略分布),污染梯度。书中第 5.5.2 节证明:当 γ^n < 0.1 时,该截断项引入的 bias 可控,但 variance 可能翻倍。
解决:① 动态 n:初始 n=1,每 1e4 步增 1,上限 n=5;② 用 Retrace(λ) 替代简单 n-step,对远期 reward 加重要性权重 ρ_{t:t+n−1} = Π_{i=t}^{t+n−1} min(1, π_θ(a_i|s_i)/μ(a_i|s_i));③ 对 v_φ(s_{t+n}) 添加 clipped double Q 技巧(如 Twin-D3PG)。
5.4 现象:在稀疏 reward 环境中,reward 一直为 0,policy 完全不更新
原因:REINFORCE 类算法依赖 reward 信号计算梯度,reward=0 时 δ_t=0,∇logπ·0=0,梯度消失。但书中第 8.1 节指出:即使 reward=0,只要策略改变导致状态分布 ρ^π 变化,就应影响长期价值——问题在于单步估计无法捕捉。
解决:① 改用 model-based 方法,学环境动力学 p̂(s′,r|s,a),然后规划(如 PILCO);② 加入 curiosity reward:r_int = ‖ϕ(s′) − ϕ̂(s,a)‖²,其中 ϕ 是状态编码器,ϕ̂ 是前向模型;③ 用 hindsight experience replay(HER),将失败轨迹中最终到达的状态 s_final 作为虚拟目标重新标记 reward。
5.5 现象:分布式训练中,多个 worker 的 policy divergence 超过 30%,性能断崖下跌
原因:异步更新导致各 worker 基于不同版本的 global network 计算梯度,而策略梯度定理假设所有梯度基于同一 π_θ。书中第 9.2.3 节证明:当 worker i 使用 θ_i,global 为 θ,则 ∇_θ 𝔼_{π_θ}[·] ≈ ∇_{θ_i} 𝔼_{π_{θ_i}}[·] + (θ − θ_i) ⊤ Hessian,若 ‖θ − θ_i‖ 大,则二阶项主导,梯度方向错误。
解决:① 用 IMPALA 架构:worker 只收集数据,learner 异步更新,worker 定期同步 θ;② 添加 trust region 约束:maximize ∇_θ J(θ_old)ᵀ(θ − θ_old) s.t. KL[π_θ||π_{θ_old}] ≤ δ;③ 每次 worker 同步后,用 10% 数据做 local PPO update,再上传梯度。
6. 把数学原理变成 debug 工具:三个可立即上手的验证技巧
6.1 用压缩映射检验 critic 收敛性:计算实际收缩率 γ_eff
贝尔曼算子 T^π 的理论收缩率是 γ,但实际训练中,由于函数近似误差,有效收缩率 γ_eff 可能远小于 γ。书中第 4.4 节建议:每 100 步记录 v_k(s) 和 v_{k+1}(s) = T^π v_k(s)(用当前 critic 和 policy 采样计算),然后计算
γ_eff = ‖v_{k+1} − v_k‖∞ / ‖v_k − v{k−1}‖_∞
若 γ_eff > 0.95 且持续 10 次,则说明 critic 未充分学习(欠拟合);若 γ_eff < 0.5,则可能过拟合或 reward scale 不当。我一般会画 γ_eff 曲线,当它稳定在 0.7–0.8 时,认为 critic 达到平衡。
# 实现:在训练循环中插入 if step % 100 == 0: v_old = critic(torch.tensor(states_old)).detach().numpy() # shape: (N,) v_curr = critic(torch.tensor(states_curr)).detach().numpy() v_next = [] for s, a in zip(states_curr, actions_curr): r, s_prime, done = env.step(s, a) # 真实环境 step v_next.append(r + gamma * critic(torch.tensor([s_prime])).item() * (1-done)) v_next = np.array(v_next) gamma_eff = np.max(np.abs(v_next - v_curr)) / np.max(np.abs(v_curr - v_old)) print(f"Step {step}: gamma_eff = {gamma_eff:.3f}")6.2 用 score function 检验 policy 梯度:验证 ∇_θ log π_θ 的期望是否为 0
策略梯度定理的基石是 𝔼_{a∼π_θ}[∇_θ log π_θ(a|s)] = 0。若该式不成立,则所有 policy gradient 估计量都有系统性 bias。书中第 6.1.2 节给出验证方法:对固定 s,采样 K=1000 个 a_i ∼ π_θ(·|s),计算 mean_grad = (1/K) Σ_i ∇_θ log π_θ(a_i|s),若 ‖mean_grad‖_2 > 1e−3,则说明 log π_θ 实现有误(如 softmax 输出未归一化、Gaussian 的 log_prob 忘记减去 0.5*log(2πσ²))。我在写新策略类时,必跑此检验:
def test_score_function(policy, state, num_samples=1000): state_t = torch.tensor(state, dtype=torch.float32).unsqueeze(0) grads = [] for _ in range(num_samples): action = policy.sample(state_t) # 返回 action tensor log_prob = policy.log_prob(action, state_t) # 标量 grad = torch.autograd.grad(log_prob, policy.parameters(), retain_graph=True) # 拼接所有参数梯度为一维向量 flat_grad = torch.cat([g.flatten() for g in grad]) grads.append(flat_grad) mean_grad = torch.stack(grads).mean(dim=0) print(f"Score function mean norm: {torch.norm(mean_grad).item():.2e}") assert torch.norm(mean_grad) < 1e-3, "Score function expectation not zero!"6.3 用贝尔曼残差热力图定位 critic 的薄弱区域
书中第 4.5 节提出:贝尔曼残差 δ(s) = |r + γ v(s′) − v(s)| 在状态空间的分布,能暴露 critic 的盲区。例如,在倒立摆任务中,若 δ(s) 在 s=[θ=±0.3, θ̇=0] 处持续 >1.0,说明 critic 对临界平衡点估值不准。我习惯在训练中定期生成热力图:
| 状态维度 | 网格分辨率 | 计算方式 | 解读 |
|---|---|---|---|
| θ (角度) | 100 点 [-π,π] | 固定 θ̇=0,遍历 θ | 高 δ 区域 = 平衡点附近估值不准 |
| θ̇ (角速度) | 100 点 [-8,8] | 固定 θ=0,遍历 θ̇ | 高 δ 区域 = 高速摆动时 reward 估计失真 |
| 联合空间 | 50×50 网格 | 双重遍历 | 斜向高 δ 带 = θ 与 θ̇ 耦合关系未学好 |
注意:生成热力图时,s′ 必须用真实环境 step(而非 model 预测),确保 δ(s) 反映真实贝尔曼误差。若用 model,会把 model bias 也计入 critic error。
这些技巧不是“锦上添花”,而是我在某跨平台机器人控制项目中,靠它们把 policy 收敛时间从 3 天缩短到 8 小时的关键。当你的 RL 项目卡在某个玄学 bug 里,别急着调 learning rate,先打开这本书第 4 章,抄一段贝尔曼残差计算代码跑一跑——数学原理不是用来背的,是用来 debug 的。希望帮到你。
本文还有配套的精品资源,点击获取