简介《强化学习的数学原理》是西湖大学赵世钰教授撰写的英文专著面向具备线性代数、概率论与优化基础的研究生及算法工程师系统解决强化学习理论理解不深、公式推导不清、算法设计缺乏数学依据等痛点。全书10章附录从网格世界实例切入严格推导贝尔曼方程、值迭代与策略迭代收敛性、蒙特卡洛与TD方法的随机近似本质、策略梯度定理及Actor-Critic框架的稳定性条件特别强化了矩阵-向量形式建模、收缩映射证明、闭式解与迭代解对比等数学细节为算法改进与论文复现提供坚实支撑。资源为单文件PDF18.9MB内容完整覆盖全部章节与QA排版清晰、公式规范、示例丰富便于精读推演与课堂讲义参考。目前已有837人学习下载是少有的兼顾严谨性与可读性的强化学习数学导引文本。1. 这不是另一本“调库指南”赵世钰《强化学习的数学原理》为什么让算法工程师连夜重读线性代数你手头那本《Deep Reinforcement Learning Hands-On》翻到第三章就卡在 policy gradient 的梯度推导上PyTorch 实现 DQN 跑通了但改个 discount factor 就发现训练曲线像心电图一样乱跳——这不是你代码写得差是底层数学直觉没立住。赵世钰老师这本 2023 年 8 月定稿的《Mathematical Foundations of Reinforcement Learning》根本不是冲着“快速上手项目”去的它是一把手术刀专切 RL 里那些被封装成黑匣子的数学断层为什么贝尔曼方程非得是递归形式为什么 Q-learning 的 off-policy 更新能收敛而 naive 的 TD 不能为什么策略梯度里那个 baseline 减法不改变期望却能让方差暴跌全书 10 章全部锚定在一个网格世界grid world上反复推演——没有花哨的 Atari 游戏截图没有 PyTorch 框架截图只有手算的 4×4 状态转移矩阵、带下标的手写贝尔曼展开式、以及每一步都标清维度的向量运算。它默认你懂概率论和线性代数附录 C 还专门补了随机序列收敛性但拒绝用“显然可得”跳过关键推导。我拿它给组里两个刚转 RL 的 CV 工程师试读第三章 Bellman Optimality Equation 的 contraction mapping 证明部分他们俩对着白板演算三小时出来第一句话是“原来我们之前写的 value iteration 代码本质是在解一个压缩映射的不动点……现在看 learning rate 设置得那么玄学突然就合理了。” 这本书适合谁不是想三天跑通 PPO 的实习生而是已经调过半年 RL 算法、开始怀疑自己是不是在“用魔法对抗魔法”的一线工程师它不教你怎么 pip install它逼你亲手把 reward signal 拆成期望、方差、高阶矩再重新焊回 policy update 的梯度里。2. 从网格世界出发为什么所有 RL 数学必须先过“状态-动作-转移-奖励”四元组这一关强化学习不是端到端拟合它的骨架由四个不可拆分的数学对象撑起状态state、动作action、状态转移state transition、奖励reward。赵世钰老师在 Chapter 1 开篇就用一个极简的 3×3 网格世界图 1.1把这四元组钉死在读者脑子里——没有抽象定义只有坐标、箭头、数字和概率。这个选择不是偷懒而是直击 RL 初学者最常翻车的根源把“环境”当成黑盒 API 调用却从未思考过env.step(action)返回的next_state, reward, done背后藏着怎样的测度空间结构。下面我们就用这个网格世界把四元组的数学含义一一手撕清楚。2.1 网格世界的显式建模状态集 S、动作集 A 与转移概率 P 的构造我们取一个更清晰的 2×2 网格为简化计算实际书中是 3×3但原理完全一致[0,0] → [0,1] ↓ ↓ [1,0] → [1,1]状态集 S不是字符串或 ID而是坐标对构成的集合S {(0,0), (0,1), (1,0), (1,1)}共 |S| 4 个状态。注意(0,0)是左上角起点(1,1)是右下角目标reward1其他状态 reward0。动作集 A每个状态可执行{up, down, left, right}四个动作但边界状态会触发“撞墙”——这里赵老师没用doneTrue糊弄而是明确定义撞墙时状态不变reward -0.1惩罚项。所以 A 是全局统一的但P(s|s,a)在边界会退化。状态转移概率 P这才是数学落地的关键。以状态(0,0)为例执行right动作P((0,1)|(0,0), right) 0.9成功向右P((0,0)|(0,0), right) 0.1撞墙停留原地执行up动作P((0,0)|(0,0), up) 1.0必然撞墙其他动作同理。最终整个转移概率可写成一个|S| × |A| × |S|的张量或更常用的是|S| × |S|的矩阵族每个 a 对应一个矩阵。赵老师在 1.3 节强调MDP 的“马尔可夫性”不是假设而是建模约束——你定义的 S 必须包含所有影响未来奖励的历史摘要信息。如果你的网格世界需要记住“上一步是否撞过墙”那(0,0)就不够得扩成((0,0), hit_wallTrue)——这就是状态设计的数学本质。提示很多 RL 项目后期效果崩坏根源就在 S 定义不满足马尔可夫性。比如机器人导航中只输入当前激光雷达点云却不编码“已探索区域”模型就会在死胡同反复横跳。赵书第 1.7 节用形式化语言指出若P(s_{t1}|s_t,a_t) ≠ P(s_{t1}|s_t,a_t,s_{t-1},a_{t-1})则当前 S 不完备。2.2 策略 π 的两种存在形态确定性 vs 随机性及其对贝尔曼方程的决定性影响策略 π 是 RL 的心脏但初学者常混淆它的两种数学身份确定性策略 π: S → A每个状态 s 映射到唯一动作 a。例如π((0,0)) right, π((0,1)) down。这是最直观的但无法处理探索exploration。随机性策略 π: S × A → [0,1]π(a|s) 表示在 s 下选择 a 的概率。这是数学上更普适的形式也是后续所有贝尔曼方程的基础。赵老师在 1.4 节刻意用同一网格世界演示两者的区别若用确定性策略 π₁轨迹是固定路径(0,0)→(0,1)→(1,1)回报 G 0 0 1 1若用随机策略 π₂如 ε-greedy90% 执行最优动作10% 随机轨迹变成随机变量回报 G 成为随机变量其期望E[G|s,π]才是状态值 v_π(s)。关键洞见来了贝尔曼方程v_π(s) Σ_a π(a|s) Σ_{s} P(s|s,a) [r(s,a,s) γ v_π(s)]中左边是标量右边是双重期望——外层对动作 a 求期望由 π 决定内层对下一状态 s 求期望由 P 决定。如果你硬把 π 当成确定性函数代入公式立刻崩塌因为Σ_a π(a|s)不再是概率分布它只在某个 a 上为 1其余为 0求和仍为 1但微分性质全失。这就是为什么 Policy Gradient 方法必须用随机策略——梯度∇_θ J(θ)的存在性依赖于 π_θ(a|s) 关于 θ 的可微性而确定性策略是阶跃函数不可微。2.3 奖励函数 r(s,a,s) 的隐藏维度为什么它必须是三元函数而非二元初学者常把 reward 写成r(s,a)比如r((0,0), right) 0。但赵书在 1.5 节明确指出标准 MDP 中reward 是 s→a→s 这个完整转移的属性记为 r(s,a,s)。原因有二物理合理性机器人从 s 执行 a 后到达 s奖励取决于“抵达结果”如是否精准停在目标点而非单纯“执行动作”。数学必要性贝尔曼方程中的r(s,a,s)是条件期望E[r|s,a,s]的简写而E[r|s,a] Σ_{s} P(s|s,a) r(s,a,s)。如果 reward 只依赖 s,a则r(s,a,s) ≡ r(s,a)此时E[r|s,a] r(s,a)看似简化实则丢失了 s 对 reward 的调节能力比如同样执行right到达(0,1)得 0 分到达(1,1)得 1 分。在代码实现中这意味着你的环境接口不应是def step(self, action): return next_state, reward, done而应是def step(self, action): next_state self._transition(state, action); reward self._reward(state, action, next_state); return next_state, reward, done。赵老师在 1.6 节的 trajectory 示例中特意写出τ (s₀,a₀,r₁,s₁,a₁,r₂,s₂,...)其中rₜ下标为 t强调它是s_{t-1}→a_{t-1}→s_t的产物而非s_t的附属品。2.4 贝尔曼方程的诞生从“回报期望”到“自洽方程”的一步跨越有了 S,A,P,r下一步是定义智能体的目标最大化长期累积奖励。但“长期”怎么量化赵书用两个动机示例2.1, 2.2破除直觉误区Motivating example 1若不加折扣γ1无限步回报可能发散如永不停止的循环路径Motivating example 2若简单取平均回报会抹杀时间价值早拿到的 1 块钱比晚拿到的 1 块钱更值钱。于是引入折扣回报discounted returnG_t r_{t1} γ r_{t2} γ² r_{t3} ... Σ_{k0}^∞ γ^k r_{tk1}其中0 ≤ γ 1。状态值v_π(s) E_π[G_t | s_t s]的定义水到渠成。但关键突破在 2.4 节赵老师将G_t拆成r_{t1} γ G_{t1}然后取条件期望v_π(s) E_π[r_{t1} γ G_{t1} | s_t s] E_π[r_{t1} | s_t s] γ E_π[E_π[G_{t1} | s_{t1}] | s_t s] Σ_a π(a|s) Σ_{s} P(s|s,a) r(s,a,s) γ Σ_a π(a|s) Σ_{s} P(s|s,a) v_π(s)这就是贝尔曼方程Bellman Expectation Equation。注意它不是一个“算法”而是一个关于 v_π 的函数方程——v_π 同时出现在等式左右两边。求解它就是找一个函数 v使其满足这个自洽关系。赵老师在 2.7 节给出两种解法闭式解2.7.1将方程写成矩阵形式(I - γ P^π) v^π r^π其中P^π是|S|×|S|矩阵P^π_{ij} Σ_a π(a|s_i) P(s_j|s_i,a)r^π_i Σ_a π(a|s_i) Σ_{s_j} P(s_j|s_i,a) r(s_i,a,s_j)。解为v^π (I - γ P^π)^{-1} r^π。这要求I - γ P^π可逆γ1 保证谱半径1故可逆。迭代解2.7.2v_{k1}(s) Σ_a π(a|s) Σ_{s} P(s|s,a) [r(s,a,s) γ v_k(s)]即经典的Policy Evaluation。赵老师证明只要0≤γ1该迭代必收敛到唯一不动点v^πcontraction mapping theorem。注意很多开源实现把r(s,a,s)硬编码成r(s,a)导致r^π计算错误。赵书附录 C 的收敛性证明提醒你迭代收敛的前提是P^π的谱半径严格小于1/γ而r(s,a,s)的缺失会污染r^π的期望值使收敛变慢甚至失效。3. 贝尔曼最优方程BOE为什么“最优”不是选最大值那么简单如果说贝尔曼期望方程描述了“给定策略下的价值”那么贝尔曼最优方程Bellman Optimality Equation, BOE则直指 RL 的终极目标找到一个策略 π使得其状态值 v_π(s) 在所有策略中最大即 v_π*(s) max_π v_π(s) ∀s ∈ S**。但赵世钰老师在 Chapter 3 开篇就泼了一盆冷水这个“max”不能直接套在贝尔曼期望方程右边。为什么因为v_π(s) Σ_a π(a|s) [...]而max_π Σ_a π(a|s) [...]和Σ_a π(a|s) max [...]完全不同——前者是策略的加权平均后者是每个动作的最优值再加权。BOE 的精妙之处正在于它绕开了对 π 的显式优化转而对动作值 q(s,a) 施加 max 操作。下面我们一层层剥开这个“最优”的数学外壳。3.1 从策略改进Policy Improvement到最优性一个反直觉的观察赵书 3.1 节用一个极简例子揭示核心矛盾假设在状态 s有两个动作 a₁,a₂其对应的价值为q_π(s,a₁)5,q_π(s,a₂)3。直觉上把 π 改成“在 s 下只选 a₁”新策略 π 应该更好。但赵老师问这个“更好”是局部的还是全局的他证明若对所有 s新策略 π 满足q_π(s, π(s)) ≥ v_π(s)则必有v_π(s) ≥ v_π(s)且等号仅当 π π。这就是著名的Policy Improvement Theorem。它意味着只要在某个状态 s 上你能找到一个动作 a 使得q_π(s,a) v_π(s)那么将 π 在 s 处改为 a就能严格提升整体性能。由此引出关键定义最优动作值函数 q(s,a)*即q*(s,a) max_π q_π(s,a)。注意q* 是关于 (s,a) 的函数而 v* 是关于 s 的函数且v*(s) max_a q*(s,a)。这个max_a操作正是 BOE 的灵魂。3.2 贝尔曼最优方程BOE的推导从 q* 到 v* 的闭环BOE 的标准形式是q*(s,a) Σ_{s} P(s|s,a) [r(s,a,s) γ max_{a} q*(s,a)]v*(s) max_a q*(s,a)赵老师在 3.3 节的推导极其干净由定义q*(s,a) max_π q_π(s,a)而q_π(s,a) Σ_{s} P(s|s,a) [r(s,a,s) γ Σ_{a} π(a|s) q_π(s,a)]贝尔曼期望方程对 q 的形式因此q*(s,a) max_π Σ_{s} P(s|s,a) [r(s,a,s) γ Σ_{a} π(a|s) q_π(s,a)]由于P(s|s,a)和r(s,a,s)与 π 无关且q_π(s,a) ≤ q*(s,a)上式最大值在π(a|s)集中于使q_π(s,a)最大的那个a时取得即π(a|s) 1ifa argmax_{a} q*(s,a)else0代入即得q*(s,a) Σ_{s} P(s|s,a) [r(s,a,s) γ max_{a} q*(s,a)]。这个方程的威力在于它不依赖任何具体策略 π只依赖环境动态 P,r 和折扣因子 γ。求解它就得到了所有状态-动作对的“理论天花板”价值。而v*(s) max_a q*(s,a)自动给出最优状态值。赵老师在 3.3.1 节强调max_{a} q*(s,a)是非线性操作这导致 BOE 无法像贝尔曼期望方程那样写成线性方程组(I - γ P) v r。它是一个非线性不动点方程其解的存在唯一性依赖于max操作的 contraction 性质见 3.3.4。3.3 BOE 的收缩映射Contraction Mapping证明为什么 Value Iteration 必然收敛这是全书最硬核也最实用的数学之一3.3.3, 3.3.4。赵老师定义了一个算子T*: R^{|S||A|} → R^{|S||A|}[T*q](s,a) Σ_{s} P(s|s,a) [r(s,a,s) γ max_{a} q(s,a)]BOE 即q* T*q。要证明T*是 contraction需证存在0≤α1使得对任意两个函数q₁,q₂有||T*q₁ - T*q₂||_∞ ≤ α ||q₁ - q₂||_∞。证明关键在max的 Lipschitz 性质|max_{a} q₁(s,a) - max_{a} q₂(s,a)| ≤ max_{a} |q₁(s,a) - q₂(s,a)| ≤ ||q₁ - q₂||_∞于是|[T*q₁](s,a) - [T*q₂](s,a)| |γ Σ_{s} P(s|s,a) [max_{a} q₁(s,a) - max_{a} q₂(s,a)]|≤ γ Σ_{s} P(s|s,a) |max_{a} q₁(s,a) - max_{a} q₂(s,a)|≤ γ Σ_{s} P(s|s,a) ||q₁ - q₂||_∞ γ ||q₁ - q₂||_∞因此||T*q₁ - T*q₂||_∞ ≤ γ ||q₁ - q₂||_∞即T*是 contractionLipschitz 常数为γ。根据 Banach 不动点定理迭代q_{k1} T*q_k必收敛到唯一不动点q*。血泪经验这个γ就是 Value Iteration 的收敛速度上限如果你设γ0.99理论上需要log(ε)/log(γ)次迭代才能达到误差ε而log(0.99)≈-0.01所以100次迭代才降1/e。实践中γ0.9是更平衡的选择——赵书在 4.1.1 的代码注释里明确建议“For most grid-world problems, γ0.9 achieves a good trade-off between convergence speed and long-term planning horizon.”对多数网格世界问题γ0.9 在收敛速度与长期规划视野间取得良好平衡。3.4 从 BOE 到最优策略贪婪策略Greedy Policy的数学正当性一旦得到q*最优策略π*可直接定义为π*(a|s) 1ifa argmax_{a} q*(s,a)else0赵老师在 3.4 节证明这个π*确实满足v_π*(s) v*(s)。但更深刻的是他指出贪婪策略是 BOE 的自然产物而非人为设定的启发式。因为 BOE 的max_{a}操作本质上就是在每个s上选择使q*最大的动作a这正是贪婪行为。然而赵老师在 3.5 节埋下伏笔最优策略π*的具体形式强烈依赖于r(s,a,s)和P(s|s,a)的结构。例如若r(s,a,s)在某个s上极高但P(s|s,a)极低高风险高回报γ较小时π*可能放弃它γ接近 1 时π*又可能拥抱它。这就是“折扣因子如何影响最优性”的数学本质——它不是超参调优而是对“时间偏好”的显式建模。赵书表 3.1 列出了不同γ下同一网格世界的最优路径变化直观展示了这种权衡。4. Value Iteration 与 Policy Iteration两种不动点求解器的工程抉择Chapter 4 是全书从“理论存在性”迈向“算法可实现性”的转折点。贝尔曼最优方程q* T*q保证了最优解的存在但如何高效算出来Value IterationVI和 Policy IterationPI是两种经典范式它们本质都是求解同一个不动点方程q* T*q但路径截然不同。赵世钰老师没有陷入“哪个更快”的口水战而是用数学语言划清了它们的适用边界VI 是单步更新PI 是双步交替VI 更鲁棒PI 在策略空间更高效。下面我们将用同一网格世界手撕两种算法的每一步并揭示那些藏在伪代码背后的数学陷阱。4.1 Value Iteration为什么它叫“Value”而不是“Q-value”迭代VI 的标准形式4.1.1是q_{k1}(s,a) Σ_{s} P(s|s,a) [r(s,a,s) γ max_{a} q_k(s,a)]注意它更新的是q_k而非v_k。虽然很多教材写v_{k1}(s) max_a Σ_{s} P(s|s,a)[r(s,a,s) γ v_k(s)]但赵书坚持用q理由很数学BOE 的自然变量是q*v*只是它的投影。用q迭代避免了v到q的中间转换q_π(s,a) Σ_{s} P(s|s,a)[r(s,a,s) γ v_π(s)]减少数值误差。4.1.1 VI 的 Python 实现与参数解析import numpy as np def value_iteration(P, R, gamma0.9, theta1e-6, max_iter100): P: transition tensor, shape (nS, nA, nS) R: reward tensor, shape (nS, nA, nS) or (nS, nA) gamma: discount factor theta: convergence threshold max_iter: max iterations Returns: q_star (nS, nA), pi_star (nS,) nS, nA P.shape[0], P.shape[1] # Initialize q arbitrarily, e.g., zeros q np.zeros((nS, nA)) for i in range(max_iter): q_prev q.copy() # Update all q(s,a) simultaneously for s in range(nS): for a in range(nA): # Compute expectation over next state s expected_next_v 0.0 for s_prime in range(nS): # R[s,a,s_prime] is the reward for s-a-s_prime r R[s, a, s_prime] if len(R.shape) 3 else R[s, a] expected_next_v P[s, a, s_prime] * (r gamma * np.max(q[s_prime])) q[s, a] expected_next_v # Check convergence: max norm of difference if np.max(np.abs(q - q_prev)) theta: print(fVI converged in {i1} iterations) break # Extract greedy policy pi_star np.argmax(q, axis1) # pi_star[s] argmax_a q[s,a] return q, pi_star # Example usage for 2x2 grid (nS4, nA4) # P, R constructed from grid world dynamics...逻辑说明与参数深挖q初始化为零是安全的因为T*是 contraction从任意起点出发都收敛。theta1e-6是||q_{k1} - q_k||_∞的阈值它控制着解的精度。赵书 4.1.2 指出theta越小q_k越接近q*但v_k(s) max_a q_k(s,a)的误差上界为||v_k - v*||_∞ ≤ γ^k / (1-γ) ||q_0 - q*||_∞所以theta也隐含了迭代次数。max_iter100是保险阀防止不收敛理论上不会但浮点误差可能导致。np.max(q[s_prime])这一行就是max_{a} q_k(s,a)的实现它体现了 BOE 的核心非线性操作。提示很多开源 VI 实现把R设为(nS, nA)即r(s,a)这忽略了r(s,a,s)。赵书强调若r依赖s必须用R[s,a,s_prime]否则expected_next_v计算错误导致q*偏差。4.2 Policy Iteration为什么它需要“策略评估 策略改进”两步走PI 的流程4.2.1是策略评估Policy Evaluation对当前策略 π_k求解v_π_k即解线性方程(I - γ P^{π_k}) v r^{π_k}策略改进Policy Improvement基于v_π_k构造新策略 π_{k1}(s) argmax_a q_π_k(s,a) argmax_a Σ_{s} P(s|s,a)[r(s,a,s) γ v_π_k(s)]重复直到 π_{k1} π_k。赵老师在 4.2.1 证明每次改进v_{π_{k1}}(s) ≥ v_{π_k}(s)且严格大于除非 π_k 已最优。因此 PI 有限步内必收敛因策略空间有限。4.2.1 PI 的矩阵求解与数值稳定性PI 的核心是解线性系统。对于nS4的网格世界I - γ P^{π_k}是4×4矩阵。赵书 4.2.2 给出两种解法直接求逆v np.linalg.inv(I - gamma * P_pi) r_pi。优点精确缺点O(nS³)复杂度且当γ接近 1 时I - γ P^{π_k}接近奇异求逆不稳定。迭代法如 Jacobiv_{j1} r^{π_k} γ P^{π_k} v_j。优点稳定内存友好缺点慢。赵老师推荐折中方案对中小规模问题nS 1000用np.linalg.solveLU 分解它比inv更稳定# Inside policy_evaluation function # P_pi: (nS, nS) matrix, r_pi: (nS,) vector # Solve (I - gamma * P_pi) v r_pi I np.eye(nS) A I - gamma * P_pi v np.linalg.solve(A, r_pi) # More stable than np.linalg.inv(A) r_pi参数深挖np.linalg.solve的稳定性源于 LU 分解对病态矩阵的容忍度更高。赵书在 4.2.3 的示例中展示当γ0.99时inv解的||v||波动达1e3而solve保持1e0级别。这是工程落地的关键细节。4.3 Truncated Policy Iteration当“精确评估”成为负担时的数学妥协标准 PI 要求策略评估完全收敛v_{π_k}精确但现实中我们常只需v_{π_k}的一个粗糙估计。Truncated PI4.3.2就是这种妥协只做 k 步迭代评估就进行策略改进。赵书证明只要 k≥1Truncated PI 仍收敛且 k 越大收敛越快逼近标准 PIk1 时它退化为 Value Iteration这揭示了 VI 和 PI 的本质联系VI 是 k1 的 Truncated PI而标准 PI 是 k∞ 的 Truncated PI。选择 k就是在“每次迭代的计算量”和“总迭代次数”之间做权衡。赵老师在 4.3.1 的对比表中给出经验法则场景推荐算法理由小规模、高精度需求Standard PI策略空间小精确评估快大规模、实时性要求VI (k1)每次更新快内存占用低中等规模、平衡需求Truncated PI (k3~5)比 VI 收敛步数少比 PI 每步计算轻注意Truncated PI 的k不是超参而是数学保证收敛的最小迭代数。赵书定理 4.3.1 证明只要k ≥ log(ε) / log(γ)就能保证||v_{π_{k1}} - v*||_∞ ≤ ε。所以k3对γ0.9是安全的log(0.01)/log(0.9)≈43但实际中远小于此。5. 避坑指南强化学习数学落地的五个血泪教训强化学习的数学原理看似优雅但一旦落到代码和数据上各种“玄学”问题接踵而至。赵世钰老师的这本书之所以珍贵不仅在于它讲清了“是什么”更在于它用严谨的数学语言提前预警了那些会让工程师深夜抓狂的坑。以下是我在复现书中所有算法从网格世界到附录的随机序列收敛过程中踩过的五个最痛的坑每一条都附有现象、原因和赵书中的数学依据。5.1 现象Value Iteration 迭代几十轮q_k的max值还在缓慢爬升theta1e-6死活不触发收敛原因theta是||q_{k1} - q_k||_∞的阈值但q_k的绝对值大小受r和γ影响极大。若r的量级是100γ0.99则q*可能高达100/(1-0.99)10000此时1e-6的差值在数值上几乎不可能达到浮点精度限制。赵书 4.1.1 的脚注明确指出本文还有配套的精品资源点击获取