简介:《强化学习的数学原理》是西湖大学赵世钰教授撰写的一部英文原著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 10 | Actor-Critic 方法 | 第 8、9 章 | 建议读 |
| Appendix C | 序列收敛性 | 数学分析基础 | 按需查阅 |
实际读的时候,第一个坑很容易踩:很多人读完第 4 章就直接跳到第 8 章看 DQN,跳过第 5、6、7 章。结果就是“为什么需要经验回放”“目标网络是干嘛的”完全想不明白。因为从表格型方法到函数近似,中间隔着一个“如何从交互数据中学习”的鸿沟,第 5 章和第 7 章正是用来填这个沟的。我的建议是第 2 到第 8 章严格顺序读,第 9、10 章可以适当跳读,附录部分按需查阅。
2.4 灰色框怎么读:主线与分支的取舍策略
作者在序言里专门说明:灰色框是可以按兴趣选读的内容。实际翻阅时你会发现,灰色框往往包含详细的数学证明或扩展讨论,与主线的“算法直觉”是两条线。我读的时候采取的策略是:
第一遍主线阅读时,跳过所有灰色框,只读正文和每个小节的 illustrative examples,目标是建立“这个算法在解决什么问题、它的大致流程是什么”的整体认知。第二遍精读时,再回来补灰色框里的证明。这个方法帮我避免了一个常见问题:执着于某个定理的完整证明而跟不上算法主线,最后整体的框架感反而丢了。第二遍读灰色框时,可以配合 Q&A 小节,很多推导里“为什么这里取最大值而不是求和”之类的疑惑,Q&A 都有针对性解答。
3. 三类算法主线:从表格到函数,从有模型到无模型
3.1 表格型方法:值迭代与策略迭代的分工
第二章到第四章构成第一块完整的主线:从状态价值的概念出发,建立 Bellman 方程和 Bellman 最优方程,然后给出两种求解方法。值迭代和策略迭代的核心区别,我总结成一句话:值迭代是“在价值空间里反复迭代,直到价值收敛,再从收敛的价值中提取策略”;策略迭代是“在策略空间里迭代,每一步都先算清当前策略的价值,再改进这个策略”。
具体到第四章的算法流程,值迭代的内部循环只做一件事:对每个状态 s,用 ( v_{k+1}(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(col+1, 2) elif a == 2: row = min(row+1, 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(f"iter {it}: v = {v.reshape(3,3)}")这段代码有两点值得说明。第一,prob_next的赋值里我故意区分了“滑移后还在原位”的边界情况,实际工程里这类边界逻辑很容易被忽略,导致收敛结果与理论值对不上。第二,我设v[8]=1.0并把它当作固定值,这就是“终止状态不参与迭代更新”的约定;如果你在做连续任务(没有终止状态),这里的处理逻辑会完全不同。你在重写类似脚本时,可以先从 3×3 网格开始,把价值函数打印出来,和书中的手算例子做对比,这是建立“公式 ∩ 代码”双向映射最快的方法。
4.2 ε-greedy 的探索与利用:参数边界和常见误用
第五章里有一个重要结论:ε-greedy 策略在最坏情况下以 ε 的概率做一个随机动作,以 1-ε 的概率选择当前最优动作。很多人在工程里把它当成“固定套路”:选最优动作,偶尔随机一个。但书里指出一个容易被忽略的点:ε-greedy 中的随机动作是从所有动作中均匀采样的,并不是在“除最优动作之外的子集”里采样。这意味着最优动作本身也会被随机选中,其被选中的总概率不是 1-ε,而是 1-ε + ε/|A|。
| 策略 | 最优动作被选概率 | 何时适用 |
|---|---|---|
| greedy | 1 | 价值函数已收敛 |
| ε-greedy (ε=0.1, 4动作) | 1-0.1+0.1/4 = 0.925 | 训练中后期 |
| softmax 策略 | 随温度参数变化 | 从探索到利用平滑过渡 |
这个差异看似不大,但在某些环境里会直接影响收敛策略的质量。如果某个非最优动作与最优动作的价值差很小,ε-greedy 的均匀采样会持续引入不必要的探索,导致策略波动无法收敛到最优。我一般会在大规模实践开始前先把 ε 衰减曲线设计好:初期 ε=0.5 左右保证探索,中期线性衰减到 0.1,后期 0.01。书里不直接给你一套衰减经验,但第五章末尾 Q&A 里对“何时停止探索”的讨论,能帮你建立自己的判断框架。
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_{k=1}^\infty \alpha_k = \infty ) 且 ( \sum_{k=1}^\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 概率的梯度求错了——不是环境的错,是数学公式的符号处理出了问题。这件小事之后,我更加确信:这本书對从业者的价值不在“教你调用某个算法”,而在“让你亲手推导时心中有底”。
这本书适合放在手边,不追求通读一遍就能记住全部推导,而是在每次实验失败、每次新算法上手时翻对应章节对照。读懂它之后,你面对一个强化学习问题时,至少能分清哪些是要调整的超参数、哪些是理论上的“硬约束”——这种辨识能力,才是真正值得下载这份资料的原因。
希望这份拆解能帮你在读原书时少走弯路,也愿你在推公式和写代码之间逐渐找到自己的节奏。
本文还有配套的精品资源,点击获取