简介:《强化学习的数学原理》是西湖大学赵世钰教授撰写的英文专著,面向具备线性代数、概率论与基础优化知识的研究生及算法工程师,系统解决强化学习理论根基薄弱、公式推导模糊、算法理解流于表面等核心痛点。全书以数学严谨性为纲,从网格世界等直观示例切入,逐步展开马尔可夫决策过程、贝尔曼方程及其矩阵形式、值迭代与策略迭代收敛性、蒙特卡洛与时间差分方法的随机逼近本质、值函数近似与策略梯度的泛函分析视角,并在附录中严格论证序列收敛性,显著强化对算法设计原理的深层把握。资源为单文件PDF(18.9MB),内容完整覆盖10章正文与附录,排版清晰、公式规范、示例丰富,适合作为RL理论进阶教材或研究参考手册。目前已有847人学习下载,是少有的兼顾数学深度与教学可读性的强化学习原味教材。
1. 强化学习的数学原理:不是调参玄学,而是智能体“做决定”的算账本
你有没有想过,一个机器人在迷宫里左转右转、反复碰壁,最后居然自己学会了抄近路?或者一个下棋程序没背过任何棋谱,却能越下越强?我们常把这叫“AI学会了”,但背后真正在发生什么?——它不是在模仿人类,而是在一笔一笔地算账:每走一步,环境给它一个数字(奖励),它默默记下“从这儿出发,按这个套路走下去,大概能赚多少”。久而久之,它就摸清了哪条路“长期最赚钱”。这个“算账”的整套逻辑、公式和推理链条,就是《强化学习的数学原理》要讲清楚的事。
这本书不教你怎么用TensorFlow搭个DQN跑通Atari游戏,而是回到源头问:为什么非得用贝尔曼方程?为什么折扣因子γ必须小于1?为什么策略迭代比值迭代收敛得快?为什么蒙特卡洛方法要等一整局结束才更新,而时间差分(TD)方法可以边走边学?它把强化学习从“黑匣子调参”拉回“白纸推导”的层面,用网格世界这种一眼看懂的场景,把每个定义、每条定理、每次迭代都掰开揉碎——就像教人骑自行车,不只让你蹬,还告诉你重心怎么偏、脚踏力怎么分配、为什么松把不会倒。如果你曾被“Q值”“策略梯度”“贝尔曼最优性”这些词绕晕,或总在代码跑通后心里发虚:“它到底为什么有效?”,那这本书就是帮你把那层模糊的雾,换成一张清晰的算账草稿纸。它不回避数学,但绝不堆砌符号;它要求你动笔算,但每一步都配着格子图和数值例子。这不是速成手册,而是一份“智能体如何理性决策”的说明书。
2. 贝尔曼方程:强化学习的“复利公式”,把未来收益折算成当下价值
强化学习的核心问题,说白了就一个:现在该选哪个动作,才能让未来赚得最多?
但“未来赚得多”是个模糊概念——是明天赚10块重要,还是三年后赚100块重要?如果风险高、不确定大,是不是该打点折?贝尔曼方程,就是解决这个问题的“复利公式”。它不预测具体哪天赚多少,而是建立一种递归关系:一个状态的价值,等于“立刻拿到的奖励”加上“下一步可能去的所有状态的价值,按概率加权后的平均值”,再乘上一个折扣因子γ(0<γ<1)。这个γ,就是对未来的“理性打折”——越远的收益,越不可靠,所以越不值钱。
2.1 为什么非得用递归?——从“笨算法”说起
假设你在4×4网格世界里,目标是走到右下角(奖励+10),踩到陷阱(奖励-5)。你想知道“站在左上角时,我的长期价值是多少?”
最笨的办法:穷举所有可能路径,算每条路径的总回报,再求平均。但路径数是指数级增长的(比如10步就有4¹⁰种走法),根本算不完。
贝尔曼方程换了个思路:它不硬算所有路径,而是抓住一个关键事实——价值是“局部可分解”的。站在A格子的价值,只取决于:①从A出发拿多少奖励;②A能走到哪些格子(B、C、D);③那些格子本身值多少钱。只要我知道B、C、D的价值,A的价值就呼之欲出。这就把一个全局难题,拆成了一个个可解的小方程。
2.2 贝尔曼方程长什么样?——一个带“自我指涉”的等式
用数学语言写出来,对任意状态s,其状态值v_π(s)(在策略π下)满足:
v_π(s) = \sum_{a} π(a|s) \left[ r(s,a) + γ \sum_{s'} P(s'|s,a) \, v_π(s') \right]别被符号吓住,我们逐项翻译:
v_π(s):这是我们要算的“答案”,即s状态的价值;π(a|s):策略π规定“在s状态下选动作a的概率”(比如随机策略就是各选1/4);r(s,a):在s状态执行a动作,立刻拿到的奖励;P(s'|s,a):执行a后,从s跳到s'状态的概率(比如向右走有0.8概率成功,0.2概率滑向别处);v_π(s'):s'状态的价值——注意!右边又出现了v_π,这就是“递归”或“自我指涉”的来源。
提示:这个公式本质是“期望值”的展开。它说:s的价值,等于“所有可能动作a带来的即时奖励 + 折扣后下一状态的期望价值”的加权平均。它没告诉你v_π(s')是多少,但它告诉你v_π(s)和v_π(s')之间必须满足这个关系。
2.3 一个手算例子:2×2网格的“价值传播”
考虑极简网格:
S0 — S1 | | S2 — S3(目标,r=+10)假设:只能上下左右走,撞墙不动;策略π是“总是往右或往下”(确定性);γ=0.9;其他转移100%成功。
- S3是终点,v_π(S3)=0(到达后无后续动作,或定义为0);
- S1:只能往右到S3,所以v_π(S1) = r(S1,右) + γ·v_π(S3) = 0 + 0.9×0 = 0;
- S2:只能往下到S3,同理v_π(S2) = 0;
- S0:可往右到S1,或往下到S2,各50%概率(若策略随机),则
v_π(S0) = 0.5×[r(S0,右)+γ·v_π(S1)] + 0.5×[r(S0,下)+γ·v_π(S2)] = 0.5×[0+0.9×0] + 0.5×[0+0.9×0] = 0。
但若S0→S1有奖励+1(比如路过有金币),则v_π(S0)瞬间变成0.5×(1+0) + 0.5×0 = 0.5。
你看,价值不是凭空来的,它像水一样,从有奖励的地方(S3的+10,S0→S1的+1)一层层“渗透”回来。贝尔曼方程,就是描述这股“价值水流”的物理定律。
2.4 矩阵形式:把100个方程打包成一个AX=b
当状态很多(比如1000个格子),手算1000个方程太累。这时把所有v_π(s)排成一个列向量v,把所有r(s,a)和P(s'|s,a)整理成矩阵,贝尔曼方程就能写成:
\mathbf{v} = \mathbf{r}_π + γ \mathbf{P}_π \mathbf{v}其中r_π是策略π下的即时奖励向量,P_π是策略π诱导的状态转移矩阵(第i行第j列是“从i状态按π行动后,转移到j状态的概率”)。移项得:
(\mathbf{I} - γ \mathbf{P}_π) \mathbf{v} = \mathbf{r}_π这就变成了标准线性方程组!只要矩阵(I - γP_π)可逆(γ<1保证了这点),就能用v = (I - γP_π)⁻¹ r_π直接算出所有状态价值——这就是闭式解。但实际中矩阵可能很大(百万维),求逆太贵,所以更常用迭代法:猜一个初始v⁰,代入右边算出v¹,再把v¹代入算v²……直到变化极小(收敛)。这就像不断用新算出的价值去刷新旧的价值,让“水流”慢慢稳定下来。
2.5 常见误区:贝尔曼方程不是万能钥匙,它有严格前提
初学者常把贝尔曼方程当成通用工具乱套,结果发现算出来不对。关键在于,它成立需要三个隐含条件,缺一不可:
- 误区1:以为任何策略都适用 → 忽略了“策略π必须已知且固定”
贝尔曼方程v_π(s)是针对某个给定策略π的。如果你一边算v_π,一边偷偷改π(比如发现某步不好就换动作),方程立刻失效。它描述的是“如果我死守这个π,价值会怎样”,不是“我该怎么改π”。想优化π,得升级到第三章的贝尔曼最优方程。 - 误区2:把r(s,a)当成固定数 → 忽略了“奖励可能是随机的”
公式里的r(s,a)其实是期望奖励E[r|s,a]。现实中,同一动作可能有时得+1,有时得0(比如射击命中率80%)。贝尔曼方程用的是平均值,不是某次运气。如果奖励方差极大,单纯用期望值可能误导决策(需引入风险敏感RL,本书未覆盖)。 - 误区3:认为γ可随意设 → 不理解“γ<1是收敛的生死线”
如果γ=1,方程变成v = r_π + P_π v,移项后(I - P_π)v = r_π。但I - P_π往往奇异(行列式为0),因为马尔科夫链可能有吸收态(如S3),导致无唯一解。γ<1不仅体现“远期打折”,更是数学上保证(I - γP_π)可逆、迭代必收敛的保险栓。设γ=0.999和γ=0.9,收敛速度可能差十倍——这不是调参玄学,是矩阵谱半径的硬约束。
3. 贝尔曼最优方程:当“算账”升级为“精打细算”,最优策略藏在方程的“max”里
如果说贝尔曼方程是帮一个“守规矩的员工”算清楚“按老板给的流程干,我能拿多少年终奖”,那么贝尔曼最优方程,就是给这位员工放权:“你可以自己决定每一步怎么干,目标是让总奖金最大化——现在,重新算账。” 它不再满足于评估某个固定策略,而是直接指向那个“终极最优策略π*”,并给出其对应的价值函数v*(s)所必须满足的方程。这个方程最醒目的特征,就是在原来贝尔曼方程的右边,多了一个max操作符——它代表“在当前状态s,我主动挑选那个能让‘即时奖励+未来期望价值’最大的动作a”。
3.1 动机:为什么不能直接优化策略?——“鸡生蛋”困境
直觉上,想找到最优策略,似乎该遍历所有可能策略,算出各自的价值,再挑最大的。但策略空间巨大:若有100个状态,每个状态有4个动作,策略总数是4¹⁰⁰(远超宇宙原子数)。更糟的是,策略和价值互相依赖——没有策略,算不出价值;没有准确价值,又不知如何改进策略。贝尔曼最优方程打破了这个循环,它指出:最优价值v(s)本身,就编码了最优策略的信息*。只要你解出v*(s),最优动作a*就自然浮现:a* = argmax_a [r(s,a) + γ Σ_s' P(s'|s,a) v*(s')]。方程把“找策略”的难题,转化成了“解一个带max的方程”的数学问题。
3.2 贝尔曼最优方程:一个“选择最优分支”的递归定义
对任意状态s,最优状态值v*(s)满足:
v^*(s) = \max_{a} \left[ r(s,a) + γ \sum_{s'} P(s'|s,a) \, v^*(s') \right]对比普通贝尔曼方程,区别就在max_a取代了Σ_a π(a|s)[...]。这意味着:
- 在s状态,我不再按某个概率分布选动作,而是穷举所有a,计算每个a带来的“即时+未来”总收益,然后取最大值;
- 这个最大值,就是s的“天花板价值”——无论你多聪明,都不可能超过它;
- 右边的
v*(s')仍是未知的,但方程声明:v*必须是那个让所有状态都达到自身天花板的唯一函数。
提示:这个方程之所以能成立,依赖于“最优子结构”原理——全局最优策略,必然在每个子问题(从任意s'开始的后续决策)上也是最优的。否则,你总能在某处替换成更好的子策略,从而提升全局收益。
3.3 “max”的威力:从价值函数反推最优策略
解出v*(s)后,最优策略π*就呼之欲出。以网格世界为例:
- 假设在状态s,动作a₁带来
r+γΣP v* = 5.2,a₂带来4.8,a₃带来6.1,a₄带来3.9; - 那么
v*(s) = max{5.2,4.8,6.1,3.9} = 6.1,且π*(s) = a₃(确定性策略); - 如果多个a并列最高(如a₁和a₃都是6.1),π*(s)可任选其一,或按比例混合(随机最优策略)。
这就是“策略提升”(Policy Improvement)的核心:用当前价值函数v,生成一个新策略π',让π'(s)总是选使r+γΣP v最大的a。贝尔曼最优方程保证,只要v=v*,这个π'就等于π*。
3.4 收敛性保障:为什么迭代max一定停得住?——收缩映射定理
你可能会担心:反复用v_{k+1}(s) = max_a [r(s,a) + γ Σ_s' P(s'|s,a) v_k(s')]更新,会不会无限震荡?答案是不会,这得益于收缩映射定理(Contraction Mapping Theorem)。
简单说,定义一个“贝尔曼最优算子”T*:T*v(s) = max_a [r(s,a) + γ Σ_s' P(s'|s,a) v(s')]。该算子具有收缩性:对任意两个价值函数u,v,有
||T^*u - T^*v||_∞ ≤ γ \, ||u - v||_∞其中||·||_∞是无穷范数(所有状态误差的最大值)。因为γ<1,每次应用T*,函数间的“距离”至少缩小γ倍。想象两个点在数轴上,每次操作都把它们拉近γ倍,最终必然重合于唯一不动点——这个不动点,就是v*。
这解释了为什么值迭代(第四章)可行:从任意初值v⁰开始,v¹=Tv⁰, v²=Tv¹,...,序列{vᵏ}必收敛到v*。收敛速度由γ决定:γ越小,收敛越快(但可能忽略长期收益);γ越接近1,收敛越慢但解更“远见”。
3.5 常见误区:最优≠完美,v*的局限性常被忽视
贝尔曼最优方程虽强大,但它的“最优”是特定框架下的最优,新手易陷入以下幻觉:
- 误区1:以为v(s)是绝对真理 → 忽略了“模型准确性”的前提*
方程假设你完全知道P(s'|s,a)和r(s,a)(即拥有环境的“动力学模型”)。但现实中,机器人不知道地面摩擦系数,股票模型无法穷尽黑天鹅。v*再优,也是基于错误模型的最优——这叫“精确的错误”。本书第五、七章的蒙特卡洛和TD方法,正是为解决“无模型”场景而生。 - 误区2:把argmax当成唯一解 → 不理解“多重最优策略”的存在
在某些状态,不同动作可能给出完全相同的r+γΣP v*。比如两条路都通向+10终点,且长度、风险全同。此时v相同,但π可以是任一条路,或随机切换。最优策略不唯一,v*只是它们的“共同价值签名”。 - 误区3:认为γ=1才是“真正长远” → 混淆了“无折扣”与“无限视野”
γ=1理论上允许无限期规划,但数学上会导致方程无解(除非所有回报为0)或策略不稳定(如循环获取零和奖励)。γ<1不仅是技术妥协,更是对“不确定性随时间放大”的理性承认——就像人不会为百年后子孙的幸福,放弃今天的救命药。
4. 值迭代 vs 策略迭代:两种“逼近最优”的路线图,一个快准狠,一个稳扎稳打
有了贝尔曼最优方程,下一步自然是“怎么解它”。毕竟没人能手算百万维的max方程。值迭代(Value Iteration)和策略迭代(Policy Iteration)是两种经典解法,它们像登山的两条路:一条是边爬边校准方向(值迭代),另一条是先画好详细地图再稳步前进(策略迭代)。两者最终都抵达v*,但路径、速度、资源消耗截然不同。理解它们的差异,是避免在项目中“用错工具”的关键。
4.1 值迭代:单刀直入,用“价值”本身做导航
值迭代的思想极简:既然v是T的不动点,那就直接迭代应用T,直到收敛*。算法步骤:
- 初始化任意v⁰(s)(如全0);
- 对每个状态s,计算
v^{k+1}(s) = max_a [r(s,a) + γ Σ_s' P(s'|s,a) v^k(s')]; - 重复2,直到
||v^{k+1} - v^k|| < ε(如所有状态变化<0.001)。
它的优势在于内存友好、实现简单:只需存一个价值向量v,每次更新就地覆盖。但代价是收敛慢——尤其当γ接近1时,需要很多轮迭代才能让“价值涟漪”从终点扩散到起点。例如在10×10网格中,从目标格子的价值“波及”到角落,可能需要O(1/(1-γ))轮。
4.2 策略迭代:两步走,先固化策略再优化价值
策略迭代则分两步走:
- 策略评估(Policy Evaluation):对当前策略πᵏ,用普通贝尔曼方程(无max)精确求解其价值v_πᵏ(可通过迭代或解线性方程);
- 策略提升(Policy Improvement):用v_πᵏ生成新策略πᵏ⁺¹,即
πᵏ⁺¹(s) = argmax_a [r(s,a) + γ Σ_s' P(s'|s,a) v_πᵏ(s')]。
这两步交替进行,直到πᵏ⁺¹ = πᵏ(策略不再变),此时πᵏ即为最优π*,v_πᵏ即为v*。
它的优势是收敛极快:理论上,有限状态MDP下,策略迭代最多|A|^|S|步就收敛(|A|动作数,|S|状态数),实践中常3-5轮就搞定。但代价是计算重:策略评估若用迭代法,每轮都要扫全状态;若用矩阵求逆,内存和计算量随状态数平方增长。
4.3 一个直观对比:2×2网格上的“收敛竞赛”
仍用之前S0-S3网格,γ=0.9,目标S3奖励+10,其余转移无即时奖励。
值迭代:
v⁰ = [0,0,0,0]
v¹:S3=0(定义),S1=max[0+0.9×0]=0,S2=0,S0=max[0+0.9×0, 0+0.9×0]=0 → 全0
v²:S1=max[0+0.9×0]=0,S2=0,S0=0 → 仍全0(因无即时奖励,价值无法启动)
直到S3被赋予“终止价值”(如设v(S3)=10),v¹(S1)=0+0.9×10=9,v¹(S2)=9,v¹(S0)=max[0+0.9×9, 0+0.9×9]=8.1
v²(S0)=max[0+0.9×9, 0+0.9×9]=8.1 → 此时已接近最优(v*(S0)=8.1, v*(S1)=v*(S2)=9, v*(S3)=10)
共需约3轮。策略迭代(初始策略π⁰:所有状态随机选右/下):
- 评估π⁰:因随机,v_π⁰(S0)≈0.5×(0+0.9×v_π⁰(S1)) + 0.5×(0+0.9×v_π⁰(S2)),联立解得v_π⁰≈[0,0,0,0](近似);
- 提升:v_π⁰≈0,故
argmax无差别,π¹可设为“S0→S1, S1→S3, S2→S3”; - 评估π¹:S3=0, S1=0+0.9×0=0, S2=0, S0=0+0.9×0=0 → 仍≈0;
- 提升:因v≈0,但S1→S3有直接路径,故π²(S1)=右,同理π²(S2)=下;
- 评估π²:S1=0+0.9×10=9, S2=9, S0=max[0+0.9×9, 0+0.9×9]=8.1 → v_π²=[8.1,9,9,0];
- 提升:检查各状态,S0选右/下都得8.1,S1必选右(得9),S2必选下(得9)→ π³=π²,收敛!
共2轮策略更新,每轮评估1次。
注意:此例中值迭代看似更快,但那是因状态少。当状态数升至1000,策略迭代的“轮数少”优势碾压值迭代的“每轮快”。
4.4 截断策略迭代:工程实践中的“性价比之选”
纯策略迭代的评估步太重,值迭代又太慢。于是有了截断策略迭代(Truncated Policy Iteration):在策略评估阶段,不求精确解v_πᵏ,而只做K次贝尔曼方程迭代(K≥1),就停止并提升策略。当K=1时,它退化为值迭代;当K→∞,它趋近纯策略迭代。K=2或3是常见折中——既避免了求解大型线性方程,又比值迭代收敛快得多。这体现了理论到工程的务实智慧:不追求数学上的完美解,而寻求“足够好且够快”的实用解。
4.5 常见误区:混淆“算法目标”与“适用场景”
开发者常因名字望文生义,导致用错场合:
- 误区1:“值迭代输出策略,策略迭代只输出价值” → 完全颠倒
值迭代只输出v*,要得策略π*,还得额外做一次argmax(即策略提取);策略迭代的每一轮都明确产出一个策略πᵏ,且最终πᵏ就是π*。前者是“先算价值再导策略”,后者是“边算边产策略”。 - 误区2:“策略迭代一定比值迭代好” → 忽略了计算资源的硬约束
在嵌入式设备或实时系统中,内存可能只够存一个v向量,无法存π和v两个大数组。此时值迭代是唯一选择。策略迭代的“快”是以空间换时间,当空间不足,它反而成累赘。 - 误区3:“截断策略迭代是偷懒” → 不理解它是收敛性与效率的精妙平衡
K次迭代评估,本质上是在用“K步价值传播”近似“无限步收敛”。理论证明,只要K≥1,截断策略迭代仍保证收敛到v*,只是收敛速率介于值迭代和纯策略迭代之间。这不是妥协,而是对现实约束的尊重。
5. 蒙特卡洛 vs 时间差分:当模型未知时,“等结局”和“边走边学”的两种生存哲学
前四章的方法(值/策略迭代)都有一个隐藏前提:你知道环境的完整模型——即对任意s,a,都能说出P(s'|s,a)(跳去哪)和r(s,a)(拿多少)。但现实世界哪有这么理想?机器人不知道电机响应延迟,交易系统无法建模黑天鹅事件。这时,强化学习必须“摸着石头过河”:不靠预设模型,而靠与环境交互产生的真实经验(trajectories)来学习。蒙特卡洛(Monte Carlo, MC)和时间差分(Temporal-Difference, TD)就是两大流派,它们代表了两种截然不同的学习哲学:MC是“等一局终了再算总账”,TD是“边走边结账,即时反馈”。
5.1 蒙特卡洛:用“完整剧集”做样本均值估计
MC方法的核心信条:只有看到整个episode(从开始到终止)的完整轨迹,才能准确计算该轨迹中每个状态的回报G_t。回报G_t定义为从时刻t开始的折扣累积奖励:G_t = R_{t+1} + γR_{t+2} + γ²R_{t+3} + ...。MC用多次episode的G_t均值,来估计状态价值v_π(s)。
- 首次访问MC:对每个状态s,只统计该episode中第一次访问s时的G_t;
- 每次访问MC:统计该episode中每次访问s时的G_t。
提示:MC是无偏估计(期望等于真值),但方差大——因为G_t受整条轨迹随机性影响,一次倒霉的episode(如连续踩陷阱)会让G_t极低,拖累均值。
5.2 时间差分:用“一步展望”做增量更新
TD方法则激进得多:它不要等结局,而是用当前估计v(s_{t+1}),来更新对v(s_t)的估计。核心更新式:
v(s_t) ← v(s_t) + α \left[ R_{t+1} + γ v(s_{t+1}) - v(s_t) \right]括号内R_{t+1} + γ v(s_{t+1})叫TD目标,v(s_t)叫TD预测,差值叫TD误差。α是学习率。
- 这个式子神似监督学习:把
R_{t+1} + γ v(s_{t+1})当作s_t的“标签”,用v(s_t)去拟合它; - 但它不需要真实标签,TD目标本身就是用当前知识(v(s_{t+1}))构建的“自洽猜测”;
- 因此TD是有偏但低方差的:v(s_{t+1})不准,TD目标就有偏;但每次更新只依赖一步奖励和一个估计,不受整条轨迹干扰,方差小得多。
5.3 一个生活类比:学开车的两种教练
- MC教练:让你开完整条10公里路线,结束后才点评:“刚才第3个路口你早打了2秒转向灯,导致后面车急刹,扣2分;第7个红灯你晚停了0.5米,扣1分……总分87。” 你只在终点得到反馈,中间无法调整。优点是评价全面(基于真实结果),缺点是反馈延迟长、单次失误影响大。
- TD教练:你刚打完转向灯,他立刻说:“灯打早了,下次提前1秒!” 你刚停稳,他说:“停线位置完美!” 反馈即时、高频、聚焦当下。优点是能快速修正,缺点是判断依赖他的“经验模型”(v(s_{t+1})),如果他对下一个路口的判断错了,这次反馈就带偏见。
5.4 关键算法对比:MC Basic vs SARSA vs Q-learning
- MC Basic:最朴素MC,用首次访问,策略固定(on-policy);
- SARSA(State-Action-Reward-State-Action):TD版MC,更新动作值q(s,a),目标是
R_{t+1} + γ q(s_{t+1}, a_{t+1}),其中a_{t+1}是实际执行的动作(on-policy); - Q-learning:更激进的TD,目标是
R_{t+1} + γ max_a q(s_{t+1}, a),即用s_{t+1}的最优动作值做目标(off-policy)。它允许你用随机探索的轨迹,去学习最优策略——就像让学员用“试错法”开车,却教他“老司机”的最优路线。
# SARSA 更新(on-policy) q[s, a] += alpha * (reward + gamma * q[next_s, next_a] - q[s, a]) # Q-learning 更新(off-policy) q[s, a] += alpha * (reward + gamma * max(q[next_s, :]) - q[s, a])5.5 常见误区:混淆“on-policy/off-policy”与“探索/利用”
这是最易混淆的概念对:
- on-policy vs off-policy:指学习所用的数据,是否来自当前正在优化的策略。SARSA用π生成数据并优化π,是on-policy;Q-learning用行为策略(如ε-greedy)收集数据,却用max优化目标策略,是off-policy。它关乎数据与策略的匹配性。
- 探索 vs 利用:指单个策略内部如何平衡“尝试新动作”和“执行已知好动作”。ε-greedy是典型机制:以ε概率随机探索,1-ε概率贪心利用。它关乎策略的设计。
二者正交:你可以用on-policy策略(SARSA)配合ε-greedy探索;也可以用off-policy(Q-learning)配合ε-greedy收集数据。混淆它们,会导致调试时定位错误——比如Q-learning不收敛,你该查目标策略是否合理,而非怪ε-greedy探索不够。
6. 从表格到函数:当状态爆炸时,“查表”失效,“拟合”成为唯一出路
前面所有方法(值迭代、MC、TD)都基于一个隐含假设:状态空间是离散且规模适中,我们可以为每个状态s维护一个独立的数值v(s)或q(s,a),存成一张“大表格”。这在4×4网格(16个状态)中很美,但在真实世界中立刻崩塌:一个自动驾驶汽车,状态包括位置、速度、周围10辆车的坐标/速度/类型……维度轻松破百,状态数远超宇宙原子数。此时,“查表”不仅内存不够,连遍历一遍都不可能。出路只有一条:放弃为每个状态记一个数,改为用一个参数化的函数q_θ(s,a)来近似q(s,a),其中θ是待学习的参数(如神经网络权重)。这就是函数近似(Function Approximation)*,也是深度强化学习(如DQN)的基石。
6.1 为什么表格法在此失效?——维度灾难的具象化
考虑一个简化状态:(x,y,θ,v),分别表示位置x,y、朝向θ、速度v,各用100个离散值表示。状态总数=100⁴=10⁸(1亿)。存储1亿个浮点数需约400MB内存,尚可接受。但若增加一个维度——“前方障碍物距离”,再分100档,状态数飙升至10¹⁰(100亿),内存需求40GB,且更新时需遍历100亿次——这已超出单机能力。而真实状态远不止5维。表格法的复杂度是O(|S||A|),随维度指数增长,此即维度灾难(Curse of Dimensionality)。
6.2 函数近似的本质:用“泛化”代替“记忆”
函数近似不做“记住每个点”,而做“理解规律”。例如,q*(s,a)可能有这样的模式:“当车距<5米且前车减速时,急刹q值高;车距>50米时,跟车q值平缓”。一个线性函数q_θ(s,a) = θ₀ + θ₁·distance + θ₂·relative_speed就能捕捉这种趋势;一个神经网络更能拟合复杂非线性关系。关键在于:训练数据(s,a,r,s')只要覆盖部分状态,函数就能外推到未见过的状态——这是表格法永远做不到的“泛化
本文还有配套的精品资源,点击获取