
1. 为什么强化学习绕不开动态规划先想明白这个基础说实话很多人刚接触强化学习时看到课程表里动态规划这一讲第一反应都是这不就是算法课里那个求最短路径的东西吗怎么又学一遍。我当年也是这样结果翻了几天书才反应过来此动态规划非彼动态规划它在强化学习里的位置远比想象中关键。理解强化学习里的动态规划本质上只需要想通一个问题当你已经知道环境的一切规则时能不能直接算出最优策略动态规划就是这套计算方法的总称。它和真正做强化学习无模型时靠采样学习的区别就像闭卷考试和开卷考试的区别——动态规划是开卷所有规则都摆在桌面上而真正的强化学习是闭卷你只能靠做过的题总结经验。课程里通常把这个设定叫模型已知术语叫MDP四元组完全给定。但要注意动态规划并不是什么花哨的新算法而是两大经典方法的总称策略迭代和价值迭代。它们共同的理论根基是贝尔曼方程。为啥这玩意儿这么重要因为整个强化学习学科说白了就是围绕贝尔曼方程做文章能解就直接解不能解就近似解不能近似就学一个估计出来。而动态规划恰好是接近直接解的理想情况。这一讲的核心内容拆解下来通常是这几块从最优贝尔曼方程出发理解动态规划要解决的目标策略评估给定一个策略算出它的价值函数策略改进根据价值函数找出更好的策略策略迭代评估和改进反复循环直到收敛价值迭代不显式做策略评估直接逼近最优价值函数动态规划的局限性和它为什么是后续所有算法的地基这些内容看起来多但串起来就一条线我们想找到最优策略而最优策略藏在最优价值函数里最优价值函数又是所有策略里最好的那个对应的价值所以我们需要一种办法不断逼近它。动态规划就是干这个的。另外我还想说清楚一个学习心态别觉得这讲内容太理想化就不当回事。动态规划确实是理想假设下的算法但它是理解后续时序差分TD、Q-learning、策略梯度这些方法的必经之路。没有这一步后续你看到用TD估算价值的时候很难理解估算的到底是个啥、误差从哪来、为啥要那个公式。所以这一讲再怎么强调基础都不为过。2. 动态规划的核心引擎贝尔曼方程与策略评估2.1 贝尔曼方程到底在表达什么贝尔曼方程是动态规划的理论发动机核心思想其实很简单——把一个状态的价值拆成立即回报 下一状态的价值按概率加权求期望。它表达的是一个自我一致性状态的价值等于在这个状态下采取某个动作的即时收益加上进入后续状态后能拿到的未来收益这些未来收益再按折扣率折算到今天。举个例子假设你玩一个迷宫游戏当前在格子A。贝尔曼方程说的就是格子A的价值等于从这里每走一步能拿到的分数可能是0可能是奖励加上折扣后下一步所在格子的价值。如果下一步格子B里有大宝藏那格子A也会因此有更高的价值因为你有机会走到B。用数学语言描述就是v(s) E[ R_{t1} γ * v(S_{t1}) | S_t s ]这个公式看起来简单但它有两个隐含的意思初学者很容易忽略第一价值不是拍脑袋想出来的而是由环境动态状态怎么转和策略状态之间怎么走共同决定的。第二它是递归的一个状态的价值依赖于其他状态的价值其他状态的又依赖于更多的形成一个互相纠缠的方程组。这也是为什么我们必须用迭代法去解不能用普通代数一招直接算完。2.2 策略评估的完整步骤假设现在有一个策略π比如迷宫每个格子上都往右走。策略评估要做的事就是如果一直按这个策略走每个格子的长期回报期望是多少。这个过程的学名叫预测问题因为它是在预测当前这个策略的回报而不是在算最优结果。最直白的做法是同步迭代。给每个状态一个初始价值通常是0然后用贝尔曼方程当更新规则一轮一轮刷新所有状态的价值v_{k1}(s) Σ_a π(a|s) Σ_{s,r} p(s,r|s,a) [ r γ * v_k(s) ]第一次迭代v就变成了立刻能拿到的回报第二次变成立刻回报 一次折扣后的后续回报第三次继续往后延伸。虽然更新公式看起来像一个递推式但在课程实践里大家更常用的其实是表格法——给每个状态先预设一个初始值然后反复用上面这个式子和现有值表把新值算出来直到值的变化非常小为止。这里有个实操中的细节值得特别注意上面的迭代公式是同步更新版本意思是所有状态的新价值一起算完再统一替换。但初学者写代码时容易犯个大错——每算一个状态就马上把旧表里对应位置覆盖掉这样算后面的状态时用的其实已经是本轮的部分新值。虽然大部分情况下最后也能收敛但严格说这就变成异步更新了而且如果你想复现教科书里某个特定迭代步数的结果数值会对不上。我自己最开始写策略评估时就因为这个折腾了一晚上最后才意识到是同步和异步的问题所以这里专门提醒一下。2.3 收敛判据怎么设才合理策略评估是个迭代过程不能无限跑下去得有个终止条件。课程里通常讲的是当价值变化足够小就停但具体多小算小这个阈值如何设直接关系到训练耗时和结果精度。实践里常用的有三种方式设置最大迭代轮数比如100轮、1000轮到点无条件停止设置价值变化阈值比如所有状态中价值变化的最大值小于某个小量如1e-4两者结合哪个先到都停我的建议是练手阶段用最大迭代轮数先跑通流程因为简单直接真正做实验、对比算法效果时用阈值来判断收敛因为这个标准更稳定、更公平。阈值设多大也有讲究——设太大比如1e-2策略评估会提前结束价值函数还很粗糙后续策略改进就容易走弯路设太小比如1e-8又会白白耗费大量迭代轮次因为后期价值变化衰减得非常缓慢边际收益很低。我个人的经验是1e-4左右是个很实用的起点大部分实验中效果都不错。另外收敛到最优价值函数这件事用数学语言说就是v_k以几何速度逼近v_π这意味着它前期收敛很快越到后面越慢。我实测过在经典网格世界中前20次迭代价值基本已经成形后面几十次都是在打磨小数点后的细节所以设置阈值时也要有这个心理预期别因为后期变化小就误以为它不收敛了。3. 从评估到改策策略改进定理与贪心策略3.1 价值函数算出来之后怎么用策略评估算出的价值函数本身只是回答了一个如果问题——如果你一直按这个策略走能得到多少回报。但这还不够我们真正想要的是比现在更好的策略。好在这个问题有明确的答案在某个状态s下如果存在一个动作a使得执行动作a之后后续再按原策略π走得到的期望回报比状态s的当前价值更高那决策时选择动作a就是更优的。这就是策略改进定理的核心思想。它属于那种道理一说就通但自己发现很难的结论——每一步都选当前看起来最划算的动作也就是贪心长期结果不会变差。具体的贪心策略长这样在所有可选动作中用动作价值函数Q函数算一笔账选那个能让立即回报 后续价值最大的动作。公式为π(s) argmax_a Σ_{s,r} p(s,r|s,a) [ r γ * v_π(s) ]这里有个关键概念必须理清做这一步叫策略改进时我们仍然需要环境模型p(s,r|s,a)因为你要估算如果执行这个动作会进到哪些状态、拿多少奖励。如果你没有这个模型这一步根本没法算——这正是后续无模型强化学习要用采样来替代的原因。3.2 贪心策略为何不会让结果变差贪心这个说法听起来总有点目光短浅的意思很多人第一反应是只看重眼前利益会不会错过长期回报。但在策略改进定理中答案是不会。定理说如果新策略π在每一步都比π好或者相等那么整体上π的价值函数一定逐状态不低于π的价值函数。直观理解也很简单如果某一步贪心的决定带来的是日后更好或持平那从这一步往后整条路径的价值就不会比原来差。由于每一步都能这么说整条轨迹的价值也就不减。这个数学结论通过贝尔曼算子可以严格证明但在实际应用中我们更该记住的是它的工程意义——你不必担心贪心导致崩盘至少在策略改进这一步贪心是无风险的操作。有一类策略改进场景容易让人困惑当存在策略π使得所有状态的价值都达到最大即达到最优此时贪心改进会得到一个还在原策略转悠的结果产生所谓改进不动的死循环。你不用纠结这个因为这恰恰说明已经收敛了。在实际实现中如果新策略和旧策略完全相同就可以宣告完工了。3.3 策略改进在代码里怎么落地理论说得清楚写代码时也有一坑程序上得注意几点需要一个函数存旧策略的价值函数另一个函数根据价值函数算新策略别把两者混在一个变量里改策略本身用什么数据结构存常用做法是二维数组或字典外层是状态里层是对应每个动作的概率更新策略时要用同步思路先完整算出新策略再整体替换旧策略否则比较新旧策略是否相同时容易出错我贴一段伪代码级示意图展示策略改进的实现逻辑def improve_policy(env, V, gamma, policy): policy_stable True for s in env.states: old_action policy[s] q_values {} for a in env.actions: q 0 for prob, s_next, reward in env.transitions(s, a): q prob * (reward gamma * V[s_next]) q_values[a] q new_action argmax(q_values) if new_action ! old_action: policy_stable False policy[s] new_action return policy, policy_stable之所以这里特别强调用argmax选动作而不是输出一个每个动作概率都是1除以动作数的均匀策略是因为你要给程序一个明确的决策规则。这个决策规则在策略迭代里会反复用来判定是否已经稳定如果图省事输出了分布稳定性判断就会出错后续逻辑也会乱。4. 策略迭代全流程评估、改进、再评估直到不动4.1 两步循环的完整框架策略改进定理给了我们一条路任何策略都可以通过评估 → 改进变成更好的策略。把这个过程循环起来就得到了策略迭代算法。它的流程简单到可以做一张图初始化一个策略比如完全随机或全选某个固定动作策略评估用当前策略算出价值函数v_π策略改进基于v_π算出贪心策略π如果π和π相同输出π否则用π代替π回到第二步这个循环的每一步都是有保证的策略评估收敛于当前策略的真实价值策略改进得到的新策略不会差于旧策略。所以反复循环后必然收敛到最优策略和最优价值函数。整个过程在有限状态、有限动作的MDP中迭代次数是有上限的因为策略总数是有限的而每次改进都是严格变好的所以不可能无限循环下去。4.2 一个能动手算的小例子理论再好不如动手算一次。借用经典4x4网格世界来走一遍流程——起点左下角终点右下角每一步移动的即时奖励是-1折扣率γ1或者0.99都行原理一样。走法上下左右撞墙不动。目标是最大化总回报也就是尽量少走冤枉路到达终点。第一次迭代假设初始策略是完全均匀随机所有方向概率各0.25。策略评估的结果是每个格子的价值都非常接近负数因为无论如何都有概率走冤枉路。基于这个价值做策略改进时会发现朝向终点方向的动作——比如终点的格子左边一格最优动作是向右——价值最高。于是策略改进把那些明确朝终点的格子改成定向动作其余格子可能还是随机朝各处。第二次迭代新策略已经看起来像样子了再用策略评估去算它的价值函数这次因为策略更确定价值也更高比如从-10级别提升到-5级别。再基于新价值做改进又会出现更多定向动作。如此反复几轮最终策略收敛为一条最短路径每一步都朝终点走触墙就绕一步。这个收敛过程我第一次手动推演时花了一个多小时真真切切理解了什么叫改进循环。4.3 策略迭代的实际效率与经验教训做实验时会发现策略迭代并不是每次都等到策略评估完全收敛才去做改进。事实上教科书说要等评估收敛但实际跑的时候你会发现等它完全收敛很浪费早期策略很差价值函数算得再精准也没意义因为它马上就又要变了。对此业界有变体方案比如截断策略评估——只评估几轮就立刻改策略。这个思路在课程里经常被当作细节提一嘴但在真正的项目里很常用也是后面讲价值迭代的思想雏形之一。我自己建议的做法是用策略迭代时评估阶段别设太大的标准。阈值设为1e-4已经绰绰有余甚至可以放宽到1e-2先跑通整体流程观察策略是否快速进入稳定区。因为策略的骨架往往在第一轮改进后就基本成形了后面几轮改进只是在小范围内调整细节。所以千万别让策略评估耗在小数点后几位的打磨上那点精度对策略最终决策的影响微乎其微。另外还有一个容易犯的毛病忘记记录新旧策略是否相同就提前终止程序。代码里最好加一个布尔变量比如policy_stable在每次策略改进后检查它。因为策略不变是你判断算法是否收敛的重要标志如果忘了记录你可能会发现价值函数明明还在微微变化但策略早就稳定了于是程序一直空转到超时才停。5. 换个思路的价值迭代不评估也能改进5.1 价值迭代和策略迭代的本质区别策略迭代是化整为零的打法每轮都先算出策略的价值然后挑更好的策略而价值迭代根本不单独存一个策略它只专注于一件事——不停地用贝尔曼最优算子去更新价值函数。贝尔曼最优算子长这样v_{k1}(s) max_a Σ_{s,r} p(s,r|s,a) [ r γ * v_k(s) ]对比策略评估的公式可以发现区别就一处策略评估里动作是按照策略概率π(a|s)加权的期望价值迭代里的动作是取最大值max_a。这个细微差别带来两个影响价值迭代不需要显式的策略评估过程自然也就没有评估到收敛才改的限制它直接逼近的是最优价值函数v*而不是某个具体策略的价值函数学到这里很多人会混淆两点策略迭代和价值迭代都能收敛到同一个最优解吗答案是能只不过路径不同。策略迭代一路在价值函数和策略两个空间交替穿梭价值迭代只盯着价值函数这一个空间猛跑。价值迭代的价值函数收敛到最优后再一次性提取贪心策略就是最优策略。5.2 价值迭代的收敛节奏价值迭代最大的优点之一是省事——它把评估 改进合并成一个步骤了不需要在每个状态下再三计算策略概率。代码实现也很直接就那一个max公式反复刷表。我在手写代码时价值迭代实现的代码量通常只有策略迭代的一半不到这对快速测试环境、验证想法特别有用。但它的收敛节奏有个奇怪的特点价值函数的变化量并不单调。某轮可能变化很大下一轮却很小再过一轮又变大这点和策略迭代那种每轮都更优的错觉很不一样。实际运行价值迭代时会看到这样的进程前期价值函数快速勾勒出整体形状哪个区域好、哪个区域不好中期在细节上慢慢修正后期收敛变慢。因为更新规则是max算子它对某些状态可能一次就跳到差不多对的值对另一些状态却要很多次迭代才能把间接影响传播到位。传播速度这个问题在实现中非常有意思。价值函数里的信息是靠迭代一步步扩散的很像水滴在池塘里荡开一圈圈波纹。比如一个奖励很大的终点状态第一轮价值迭代能影响离它一步以内的邻居第二轮能影响两步以内的第三轮三步以内。奖励信息传递的速度和折扣率γ也有关γ越小远期信息折损越多扩散的速度和影响力都会打折扣。所以做实验时别嫌收敛慢先看看你的奖励传播得够不够远、折扣率是不是设得太保守。5.3 价值迭代的终止条件和常见坑价值迭代没有策略稳定这个天然停靠点所以程序的终止条件通常是看价值函数的变化幅度。每次更新后检查max|v_{k1} - v_k|当它小于阈值就停下。这个阈值同样别设太细1e-4在大多数小环境演示里足够了但大状态空间下1e-6就显得过于苛刻白白多跑几十轮。这里有一个很容易踩的坑价值迭代跑出的价值函数在尚未完全收敛时对应的策略可能已经是最优了。因为策略的取舍是argmax价值差的微小扰动并不影响最大值的归属但价值迭代却还在为消除这些微小扰动反复迭代。我做个实验时遇到过价值函数在第12轮已经和最终值差0.01左右但策略在第六轮就已经不再变化。如果当时死等价值函数收敛就白白多了六轮计算量。所以实践中如果你的最终产出是策略而非价值函数那么价值迭代的终止条件可以放宽一些甚至可以考虑直接用策略不再变化作为停靠条件虽然这严格说已偏离教科书定义但工程上非常有效。6. 两大算法的对比与选型建议6.1 用一张表看清策略迭代和价值迭代我在带新同学入门时经常让他们先背这样一张对照表因为它能把两个算法的异同理清非常有效对比维度策略迭代价值迭代迭代内容价值函数与策略交替更新只更新价值函数每轮开销较高评估要跑多轮较低只有一步更新收敛速度快通常几十轮内慢和状态空间传播速度有关需要记录的内容价值函数策略只要价值函数策略提取时机每轮改进后拿到的就是策略最后收敛后一次性做argmax对初学者的友好度逻辑清晰但代码量大代码简单但逻辑绕典型适用场景需要显式分析策略时快速计算最优价值或策略时这张表不是我抄来的是我跑过无数实验后自己总结的感受。特别是收敛速度这一行很多教程会简单地说价值迭代比策略迭代慢这个说法其实不够准确——应该说策略迭代在迭代次数上通常更少但每次迭代的计算量更大。两样东西合在一起比较往往要看具体环境如果策略评估很快收敛策略迭代效率高如果策略评估需要很多轮那价值迭代因为省去了评估的开销反而可能更快。我们自己在经典网格世界上测过两者整体运行时间其实相差很小但形成策略的速度有明显差异。6.2 什么情况下优先用策略迭代如果你需要精确分析某个策略的长期表现——比如回答如果自动驾驶车辆永远靠右行驶最终能积累多少安全分——策略迭代是天然的选择因为它评估出的价值函数就是这个策略的价值自带解释力。策略迭代的过程也更直观容易调试你可以在每一步输出当前策略和价值函数看看是不是某一步改进改错了方向。还有一个场景特别适合策略迭代你的初始策略来自某个业务规则或人工经验而不是随意初始化此时你先做几轮策略评估就能看出现有策略的短板在哪些状态上再通过策略改进有针对性地纠正。这种先复盘再调优的风格在工业应用中很常见。6.3 什么情况下优先用价值迭代反过来如果环境很大、状态数很多或者你只是想快速拿到一个可用策略价值迭代会省心很多因为它的代码少、对内存的占用也少——不用同时维护策略表和价值函数两张表。在代码验证阶段、环境调试阶段价值迭代称得上趁手工具半小时内就能跑出一个基础结果。另外如果环境的状态转移非常确定比如许多棋盘游戏都是确定性规则价值迭代的优势更明显。因为确定性环境下max算子有很好的性质价值信息传播得非常快价值迭代通常比策略迭代收得更快、更稳。6.4 基于问题特点的选型决策我做选型时一般会问自己三个问题这里也分享出来供参考我要不要显式输出某个策略的价值分析要的话策略迭代我的状态空间大不大大且内存紧张的话价值迭代我的模型转移是确定还是随机的随机且复杂先试策略迭代当然这只是经验法则绝不是铁律。我在实际项目里通常是先用价值迭代快速跑通流程、验证环境代码对不对拿到一个baseline再切换到策略迭代做精细分析、调参、生成可视化报告。这两个算法不是竞争关系而是互补关系先快后细的组合拳效率最高。7. 动态规划的真正局限不只是太理想7.1 三个绕不开的前提假设课程讲到这一节一定会提到动态规划的缺点。常见表述是因为它要求已知MDP模型所以现实中没法直接用。这个说法没错但只说对了一半。我拆开说三点第一模型必须已知。你需要知道每个状态下执行每个动作的转移概率和奖励分布。现实世界中你不可能把自动驾驶的所有交通状态转移概率精确列出来。这个限制是最致命的。第二状态空间必须有限且可遍历。动态规划的迭代更新公式需要在所有状态上逐一刷新无限状态或连续状态就根本没法算。即使有限如果状态数大到一定程度比如围棋的10的170次方遍历一次都做不到更别说迭代几百轮了。第三转移概率和奖励必须平稳不变。如果环境随时间变化动态规划算出的策略可能在下一分钟就过期了。现实世界到处都是非平稳的比如用户兴趣随时在变。7.2 这些局限如何推动了后续算法也许你会想动态规划条件这么苛刻为啥还要学它答案在于——它是整个强化学习算法族谱的根。后续所有算法都是在对动态规划的某一环节做松绑。先说无模型算法比如蒙特卡洛方法和时序差分学习。它们直接砍掉了模型已知这个前提不再用概率去计算期望而是通过与环境交互、采样真实回报来估计价值。你不需要知道转移概率只需要不断试错从实际数据中学习。从理论上讲这些方法都是在用样本均值逼近贝尔曼方程里的期望项。再说函数逼近方法比如深度Q网络它用神经网络来存储和泛化价值函数绕开了状态空间太大没法遍历的限制。动态规划的价值表换成一组参数更新公式也从逐一刷表变成用梯度下降更新参数。但有一点需要注意这些新算法里的核心公式仔细推敲后几乎都能在动态规划里找到原型。Q-learning的时间差分更新本质上是价值迭代的一个采样版本蒙特卡洛策略评估本质上是策略评估用样本替代期望。理解了这一讲你才能理解后续算法为什么要那么改。这也是课程把动态规划放这么靠前的原因它不是过时内容而是整个学科的统一语言。7.3 动态规划在今天的真实应用场景很多人以为动态规划只活在教科书里其实它在某些特定领域依旧活跃。我举几个实际见过的例子它们都有个共同特点模型已知或者容易建模。棋盘类游戏是典型的应用场景。比如黑白棋、五子棋这类游戏状态转移完全确定奖励规则也是固定的这就是标准MDP完全符合动态规划的使用前提。我在做五子棋机器人时状态空间比围棋小一两个数量级用价值迭代跑出一个较好的评估函数完全不费力。资源分配与调度也是动态规划的用武之地经典例子包括库存管理、电网调度、排队系统优化。这类问题通常有详细的物理模型和仿真器转移概率虽复杂但可以通过数值方法算出或近似。这种时候直接上强化学习反而舍近求远动态规划又快又稳。机器人运动规划里如果环境地图事先已知且机器人的动力学模型标定得比较好完全可以用动态规划在状态空间中搜出最优路径。虽然现在更多人用采样方法比如RRT但动态规划的结果可以作为基准答案用来验证采样方法是否接近最优。我个人的看法是动态规划不只是入门知识它在可建模的场景中依然有工程价值。哪怕ML领域已经用上了各种花哨的深度强化学习方法动态规划作为精确解的地位一直没变这点在任何时候都很值钱。8. 手写代码时最容易踩的四个大坑8.1 同步更新的顺序问题前文提到过策略评估和价值迭代都要求在计算新值时使用上一轮的旧值。实现时如果直接在原表上覆盖就会出现用新值算新值的问题虽然多数情况下也能收敛但在某些精心构造的例子里会出现振荡甚至不收敛。我的建议是代码里显式准备新表每轮计算时把新值存进去等全表算完后整体拷贝回旧表。虽然多占一份内存但这保证和教科书完全一致排查问题也更方便。尤其是用numpy做向量化计算时如果不注意副本很容易写出隐藏bug。8.2 折扣因子的作用不可忽视折扣因子γ不只是个数学装饰它承载的是未来收益的打折率。设多大直接影响收敛行为和最优策略的形状。γ很小比如0.5时算法强烈偏好近期收益长期回报的权重下降很快而γ很大比如0.99时远期收益依然重要状态间的价值传播会很远迭代次数也随之增加。实操中我见过不少人为了方便直接设1不折扣这在小规模确定性环境中没问题但一旦存在循环状态外加较高的回报不折扣可能会让价值函数发散。因此除非环境设计很简单否则我一般建议γ放在0.9到0.99之间既保留长期信息又保证收敛稳定。8.3 终止条件别只看误差上限很多初学者喜欢写跑固定100轮或误差小于1e-6以为这就万事大吉。但实际经验是固定轮数看运气可能跑过了收敛点不少轮白算固定误差在大状态空间上算起来很贵因为每个状态都要扫一遍我的习惯是叠加两个条件主要看误差上限辅以最大轮数兜底。同时误差上限设置得比实际需要的精度宽松一点比如1e-4就好——因为你的最终产出是策略而不是小数点后好几位的精确价值。策略的决策对价值的小扰动非常鲁棒。8.4 使用字典还是数组存储状态小规模演示时用字典存状态价值很简单直观但一旦状态空间变大字典查找的开销会拖慢每轮的更新速度。使用numpy数组或pandas表格会快很多前提是状态能映射到连续的整数索引。我在自己的项目里有个小惯例先用字典快速验证逻辑确认无误后切换到数组版本做正式实验兼顾开发效率和运行效率。9. 从动态规划到现代强化学习的思维迁移9.1 动态规划是理解价值的唯一入口我见过不少同学先跳去学了深度强化学习回来补动态规划时一头雾水原因是他们的直觉里价值这个概念从来没有建立起来。动态规划给了他一张完整的价值地图让他理解为什么每个状态的值是由环境结构和策略共同决定的为什么距离奖励越近、价值越高为什么绕远路会降低价值。这份直觉不是说用就能有的它需要在动态规划里亲手迭代、观察价值变化才能沉淀。一旦有了之后看Q-learning、策略梯度算法时的很多困惑都会迎刃而解。我甚至觉得判断一个人强化学习基础扎不扎实不用问会多少算法直接看他能不能从贝尔曼方程推一推动态规划的两大迭代只要这个链路顺畅基本盘就不会差。9.2 采样方法如何替换期望计算后续时序差分学习中核心变化就是把求和求期望替换成采样取平均。动态规划的价值更新用了环境的真实转移概率而时序差分用一种很生活化的类比来理解就是你不再翻阅地图算所有路线的平均耗时而是直接开一次车记录实际时间。这个迁移看起来简单但涉及一个微妙的数学问题采样带来的方差怎么控制偏差又如何影响收敛。动态规划为这个比较提供了清晰的参照系——每一步更新的目标值应该是多少算法的差距是多少这样你才能判断采样近似到底准不准。9.3 从状态价值到动作价值的视角扩展动态规划的经典版本主要关注状态价值v(s)但现代强化学习几乎全部围绕动作价值q(s,a)展开。背后的原因也很好理解真实环境中你往往没有模型动作价值算起来比状态价值方便因为动作价值不需要对策略的所有动作求期望尤其在策略是确定性的情况下只要知道当前策略下每个动作的价值决策就变成了argmax。动态规划虽然也能通过某种形式推导动作价值但经典课程通常不展开讲。这里我提醒一句当你后续进入Q-learning时遇到的第一个公式q(s,a) ← q(s,a) α [r γ max_a q(s,a) - q(s,a)]别慌。它就是价值迭代的一步采样式近似唯一的区别是价值更新从v换成了q期望换成了采样。底层逻辑和这一讲完全互通。9.4 动态规划思维在日常建模中的价值最后一个我想说的大白话感悟是动态规划学的是一种分而治之、逐步逼近的问题求解思维。无论做系统设计还是算法调优你都会遇到一步算不出全局最优的问题。动态规划教你的方法是先把每一步的最优价值搞清楚然后通过迭代让它扩散到全局。这在任何领域都超级好用。比如我在做路径规划和资源分配的时候动态规划式思维几乎每星期都会用上。它不一定是最终算法但是作为思考框架、作为baseline、作为调优参照它从来没让我失望过。所以如果你学完这一讲觉得太理想、离实际太远我的建议是换个角度它不是在给你一个能直接上线的工具而是在给你一套理解所有复杂算法的坐标系。有了坐标系后面不管深度学习如何变化你都不会迷路。