RL强化学习从小白到老鸟(五)——PPO实战:从单步更新到稳定策略优化

发布时间:2026/8/22 10:01:33

RL强化学习从小白到老鸟(五)——PPO实战:从单步更新到稳定策略优化
项目源码https://github.com/NocoldBob/RL第一篇速通贪吃蛇游戏第二篇手撕 GPT零基础保姆级教学第三篇让贪吃蛇训练更稳定、更容易复现第四篇DQN实战四种策略同场对照前言第二篇没有“教错”第五篇是在它上面继续搭积木第二篇实现了一个很轻量的单步 Actor-Critic智能体与环境交互一步立即用这一步的 TD误差更新 Actor 和 Critic。它代码短、反馈快很适合第一次看懂策略梯度怎样工作。但“适合入门”不等于“已经稳定”。第四篇的三随机种子实验中这个极简实现的最终确定性策略波动很大。问题不在于 Actor-Critic 这条路线本身而在于它每次只看一步、样本相关性强、一次更新对策略影响又缺少明确限制。第五篇加入 PPOProximal Policy Optimization重点回答三个问题能不能先收集一段轨迹再批量计算更平滑的优势同一批 on-policy 数据能不能训练多轮提高样本利用率怎样限制新策略不要一次偏离旧策略太远最终仍然使用普通 CPU、6×6贪吃蛇和三个随机种子并把 PPO 加入随机策略、启发式教师、单步 Actor-Critic、DQN 的统一评估。一、PPO 与单步 Actor-Critic 有什么关系两者都包含两个角色Actor 输出三个离散动作的概率Critic 估计当前状态的价值。区别主要在训练数据和更新方式。方法数据收集优势估计同批数据更新策略变化限制单步 Actor-Critic每走一步一步 TD 误差1 次梯度裁剪PPO一段 RolloutGAE多个 Epoch概率比率 Clip可以把第二篇理解成“最小可运行的策略梯度闭环”把第五篇理解成“在同一思想上增加批量轨迹、优势估计和保守更新”。前者帮助看清每个零件后者开始处理真实训练中的波动。二、PPO 的一次更新发生了什么项目中的 PPO 循环分成四步。1. 用当前策略与环境交互每一步除了保存状态、动作和奖励还要保存动作当时在旧策略下的概率以及 Critic 给出的价值估计action,log_probability,valueagent.select_action(observation)rollout.append(observation,action,reward*config.reward_scale,done,log_probability,value,)这里保存的是log_probability因为概率连乘容易变得非常小强化学习实现通常在对数空间计算。2. 组成 Rollout默认累计约256个环境步。为了让教学实现保持清楚代码会在一个 Episode 结束后判断是否达到更新长度因此实际 Rollout 可能略多于 256 步但不会把某一局生硬切断。PPO 是 on-policy 算法更新完成后这批 Rollout 会被清空然后用新策略继续采集。它不像DQN 那样保留一个可以反复随机抽样的大型经验回放池。3. 用 GAE 计算优势优势函数回答的是这个动作的结果比 Critic 原本认为的平均水平好多少最简单的一步 TD 误差为δ_t r_t γV(s_{t1}) - V(s_t)GAEGeneralized Advantage Estimation继续把未来的 TD 误差按距离衰减后累加A_t δ_t γλδ_{t1} (γλ)^2δ_{t2} ...λ越小越接近短期 TD偏差较大但方差较小λ越接近 1越重视完整长期回报偏差较小但方差可能增大。项目默认gamma0.99、gae_lambda0.95。终局位置必须阻断递推否则上一局的优势会错误地接上下一局。代码使用done把后续价值和GAE 都乘为 0并有自动测试专门锁定这个边界。4. 对同一批数据做多轮 PPO 更新Rollout 转成批量张量后优势会标准化advantages(advantages-advantages.mean())/(advantages.std(unbiasedFalse)1e-8)默认把这批数据打乱成 batch 64重复训练 4 个 Epoch。这样比单步数据只用一次更充分但同一批旧数据训练太多次又会让新策略偏离采样它们的旧策略所以接下来需要 Clip。三、PPO Clip 到底裁剪了什么先计算同一个动作在新旧策略中的概率比率r_t π_new(a_t | s_t) / π_old(a_t | s_t)r_t 1动作概率没有改变r_t 1.2新策略选择这个动作的概率变成原来的 1.2 倍r_t 0.8概率降为原来的 0.8 倍。如果优势为正我们希望增加这个动作的概率如果优势为负则希望降低。但一次变化太大可能让后续采集到完全不同的数据训练突然崩掉。PPO 取下面两项中更保守的一项L_clip min(r_t A_t, clip(r_t, 1-ε, 1ε) A_t)对应实现ratio(new_log_probabilities-old_log_probabilities).exp()unclippedratio*advantages clippedratio.clamp(1.0-clip_ratio,1.0clip_ratio)*advantages policy_loss-torch.minimum(unclipped,clipped).mean()默认clip_ratio0.2。它不是简单地把梯度裁掉而是让“继续把策略推得更远”不再带来更好的目标值。PPO 的名字里Proximal表达的正是让新旧策略保持相近。四、完整损失还包含 Critic 和熵本项目一次 PPO 更新的总损失为总损失 策略损失 value_coef × 价值损失 - entropy_coef × 策略熵Critic 用均方误差拟合 GAE 得到的回报目标。熵项鼓励策略保留一定的不确定性避免过早把某一个动作概率推到接近 100%。最后再使用梯度范数裁剪loss.backward()nn.utils.clip_grad_norm_(model.parameters(),max_norm0.5)optimizer.step()训练日志同时记录policy_loss、value_loss、entropy、近似 KL 散度和裁剪比例。若clip_fraction长期非常高往往意味着学习率、更新轮数或 Clip 范围需要重新检查。五、一个小但重要的奖励缩放贪吃蛇通关会一次得到约100的奖励而普通移动奖励只有0.1量级。直接让 Critic 拟合跨度很大的原始回报时价值损失容易压过策略损失。PPO 默认只在训练内部使用training_rewardenvironment_reward*0.1这不会修改环境也不会美化最终成绩控制台训练奖励、独立评估奖励和五策略基准仍然使用原始环境奖励。奖励缩放只是给优化器换了一个更容易处理的数值尺度。六、网络仍然适合普通 CPUPPO 使用一个共享编码器self.encodernn.Sequential(nn.Conv2d(input_channels,16,kernel_size3,padding1),nn.ReLU(),nn.Flatten(),nn.Linear(16*grid_size*grid_size,64),nn.ReLU(),)self.actornn.Linear(64,action_count)self.criticnn.Linear(64,1)相较第二篇的极简网络这里增加了一个 64 维共享隐藏层。它仍然很小但给策略和值函数增加了一层非线性表达能力。PPO、DQN 和单步 Actor-Critic 的网络并不完全相同因此本文比较的是三个完整教学实现而不是只替换损失函数的消融实验。七、运行 PPO1. 安装项目git clone https://github.com/NocoldBob/RL.git cd RL py-3.12-m venv.venv.\.venv\Scripts\Activate.ps1 python-m pip install-r requirements.txt2. 先跑短流程检查python.\贪吃蛇\train_ppo.py--episodes 50--rollout-steps 64 --eval-interval 25--eval-episodes 5--output-dirruns\ppo-smoke短流程只是检查交互、Rollout、GAE、PPO 更新、评估和检查点能否完整运行不代表已经收敛。3. 运行默认训练python.\贪吃蛇\train_ppo.py主要默认参数参数默认值作用episodes1000训练局数rollout_steps256每批轨迹的目标步数update_epochs4同一 Rollout 重复训练轮数batch_size64每次参数更新的样本数gamma0.99回报折扣gae_lambda0.95GAE 偏差与方差权衡reward_scale0.1仅用于 PPO 训练的奖励缩放clip_ratio0.2新旧策略概率比率裁剪范围entropy_coef0.01熵奖励系数torch_threads1小模型 CPU 线程数输出目录为runs/ppo/ checkpoints/best.pt checkpoints/latest.pt history.json summary.json tensorboard/4. 查看训练曲线tensorboard--logdir.\runs\ppo\tensorboard除奖励和得分外建议同时观察ppo/policy_loss策略目标ppo/value_lossCritic 拟合误差ppo/entropy动作分布还保留多少不确定性ppo/approx_kl新旧策略变化程度ppo/clip_fraction有多少样本触发了 Clip。5. 播放模型python.\贪吃蛇\play_ppo.py.\runs\ppo\checkpoints\best.pt--fps 15默认按照 Actor 输出的策略概率采样动作并使用固定随机种子因此可以复现。要观察“每一步都选最大概率动作”的效果python.\贪吃蛇\play_ppo.py.\runs\ppo\checkpoints\best.pt --deterministic--fps 15八、为什么 PPO 评估默认不是贪心动作DQN 输出动作价值评估时自然选择最大 Q 值。PPO 的 Actor 输出的是一个策略分布。我们最初也尝试把评估设为总取最大概率动作结果发现它可能破坏策略已经学到的随机性。在相同 100 张地图上三个 PPO 检查点的平均得分如下训练种子按策略采样总取最大概率动作70.710.57421.550.1120261.440.62这不代表所有 PPO 都必须随机评估而是提醒我们随机策略不等于“训练时加噪声、测试时一定关闭”。如果任务和目标函数学到的就是策略分布直接改成贪心策略相当于换了一种决策规则。为了保证实验可复现评估环境种子与 PPO 动作采样随机数都被固定。原始数据保存在docs/experiments/05-ppo-action-modes.json。九、五种策略统一评估完整基准命令python.\贪吃蛇\benchmark.py--seeds 7 42 2026--episodes 1000 --eval-episodes 100--device cpu--torch-threads 1实验条件与第四篇保持一致6×6地图蛇长度达到 4 视为通关每局最多 100 步三个学习算法都训练 1000 个 Episode训练种子为7、42、2026每个检查点在相同的 100 张地图上评估Actor-Critic 与 DQN 使用确定性动作PPO 使用固定随机数的策略采样教师是规则上限参考不参与训练耗时比较。这仍是低算力教学基准不是严格控制网络参数量和环境交互步数的论文级算法排名。十、实测结果三训练种子的聚合结果如下±后为种子之间的总体标准差策略平均奖励平均得分平均通关率平均训练时间随机-2.27 ± 0.270.14 ± 0.020%无训练启发式教师134.31 ± 0.003.00 ± 0.00100%规则策略单步 Actor-Critic-26.64 ± 7.250.17 ± 0.100%20.1 ± 2.7 秒DQN25.33 ± 21.561.05 ± 0.2616.3% ± 9.8%15.4 ± 1.9 秒PPO25.60 ± 13.281.23 ± 0.3715.3% ± 8.2%9.2 ± 3.2 秒原始 JSON 保存在docs/experiments/05-ppo-benchmark.json。怎样理解 DQN 与 PPO 的结果PPO 的平均奖励和平均得分略高DQN 的平均通关率略高。两者差距都不大且三个种子的波动仍然明显。因此合理结论是在当前小网络、奖励设计和 1000 局预算下PPO 与 DQN 整体表现接近各项指标互有胜负两者都明显优于当前单步 Actor-Critic但都没有接近规则教师。不能据此写成“PPO全面胜过 DQN”也不能推广成其他任务上的算法排名。为什么 PPO 的平均训练时间更短本实现按 Rollout 批量更新网络很小且 CPU 只使用一个 PyTorch 线程。DQN 每隔 4 个环境步从回放池抽样还需要维护在线网络和目标网络。当前机器上 PPO 因此更快。训练时间受 CPU、PyTorch 版本、后台负载和 Episode 实际长度影响只能作为本次实验记录不能当作固定性能指标。更加严格的样本效率比较应该统一环境交互步数而不只是 Episode 数。十一、三个随机种子仍然讲了三个故事PPO 的逐种子结果种子平均奖励平均得分通关率77.700.714%4229.611.5519%202639.481.4423%如果只展示seed2026PPO 看起来已经相当不错如果只展示seed7又会显得提升有限。多随机种子不是为了让表格更复杂而是避免我们无意中挑中最符合预期的那一次。十二、留给读者的四个实验实验 A关闭 Clip 的保护效果把裁剪范围放得很大python.\贪吃蛇\train_ppo.py--clip-ratio 1.0--output-dirruns\ppo-wide-clip比较approx_kl、训练曲线和最终独立评估是否更容易波动。实验 B减少同批数据更新轮数python.\贪吃蛇\train_ppo.py--update-epochs1--output-dirruns\ppo-one-epoch观察训练速度、样本利用率和最终成绩怎样变化。实验 C改变 GAE 的 λpython.\贪吃蛇\train_ppo.py--gae-lambda 0.5--output-dirruns\ppo-lambda-05 python.\贪吃蛇\train_ppo.py--gae-lambda 1.0--output-dirruns\ppo-lambda-10不要只比较某一局最高分应使用相同评估地图和多个训练种子。实验 D比较采样策略和贪心策略训练完成后用同一个检查点分别运行python.\贪吃蛇\play_ppo.py python.\贪吃蛇\play_ppo.py--deterministic观察某些状态下保留第二选择是否能减少固定循环或过早撞墙。项目地址https://github.com/NocoldBob/RL

相关新闻

Claude Code插件安装配置与API限额调整详解

Claude Code插件安装配置与API限额调整详解

2026/8/22 10:01:33

1. 先搞清楚 Claude Code 到底是什么,以及为什么限额调整值得关注如果你最近在找一款能直接集成在 VSCode 里、写代码和解释代码的 AI 助手,大概率会碰到Claude Code。它不是 Claude 官方推出的独立产品,而是一个由社区开发者基于 Claude API…

测试环境安全配置:如何避免误用生产密钥的风险与解决方案

测试环境安全配置:如何避免误用生产密钥的风险与解决方案

2026/8/22 9:51:33

这次我们来看一个关于航空公司互联网购票系统测试环境安全配置的技术话题。项目标题“ANA Airlines Internet Purchasing uses live key on test env”直指一个在软件开发与测试领域非常典型且高风险的问题:在生产环境之外(如测试环境)误用了…

Win11Debloat 快速清理 Windows 11 预装应用与隐私设置教程

Win11Debloat 快速清理 Windows 11 预装应用与隐私设置教程

2026/8/22 9:51:33

Win11Debloat 快速清理 Windows 11 预装应用与隐私设置教程 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and customiz…

T²PO:基于不确定性引导的多轮智能体强化学习稳定探索方法

T²PO:基于不确定性引导的多轮智能体强化学习稳定探索方法

2026/8/22 10:51:36

1. 从“单次决策”到“多轮对话”:智能体强化学习的新挑战 最近在跟几个做对话机器人和游戏AI的朋友聊天,大家普遍都在头疼一个问题:怎么让AI智能体(Agent)在连续多轮的交互中,不仅能把眼前这一步走好&…

机器学习实战:从数据清洗到模型部署的二手车价格预测全流程解析

机器学习实战:从数据清洗到模型部署的二手车价格预测全流程解析

2026/8/22 10:51:36

1. 项目概述:从数据到决策,用机器学习给二手车定价给一辆二手车估价,这事儿听起来像是经验丰富的老车贩子或者评估师的活儿。他们围着车转一圈,看看漆面,听听发动机,再查查保养记录,心里大概就有…

Fireworks AI定制模型服务实战:从API调用到应用集成全解析

Fireworks AI定制模型服务实战:从API调用到应用集成全解析

2026/8/22 10:51:36

如果你最近在关注AI模型服务领域,可能会注意到一个现象:无论是技术社区的热议,还是各大评测榜单,一个名字的出现频率越来越高——Fireworks AI。它不仅在多个权威推理性能榜单上名列前茅,更关键的是,它背后…

Windows 11 Alt+Tab切换后输入法状态混乱的根治方案

Windows 11 Alt+Tab切换后输入法状态混乱的根治方案

2026/8/22 10:51:36

在 Windows 11 上进行多任务切换时,你是否也遇到过这样的困扰:正用着中文输入法在文档里奋笔疾书,突然需要AltTab切到浏览器查个资料,结果切回来时,输入法状态莫名其妙地变成了英文,或者更糟,直…

AI图像增强实战:从原理到实践,手把手教你修复模糊老照片

AI图像增强实战:从原理到实践,手把手教你修复模糊老照片

2026/8/22 10:51:35

你是不是也遇到过这样的场景:翻出多年前的老照片,却发现画面模糊、色彩暗淡,甚至还有划痕和噪点,想修复却无从下手?或者,工作中收到一张低分辨率的素材图,放大后全是马赛克,严重影响…

AI Agent 落地实战:OpenClaw 搭建调试,避开绝大多数配置坑

AI Agent 落地实战:OpenClaw 搭建调试,避开绝大多数配置坑

2026/8/22 10:41:35

✨ 前言 OpenClaw(小龙虾)是一款备受瞩目的本地 AI 自动化工具。它无需联网即可独立运行,也无需注册云端账号,用户仅需通过自然语言下达指令,即可驱动程序自动处理电脑上的各类重复性操作,从而显著提升日常…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/21 21:41:19

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/20 21:07:35

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/19 8:02:16

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

多尺度智能体控制:从宏观密度场到微观决策的架构与实践

多尺度智能体控制:从宏观密度场到微观决策的架构与实践

2026/8/22 0:00:52

1. 从宏观到微观:多尺度智能体控制的核心挑战在智能体(Agent)技术日益普及的今天,我们面临着一个越来越普遍的难题:如何同时管理成千上万个,甚至百万级别的智能体?无论是城市交通中的自动驾驶车…

CUBE标准:统一AI智能体评测的度量衡与架构解析

CUBE标准:统一AI智能体评测的度量衡与架构解析

2026/8/22 0:00:52

1. 项目概述:为什么我们需要一个统一的智能体评测标准?最近在折腾各种AI智能体项目,从简单的自动化脚本到复杂的多模态交互系统,我发现了一个让人头疼的共性问题:评测。每次开发完一个智能体,想看看它到底行…

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

2026/8/22 0:00:52

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…