
简介由西湖大学赵世钰教授撰写的英文原版教材《强化学习的数学原理》是一份面向希望从数学角度系统理解强化学习核心原理的PDF资料。全书以网格世界示例引入基本概念依次讲解状态值与贝尔曼方程、最优状态值与贝尔曼最优方程、值迭代与策略迭代、蒙特卡洛方法、随机近似、时间差分、值函数近似、策略梯度与Actor-Critic等核心主题并在附录讨论序列收敛性。资源为单个PDF文件大小约18.9MB便于离线阅读、检索和标注。目前已有833人学习使用。读者通过大量例子与严谨推导可以建立从马尔可夫决策过程到现代强化学习算法的完整知识框架掌握价值函数求解、策略优化的数学机制为后续设计分析强化学习算法打下扎实基础适合有一定数学背景的研究者、工程师和高年级学生作为教材或参考书。1. 为什么我劝你啃下这本《强化学习的数学原理》而不是先刷代码做了几年强化学习落地我见过太多人卡在同一个地方调了好几个月PPOreward就是不涨换了个随机种子又崩了。代码看了一堆GitHub上的实现能跑但一换环境就翻车。问题的根源不在代码而在你根本不知道自己在优化什么。赵世钰老师的《强化学习的数学原理》这本书恰恰就是治这个病的。它不是一本让你“看懂强化学习”的科普书而是一本让你“算得出强化学习算法为什么这样写”的案头书。适合谁适合已经被DQN、PPO折磨过、想回头把数学底子补上的工程师也适合刚入门但不想只停留在调包层面的学生。它不给你代码给你的是代码背后的那个黑匣子的钥匙。2. 这本书到底在讲什么从MDP到贝尔曼方程的一条主线2.1 先建立强化学习的数学骨架状态、动作、策略、回报强化学习的数学原理起点不是神经网络而是马尔可夫决策过程MDP。这本书的核心逻辑是把“智能体与环境交互”这件事严格地翻译成一组数学对象状态集合、动作集合、状态转移概率、奖励函数、折扣因子。你要做的第一件事就是把这五个要素在脑子里钉死因为后面所有公式都从这里长出来。我见过太多人把MDP当成一个“概念”跳过结果读到策略梯度定理时完全懵了。这里的区别在于你是在背名词还是在理解结构。状态转移概率 $P(s|s,a)$ 看起来只是一个条件概率但它决定了你做的每一步动作会导致什么样的后果分布。奖励函数 $R(s,a,s)$ 也不只是一个数值表它是策略搜索的目标函数里唯一的“信号源”。这本书的优势在于它把每一步推导都写得很细细到什么程度连“为什么期望可以这样拆开”这种在别的教材里一句话带过的步骤它都会给你展开写。这对工程师来说反而是好事——你不需要去猜作者跳过了哪一步。建议你在读前两章时把五个要素写在一张A4纸上每碰到一个新公式就圈出它用了哪几个要素。你会发现几乎所有核心公式都离不开状态转移概率和奖励函数这两个结构。搞定了这张纸你就不会再出现“策略、价值、模型三个概念混在一起”的糊涂状态。2.2 贝尔曼方程为什么是整本书的“交通枢纽”如果说MDP是骨架那贝尔曼方程就是血液循环系统。这本书里几乎所有算法——无论策略迭代、值迭代、TD时序差分、Q-learning还是Actor-Critic——最终都在做同一件事求解或逼近贝尔曼方程。贝尔曼方程的核心思想用一个式子就能表达清楚$$ v_\pi(s) \sum_a \pi(a|s) \sum_{s,r} p(s,r|s,a) [r \gamma v_\pi(s)] $$这个式子的含义是当前状态的价值等于“立即奖励”加上“下一个状态的折扣价值”的期望。它的结构是递归的——当前价值依赖未来价值。这就是为什么强化学习的数学推导总是呈现出一种“套娃”的形态也正因为这种递归结构你才能用迭代法去逼近真实的价值函数。赵世钰的书在处理这个方程时有一个很值得称道的做法它把方程解的存在性和唯一性放在了一个清晰的位置来讲。收缩映射、范数、不动点这些概念在别的教材里可能被当成数学附录丢在后面在这本书里它们是推导算法收敛性的主线工具。你不需要成为泛函分析专家但你需要理解“贝尔曼算子是一个收缩映射”这件事否则你不明白为什么迭代一定收敛。在阅读建议上我强烈建议你在这一章停留足够久。至少把策略评估Policy Evaluation的迭代过程手动推导三遍以上。第一遍照抄第二遍不看书写第三遍尝试给自己讲解。三遍之后你再看TD算法会觉得它就是在贝尔曼方程右边做了一个单步采样近似而已。2.3 策略迭代与值迭代两种求解思路的分水岭策略迭代和值迭代是这本书介绍的第一个算法对比案例也是你理解“策略搜索”和“价值拟合”两条路线之争的起点。策略迭代的思路是先固定策略计算它的价值函数然后根据价值函数贪婪地改进策略重复这个过程。值迭代则是不显式地维护策略直接把贝尔曼最优方程当作迭代目标来更新价值函数。用伪代码来对比策略迭代的内层是一个完整的策略评估循环外层才是策略改进。值迭代则省掉了那个内层循环每一步更新都在向最优价值函数逼近。# 策略迭代Policy Iteration骨架 def policy_iteration(): # 初始化随机策略 policy init_random_policy() while True: # 策略评估迭代求解当前策略的价值函数 V policy_evaluation(policy) # 策略改进根据当前价值函数贪心更新策略 new_policy greedy_improve(V) if new_policy policy: break policy new_policy return policy# 值迭代Value Iteration骨架 def value_iteration(): V zeros(state_space) while not converged: # 直接对每个状态做一步贝尔曼最优备份 for s in all_states: V[s] max_a sum_{s,r} p(s,r|s,a) [r gamma * V[s]] return V这两段代码的区别在于策略迭代里policy_evaluation需要完整收敛一个内层循环而值迭代只做一步备份。实际运作中策略迭代在状态数不多的场景下收敛更快值迭代则更容易实现。更重要的一点是值迭代的更新公式里那个max_a正是“最优性”从何而来的数学表达——它不是谁拍脑袋定义的而是从贝尔曼最优方程里直接推出来的。读这一章时你可以在小规模网格世界上手写这两个算法对比它们的收敛轨迹。你会发现值迭代的早期迭代会产生一些“看起来不太对”的价值估计这是正常的——它在用单步备份逼近全局最优中间状态的震荡并不意味着失败。明白了这一点你以后再看到训练曲线的大幅波动就不会急着去调学习率了。3. 把“最优”这件事讲透策略梯度、价值函数与探索利用的数学表达3.1 策略梯度定理为什么参数化策略能直接往回报大的方向推当状态空间大到你没法再逐项枚举价值函数时你就需要把策略表示成一个带参数的分布——这就是策略梯度方法的起点。策略梯度定理是这本书后半部分的第一个大高潮也是一个劝退点。它的核心结论是$$ \nabla_\theta J(\theta) \mathbb{E}{\tau \sim \pi\theta} \left[ \sum_{t0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t \right] $$这个公式在说什么它说梯度的方向等于“策略分布取对数后对参数的梯度”乘以“从当前时刻开始的累积回报”的期望。通俗一点讲如果某个动作带来了高回报那么提高这个动作被选中的概率如果带来的是低回报就降低它。听起来像常识但数学上要证明这件事成立并不容易——因为累积回报本身也依赖策略参数为什么对参数的梯度可以直接穿透过去而不考虑回报函数对参数的依赖这就是策略梯度定理的存在意义。我见过很多工程师把PPO写成“截断的某个目标函数”但没有意识到它底层依赖的正是这条定理。当你理解了这条定理再看PPO时会发现PPO只是对每个更新步的步长和一个比值做了额外约束防止一步走太远而已。3.2 广义优势估计GAE减方差的背后是这条公式广义优势估计GAE是现代演员-评论家算法里最常用的优势函数估计方式。它的数学形式是$$ \hat{A}t^{GAE(\gamma,\lambda)} \sum{l0}^{\infty} (\gamma\lambda)^l \delta_{tl} $$其中 $\delta_t r_t \gamma V(s_{t1}) - V(s_t)$ 是TD误差。GAE做的事情本质上是用一个带指数衰减的权重把多步的TD误差累加起来。当 $\lambda 0$ 时GAE退化成一步TD误差当 $\lambda 1$ 时它等价于蒙特卡洛回报。这本书讲GAE的方式有一个很实用的优势它把“偏差-方差权衡”从一句口头禅变成了你可以亲手计算的量。$\lambda$ 大方差大但偏差小$\lambda$ 小偏差大但方差小。实际调参时$\lambda$ 在0.95到0.99之间是常见区间但很多训练失败的根本原因并不是这个值没选好而是你没意识到它和时序差分截断步数之间的耦合关系。这一章读完后你应该能独立写出GAE的计算逻辑不需要参考任何开源实现。如果做不到这一点说明前面的贝尔曼方程还没吃透建议回头重读。3.3 从表格法到函数近似这本书为做深度学习的人打的基础多数做工程的人第一次接触强化学习时学的就是DQN、PPO这类深度强化学习算法。它们的共同点是用神经网络代替了价值函数或策略的表格表示。问题在于直接跳到神经网络会错过很多关键细节——函数近似带来的非平稳性问题、特征表示对收敛性的影响、以及目标网络为什么有必要存在。这本书处理函数近似的方式是从线性函数近似讲起的。线性近似虽然在工程上不够强大但它的数学性质好得多它让你能用凸优化的分析工具来理解价值估计的收敛行为。当你理解了线性近似的极限和问题后再跳到神经网络你至少知道哪些问题是近似方式带来的哪些问题是优化器带来的。我见过一个常见的翻车场景有人用DQN训练CartPoleloss下降得很漂亮但最终策略完全不行。如果你读过这本书的相关章节你会明白这很可能是因为Q值的近似误差在累积导致策略选择方向发生了偏移。单纯调网络结构解决不了这个问题需要从价值函数更新的逻辑层面去干预。这不是代码能教你的只能靠数学原理来指路。4. 学习这本书的避坑指南五个最容易卡住的地方4.1 卡在“期望”和“采样”的差异数学式子和代码对不上现象公式里的期望符号看着很顺眼一写代码就不知道在哪里“取期望”。比如策略梯度定理里的那个期望到底怎么在Python里实现原因数学里的期望是一个积分运算而代码里你只能拿到有限条轨迹的样本均值。你用一批采样的平均来估计期望这引入了估计偏差和方差——这正是RL训练曲线抖动剧烈的理论来源。解决把书里的期望符号“翻译”成采样循环。见到期望就告诉自己这里我要跑N条轨迹取平均。更进一步要把“这个期望是对哪个分布取的”问清楚——是对当前策略的轨迹分布还是对经验回放池里的均匀分布。这两个分布一旦搞混你的更新方向就是错的。4.2 卡在收敛性证明为什么不收敛也能用现象书上证明了在某些条件下策略迭代收敛到最优但你在实际训练中从来没看到过“收敛”只有曲线在震荡中缓慢爬升或突然崩盘。原因书里的证明大多假设状态转移概率已知表格法或者函数近似类满足严格条件。现实任务里这些假设全都不成立状态转移未知、神经网络不是线性函数近似、非平稳性无处不在。数学上的收敛性是保证算法设计方向正确的锚点不是对每次运行的承诺。解决把收敛性证明读成“设计指南”。证明过程中使用到的关键条件就是你调参时需要留意的地方。例如证明要求步长满足Robbins-Monro条件在实践中就对应着学习率衰减策略的重要性。别去追求“让训练收敛”而是去检查“是否至少不违背这些定理的基本条件”。4.3 卡在符号体系不同教材的记号不一致怎么切换现象刚看完Sutton的书转来看赵世钰的书发现策略用 $\pi$ 写成 $\pi(a|s)$但在别的教材里是 $\pi(s,a)$回报的符号也各有不同。几本书串着读符号把自己搞晕了。原因强化学习社区没有统一的符号标准Sutton用 $G_t$ 表示回报有的文献用 $R_t$还有的用 $U_t$。符号不同不代表概念不同但频繁切换确实增加认知负担。解决强烈建议你在读这本书之前建立一张“符号对照表”。自己在笔记里写下哪个符号表示状态价值、哪个表示动作价值、哪个表示折扣因子。每次开始读一个新章节前先在对照表里把该章的符号映射关系过一遍。这个习惯能帮你省下大量时间而且会形成你自己的知识体系而不是被不同教材牵着走。4.4 卡在“状态价值”和“动作价值”的区分什么时候用哪个现象读的时候觉得两个概念都很清楚但一推导起来就混。比如在Q-learning里更新的明明是动作价值策略改进时却要从动作价值中恢复出状态价值。原因状态价值 $V(s)$ 是对状态本身好坏的评估动作价值 $Q(s,a)$ 是对“在这个状态下执行这个动作”好坏的评估。两者的关系是 $V(s) \max_a Q(s,a)$最优策略下或者 $V(s) \sum_a \pi(a|s)Q(s,a)$给定策略下。这个转换看似简单但在多步推导中很容易搞丢一个求和符号或一个max算子。解决每看到一个关于价值的公式先问自己这里的价值是对状态求的还是对“状态-动作对”求的如果是状态价值它有没有对动作做边际化如果是动作价值它对应的策略分布是哪来的养成这个习惯后你再看Actor-Critic类算法时会发现评论家的目标到底是拟合V还是拟合Q直接决定了整个更新图的形状。4.5 卡在“一边学一边采样的非平稳问题”理论假设和工程现实现象跑online RL任务时训练效果好一阵子然后突然崩坏怎么重试都没用。用offline数据训练却没有这个问题。原因在线强化学习的数据分布是随策略变化的——策略一变你采到的数据分布就变了。这个非平稳性让监督学习的经典理论不再适用。书上讲的收敛性通常在“固定数据分布”或“循环访问所有状态”的假设下成立工程中这两个假设基本都不现实。解决把书里的“遍历性假设”当作一个调参线索。例如为什么经验回放experience replay能提升稳定性因为它在一定程度上缓解了数据分布突变的问题。为什么PPO要限制每次更新的幅度因为它试图避免策略一次变化太大导致数据分布骤变。理解了这一点你就能理解为什么有些论文里会刻意增大回放池容量——这不是凭空来的调参技巧而是在向理论假设靠拢。5. 怎么把这本书吃到肚子里一个可行的学习路径与配套练习5.1 按章节推进的阅读顺序哪些可以跳过、哪些必须死磕这本书的阅读顺序是有讲究的。如果你是工程背景数学基础一般不建议从头到尾线性阅读。我的做法是分三层推进第一层通读一到四章MDP、贝尔曼方程、动态规划、蒙特卡洛与TD目标是建立符号体系和核心概念框架。这四章里的所有公式都需要亲自推导一遍不要跳。尤其是贝尔曼方程的两种形式状态价值和动作价值必须达到闭卷能写出来的水平。第二层聚焦策略梯度与Actor-Critic部分重点推策略梯度定理和GAE的推导。这一层开始接触现代算法阅读速度可以放慢每一页推导都要跟到最后一个等号。凡是出现“显然”“容易看出”的地方停下来自己补全推导。第三层选择性地读函数近似和探索利用相关章节。这两部分内容更进阶不需要一次读完可以当你实际项目中遇到相关问题时按需查阅。我的实操经验是第一层用三周看完每天一到两小时第二层用两周每天投入更集中第三层不设时间限制变成工具书随时查阅。5.2 每章看完后必须亲手做的三类推导作业只看不做等于白读。我给自己定了三条规则你也可以直接用第一每个定理都要亲手推导一遍不看不抄。别怕慢我第一次推贝尔曼最优方程花了两个小时中间还卡住了三次。实际上你卡住的那几次才是真正学到东西的时刻。第二每个算法都要写出“单步更新公式”。比如看完了Q-learning把它的更新写成一行伪代码Q[s,a] lr * (r gamma * max_a Q[s,a] - Q[s,a])。能把这行写出来说明你理解了写不出来说明还没吃透。第三把证明中用到的“关键假设”圈出来。书里每个定理都有前提条件找到它们并思考如果去掉这个条件会怎样。这是工程师最容易忽略但最值得做的练习——它决定了你能否把一个算法迁移到新环境。5.3 用公式推导驱动代码调试PPO中GAE实现对照最后把书里的GAE公式和代码实现对照起来。实践中有个常见问题很多开源PPO代码里的GAE实现都带有一些“看似多余”的操作比如先在最后一个状态处初始化一个零优势、然后逆序累积。这些细节不脏但如果你没读过数学推导就不知道每一行代码对应的是公式里的哪一项。以GAE计算的关键代码为例def compute_gae(rewards, values, dones, gamma, lam): # rewards: 每一步奖励 # values: 评论家对每个状态的价值估计 # dones: 是否为终止状态 T len(rewards) advantages [0] * T gae 0 for t in reversed(range(T)): # 非终止状态下计算TD误差 next_value values[t 1] if t 1 T else 0 # 注意termination时下一个状态的价值应归零 delta rewards[t] gamma * next_value * (1 - dones[t]) - values[t] # GAE的递推形式当前优势 TD误差 gamma*lam*未来优势 gae delta gamma * lam * gae * (1 - dones[t]) advantages[t] gae return advantages这段代码里最容易被忽略的是dones[t]的乘项。终止状态下不存在“下一个状态”所以价值估计必须归零。这个细节在数学推导中对应的是“回合结束后的未来回报为零”的约定。没有这个处理训练时值函数会在终止状态附近产生严重偏差。你能看出这一点说明书没白读。参数说明 - gamma折扣因子决定未来奖励的权重常见取值0.99左右。 - lamGAE的平滑系数控制偏差与方差的权衡常见取值0.95~0.99。 - dones终止标志数组1表示终止0表示继续。6. 验证自己真学懂了复现一个算法并讲清每个符号最后一个技巧也是我一直在用的“检验标准”找一个你熟悉的算法闭上书从零复现它的更新流程。不需要全部代码跑通只需要把每个符号对应的计算写在纸上。比如你写PPO就要能回答advantage来自哪里log_prob在哪个分布下计算ratio是概率比还是对数概率差如果每个问题都能给出明确答案说明这本书已经长在你脑子里了。这些年我带过不少人入门强化学习一个绕不开的教训是先动手写代码的人往往会在三个月后回来补数学先啃数学的人写代码的速度会慢一点但很少返工。这个领域的知识密度很高没有捷径。你不需要成为数学家但你需要掌握那些公式背后“为什么这样设计”的判断力这恰恰是赵世钰这本《强化学习的数学原理》能给到你的东西。希望帮到你。本文还有配套的精品资源点击获取