资讯动态

强化学习算法全景梳理:从MDP到PPO的体系化入门指南

发布时间:2026/10/14 15:31:07 来源:尧图企业网站定制
1. 从零散笔记到体系化认知为什么值得重新梳理强化学习很多人第一次接触强化学习都是被智能体自己学会玩游戏这种画面吸引进来的。但真正上手之后往往会在两三个星期内陷入一种很尴尬的状态策略梯度、值函数、贝尔曼方程、时序差分这些词全都见过单独拎出来也能说上两句可一旦要把它们串成一条线脑子里就乱了。我自己当年也是这样笔记记了好几本公式抄了一堆但遇到一个新问题还是不知道该从哪个算法切入。这篇内容就是围绕强化学习汇总这件事展开的。它适合三类人第一类是刚学完机器学习基础、准备进入强化学习的新手需要一条清晰的入门主线第二类是做工程落地、需要快速判断某个场景该用哪类算法的开发者第三类是把强化学习当工具、想用它解决实际决策问题的研究者。核心目标不是把每个算法讲成教科书而是把强化学习这张地图画清楚——哪些是地基哪些是分支哪些是看起来花哨但实际很少用的旁支。我个人的体会是强化学习最劝退的地方不在于数学难而在于它的知识结构是网状的不是线性的。监督学习你可以从线性回归一路推到深度学习路径很直。强化学习不行它同时牵扯到马尔可夫决策过程、动态规划、蒙特卡洛、时序差分、函数逼近、策略优化这几条线而且它们之间互相引用。所以汇总这件事本身就有价值——它帮你把这张网重新织一遍让你知道每个节点在整体里的位置。下面我会按照先建地基、再分门派、最后谈落地的思路来展开。中间会穿插一些我踩过的坑和实际调试时的经验尤其是那些文档里不会写、但真正动手时一定会遇到的问题。2. 地基部分马尔可夫决策过程与贝尔曼方程到底在说什么2.1 把MDP理解成状态、动作、奖励的三件套强化学习所有算法的根都在马尔可夫决策过程MDP上。很多人背过它的五元组定义——状态空间、动作空间、转移概率、奖励函数、折扣因子——但背完就忘了因为没理解它为什么长这样。我用一个生活化的类比来解释。假设你在玩一个迷宫游戏你站在某个位置状态可以往四个方向走动作走到不同格子会得到不同分数奖励而且你走到哪一格只取决于你现在在哪、往哪走跟你之前怎么绕过来的没关系马尔可夫性。这四件事加上一个未来奖励打几折的系数就构成了MDP。这里有个新手最容易忽略的点马尔可夫性是一个假设不是事实。现实中很多问题的当前状态并不包含全部历史信息比如你只看当前一帧画面是不知道球往哪个方向飞的。这时候要么把历史帧拼起来当状态要么用循环网络来编码历史。我在做某个仿真环境的时候就吃过这个亏一开始只把当前位置当状态结果智能体学出来的策略一直在原地打转因为它根本分不清自己是刚来还是绕了一圈又回来了。2.2 贝尔曼方程把长远收益拆成当下未来贝尔曼方程是强化学习里最核心的一个等式它的思想其实特别朴素一个状态的价值等于你立刻拿到的奖励加上打折后的下一个状态的价值。用公式写就是V(s) Σ p(s, r | s, a) [ r γ V(s) ]看起来简单但它解决了一个关键问题——它把一个无限长的求和问题变成了一个递归问题。如果没有这个递归结构你要算一个状态的价值就得把所有可能的未来轨迹全展开那是指数级的爆炸。有了贝尔曼方程你才能用动态规划、用迭代的方式去逼近它。我建议新手一定要亲手推一遍这个方程不要只看结论。推导过程会让你明白为什么折扣因子γ这么重要γ接近0智能体就变得短视只看眼前奖励γ接近1它就会考虑很远但方差也会变大训练不稳定。实践中γ一般取0.9到0.99之间具体取多少要看任务的回合长度。回合越长γ越要接近1否则远处的奖励根本传不回来。2.3 动态规划理想条件下的标准答案有了贝尔曼方程最直接的做法就是动态规划。策略迭代和值迭代是两个经典方法它们的思路都是反复用贝尔曼方程更新价值直到收敛。但动态规划有个硬性前提你必须知道完整的环境模型也就是转移概率p(s, r | s, a)你得全知道。现实中这几乎不可能你不可能提前知道迷宫每一个格子的转移概率更不可能知道真实世界里每一步会发生什么。所以动态规划更多是理论基石实际用得少。不过它有一个重要的教学价值它告诉你如果环境完全已知强化学习问题是可以精确求解的。后面所有的采样方法本质上都是在不知道模型的情况下想办法逼近这个精确解。理解了这一点你再看蒙特卡洛和时序差分就会明白它们不是凭空冒出来的而是被模型未知这个现实逼出来的。3. 无模型方法的两条主线蒙特卡洛与时序差分3.1 蒙特卡洛等一整局结束再算账蒙特卡洛方法的逻辑非常直白我不知道环境模型那我就实际跑一遍跑完一整局看看从某个状态出发最终拿到了多少回报用这个实际回报来估计价值。它的优点是无偏——你实际采样得到的回报期望上就是真实的价值。但缺点也很明显方差大而且必须等回合结束。如果任务是没有终点的比如持续运行的推荐系统蒙特卡洛根本没法用因为它永远等不到结束。我在做一个回合制的小游戏时用过蒙特卡洛效果还行因为每局很短几十步就结束了。但换成连续控制任务它就完全跑不动。这也是为什么后来大家更偏爱时序差分。3.2 时序差分走一步就更新不等结局时序差分的核心思想是自举——我不等最终回报我用当前估计的下一个状态的价值加上这一步的实际奖励来更新当前状态的价值。这就是TD误差的来源δ r γ V(s) - V(s)这个δ就是我原本以为会得到这么多实际走了一步发现差了多少然后用它来修正估计。时序差分的好处是可以在线学习、方差小、不需要等回合结束。代价是它引入了偏差因为它用的是估计值去更新估计值。但这个偏差在实践中通常可以接受而且随着训练会逐渐减小。这里有个经验TD(0)和蒙特卡洛其实是两个极端中间还有TD(λ)这种折中方案。λ取0就是纯TDλ取1就接近蒙特卡洛。实际调参时如果发现训练方差太大可以适当调大λ如果发现收敛太慢就调小λ。这个参数在很多教程里一笔带过但它对训练稳定性影响很大。3.3 Q-Learning与SARSA同门师兄弟的关键分歧说到时序差分就绕不开Q-Learning和SARSA。这两个算法长得几乎一样但有一个本质区别Q-Learning是离策略的SARSA是在策略的。具体来说Q-Learning更新时用的是下一个状态下最大的那个Q值不管实际下一步会走哪个动作SARSA用的是实际下一步真正采取的那个动作的Q值。这个差别听起来很小但影响很大。Q-Learning更激进它假设你以后总是选最优动作所以学出来的策略更贪心SARSA更保守它考虑了你实际会怎么走包括你探索时可能走的烂棋。在悬崖行走这个经典例子里Q-Learning会贴着悬崖边走因为理论上最优而SARSA会绕远一点因为它知道探索时可能掉下去。我实际用下来如果探索率衰减得比较慢SARSA通常更稳如果探索率很快就降下去Q-Learning收敛更快。选哪个要看你对训练过程中的安全性有多在意。4. 从表格到神经网络函数逼近带来的能力与麻烦4.1 为什么表格方法撑不住真实问题前面说的Q-Learning、SARSA本质上都是表格方法——用一个表格存每个状态动作对的Q值。状态少的时候没问题但真实问题的状态空间往往大得离谱。比如一张84×84的灰度图状态数就是256的7000多次方这个表格根本存不下。所以必须用函数逼近也就是用一个参数化的函数比如神经网络来近似Q值或策略。这就是深度强化学习的起点。但函数逼近引入了一个新问题不再有收敛保证。表格方法可以证明收敛但一旦换成神经网络理论保证就没了训练可能震荡、可能发散、可能陷入局部最优。这也是为什么深度强化学习调参这么难——你面对的是一个没有理论护栏的系统。4.2 DQN的三个关键技巧经验回放、目标网络、奖励裁剪DQN是深度强化学习的里程碑它用神经网络来近似Q值。但直接把Q-Learning和神经网络拼在一起是跑不起来的DQN靠三个技巧才把它救活。第一个是经验回放。它把智能体的经历存到一个缓冲区里训练时随机采样。这样做的好处是打破了样本之间的时间相关性。神经网络训练假设样本是独立同分布的但强化学习的样本是连续产生的前后高度相关直接拿来训练会导致灾难性遗忘。经验回放把这个问题缓解了。第二个是目标网络。如果更新时用的目标值也是由当前网络算出来的那目标本身在动训练就像追自己的影子。DQN用一个隔一段时间才同步一次的目标网络来算目标值让训练稳定下来。第三个是奖励裁剪。不同任务的奖励尺度差别很大有的任务奖励是0到1有的是负几百。把奖励裁剪到[-1, 1]区间能让不同任务用同一套超参数。这三个技巧我在实际复现时都踩过坑。经验回放缓冲区太小训练会不稳定目标网络同步太频繁等于没有奖励不裁剪学习率稍微大一点就发散。这些细节文档里都会提但只有自己调过才知道它们有多关键。4.3 Double DQN、Dueling DQN与优先经验回放DQN之后有一系列改进。Double DQN解决的是Q值高估问题——因为Q-Learning总是取最大值而最大值是有偏的会导致估计偏高。Double DQN把选动作和评估动作分开用两个网络分别做缓解了高估。Dueling DQN把Q值拆成状态价值和动作优势两部分让网络更容易学到这个状态好不好和这个状态下哪个动作更好这两件事。在有些动作对结果影响不大的状态下这个结构学得更快。优先经验回放则是让那些TD误差大的样本被采样得更频繁因为那些样本说明网络还没学好。这个思路很直观但实现时要注意重要性采样权重否则会引入偏差。我个人的建议是先把基础DQN跑通再逐个加改进。一次性把所有技巧都堆上去出了问题你根本不知道是哪个环节的锅。5. 策略梯度与Actor-Critic另一条完全不同的路5.1 从算价值到直接学策略前面讲的都是值函数方法——先学价值再根据价值选动作。策略梯度走的是另一条路直接参数化策略用梯度上升来最大化期望回报。这条路的好处是可以处理连续动作空间值函数方法在连续动作上取max很麻烦可以学随机策略有些场景随机策略比确定性策略更好而且收敛性理论上更平滑。策略梯度的核心公式是∇J E[ ∇log π(a|s) * G ]其中G是回报。直观理解就是如果某个动作带来了高回报就增大它的概率如果回报低就减小它的概率。这个思路非常符合直觉。但纯策略梯度有个大问题方差极高。因为G是整条轨迹的回报波动很大。所以实践中几乎不会直接用原始的策略梯度而是会加各种降方差技巧比如减去基线、用优势函数代替回报。5.2 REINFORCE的朴素与局限REINFORCE是最基础的策略梯度算法它用整条轨迹的回报来更新。实现简单但方差大、样本效率低。我在一个小型连续控制任务上试过跑了几十万步才勉强学到一点东西换成Actor-Critic之后几万步就有明显效果。所以REINFORCE更多是教学用让你理解策略梯度的基本形式。真正落地时基本都会用Actor-Critic。5.3 Actor-Critic一个决策一个打分Actor-Critic的核心思想是用两个网络一个Actor负责选动作一个Critic负责评估这个动作好不好。Critic给出的评估值通常是状态价值或优势函数用来降低Actor更新的方差。这就像你打球时一个人负责打一个人负责在旁边点评。点评的人越准打球的人进步越快。Critic就是那个点评的人。A2C、A3C、PPO、SAC这些算法本质上都是Actor-Critic的变体区别在于怎么算优势、怎么限制更新幅度、怎么处理探索。其中PPO是目前工程上最常用的因为它稳定、好调、对超参数不敏感。SAC则在连续控制任务上表现很好因为它引入了最大熵框架鼓励探索。我实际用PPO最多它的clip机制确实让训练稳定了很多。但要注意PPO对优势估计的准确性比较敏感如果Critic学得不好Actor也会跟着跑偏。所以训练时一定要盯着Critic的loss如果它一直降不下去说明价值估计有问题这时候调Actor的学习率是没用的。6. 算法选型面对一个新问题该怎么下手6.1 先判断动作空间是离散还是连续这是选型的第一道分水岭。离散动作空间比如上下左右、几个按钮优先考虑DQN系列连续动作空间比如机械臂关节角度、油门刹车力度优先考虑DDPG、TD3、SAC或PPO。我见过有人拿DQN去做连续控制然后花了两周时间试图把动作离散化结果精度怎么都上不去。其实直接换SAC一天就能跑出像样的结果。选型错了后面再努力都是白费。6.2 再看样本效率和训练稳定性如果环境交互成本很高比如真实机器人、真实用户样本效率就是第一优先级这时候优先考虑离策略算法比如SAC、TD3因为它们可以用经验回放反复利用旧数据。如果环境是仿真器可以随便跑那在策略算法比如PPO就更省心因为它稳定。下面这张表是我自己总结的选型参考场景特征推荐算法理由离散动作、状态简单Q-Learning / SARSA实现简单收敛快离散动作、状态高维DQN / Double DQN能处理图像等高维输入连续动作、样本宝贵SAC / TD3离策略样本效率高连续动作、追求稳定PPO对超参数不敏感易调多智能体、合作任务MADDPG / QMIX考虑智能体间交互稀疏奖励、长序列分层RL / 好奇心驱动需要额外探索机制6.3 稀疏奖励最容易被低估的难点很多真实任务的奖励是稀疏的——只有最终成功才有奖励中间过程全是0。这种情况下随机探索几乎不可能碰到奖励智能体学不到任何东西。解决思路有几类一是奖励塑形人为设计中间奖励但这需要领域知识而且设计不好会引入偏差二是好奇心驱动用预测误差作为内在奖励鼓励智能体探索新颖状态三是分层强化学习把长任务拆成子任务每个子任务有自己的奖励。我在一个导航任务里遇到过这个问题一开始奖励只在终点给智能体跑了上百万步都没到过终点。后来加了基于距离的塑形奖励很快就学会了。但塑形奖励的权重很关键太大智能体会只盯着中间奖励不走完全程太小又起不到引导作用。7. 实操中那些文档不会告诉你的坑7.1 随机种子不是玄学是必须控制变量强化学习对随机种子极其敏感。同一个算法换个种子结果可能从完美收敛变成完全不收敛。所以做实验时一定要跑多个种子取平均至少3个最好5个。只跑一个种子得出的结论基本没有参考价值。我早期就犯过这个错看到某个算法跑出一个好结果就以为找到了最优方案结果换种子一跑就崩了。后来养成习惯所有对比实验都跑5个种子画均值和方差结论才靠谱。7.2 超参数学习率和折扣因子是重灾区学习率太大训练震荡太小收敛慢到怀疑人生。折扣因子太大方差大太小智能体短视。这两个参数几乎决定了训练的成败。我的经验是先用一个中等学习率比如3e-4跑一遍看loss曲线。如果loss剧烈震荡就降学习率如果loss几乎不动就升学习率。折扣因子一般从0.99开始如果回合特别长上千步可以调到0.995甚至0.999。还有一个容易被忽略的是网络初始化。策略网络的最后一层如果初始化得不好初始策略会极端偏向某个动作导致探索不足。常见的做法是把最后一层权重初始化得很小让初始策略接近均匀分布。7.3 环境并行加速训练的关键手段强化学习训练慢是出了名的。一个有效的手段是并行多个环境同时收集数据。A3C就是用多个worker并行跑环境PPO也支持多环境并行。并行环境的好处不只是快还能增加样本多样性让训练更稳定。但要注意并行环境数不是越多越好太多会导致每个环境分到的更新频率降低反而影响学习。一般8到16个环境是比较常见的配置。7.4 评估训练 reward 高不代表策略好这是新手最容易踩的坑训练时的平均回报上去了就以为模型学好了。但训练时的回报是带探索的而且可能过拟合到训练环境。真正要看的是在固定测试环境、关闭探索后的评估回报。我习惯每隔一段时间就跑一次确定性评估用固定的几个种子看评估回报的曲线。如果训练回报涨但评估回报不涨说明过拟合了要么加正则要么减网络容量要么增加环境多样性。8. 把知识串起来一条可执行的入门路线如果让我给一个刚入门的人排一条学习路线我会这样安排第一周把MDP和贝尔曼方程彻底搞懂能手推值迭代和策略迭代。这一步不要求写代码但要求能在纸上把一个小MDP的价值算出来。第二周实现表格版Q-Learning和SARSA在FrozenLake或CliffWalking这种小环境上跑通。重点观察探索率、学习率、折扣因子对结果的影响。第三周实现DQN在CartPole上跑通然后逐步加经验回放、目标网络、Double DQN每加一个看效果变化。第四周实现REINFORCE和A2C理解策略梯度和Actor-Critic的区别。然后在连续控制环境上跑PPO。第五周开始挑一个自己感兴趣的真实问题从选型、搭环境、调参到评估完整走一遍。这一步最重要因为只有完整走一遍你才会真正理解前面那些算法各自的边界在哪里。我自己的经验是看十篇教程不如自己完整复现一个算法。复现过程中遇到的那些报错、不收敛、调参调不动的问题才是真正让你成长的东西。教程里的代码都是跑通的但你自己写的时候一个维度对不上、一个激活函数选错结果就完全不一样。最后分享一个我常用的调试技巧先把问题简化到极致。如果算法在复杂环境上不工作先换一个极简环境比如状态只有几个、动作只有两个、回合只有几步。如果极简环境都跑不通那说明是算法实现有问题不是环境太难。等极简环境跑通了再逐步增加复杂度。这个思路帮我省下了大量瞎调参的时间。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑