强化学习数学原理:从Bellman方程到策略梯度,读法与避坑指南
简介《强化学习的数学原理》是西湖大学赵世钰教授撰写的一部英文原著PDF面向具备一定数学基础的强化学习学习者与研究者旨在从数学角度系统揭示强化学习的本质原理。全书从零开始结合大量网格世界等直观例子循序渐进地展开十大核心主题基础概念、状态值与贝尔曼方程、最优状态值与贝尔曼最优方程、值迭代与策略迭代、蒙特卡洛方法、随机近似、时间差分、值函数近似、策略梯度及演员-评论家方法附录还给出了序列收敛性分析构成完整的学习链条。资源包为单个PDF文件体积仅18.9MB便于离线翻阅与标注。已有833人学习适合作为系统入门后的进阶读物或教学参考读者可从中掌握强化学习核心思想的严格数学表述为后续算法设计与分析打下扎实基础。1. 这不是一本工具书是一张把强化学习“数学地图”摊开的草稿第一次翻《强化学习的数学原理》英文原版时我以为是本“带代码的强化学习实战”结果翻完目录就愣住了十个章节、两百多页从头到尾没有一行某框架代码。但恰恰是这种“不设代码”的写法让我把强化学习从“调某个库函数”变成了“能自己推更新公式”。这本书能解决一个很实际的问题当你在项目里用了某个算法却不知道为什么收敛、为什么震荡时它能给你完整的数学链条。它的读者对象很明确有概率论和线性代数基础、愿意用公式而不是黑匣子理解强化学习的人。如果你只想调包跑通某个Demo这本书暂时不适合你。2. 读前必修课概率论、线代与网格世界的读法2.1 先做一次“数学自检”再决定从哪一章开始不少从业者翻开这本书的第二章就卡住了原因往往不是推导看不懂而是概率论和线性代数的基础不牢。书名里“数学原理”四个字不是摆设它默认读者已经掌握随机变量、期望、矩阵乘法、特征值这些基本工具。我建议打开正文前先做三件小事能把“随机变量 X 的期望 E[X]”用积分或求和形式写出来能快速完成一个 n 维向量和一个 n×n 矩阵的乘法并理解结果的含义能说清“特征值”与“矩阵范数”之间的关系。这三项如果都顺畅你可以直接从第一章顺序读如果有一项卡住先去附录 A概率论初步和附录 C序列收敛把相关小节补上再回来。很多初学者觉得概率论“够用就行”但到了第六章随机近似和第八章函数近似你会反复用到条件期望、收敛性和方差这些概念到时候再回头补课的代价远大于现在先查一遍。2.2 网格世界整本书唯一的例子为什么要盯死它作者没有用机器人控制、游戏对战这类复杂场景而是选了网格世界做全程示例。这个选择很聪明网格世界足够简单状态数量有限策略、奖励、状态转移都能在一张表上画清楚Bellman 方程的矩阵形式也能直接写出来。你不需要花精力理解环境本身的动力学只需要专注于强化学习的核心问题。我的建议是第一次读到任何“illustrative example”时不要急着往下翻先在纸上画出对应的网格标出状态编号、动作集合、转移概率和奖励值然后自己手算一遍。书里大部分例子是 3×3 或 4×4 的网格手算量完全可控。我在读第二章的 grid world 示例时把每个状态的价值推算了一遍之后再看 Bellman 方程的矩阵形式几乎是一瞬间就明白了。2.3 章节依赖关系哪几章可以跳读哪几章必须顺序读从书的 Overview 那张地图可以看出全书分成“基础工具”和“算法/方法”两大块。我按读下来的体感给你一张章节依赖关系表章节核心内容前置要求重要程度Chapter 1基本概念状态、动作、策略、奖励、回报、MDP无必读Chapter 2状态价值与 Bellman 方程第 1 章必读全书地基Chapter 3最优状态价值与 Bellman 最优方程第 2 章必读Chapter 4值迭代与策略迭代第 2、3 章必读Chapter 5蒙特卡洛方法第 4 章必读Chapter 6随机近似RM 算法、SGD概率论基础建议读Chapter 7时序差分方法Sarsa、Q-learning第 5、6 章必读Chapter 8值函数近似与 DQN第 7 章必读Chapter 9策略梯度方法REINFORCE第 7 章建议读Chapter 10Actor-Critic 方法第 8、9 章建议读Appendix C序列收敛性数学分析基础按需查阅实际读的时候第一个坑很容易踩很多人读完第 4 章就直接跳到第 8 章看 DQN跳过第 5、6、7 章。结果就是“为什么需要经验回放”“目标网络是干嘛的”完全想不明白。因为从表格型方法到函数近似中间隔着一个“如何从交互数据中学习”的鸿沟第 5 章和第 7 章正是用来填这个沟的。我的建议是第 2 到第 8 章严格顺序读第 9、10 章可以适当跳读附录部分按需查阅。2.4 灰色框怎么读主线与分支的取舍策略作者在序言里专门说明灰色框是可以按兴趣选读的内容。实际翻阅时你会发现灰色框往往包含详细的数学证明或扩展讨论与主线的“算法直觉”是两条线。我读的时候采取的策略是第一遍主线阅读时跳过所有灰色框只读正文和每个小节的 illustrative examples目标是建立“这个算法在解决什么问题、它的大致流程是什么”的整体认知。第二遍精读时再回来补灰色框里的证明。这个方法帮我避免了一个常见问题执着于某个定理的完整证明而跟不上算法主线最后整体的框架感反而丢了。第二遍读灰色框时可以配合 QA 小节很多推导里“为什么这里取最大值而不是求和”之类的疑惑QA 都有针对性解答。3. 三类算法主线从表格到函数从有模型到无模型3.1 表格型方法值迭代与策略迭代的分工第二章到第四章构成第一块完整的主线从状态价值的概念出发建立 Bellman 方程和 Bellman 最优方程然后给出两种求解方法。值迭代和策略迭代的核心区别我总结成一句话值迭代是“在价值空间里反复迭代直到价值收敛再从收敛的价值中提取策略”策略迭代是“在策略空间里迭代每一步都先算清当前策略的价值再改进这个策略”。具体到第四章的算法流程值迭代的内部循环只做一件事对每个状态 s用 ( v_{k1}(s) \max_{a} \sum_{s} p(s|s,a)[r(s,a,s) \gamma v_k(s)] ) 更新价值。策略迭代则分两步策略评估固定策略用 Bellman 方程迭代计算状态价值和策略改进对每个状态选择让动作价值最大的动作。书里特别指出一个初学者容易忽略的点策略迭代的策略评估本身也是一个迭代过程不必迭代到完全收敛截断策略迭代truncated policy iteration就是在评估精度和计算成本之间做平衡。我当时读到这里才意识到工程里常用的“评估几步就改进一次”并不是什么经验之举它对应着完整的理论分析。3.2 从有模型到无模型Monte Carlo 的跳跃第四章的算法都假设已知状态转移概率 ( p(s|s,a) )第五章开始直接把这个假设拿掉这就是从“有模型”到“无模型”的关键跳跃。Monte Carlo 方法的核心思想是用经验均值代替期望既然转移概率是未知的那就通过智能体与环境交互采样把一条完整轨迹的回报记下来再用平均回报近似状态价值。你如果对 RL 的工程应用有一点了解肯定知道强化学习在真实环境里最大的痛点就是没有模型MC 方法第一个告诉你没有模型也能学习。但 MC 有一个硬性要求必须是完整的 episode 才能更新价值而且要保证每个状态都能被访问到。书里为了解决后一个问题引入了 exploring starts 假设然后退一步讨论更实际的 ε-greedy 策略。我看第五章时印象最深的一句话是exploring starts 在理论上很干净但实践中几乎做不到所以 ε-greedy 不是“锦上添花”而是“没有它就学不下去”。3.3 衔接桥梁随机近似与 TD 方法第六章 Stochastic Approximation 是我认为全书位置极其重要但最容易被低估的一章。它的定位很明确为一章更新方式的 TD 方法提供数学基础。Robbins-Monro 算法解决的是“用带噪声的观测去求方程的根”的问题而 TD 更新本质上就是一个 RM 算法的应用实例。如果你能看懂第六章中 RM 算法的收敛性证明思路再去看第七章 TD 学习的收敛性分析会觉得一切都顺理成章。TD 方法相对 MC 的优势用一个词概括就是“增量”它不需要等一条完整轨迹结束而是用当前状态的奖励加上下一状态的估计值来构成目标。书里第三章给了一个统一的视角把 TD 看成是 MC 和动态规划之间的折中折扣因子 γ 和自步长 α 共同决定了这种折中的程度。Sarsa 和 Q-learning 的差异在于“用哪个动作的价值去构成 TD target”Sarsa 用实际采取的动作Q-learning 用最大动作价值。看似只差一点严格来说就是 on-policy 和 off-policy 的分水岭。书里第 7.4.2 节专门用两页篇幅分析这个区别我建议你重点标出来因为面试和实际 debug 时这个问题会反复出现。4. 关键公式与定理的“手感”养成推导、实现与边界4.1 一个最小可运行的评估脚本从状态值迭代到策略提取纯数学符号容易让初学者陷入“看得懂公式、写不出代码”的状态。为了帮你把第二章、第三章的抽象符号落回现实我强烈建议你亲手写一个最简单的网格世界策略评估脚本。下面是一个 3×3 网格世界、随机策略的状态价值迭代参考实现import numpy as np # 状态0~8动作0上, 1右, 2下, 3左 n_states 9 actions [0, 1, 2, 3] gamma 0.9 p_slip 0.1 # 每个动作有 10% 概率滑向相邻方向模拟噪声 # 奖励只在到达目标状态(8)时给 1其余为 0 rewards np.zeros(n_states) rewards[8] 1.0 # 预定义状态转移state - action - (next_state_prob_map) # 这里简化直接按确定性网格移动再用 p_slip 做扰动 def next_state(s, a): row, col divmod(s, 3) if a 0: row max(row-1, 0) elif a 1: col min(col1, 2) elif a 2: row min(row1, 2) else: col max(col-1, 0) return row * 3 col v np.zeros(n_states) v[8] 1.0 # 目标状态价值固定为 1 for it in range(100): v_new np.zeros(n_states) for s in range(n_states): if s 8: v_new[s] 1.0 continue # 随机策略每个动作等概率 0.25 value 0.0 for a in actions: s_next next_state(s, a) # 考虑滑移实际移到 s_next 的概率是 1-p_slip # 其余 p_slip 概率留在原地 prob_next (1 - p_slip) if s_next ! s else (1 - p_slip p_slip) value 0.25 * prob_next * (rewards[s_next] gamma * v[s_next]) v_new[s] value v v_new if it % 20 0: print(fiter {it}: v {v.reshape(3,3)})这段代码有两点值得说明。第一prob_next的赋值里我故意区分了“滑移后还在原位”的边界情况实际工程里这类边界逻辑很容易被忽略导致收敛结果与理论值对不上。第二我设v[8]1.0并把它当作固定值这就是“终止状态不参与迭代更新”的约定如果你在做连续任务没有终止状态这里的处理逻辑会完全不同。你在重写类似脚本时可以先从 3×3 网格开始把价值函数打印出来和书中的手算例子做对比这是建立“公式 ∩ 代码”双向映射最快的方法。4.2 ε-greedy 的探索与利用参数边界和常见误用第五章里有一个重要结论ε-greedy 策略在最坏情况下以 ε 的概率做一个随机动作以 1-ε 的概率选择当前最优动作。很多人在工程里把它当成“固定套路”选最优动作偶尔随机一个。但书里指出一个容易被忽略的点ε-greedy 中的随机动作是从所有动作中均匀采样的并不是在“除最优动作之外的子集”里采样。这意味着最优动作本身也会被随机选中其被选中的总概率不是 1-ε而是 1-ε ε/|A|。策略最优动作被选概率何时适用greedy1价值函数已收敛ε-greedy (ε0.1, 4动作)1-0.10.1/4 0.925训练中后期softmax 策略随温度参数变化从探索到利用平滑过渡这个差异看似不大但在某些环境里会直接影响收敛策略的质量。如果某个非最优动作与最优动作的价值差很小ε-greedy 的均匀采样会持续引入不必要的探索导致策略波动无法收敛到最优。我一般会在大规模实践开始前先把 ε 衰减曲线设计好初期 ε0.5 左右保证探索中期线性衰减到 0.1后期 0.01。书里不直接给你一套衰减经验但第五章末尾 QA 里对“何时停止探索”的讨论能帮你建立自己的判断框架。4.3 从表格到函数逼近目标函数如何改变第八章 Value Function Approximation 是全书从“严谨数学”到“现代深度强化学习”的分界线。表格型方法和函数逼近方法的核心差异在于表格型把每个状态当作独立参数函数逼近则用一个带参数 θ 的函数去拟合价值函数例如线性逼近 ( v_\theta(s) \phi(s)^T \theta ) 或神经网络逼近。这个转变带来一个直接后果更新公式不再能简单地写成 ( v(s) \leftarrow v(s) \alpha(\text{target} - v(s)) )而是要变成带梯度下降的目标[ \min_\theta J(\theta) \min_\theta E[\frac{1}{2}(v_\pi(s) - v_\theta(s))^2] ]书里用目标函数把这个转变讲得干干净净。你可能会想为什么表格法可以直接迭代更新而函数逼近需要定义一个目标函数答案在参数共享上。表格法的每个状态价值都是独立参数更新某状态不影响其他状态而函数逼近的参数是共享的更新 θ 会影响所有状态的估值所以必须显式定义一个在全体状态上做最小化的目标。这个区别是所有 DQN 改进算法的底层原理经验回放和 target network 本质上都是在解决“共享参数导致训练不稳定”的问题。我做过的项目中很多翻车现场都是直接绕过这个原理去改网络结构治标不治本。4.4 收敛性分析能告诉你什么第六章的 Robbins-Monro 算法和附录 C 的序列收敛定理可能是全书劝退率最高的两个部分。但它们其实能回答工程中最常见的一个问题为什么同一个算法换个随机种子有时候收敛有时候不收敛RM 算法给出了一个充分条件步长序列 ( \alpha_k ) 必须满足 ( \sum_{k1}^\infty \alpha_k \infty ) 且 ( \sum_{k1}^\infty \alpha_k^2 \infty )。第一个条件保证步长累加足够大能覆盖整个参数空间第二个条件保证步长衰减足够快让噪声被平均掉。任何随机梯度类方法包括 DQN、PPO 里的优化器都遵循这个条件。你如果出现过 loss 曲线先降后升、或者训练后期价值估计震荡不收敛的情况可以先去检查一下优化器的学习率衰减策略是否满足这两条。这不是玄学是数学收敛性分析能直接指导的调参方向。5. 避坑读这本书最容易翻车的五个地方5.1 只读正文跳过灰色框导致“知道流程”却“不懂原理”现象读完第三章能复述 value iteration 的流程但被问到“为什么 value iteration 保证收敛到最优价值”时答不上来。 原因书里关于 contraction mapping theorem 的完整证明在灰色框里你如果跳过只掌握了形式上的算法流程而不理解收敛性的来源。 解决第四章第一次接触 value iteration 时回去把 3.3 节的 contraction mapping 部分单独拿出来精读。这个定理是整个动态规划方法的基石你要做的不是背住证明而是理解“为什么 max 算子是一个收缩映射”以及“收缩映射为什么保证迭代不动点唯一”。这个直觉会一直伴随你读到 DQN。5.2 刻意跳过第六章直接进入 TD 学习现象读第七章 Q-learning 时对更新公式里的目标 ( R\gamma \max_{a} Q(s,a) ) 感觉很合理但看不懂接下来一整节的收敛性分析。 原因收敛性分析依赖 RM 算法和随机近似理论这是第六章的内容。很多初学者误以为第六章只是“数学补充”其实它是第七章的理论地基。 解决读第七章前至少把第六章 6.2 节RM 算法和 6.4 节随机梯度下降读完不用完全吃透定理的证明但要知道“带噪声的观测如何通过逐步平均逼近真值”这个直觉。我当时硬啃 TD 收敛性时反复卡壳回头补完 6.2 节才顺畅。5.3 混淆 on-policy 与 off-policy 的场景边界现象把 Sarsa 和 Q-learning 都当作“TD 方法”一类处理结果实际做控制实验时发现 Q-learning 在某个环境里表现反而差。 原因你是用 on-policy 的逻辑去调 off-policy 的参数。Sarsa 的探索策略和行为策略始终一致而 Q-learning 的目标价值是 max 操作这使它在某些风险敏感的环境里会高估状态价值。 解决读 7.4.2 节时一定要自己画一张两个算法的计算图。标清楚行为策略、目标策略和更新公式里的动作选择方式。如果你的环境有危险状态比如较大的负奖励考虑换用 Sarsa如果你在做一个 off-policy replay buffer 结合函数近似的系统务必加 target network 防止过估计。书里第七章的示例没有专门展开这一点但理解 off-policy 的本质后你会自然想到这一步。5.4 忽略附表 C遇到随机收敛问题就乱调参数现象用 MC 方法训练时回报方差很大导致价值估计波动不停地调整 episode 数量却发现改善有限。 原因你把“随机收敛”误当成“需要更多数据”。更根本的问题可能是用的 MC 采样方差过大且没有配合适当的学习率衰减。 解决回到附录 C 的 sequence convergence把随机序列收敛的条件与应用到这个场景里。理解 MC 估计方差与采样数量的增长关系方差按 1/N 衰减你就能精确定位问题是“采样量不够”还是“步长不合适”而不是盲目试。这条对工程场景特别实用我后来在项目里遇到 RL 训练不稳不再是拍脑袋调学习率而是先写出更新公式再对照收敛条件找原因。5.5 把函数近似章节当作“介绍 DQN 的科普”现象读完第八章觉得理解 DQN 了去写代码时却完全不知道 target network 和 experience replay 网络结构应该怎么搭。 原因这一章的重心是“函数逼近如何改变了 RL 的学习目标”而不是“如何实现 DQN 工程系统”。如果你带着“学完就能搭网络”的预期去读会觉得信息密度不够。 解决把 8.4 节当成“理解 DQN 何以存在的理论背景”而不是“DQN 实现指南”。书里会解释为什么 naive 的 TD 函数逼近会发散而经验回放和 target network 分别在缓解什么问题。具体代码实现去参考其他资料但理解“为什么需要这两个组件”这件事请以这本书为准。6. 把这本书当工具书用从阅读到随查随取的三次过滤法三个月时间啃完这本书原版后我发现它真正的价值不在于“读懂”而在于建立一个检索框架。现在我写任何 RL 相关代码前都会先做三遍过滤第一遍在脑内用一两句话回顾每个算法的核心更新公式和边界条件第二遍遇到具体问题去查对应章节。如果某个项目用了 Q-learning with function approximation我回到第七章和第八章。如果发现模型不收敛我先往随机近似和收缩映射的条款上想找到问题的数学本质再考虑调参。如果设计了一个包含 actor 和 critic 的算法我翻到第十章把重要性采样和策略梯度定理重新推一遍。这样书里的信息就不再是“看过一遍的文本”而是一个随查随取的资料库。有一个习惯从读这本书时起保持到现在任何一次实验中只要涉及一个新算法我都会先手推一遍它的更新公式写下来再动写代码这可以绕开大量低级的实现错误。强化学习不是照搬哪个大神的配置就能跑通的领域你的环境、奖励设计、状态表示都会改变理论是否成立的条件。有一次我在复现一个策略梯度算法时强化学习训练结果始终不收敛后来回到第九章的“策略梯度定理”推导发现 my implementation 里把 log 概率的梯度求错了——不是环境的错是数学公式的符号处理出了问题。这件小事之后我更加确信这本书對从业者的价值不在“教你调用某个算法”而在“让你亲手推导时心中有底”。这本书适合放在手边不追求通读一遍就能记住全部推导而是在每次实验失败、每次新算法上手时翻对应章节对照。读懂它之后你面对一个强化学习问题时至少能分清哪些是要调整的超参数、哪些是理论上的“硬约束”——这种辨识能力才是真正值得下载这份资料的原因。希望这份拆解能帮你在读原书时少走弯路也愿你在推公式和写代码之间逐渐找到自己的节奏。本文还有配套的精品资源点击获取