简介:由西湖大学赵世钰教授撰写的英文原版教材《强化学习的数学原理》,是一份面向希望从数学角度系统理解强化学习核心原理的PDF资料。全书以网格世界示例引入基本概念,依次讲解状态值与贝尔曼方程、最优状态值与贝尔曼最优方程、值迭代与策略迭代、蒙特卡洛方法、随机近似、时间差分、值函数近似、策略梯度与Actor-Critic等核心主题,并在附录讨论序列收敛性。资源为单个PDF文件,大小约18.9MB,便于离线阅读、检索和标注。目前已有833人学习使用。读者通过大量例子与严谨推导,可以建立从马尔可夫决策过程到现代强化学习算法的完整知识框架,掌握价值函数求解、策略优化的数学机制,为后续设计分析强化学习算法打下扎实基础,适合有一定数学背景的研究者、工程师和高年级学生作为教材或参考书。
1. 为什么我劝你啃下这本《强化学习的数学原理》而不是先刷代码
做了几年强化学习落地,我见过太多人卡在同一个地方:调了好几个月PPO,reward就是不涨,换了个随机种子又崩了。代码看了一堆,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_{t=0}^{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{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l} $$
其中 $\delta_t = r_t + \gamma V(s_{t+1}) - 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训练CartPole,loss下降得很漂亮,但最终策略完全不行。如果你读过这本书的相关章节,你会明白这很可能是因为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左右。 - lam:GAE的平滑系数,控制偏差与方差的权衡,常见取值0.95~0.99。 - dones:终止标志数组,1表示终止,0表示继续。6. 验证自己真学懂了:复现一个算法并讲清每个符号
最后一个技巧,也是我一直在用的“检验标准”:找一个你熟悉的算法,闭上书,从零复现它的更新流程。不需要全部代码跑通,只需要把每个符号对应的计算写在纸上。比如你写PPO,就要能回答:advantage来自哪里?log_prob在哪个分布下计算?ratio是概率比还是对数概率差?如果每个问题都能给出明确答案,说明这本书已经长在你脑子里了。
这些年我带过不少人入门强化学习,一个绕不开的教训是:先动手写代码的人,往往会在三个月后回来补数学;先啃数学的人,写代码的速度会慢一点,但很少返工。这个领域的知识密度很高,没有捷径。你不需要成为数学家,但你需要掌握那些公式背后“为什么这样设计”的判断力,这恰恰是赵世钰这本《强化学习的数学原理》能给到你的东西。希望帮到你。
本文还有配套的精品资源,点击获取