简介:《强化学习的数学原理》是西湖大学赵世钰教授撰写的英文专著,面向具备一定数学基础、希望从底层原理理解强化学习的学习者与研究者。全书从零出发,结合大量例子循序渐进地揭示强化学习本质,章节涵盖基础概念、状态值与贝尔曼方程、最优状态值与贝尔曼最优方程、值迭代与策略迭代、蒙特卡洛方法、随机近似、时间差分方法、值函数近似、策略梯度方法及演员-评论家方法,附录还讨论序列收敛性。资源包为1个PDF文件,约18.9MB,内容完整、目录清晰,便于按章节系统研读。目前已有843人学习下载。通过阅读,读者可掌握网格世界、状态转移、策略、奖励、轨迹与回报、马尔可夫决策过程等核心概念,理解贝尔曼方程的矩阵向量形式、闭式解与迭代解,并进一步把握从状态值到动作值、从策略评估到策略优化的数学脉络,为算法设计与分析打下坚实基础。
1. 从翻车到通透:为什么我建议你死磕这本《强化学习的数学原理》
很多人学强化学习是从跑通 Stable-Baselines3 的 PPO 开始的,我也不例外。但真到了要改 reward 函数、调 entropy 系数、或者解释为什么 Q-learning 在某个环境里死活不收敛的时候,那种“知其然不知其所以然”的无力感就来了。如果你也卡在这个阶段,手里这本《强化学习的数学原理》就是那个能帮你把地基重新打一遍的东西。它不是教你调包的速查手册,而是一本从数学角度、用网格世界这一个例子贯穿始终,把贝尔曼方程、值迭代、策略梯度这些概念一层层剥开的英文专著。全书十章加四个附录,从基本概念一路推到 Actor-Critic,适合已经会跑代码但想搞懂“为什么这么设计”的从业者,也适合被数学符号劝退过、想找一本能真正读进去的教材的读者。
2. 网格世界与 MDP:把强化学习塞进一个 5x5 的格子里
2.1 为什么选网格世界作为贯穿全书的例子
这本书最聪明的地方,是它没有一上来就甩公式,而是先给你一个网格世界。一个 5x5 的格子,智能体从起点出发,目标是走到终点,每走一步有奖励或惩罚。就这么个简单到可以用手算的东西,把状态、动作、状态转移、策略、奖励、轨迹、回报、episode 这些概念全串起来了。我一开始觉得这太小儿科,但读到后面才发现,贝尔曼方程、值迭代、蒙特卡洛、时间差分,所有算法在这个网格世界上都能用同一套数据跑出结果,对比起来极其直观。这种“一个例子吃透全书”的写法,比那些每章换一个环境的教材友好太多。
2.2 状态转移与策略的数学表达
在网格世界里,状态就是格子的坐标,动作就是上下左右。状态转移概率 p(s'|s,a) 描述的是在状态 s 执行动作 a 后跳到 s' 的概率。这本书没有回避数学,但它的处理方式很克制:先给直觉,再给公式,最后用网格世界的具体数字算一遍。策略 π(a|s) 是一个概率分布,表示在状态 s 下选动作 a 的概率。确定性策略是它的特例。我一般会建议读者在这里停下来,自己用 Python 写一个 5x5 的网格,手动定义转移和奖励,然后随机采样几条轨迹,感受一下“策略决定轨迹分布”这件事。代码不用复杂,二十行就够:
import numpy as np # 5x5 网格,状态编号 0-24,动作 0=上,1=下,2=左,3=右 n_states, n_actions = 25, 4 P = np.zeros((n_states, n_actions, n_states)) R = np.zeros((n_states, n_actions)) for s in range(n_states): row, col = divmod(s, 5) for a in range(n_actions): if a == 0: nr, nc = max(row-1, 0), col elif a == 1: nr, nc = min(row+1, 4), col elif a == 2: nr, nc = row, max(col-1, 0) else: nr, nc = row, min(col+1, 4) ns = nr * 5 + nc P[s, a, ns] = 1.0 # 确定性转移 R[s, a] = -1.0 if ns != 24 else 0.0 # 每步 -1,终点 0 # 均匀随机策略 pi = np.ones((n_states, n_actions)) / n_actions # 采样一条轨迹 s, traj = 0, [] for _ in range(20): a = np.random.choice(n_actions, p=pi[s]) traj.append((s, a, R[s, a])) s = np.random.choice(n_states, p=P[s, a]) if s == 24: break print(traj)这段代码里 P 是转移张量,R 是即时奖励,pi 是策略。跑一遍就能看到轨迹长什么样,回报怎么累加。参数上唯一需要注意的是转移的确定性——这里为了简单设成了 1.0,实际环境里可能是概率分布,改 P[s,a,ns] 的值就行。
2.3 回报、折扣因子与 episode 的边界
回报 G_t 是从 t 时刻开始的累计折扣奖励,折扣因子 γ 控制智能体有多“短视”。这本书用了一个动机示例来说明为什么需要折扣:如果任务没有终止状态,不折扣的回报可能发散。episode 则是一次完整的交互过程,从初始状态到终止状态。网格世界里 episode 就是走到终点或撞墙。我见过不少人在实际项目里把 γ 设成 0.99 却说不清为什么,这本书第二章会告诉你,γ 不仅影响数值稳定性,还决定了最优策略的形状——γ 越小,策略越倾向于就近拿奖励。这个结论在后面的最优策略影响因素一节里还会展开。
3. 贝尔曼方程与值迭代:从闭式解到收敛性证明
3.1 状态值与贝尔曼方程的矩阵形式
状态值 v_π(s) 是从 s 出发、遵循策略 π 的期望回报。贝尔曼方程把它写成递归形式:v_π(s) = Σ_a π(a|s) Σ_{s',r} p(s',r|s,a)[r + γ v_π(s')]。这本书的第二章花了大量篇幅推导这个方程,然后给出矩阵-向量形式 v = r_π + γ P_π v。这个形式的好处是,闭式解直接就是 v = (I - γ P_π)^{-1} r_π。我第一次看到这个式子的时候有点懵,后来用网格世界算了一遍才明白:P_π 是策略诱导的转移矩阵,r_π 是策略诱导的期望奖励,整个方程就是一个线性系统。闭式解在状态数少的时候能用,但状态一多矩阵求逆就不现实了,所以才有迭代解。
3.2 迭代解与收敛条件
迭代解就是不断用贝尔曼方程更新 v_{k+1} = r_π + γ P_π v_k,直到 v 变化小于阈值。这本书证明了当 γ < 1 时这个迭代是压缩映射,必然收敛到唯一不动点。我一般会建议读者自己写一个循环验证一下:
gamma = 0.9 v = np.zeros(n_states) for k in range(1000): v_new = np.zeros(n_states) for s in range(n_states): for a in range(n_actions): v_new[s] += pi[s, a] * (R[s, a] + gamma * np.dot(P[s, a], v)) if np.max(np.abs(v_new - v)) < 1e-6: print(f"收敛于第 {k} 次迭代") break v = v_new print(v.reshape(5, 5))这里 gamma 是关键参数,越接近 1 收敛越慢。阈值 1e-6 是精度控制,实际项目里可以根据状态值量级调整。跑完打印出来的 5x5 矩阵就是每个格子的状态值,能直观看到离终点越近值越高。
3.3 从状态值到动作值
动作值 q_π(s,a) 是在状态 s 执行动作 a 后再遵循 π 的期望回报。这本书从状态值自然过渡到动作值,并给出贝尔曼方程在动作值下的形式。动作值的重要性在于,它直接告诉你在某个状态下哪个动作更好,不需要知道转移概率就能比较。这个性质在后面蒙特卡洛和时间差分方法里会被反复用到。我读到这里的时候才真正理解为什么 Q-learning 学的是 Q 而不是 V——因为 Q 可以直接指导决策,而 V 还需要模型才能选动作。
4. 避坑与排查:读这本数学书时最容易翻车的五个地方
4.1 跳过第一章直接看算法
现象:很多人觉得自己“懂”强化学习,直接从第四章值迭代开始看,结果看到矩阵形式就卡住了。原因:第一章的网格世界和 MDP 定义是后面所有符号的基础,跳过之后 p(s'|s,a)、π(a|s)、v_π(s) 这些记号的含义全靠猜。解决:老老实实把第一章的网格世界手算一遍,把状态转移和回报的数值写出来,后面所有公式都能对应上。
4.2 把折扣因子当成纯超参数
现象:调参时把 γ 从 0.99 改成 0.9,发现策略变得极其短视,甚至不往终点走了。原因:γ 在数学上决定了贝尔曼算子的压缩程度,也决定了最优策略的形状。γ 太小,远期奖励被压得几乎为零,智能体只盯着眼前。解决:先根据任务的时间尺度估算一个合理的 γ,比如每步奖励量级和 episode 长度,再在这个附近微调,不要盲目搜。
4.3 混淆 on-policy 和 off-policy 的更新目标
现象:用 Sarsa 的代码去实现 Q-learning,结果学出来的策略和预期不符。原因:Sarsa 用实际执行的动作更新,Q-learning 用 max 动作更新,两者的贝尔曼备份目标不同。这本书第七章专门用一节讲 off-policy vs on-policy,读的时候要对照代码看更新公式。解决:在代码里把 target 的计算单独拎出来,确认用的是 a' 还是 argmax Q,再跑网格世界验证。
4.4 忽略随机近似的前提条件
现象:学习率设成常数,前期收敛很快,后期一直在最优值附近震荡。原因:第六章的 Robbins-Monro 算法要求学习率满足 Σα = ∞ 且 Σα² < ∞,常数学习率不满足第二个条件。解决:用 α_k = 1/k 或分段衰减,实际项目里常用线性衰减到一个小常数,兼顾收敛速度和稳定性。
4.5 值函数近似时直接套用表格方法的直觉
现象:用神经网络近似 Q 值后,发现训练极不稳定,甚至发散。原因:第八章会讲,函数近似引入了泛化误差,表格方法里的收敛保证不再成立。解决:先在小网格上用线性近似跑通,确认目标函数和更新公式没问题,再换神经网络,同时加上目标网络和经验回放。
5. 从蒙特卡洛到 Actor-Critic:一条不用模型也能走通的路
5.1 蒙特卡洛方法的无模型本质
第五章的蒙特卡洛方法是我认为全书最“解渴”的一章。它从策略迭代出发,把其中需要模型的部分(计算期望)替换成采样平均,从而得到无模型算法。MC Basic 是最简单的版本,直接用完整 episode 的回报估计动作值,然后做策略改进。这本书用网格世界展示了 MC Basic 如何一步步逼近最优策略,但同时也指出它的样本效率极低。MC Exploring Starts 和 MC ε-Greedy 分别从“更高效利用样本”和“去掉探索起点假设”两个方向改进。我读这一章的时候最大的收获是:无模型不是魔法,它只是把期望换成了样本均值,代价是方差。
5.2 时间差分与自举
第七章的时间差分方法把蒙特卡洛的采样和动态规划的自举结合起来了。TD 用 r + γ v(s') 作为目标,而不是等 episode 结束再用完整回报。这本书详细分析了 TD 的收敛性,并给出了 Sarsa、n-step Sarsa、Q-learning 的统一视角。我一般会建议读者在这里对比三个算法的更新公式:Sarsa 用实际动作,Q-learning 用 max 动作,n-step Sarsa 介于两者之间。在网格世界上跑一遍,观察 Q 值的变化轨迹,比看十遍公式都管用。
5.3 策略梯度与 Actor-Critic 的衔接
第九章的策略梯度方法把策略参数化,直接对目标函数求梯度。这本书从度量定义出发,推导了折扣和未折扣情况下的梯度,然后给出 REINFORCE 算法。第十章在此基础上引入值函数作为基线,得到 Actor-Critic。A2C、off-policy actor-critic、确定性策略梯度,这些在实际项目里常见的算法,在这本书里都有清晰的数学推导。我读到这里才真正理解为什么 A2C 里 advantage 要用 Q - V,而不是直接用 Q——因为基线不变性保证了梯度期望不变,但方差更小。
5.4 附录的收敛性证明怎么读
附录 C 的序列收敛性对理解随机近似和时间差分的收敛至关重要。这本书把确定性序列和随机序列的收敛分开讲,Dvoretzky 定理和 Robbins-Monro 定理的证明都在这里。我一开始跳过附录直接看正文,结果第七章的收敛分析看得云里雾里。后来回头补了附录 C,才发现正文里很多“可以证明”的地方,证明过程都在附录里。建议读第七章之前先把附录 C 的前两节过一遍,不需要完全吃透,但至少知道随机序列收敛的条件长什么样。
6. 把这本书用起来:我的三遍阅读法和一个验证习惯
这本书我读了三遍,每一遍的方法都不一样。第一遍是通读,不纠结证明,重点看每章的动机示例和网格世界的结果,把十章的逻辑链串起来:基本概念 → 贝尔曼方程 → 最优贝尔曼方程 → 值迭代/策略迭代 → 蒙特卡洛 → 随机近似 → 时间差分 → 值函数近似 → 策略梯度 → Actor-Critic。第二遍是动手,每读一个算法就在网格世界上用 Python 实现一遍,不调库,纯手写。第三遍是补数学,把附录 C 和每章灰色框里的证明挑出来看,重点搞懂压缩映射、随机逼近、梯度推导这三块。
我一般会建议读者在读完第四章之后,自己做一个对比实验:用值迭代、策略迭代、截断策略迭代三种方法解同一个网格世界,记录收敛所需的迭代次数和最终策略。这个实验能让你直观感受到三种算法的差异——值迭代每轮只更新一次值函数,策略迭代每轮要把值函数算到收敛,截断策略迭代则在两者之间取一个截断步数。参数上唯一要调的是截断步数,设成 1 就退化成值迭代,设成无穷大就是策略迭代。
还有一个习惯我坚持了很久:每学完一个算法,就把它和前面学过的算法放在同一个网格世界上跑,用同一套初始值和参数,对比 Q 值或策略的差异。比如学完 Q-learning 之后,把它和 Sarsa 放在一起跑,观察 on-policy 和 off-policy 在探索策略不同时的表现差异。这种对比比单独看公式有效得多,因为差异会直接体现在数值上。
从那以后我每次读新的强化学习算法,都强制自己先在网格世界上手写一遍,再去看库里的实现。这个习惯帮我避开了很多“看起来懂了但一写就错”的坑。希望这本《强化学习的数学原理》也能帮你把地基打牢,后面不管换什么算法、什么框架,都能一眼看穿它的数学骨架。
本文还有配套的精品资源,点击获取