简介:《强化学习的数学原理》是西湖大学赵世钰教授撰写的英文专著,面向具备一定数学基础、希望从零系统理解强化学习本质的读者。全书以数学推导为主线,结合大量例子循序渐进地展开,涵盖基础概念、状态值与贝尔曼方程、最优状态值与贝尔曼最优方程、值迭代与策略迭代、蒙特卡洛方法、随机近似、时间差分方法、值函数近似、策略梯度方法及演员-评论家方法,附录还讨论了序列收敛性。第一章借助网格世界例子讲解状态、动作、状态转移、策略、奖励、轨迹与回报,并引出马尔可夫决策过程;后续章节则围绕贝尔曼方程、矩阵向量形式、闭式解与迭代解、从状态值到动作值等核心内容深入剖析。资源包为1个PDF文件,约18.9MB,结构完整、目录清晰,便于按章节检索学习。目前已有843人学习下载,适合希望夯实强化学习数学基础、理解算法背后原理并用于设计与分析的读者。
1. 强化学习数学原理:一张从贝尔曼方程到 Actor-Critic 的知识地图
很多人学强化学习,卡在同一个地方:代码能跑,但说不清为什么能收敛。策略梯度推导里突然冒出一个基线,Q-learning 里突然出现 max 操作,值迭代和策略迭代到底差在哪——这些如果只靠调库,永远是一笔糊涂账。这份《强化学习的数学原理》笔记,梳理下来最大的价值,就是把这条从「基础概念」到「Actor-Critic」的链路,用数学语言重新串了一遍。全书十章加附录,前半部分讲基本工具,后半部分讲算法方法,中间用「有模型到无模型」「表格到函数」两条主线贯穿。适合已经跑过几个 Demo、但想回头补数学地基的人,也适合正在复习备考、需要一份体系化提纲的人。下面按知识地图、核心模块、易错点、复习清单四层展开。
2. 基础概念与贝尔曼方程:状态值到底在算什么
2.1 网格世界:所有概念的试验场
全书用一个网格世界任务贯穿始终,这不是偷懒,而是刻意设计。网格世界足够简单,状态、动作、转移、奖励都能可视化,但又不失 MDP 的一般性。梳理下来会发现,强化学习里几乎所有反直觉的地方,都能在这个小格子里找到对应。
核心要素可以这样对照记忆:
| 概念 | 在网格世界中的含义 | 数学符号 |
|---|---|---|
| 状态 | 智能体所在格子 | s |
| 动作 | 上下左右移动 | a |
| 状态转移 | 移动后到达的格子 | p(s'|s,a) |
| 策略 | 每个格子选方向的规则 | π(a|s) |
| 奖励 | 到达目标格子的反馈 | r |
| 回报 | 从某时刻起累计折扣奖励 | G_t |
| Episode | 从起点到终点的一轮 | τ |
这里最容易忽略的是「轨迹、回报、Episode」三者的关系。轨迹是一串状态动作序列,回报是轨迹上的折扣累加,Episode 是产生轨迹的一次完整交互。很多人把回报和奖励混用,导致后面贝尔曼方程里的期望符号理解错位。
2.2 贝尔曼方程:状态值的递归结构
状态值 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π。但实际中矩阵求逆代价太高,所以迭代解才是重点:v_{k+1} = rπ + γPπ v_k,收敛条件是 γ < 1 或策略最终到达吸收态。
从状态值到动作值的扩展也在这里完成。动作值 qπ(s,a) 表示先执行动作 a、再遵循策略 π 的期望回报。两者的关系是 vπ(s) = Σ_a π(a|s) qπ(s,a),而 qπ(s,a) = Σ_{s',r} p(s',r|s,a)[r + γ vπ(s')]。这个互相表示的关系,是后面所有算法的地基。
提示:贝尔曼方程有两种用法——策略评估时用它算给定策略的值,策略改进时用它比较不同动作的值。复习时先分清「评估」和「改进」两个场景,再去看算法。
3. 最优性与迭代算法:值迭代和策略迭代的分岔路
3.1 贝尔曼最优方程:max 操作带来的非线性
最优状态值 v*(s) 是所有策略中能取得的最大状态值。贝尔曼最优方程(BOE)把贝尔曼方程里的期望换成了 max:
v*(s) = max_a Σ_{s',r} p(s',r|s,a) [ r + γ v*(s') ]
这个 max 是整本书的分水岭。贝尔曼方程是线性的,可以直接解;BOE 是非线性的,因为 max 不能提到求和外面。压缩映射定理在这里登场,用来证明 BOE 有唯一解,且迭代法能收敛。梳理下来会发现,压缩映射的证明思路是:先证明右边关于 v 是压缩的,再用 Banach 不动点定理保证唯一性和收敛性。
影响最优策略的因素也在这里讨论:折扣因子 γ 改变会直接影响策略的激进程度,γ 越接近 1,智能体越看重长期回报;奖励设计则决定了哪些状态被赋予高值。这两点在调参时是血泪经验——γ 设错,策略可能完全跑偏。
3.2 值迭代与策略迭代:两种收敛路径
值迭代和策略迭代是求解 BOE 的两条路:
| 对比项 | 值迭代 | 策略迭代 |
|---|---|---|
| 每轮操作 | 更新值函数一次 | 完整策略评估 + 策略改进 |
| 收敛速度 | 每轮计算少,轮数多 | 每轮计算多,轮数少 |
| 核心公式 | v_{k+1} = max_a ... | π' = greedy(vπ) |
| 适用场景 | 状态空间大、单轮成本敏感 | 状态空间小、评估可精确求解 |
值迭代的逐元素形式是 v_{k+1}(s) = max_a Σ p(r + γ v_k(s')),实现时对每个状态遍历所有动作取最大值。策略迭代则分两步:先用贝尔曼方程迭代到收敛得到 vπ,再对每个状态取 argmax 得到新策略,循环直到策略不变。
截断策略迭代是两者的统一视角。值迭代相当于策略评估只做一步,策略迭代相当于策略评估做到收敛,中间的任何截断次数都对应一种算法。这个视角能解释为什么值迭代和策略迭代都能收敛到最优——它们只是评估精度的不同取舍。
注意:策略迭代里策略改进的贪心选择,如果遇到多个动作值相同的情况,要固定一个选择规则,否则可能陷入策略震荡。
4. 无模型方法:蒙特卡洛与时间差分的分工
4.1 蒙特卡洛:用完整轨迹估计值
蒙特卡洛方法的核心思想是用采样代替模型。MC Basic 直接把策略迭代中的策略评估换成用完整轨迹的回报均值来估计动作值:
qπ(s,a) ≈ (1/N) Σ_{i=1}^{N} G_i(s,a)
这里 G_i 是第 i 条轨迹中在 (s,a) 之后的折扣回报。MC Basic 的缺点是必须等 Episode 结束才能更新,且对每个状态动作对都要采样足够多次。MC Exploring Starts 通过利用样本更高效来改进:一条轨迹经过的所有状态动作对都可以用来更新,而不只是起点。MC ε-Greedy 则解决了探索起点的问题,用 ε 概率随机选动作、1-ε 概率选贪心动作,保证所有动作都有被选中的可能。
ε-greedy 的探索与利用权衡是这一章的重点。ε 太大,策略接近随机,收敛慢;ε 太小,可能漏掉更优动作。实践中常用衰减的 ε,早期多探索,后期多利用。
4.2 随机近似与时间差分:从 MC 到 TD 的桥梁
随机近似是连接蒙特卡洛和时间差分的数学工具。Robbins-Monro 算法给出了求根问题的迭代形式:
w_{k+1} = w_k - α_k * g(w_k, η_k)
其中 g 是带噪声的观测,α_k 是步长。收敛条件是 Σα_k = ∞ 且 Σα_k² < ∞。这个条件在 TD 学习里反复出现,是判断算法能否收敛的依据。Dvoretzky 定理则把收敛条件推广到更一般的形式,SGD 是它在优化中的特例。
时间差分方法的核心是用自举(bootstrapping)代替完整轨迹。TD 学习状态值的更新是:
v(s_t) ← v(s_t) + α [ r_{t+1} + γ v(s_{t+1}) - v(s_t) ]
括号里是 TD 误差。Sarsa 把同样的思路用到动作值上,更新式是 q(s_t,a_t) ← q(s_t,a_t) + α [ r_{t+1} + γ q(s_{t+1},a_{t+1}) - q(s_t,a_t) ]。n-step Sarsa 则在 MC 和 TD 之间做插值,n=1 是 Sarsa,n→∞ 是 MC。
Q-learning 是最重要的异策略算法,更新式是:
q(s_t,a_t) ← q(s_t,a_t) + α [ r_{t+1} + γ max_a q(s_{t+1},a) - q(s_t,a_t) ]
和 Sarsa 的区别在于,Q-learning 用 max 操作,学习的是最优动作值,行为策略和目标策略可以不同。On-policy 和 Off-policy 的区别在这里必须分清:Sarsa 是 on-policy,因为它用实际执行的下一个动作来更新;Q-learning 是 off-policy,因为它用最大动作值来更新,不管实际执行什么。
# Q-learning 核心更新逻辑(表格版) # q_table: 状态动作值表,shape=(num_states, num_actions) # alpha: 学习率,gamma: 折扣因子,epsilon: 探索率 for episode in range(num_episodes): s = env.reset() done = False while not done: # ε-greedy 选择动作 if random.random() < epsilon: a = env.action_space.sample() else: a = np.argmax(q_table[s]) s_next, r, done, _ = env.step(a) # Q-learning 更新:用 max 操作,off-policy td_target = r + gamma * np.max(q_table[s_next]) * (1 - done) q_table[s, a] += alpha * (td_target - q_table[s, a]) s = s_next这段代码里(1 - done)是关键,终止状态没有后续值,必须把自举项置零。np.max(q_table[s_next])对应 Q-learning 的 max 操作,换成q_table[s_next, a_next]就是 Sarsa。参数方面,alpha 通常取 0.1 到 0.01,gamma 取 0.9 到 0.99,epsilon 从 1.0 衰减到 0.05 左右。
5. 函数近似与策略梯度:从表格到神经网络
5.1 值函数近似:表格不够用之后
表格方法的状态空间是离散且有限的,一旦状态连续或维度高,表格就存不下。值函数近似用参数化函数 v(s;w) 或 q(s,a;w) 来替代表格,w 是参数向量。目标函数是均方误差:
J(w) = E[(vπ(s) - v(s;w))²]
优化用 SGD,更新式是 w ← w + α [ vπ(s) - v(s;w) ] ∇_w v(s;w)。但 vπ(s) 未知,所以用 TD 目标 r + γ v(s';w) 代替,得到半梯度 TD:
w ← w + α [ r + γ v(s';w) - v(s;w) ] ∇_w v(s;w)
叫「半梯度」是因为 TD 目标里也含 w,但求导时只对当前估计求导,忽略目标里的 w。这个近似在实践中效果足够好,但理论上不保证收敛到全局最优。
函数近似器的选择上,线性近似 v(s;w) = φ(s)^T w 有收敛保证,但表达能力有限;神经网络表达能力强,但收敛性依赖调参。Deep Q-learning 用神经网络近似 q(s,a;w),并引入经验回放和目标网络来稳定训练。经验回放打破样本相关性,目标网络固定 TD 目标一段时间,这两个技巧是 DQN 能训起来的关键。
5.2 策略梯度与 Actor-Critic:直接优化策略
策略梯度方法直接参数化策略 π(a|s;θ),优化目标是期望回报 J(θ)。策略梯度定理给出:
∇_θ J(θ) = E[ ∇_θ ln π(a|s;θ) * qπ(s,a) ]
REINFORCE 用完整轨迹的回报 G_t 代替 qπ(s,a),更新式是 θ ← θ + α G_t ∇_θ ln π(a_t|s_t;θ)。这个式子的直观解释是:回报高的动作,增加其概率;回报低的动作,降低其概率。
Actor-Critic 用值函数来估计 qπ(s,a),降低方差。最简单的 QAC 用 q(s,a;w) 作为 critic,actor 用策略梯度更新。A2C 引入优势函数 A(s,a) = q(s,a) - v(s),并证明减去基线 v(s) 不改变期望梯度,但能显著降低方差。这个「基线不变性」是 A2C 的核心。
Off-policy Actor-Critic 用重要性采样来纠正行为策略和目标策略的分布差异,重要性权重是 π(a|s)/b(a|s)。确定性策略梯度(DPG)则直接输出确定性动作,适用于连续动作空间,更新式里对动作求导而不是对策略概率求导。
| 方法 | 策略类型 | 值函数 | 适用动作空间 |
|---|---|---|---|
| REINFORCE | 随机 | 无 | 离散/连续 |
| QAC | 随机 | q(s,a) | 离散 |
| A2C | 随机 | q(s,a) 或 v(s) | 离散/连续 |
| DPG | 确定性 | q(s,a) | 连续 |
提示:策略梯度里的 ln π 求导,离散动作用 softmax 输出概率,连续动作用高斯分布输出均值和方差。复习时把这两套输出层的梯度推导各走一遍,比背公式有用。
6. 易漏点与易错点:复习时最容易翻车的五处
6.1 易漏点一:贝尔曼方程和贝尔曼最优方程的适用场景
为什么漏:两个方程形式相近,只差一个 max,复习时容易混着记。但贝尔曼方程用于策略评估,给定策略 π;贝尔曼最优方程用于找最优策略,不依赖具体 π。
怎么补:每次写方程前先问自己——当前是评估还是改进?评估用期望,改进用 max。把这两个场景写在笔记最上面,做题前先看一眼。
6.2 易漏点二:On-policy 和 Off-policy 的判断标准
为什么漏:Sarsa 和 Q-learning 的更新式只差一个 max,但策略类型完全不同。判断标准不是看更新式里有没有 max,而是看「行为策略」和「目标策略」是否相同。
怎么补:Sarsa 的行为策略和目标策略都是 ε-greedy,所以是 on-policy;Q-learning 的行为策略是 ε-greedy,目标策略是 greedy,所以是 off-policy。把这两个策略分别写出来对比,比死记结论可靠。
6.3 易漏点三:TD 误差里的终止状态处理
为什么漏:代码实现时容易忘记终止状态没有后续值,导致自举项错误地加上了 v(s_terminal)。
怎么补:在更新式里显式乘 (1 - done),或者在环境返回 done=True 时直接把 TD 目标设为 r。这个错误在调试时表现为值函数在终止状态附近异常增大,检查时优先看终止状态的更新逻辑。
6.4 易漏点四:策略梯度里的基线不变性
为什么漏:减去基线 v(s) 后,期望梯度不变,这个结论需要推导才能确认。复习时容易只记结论,不理解为什么。
怎么补:推导的关键是 E[ ∇_θ ln π(a|s;θ) * b(s) ] = 0,因为 Σ_a π(a|s;θ) = 1,对 θ 求导得 Σ_a ∇_θ π(a|s;θ) = 0,所以 Σ_a π(a|s;θ) ∇_θ ln π(a|s;θ) = 0。把这个推导走一遍,基线不变性就清楚了。
6.5 易漏点五:函数近似下的收敛性差异
为什么漏:表格方法有明确的收敛保证,函数近似下收敛性依赖近似器类型。线性近似有收敛保证,神经网络没有。
怎么补:复习时把「表格 vs 线性近似 vs 神经网络」的收敛性列成表,标注每种情况下的保证条件。DQN 的经验回放和目标网络是为了稳定训练,不是收敛保证,这个区别要分清。
7. 复习清单:从知识地图到查漏补缺的落地方法
复习这本书,最有效的方式不是从头再读一遍,而是按「概念 → 方程 → 算法 → 实现」四层做查漏补缺。下面是我自己走通一遍后整理的清单,按顺序过,每过一层标记一次。
第一层,概念自检。合上书,能不能用自己的话解释:状态值和动作值的区别、回报和奖励的区别、On-policy 和 Off-policy 的区别、值迭代和策略迭代的区别。这四个问题答不上来,后面的方程推导都是空中楼阁。
第二层,方程默写。贝尔曼方程、贝尔曼最优方程、TD 更新式、Sarsa 更新式、Q-learning 更新式、策略梯度定理、A2C 的优势函数。默写时注意每个符号的含义,特别是期望的下标和 max 的位置。
第三层,算法对比。把值迭代、策略迭代、MC Basic、MC Exploring Starts、MC ε-Greedy、Sarsa、n-step Sarsa、Q-learning、DQN、REINFORCE、QAC、A2C、DPG 列成一张表,标注每个算法的输入、输出、更新目标、策略类型、是否需要模型。这张表能帮你快速定位每个算法在知识地图上的位置。
第四层,实现验证。选一个网格世界环境,把 Q-learning 和 Sarsa 各实现一遍,对比两者的学习曲线。再把 REINFORCE 和 A2C 在同一个环境上跑一遍,观察方差差异。实现时重点检查:终止状态处理、ε 衰减策略、学习率设置、网络初始化。
| 复习层 | 自检问题 | 通过标准 |
|---|---|---|
| 概念 | 四个区别能否说清 | 不看笔记能举例说明 |
| 方程 | 七个方程能否默写 | 符号含义全部正确 |
| 算法 | 十三个算法能否对比 | 表格填写完整 |
| 实现 | 四个算法能否跑通 | 学习曲线符合预期 |
最后一层是查漏补缺。把做错的题、推错的公式、调崩的参数单独记在一个本子上,每隔一周翻一次。我自己的习惯是,每次跑新算法之前,强制走一遍「概念 → 方程 → 算法 → 实现」四层检查,确认没有跳步再动手。这个习惯帮我省了很多调试时间——很多 bug 不是代码写错,而是概念理解偏了。希望这份清单能帮到你。
本文还有配套的精品资源,点击获取