简介:《强化学习的数学原理》是西湖大学赵世钰教授撰写的英文专著,面向具备线性代数、概率论与基础优化知识的研究生及算法工程师,系统解决强化学习理论根基薄弱、公式推导模糊、算法理解流于表面等核心痛点。全书10章+附录,从网格世界示例切入,严格推导贝尔曼方程、贝尔曼最优方程、值迭代与策略迭代的收敛性,深入剖析蒙特卡洛、时序差分、策略梯度及Actor-Critic等主流方法的数学本质,并在附录中给出序列收敛性证明,显著强化理论严谨性与可复现性。资源为单文件PDF(18.9MB),内容完整覆盖全部章节与习题Q&A,排版清晰、公式规范、示例详实,便于精读推导与课堂讲义参考。目前已有847人学习下载,适合希望夯实RL数学基础、深入理解算法收敛条件与设计逻辑的进阶学习者。
1. 强化学习的数学原理:不是“调参玄学”,而是你手里的“决策说明书”
你有没有试过教一个完全没接触过编程的朋友写个“自动走迷宫”的小程序?
他可能很快能画出格子、标出起点终点,但一问“那机器人怎么知道该往左还是往右?”——他就卡住了。
说“试试看”?太慢;说“靠运气”?不靠谱;说“用AI模型”?他连“模型”长什么样都不知道。
这时候,如果递给他一张带箭头的格子图,每格旁边写着“往右走,长期来看平均能多拿2.3分”,他瞬间就懂了:原来决策不是拍脑袋,是算出来的。
《强化学习的数学原理》这本书干的就是这件事:它不教你抄几行PyTorch代码跑通CartPole,而是从第一格迷宫开始,一笔一划告诉你——
“分数”怎么定义,“长期来看”怎么算,“平均能多拿”背后的期望值怎么推,“箭头”为什么必须满足某个方程才能稳住不乱飘。
它把强化学习从黑匣子里请出来,摊在桌上,用你大二学过的概率和线代就能看懂的符号,讲清每一个“为什么”。
适合谁?零基础但敢算的人:如果你能看懂“E[X] = Σ x·P(x)”、能解个二元一次方程组、愿意为搞懂“为什么折扣因子γ要小于1”多翻两页附录——这本书就是为你写的。它不假设你会写Python,但假设你信数学能讲清楚一件事。
2. 先搞懂一个核心比喻:强化学习不是“训练模型”,而是“设计决策规则”
强化学习常被误称为“AI自主学习”,其实它更像一位刚入职的实习生,在老板(环境)不断甩来“做对了给糖、做错了扣钱”的即时反馈中,慢慢摸索出一套最稳当的做事流程(策略)。而《强化学习的数学原理》这本书,就是这位实习生的岗前培训手册——它不只教“怎么领糖”,更教“怎么把糖的数量转化成可计算、可验证、可优化的数字”。
2.1 从网格世界起步:为什么所有例子都画在格子上?
翻开书第1章,第一个例子就是一个5×5的网格世界:有起点、终点、障碍墙,每个格子代表一个状态(state)。智能体每次只能上下左右移动一格(即动作 action),撞墙就原地不动,走到终点得+10分,其他每步扣-1分。
提示:别急着想“这太简单了”。所有复杂场景——自动驾驶变道、游戏AI打Boss、机器人抓杯子——拆到底层,都是这种“在状态间跳转+动作触发反馈”的结构。格子只是把抽象概念具象化的脚手架。
这个例子贯穿全书,后续每一章的新公式、新算法,都会回到同一张格子图上手算一遍。比如第2章讲状态值(state value):它不是“当前格子有多好”,而是“站在这格子上,按某套固定规矩(策略)一直走下去,未来所有得分加起来,平均能拿多少”。
举个具体数:假设策略是“永远往右”,那么起点(0,0)的状态值V(0,0) = -1 + (-1) + … + 10 = 某个负数;而终点格子的状态值V(终点) = 10(因为到这就停了,没后续扣分)。
这个“平均未来得分”,就是强化学习里一切优化的起点——所有算法,本质都在想办法让V(s)变得更大。
2.2 贝尔曼方程:把“未来预期”变成“当前可算”的钥匙
光有V(s)定义还不够。你想算出每个格子的V值,总不能真让智能体跑一万次再平均吧?贝尔曼方程(Bellman Equation)就是解决这个问题的数学快刀。
它的核心思想极朴素:一个格子的价值 = 当前一步奖励 + 下一步所有可能去向的价值 × 去那儿的概率,再求平均。
用书里第2.4节的公式写就是:
V^\pi(s) = \sum_{a} \pi(a|s) \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + \gamma V^\pi(s') \right]别被符号吓住,我们拆成大白话:
V^π(s):你在格子s上,按策略π行动,最终能拿到的平均总分;π(a|s):策略π规定“在s格子时选动作a的概率”(比如π(右|s)=0.8,π(下|s)=0.2);P(s'|s,a):在s格子执行a动作后,实际跳到s'格子的概率(在确定性环境中就是0或1);R(s,a,s'):从s执行a到s'这一步拿到的即时奖励(比如撞墙是-1,到终点是+10);γ:折扣因子,代表“未来收益打个折”,比如γ=0.9表示明年1块钱只算今年0.9块——这是防止无限循环导致价值爆炸的关键设计。
注意:这个方程看起来是“用V算V”,像套娃。但正因如此,它把无穷步的未来压缩成了有限步的递归关系,让计算机能用迭代法(比如第2.7.2节的“反复代入更新”)一步步逼近真实值。这就是数学的力量:把不可算的问题,变成可迭代的计算。
2.3 矩阵形式:把100个格子的计算,变成一次矩阵乘法
当网格扩大到10×10甚至更大,手算每个格子的V值会疯掉。这时第2.6节的矩阵-向量形式就派上用场了。
书中把所有状态排成一列向量v,把所有状态转移概率和奖励打包成矩阵P和向量r,贝尔曼方程瞬间变身:
\mathbf{v} = \mathbf{r} + \gamma \mathbf{P} \mathbf{v}移项得:
(\mathbf{I} - \gamma \mathbf{P}) \mathbf{v} = \mathbf{r}只要解这个线性方程组,所有格子的V值就一次性全出来了!
这背后是线性代数的威力:把离散状态空间的动态,映射成矩阵空间的静态关系。你不需要理解特征值分解,但要知道——当你看到“解v = (I−γP)⁻¹r”时,它对应的就是“用numpy.linalg.solve()算出全部状态值”的实操路径。
2.4 避坑:新手算贝尔曼方程最容易踩的3个坑
现象:迭代100轮后V值还在疯狂震荡,根本收敛不了
原因:γ设成了1.0,或状态转移矩阵P的谱半径≥1/γ,导致(I−γP)不可逆。数学上,这违反了贝尔曼算子的收缩性条件(见第3.3.4节)。
解决:立刻检查γ是否<1(推荐0.9~0.99),并确认你的P矩阵每行之和严格等于1(概率守恒)。用np.allclose(P.sum(axis=1), 1.0)验证。
现象:算出来的V(终点)不是10,而是远小于10
原因:奖励R(s,a,s')定义错了。常见错误是把“到达终点的奖励”写成R(s,a,终点),却忘了终点本身也是个状态——当智能体已站在终点,下一步动作(无论做什么)都不该再给分。正确做法是:R(s,a,s')只在s'≠终点时生效;一旦s'=终点,本轮episode终止,不再触发后续奖励。
解决:在代码里加判断if s_next == goal_state: done = True; reward = 10,确保奖励只在跨入终点的那一步发放。
现象:用闭式解(I−γP)⁻¹r算出的V值,和迭代法结果差好几个数量级
原因:矩阵维度对不上。闭式解要求r是列向量,且P是|S|×|S|方阵;但新手常把r写成行向量,或P做成|S|×|A|×|S|的三维张量(这是为Q值准备的)。
解决:严格按第2.6节定义——先固定策略π,把三维P(s'|s,a)和π(a|s)合并成二维P_π(s'|s) = Σₐ π(a|s)P(s'|s,a),再构造r_π(s) = Σₐ π(a|s)Σₛ′ P(s'|s,a)R(s,a,s')。用print(P_pi.shape, r_pi.shape)确认二者都是(|S|, |S|)和(|S|, 1)。
3. 关键转折点:从“评估策略”到“改进策略”,贝尔曼最优方程是分水岭
第1章让你明白“什么是好决策”,第2章教你“怎么算出某个决策的好坏”,但真正的强化学习目标从来不是“评价”,而是“创造”——如何从零开始,自己找出那个最好的决策规则?这就是第3章“贝尔曼最优方程(BOE)”登场的意义。它不是对旧知识的重复,而是认知升级:从“描述世界”跃迁到“改造世界”。
3.1 最优策略长什么样?一个反直觉的事实
很多人以为“最优策略”就是每步都选当下奖励最高的动作。错。
回到网格世界:假设你离终点只有一步,但左边格子奖励是+5,右边格子奖励是-1,而终点在右边。选左边?你拿了5分,但卡在死胡同,再也到不了终点的+10分。真正最优的选择,是忍住眼前+5的诱惑,走-1那步,换取未来+10的确定性回报。
贝尔曼最优方程正是捕捉这种“延迟满足”的数学表达:
V^*(s) = \max_{a} \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + \gamma V^*(s') \right]注意关键变化:右边多了maxₐ!它意味着——在每个格子s,我不再被动接受某个策略π给我的动作概率,而是主动挑出所有可能动作a中,能让“当前奖励+未来价值”总和最大的那一个。
这个“挑最大”的操作,把V^*(s)从一个线性方程的解,变成了一个非线性方程的解。它不再描述“某个人怎么做”,而定义了“所有人能做到的最好极限”。
3.2 收缩映射定理:为什么“挑最大”不会让计算崩盘?
看到maxₐ,你可能会担心:这玩意儿还能迭代吗?会不会像混沌系统一样,改一个参数整个结果就天翻地覆?
第3.3.3节的收缩映射定理(Contraction Mapping Theorem)就是定心丸。它证明:只要γ<1,这个带max的贝尔曼最优算子T,就满足||T(V₁) − T(V₂)|| ≤ γ ||V₁ − V₂||。
翻译成人话:任意两个不同的价值函数V₁、V₂,经过T变换后,它们的差距至少缩小γ倍。
想象你和朋友各猜一个V值,第一次算完发现差100,第二次差90,第三次差81……按γ=0.9衰减,100轮后差距只剩0.03。这就是价值迭代(第4章)能收敛的数学根基——它不靠运气,靠的是γ<1保证的“误差衰减律”。
3.3 从V到π:最优策略不是藏在别处,它就刻在V*的公式里
很多初学者以为“先算出V*,再另写一套逻辑找π*”。其实第3.4节明确指出:最优策略π可以直接从V导出。
方法超简单:对每个状态s,穷举所有动作a,计算
Q^*(s,a) = \sum_{s'} P(s'|s,a) \left[ R(s,a,s') + \gamma V^*(s') \right]然后令π*(s) = argmaxₐ Q*(s,a)。
也就是说,你根本不需要存一个独立的策略表——只要V算准了,最优动作就在Q里,而Q只比V多一步查表计算。
书中第3.4节的例3.2直接用3×3网格演示:当V算出后,每个格子旁标出Q(s,上)、Q*(s,下)…哪个最大,箭头就指向哪。没有魔法,全是确定性计算。
3.4 避坑:理解“最优”二字的三个常见误区
现象:用价值迭代算出的π*,在仿真中表现反而不如随机策略
原因:“最优”是理论意义上的,依赖两个隐含前提:① 环境完全已知(P和R精确);② 有无限计算资源解出精确V*。现实中P和R常来自采样估计,存在偏差;且迭代次数有限,V只是近似。此时“理论最优”可能过拟合噪声。
解决:第3.5节提醒——最优策略受奖励函数R、折扣因子γ、状态转移P三者共同影响。若R设计不合理(如终点奖励太小),或γ太低(只看眼前),算出的π自然短视。先检查R和γ是否符合任务直觉。
现象:对同一状态s,argmaxₐ Q*(s,a)得到多个a(并列最大),策略π*该选哪个?
原因:数学上V唯一,但实现π时存在动作平权问题。书中第3.2节定义“最优策略”为“至少存在一个策略达到V*”,并未要求唯一。
解决:实践中常用ε-贪心(第5.4节)或软性最大化(如softmax)打破平局。但纯理论推导时,任选其一即可,不影响V*值——这正是第3.2节强调“最优策略集合可能包含多个元素”的深意。
现象:把V当成“每个状态的绝对好坏”,试图比较不同任务的V大小
原因:V的数值尺度完全由R和γ决定。任务A终点奖+100、γ=0.99,任务B终点奖+1、γ=0.5,二者V不可比。V只在同一个MDP内提供相对排序。
解决:牢记第1.7节定义——MDP由(S,A,P,R,γ)五元组唯一确定。脱离具体五元组谈V数值,如同脱离温度单位谈“36.5度很热”。比较策略好坏,应统一用“在相同MDP下,V^π(s₀)的大小”。
4. 第一个能跑通的算法:价值迭代,三步写出可执行代码
现在你已理解V*的定义、BOE的结构、收缩性保障。是时候亲手跑通第一个强化学习算法了。价值迭代(Value Iteration)是全书第4章的核心,也是新手最该优先掌握的算法——它代码短、逻辑直、不依赖采样、结果可验证,完美匹配“零基础入门”需求。
4.1 价值迭代的三步心法:初始化→更新→提取策略
对照书中第4.1.1节,价值迭代本质就三步:
- 初始化:给每个状态s设V₀(s) = 0(或任意值,反正会收敛);
- 迭代更新:对每个s,按BOE公式算新值Vₖ₊₁(s) = maxₐ Σₛ′ P(s'|s,a)[R(s,a,s') + γVₖ(s')];
- 策略提取:当Vₖ稳定(如max|Vₖ₊₁−Vₖ| < ε),对每个s,取使Vₖ₊₁(s)最大的那个a,记为π*(s)。
这三步,就是你写代码的骨架。下面用Python伪代码实现(基于确定性网格世界):
import numpy as np # 假设5x5网格,状态编号0~24,动作:0=上,1=右,2=下,3=左 n_states = 25 n_actions = 4 gamma = 0.9 theta = 1e-6 # 收敛阈值 # 初始化V,形状(25,) V = np.zeros(n_states) # 定义P和R:此处简化为确定性转移(即P(s'|s,a)为0或1) # transition[s, a] = s_next,reward[s, a] = r(到达s_next时获得的奖励) transition = np.full((n_states, n_actions), -1, dtype=int) reward = np.full((n_states, n_actions), -1.0) # 每步默认-1 # 设置终点:状态24(右下角),到达时得+10 goal_state = 24 for a in range(n_actions): transition[goal_state, a] = goal_state # 终点不动 reward[goal_state, a] = 0.0 # 终点无额外奖励(已在上一步发放) # 其他状态的转移逻辑(略,需按网格边界实现) # ... 此处省略具体坐标计算,重点看主循环 ... # 主循环:价值迭代 while True: delta = 0 for s in range(n_states): if s == goal_state: # 终点V值固定为0(已包含在初始化中) continue v_old = V[s] # 计算所有动作a对应的Q值 q_values = [] for a in range(n_actions): s_next = transition[s, a] if s_next == -1: # 无效动作(如撞墙),保持原位 s_next = s r = reward[s, a] q = r + gamma * V[s_next] q_values.append(q) # 取最大Q值作为新V值 V[s] = max(q_values) delta = max(delta, abs(v_old - V[s])) if delta < theta: break # 提取最优策略π* policy = np.zeros(n_states, dtype=int) for s in range(n_states): q_vals = [] for a in range(n_actions): s_next = transition[s, a] if s_next == -1: s_next = s r = reward[s, a] q_vals.append(r + gamma * V[s_next]) policy[s] = np.argmax(q_vals) # 动作编号0~3 print("最优策略(动作编号):", policy)4.2 代码逐行解释:为什么这里用max而不是mean?
q = r + gamma * V[s_next]:这是BOE去掉max后的部分,计算“执行动作a后,按当前V估计的总价值”。注意V[s_next]是上一轮迭代的值,体现“用旧知识评估新选择”。V[s] = max(q_values):这才是价值迭代的灵魂。它不取平均(那是策略评估),而是贪婪地选当下最好的动作——这正是第3章强调的“最优性”来源。delta = max(delta, abs(v_old - V[s])):监控所有状态V值的最大变化量。当它小于theta,说明V已稳定,继续迭代也不会明显改变结果。这是收缩性定理的工程实现。
4.3 运行结果可视化:看懂箭头背后的数学
跑通代码后,你将得到一个长度25的policy数组。把它映射回5×5网格:
状态编号: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24(终点)假设policy[0]=1(右),policy[1]=1(右)…policy[23]=1(右),那么第一行就是→→→→→,第二行同理,最终所有箭头都指向终点。
这不再是“我觉得该往右”,而是数学推导出的必然路径——因为每一步的max操作,都在把价值流导向终点。
4.4 避坑:价值迭代调试必查的4个断点
现象:V值迭代几十轮后全变成nan或inf
原因:reward中混入了未定义值(如None或NaN),或gamma>=1导致数值溢出。
解决:在循环前加assert np.all(np.isfinite(reward)) and gamma < 1;打印np.max(V)监控数值范围。
现象:policy数组里全是0(全往上),明显不符合直觉
原因:transition矩阵未正确处理边界。例如状态0(左上角)执行“上”动作,本该无效,但代码让它跳到s_next=-1,再用V[-1]索引数组末尾,造成错误传播。
解决:严格按书中第1.3节“状态转移”定义——无效动作应保持s_next=s,且reward[s,a]在此时仍为-1(撞墙惩罚)。
现象:delta始终大于theta,迭代永不终止
原因:收敛阈值theta设得太小(如1e-10),而浮点精度有限;或P/R定义导致V振荡(如γ过大且存在环路)。
解决:先设theta=1e-3测试;若仍不收敛,检查是否存在状态环路(如A→B→A),并确认γ*环路奖励和是否<0(否则价值无限增长)。
现象:提取的policy在终点附近出现“绕圈”动作(如23→24→23)
原因:reward设计缺陷。常见错误是“到达终点时给+10”,但未设置“到达后episode终止”,导致智能体在终点执行动作又拿一次+10,形成正反馈环。
解决:在reward赋值时,仅当s_next == goal_state and s != goal_state时给+10;终点自身所有动作reward=0。
5. 从“知道最优”到“学会最优”:蒙特卡洛方法如何摆脱环境模型
价值迭代很美,但它有个硬伤:必须知道P(s'|s,a)和R(s,a,s')的完整表格。就像你要规划人生,却得先精确算出“选A专业后,每种工作概率多少、年薪多少”——现实里,这些数据根本不存在。
第5章“蒙特卡洛方法”就是为此而生:它不靠模型,只靠经验。你让智能体在环境中瞎跑几次(生成轨迹trajectory),记录每次“从s出发,选a,得r,到s',再选a'…”的完整过程,用这些真实样本去估计价值。这就是“从数据中学习”的原始力量。
5.1 蒙特卡洛基本思想:用平均代替期望
书中第5.1节用“估算班级平均身高”类比:你不必知道全班身高分布(概率模型),只要随机抽100人量身高,算平均值,就是期望身高的无偏估计。
同理,状态s的价值V^π(s)定义为“从s开始,按策略π运行直到结束,所有回报G_t的期望值”。蒙特卡洛不做任何假设,直接让智能体从s出发跑N次,得到N个实际回报G¹,G²,…,Gᴺ,然后:
V^\pi(s) \approx \frac{1}{N} \sum_{i=1}^{N} G^i这就是MC Basic(第5.2.2节)的核心。它简单粗暴,但数学上坚实——大数定律保证N→∞时,估计值收敛到真实期望。
5.2 探索性起始(Exploring Starts):如何让一次采样覆盖所有状态-动作对?
MC Basic有个致命短板:它要求“从每个状态s出发采样”,但现实中你无法强制智能体从任意s开始。第5.3节的探索性起始(Exploring Starts)给出巧解:
- 每次episode开始前,随机选一个状态s和动作a作为起点(而非固定s₀);
- 然后按策略π执行,直到episode结束;
- 记录这次轨迹中,所有(s,a)对首次出现的位置t,及其后续回报G_t。
这样,只要采样次数足够,每个(s,a)对都会被覆盖到。书中例5.3用3×3网格演示:即使初始策略很差(乱走),只要起始点随机,最终也能收集到“在角落格子选‘上’动作”的样本,并据此修正Q值。
5.3 ε-贪婪策略:当无法控制起始点时,如何逼智能体自己探索?
探索性起始在仿真中可行,但真实机器人没法让你“从任意关节角度启动”。第5.4节的ε-贪婪(ε-greedy)是更普适的解法:
- 大部分时间(1−ε概率),选当前Q值最大的动作(利用exploitation);
- 小部分时间(ε概率),随机选一个动作(探索exploration)。
ε就像探索的“开关旋钮”:初期设大(如0.5),鼓励乱试;后期调小(如0.01),专注精进。书中第5.5节强调,ε-贪婪不是妥协,而是在有限样本下平衡探索与利用的数学最优策略——它让智能体在“怕错过好路”和“怕浪费时间”之间,走出一条可证明收敛的路径。
5.4 避坑:蒙特卡洛方法落地的3个实操陷阱
现象:MC估计的V值波动极大,相邻两次运行结果差2倍
原因:回报G_t方差太高。尤其当γ接近1且episode很长时,早期小误差会被指数放大。MC Basic无方差缩减机制。
解决:采用第5.3节的“首次访问MC”(First-Visit MC)而非“每次访问MC”(Every-Visit MC),避免同一轨迹中多次计数同一(s,a)对;或引入基线(baseline)降低方差(见第10.2.1节)。
现象:ε-贪婪策略下,智能体永远学不会最优动作,卡在次优循环
原因:ε衰减太慢。若ε长期保持0.1,智能体有10%概率放弃最优动作,导致Q值估计持续偏低。
解决:实现ε衰减调度,如epsilon = max(0.01, epsilon * 0.999)。书中第5.4.3节例5.5显示,ε从1.0线性衰减到0.01,收敛速度提升3倍。
现象:在稀疏奖励任务中(如终点才给+10,其余全-1),MC完全学不会,因为99%的轨迹回报≈-100,无法区分动作优劣
原因:MC依赖完整episode回报,而稀疏奖励导致信号微弱。
解决:转向第7章的TD方法(如Q-learning),它用“一步预测”替代“全程等待”,能更快传递奖励信号。这也是书中第7.5节提出“统一视角”的意义——MC、TD、DP不是对立,而是不同信息利用效率的光谱。
6. 下一步学什么:构建你的强化学习能力树,从根到叶
读到这里,你已经完成了强化学习入门最关键的跃迁:从“听说这个词”到“亲手算出第一个最优策略”。但这不是终点,而是你能力树的主干——接下来,你需要向三个方向伸展枝叶,让知识真正长成解决问题的能力。
6.1 能力树第一层:夯实数学地基,让直觉有据可依
你已用过期望、矩阵、迭代收敛,但书中附录A、B、C才是隐藏关卡。别跳过它们,按这个顺序啃:
- 附录A(概率论预备):重点重学“条件期望E[X|Y]”——它是贝尔曼方程的源头。当你看到V^π(s) = E_π[G_t|S_t=s],要能立刻反应:这表示“在S_t=s条件下,对所有可能的后续轨迹求平均”。
- 附录C(序列收敛):这是理解“为什么迭代法有效”的钥匙。C.2节讲随机序列收敛(如SGD中的梯度噪声),直接关联第6章随机近似和第7章TD收敛性证明。
- 第6章(随机近似):不要只当数学补丁。把Robbins-Monro算法(第6.2节)和你写的MC代码对照:MC中
V(s) ← V(s) + α(G_t − V(s)),就是Robbins-Monro在价值估计上的特例!αₜ = 1/Nₜ满足∑αₜ=∞, ∑αₜ²<∞,保证收敛。
从那以后我每次写更新公式,都强制检查两点:① 步长αₜ是否满足Robbins-Monro条件;② 更新项是否是无偏估计(如G_t对V^π(s)无偏)。这两条像安全带,系上再开车。
6.2 能力树第二层:打通算法脉络,看清技术演进逻辑
全书10章不是并列知识点,而是一条清晰的进化链。用一张表帮你锚定位置:
| 章节 | 核心突破 | 依赖前提 | 典型场景 | 你的下一步练习 |
|---|---|---|---|---|
| Ch2 贝尔曼方程 | 用递归定义价值 | 已知P,R(模型) | 教学网格、已知动力学的机器人 | 手算3×3网格的V^π,验证矩阵解vs迭代解 |
| Ch3 贝尔曼最优方程 | 引入max,定义最优性 | 同上 | 寻找理论最优解 | 对同一网格,对比价值迭代vs策略迭代收敛轮数 |
| Ch4 值/策迭代 | 实现Ch3的计算 | 同上 | 小规模确定性问题 | 用策略迭代复现Ch4.2.3例,观察策略如何逐步改进 |
| Ch5 蒙特卡洛 | 摆脱模型,用样本估计 | 可采样episode | 游戏(Atari)、回合制任务 | 在OpenAI Gym的FrozenLake环境跑MC,调ε衰减 |
| Ch7 时间差分 | 用bootstrapping加速学习 | 可在线采样 | 连续控制、实时决策 | 实现Sarsa,对比MC与TD在相同任务中的收敛曲线 |
| Ch8 函数逼近 | 解决状态爆炸 | 特征工程能力 | 图像输入(像素)、高维连续空间 | 用线性函数逼近替代表格,复现Ch8.2.4例 |
这张表不是为了背诵,而是给你一个“进度罗盘”。当你卡在某个算法时,回看它位于哪一层,就知道该补哪块砖。
6.3 能力树第三层:建立工程直觉,避开90%的翻车现场
数学和算法是骨架,工程直觉是血肉。以下是我在带新人时,血泪总结的3条铁律:
- 铁律1:永远先在确定性环境中验证。别一上来就跑Atari。用书中网格世界,把P和R设为确定性(P=1),确保你的Q-learning代码在γ=0.9时,10轮内就能让所有Q值收敛到理论值。这一步省掉后续80%的debug时间。
- 铁律2:监控三个量,胜过调一百个超参。每次训练,必画三条曲线:① episode reward(看任务是否学会);② loss(看网络是否收敛);③ Q-value norm(看价值是否爆炸或坍缩)。其中第三条是多数教程忽略的“后悔药”——当reward突然跌,先看Q值是否全趋近0,大概率是学习率太大或γ设错。
- 铁律3:把“策略”当成可调试对象,而非黑盒输出。书中第9章讲策略梯度,但早在Ch1你就该养成习惯:每次得到policy数组,立刻可视化。如果最优策略在空旷区域出现“Z字形抖动”,不是算法错了,是reward设计有漏洞(比如未惩罚频繁转向)。
希望帮到你。
本文还有配套的精品资源,点击获取