强化学习通关马里奥 · Day 2:从奖励设计踩坑,到发现「站桩」陷阱
强化学习通关马里奥 · Day 2:从奖励设计踩坑,到发现「站桩」陷阱
这是「用强化学习通关马里奥」系列的第二篇。Day 1 我厘清了概念(定义动作、拆分奖励),Day 2 开始真正落地:把游戏改造成 RL 能交互的环境,调奖励、加观测、跑 PPO。这一天的收获很反直觉 —— 真正值钱的不是模型学会了什么,而是我踩了一路奖励设计的坑,最后撞见一个更根本的问题。
今天做了什么
Day 2 的核心是把「环境」跑通并让 PPO 开始学。技术上我走了一条从浏览器到无头引擎的路径:
- 先在浏览器里跑通
reset/step闭环,验证能读状态、注入动作、检测死亡 - 但浏览器被渲染帧率卡死(约 15 步/秒),训练慢到不可用
- 于是把游戏引擎抽出来在 Node 里无头跑,省掉渲染和音频,速度提升约 1670 倍(5845 步/秒)
- 这一步的收获是:RL 通关马里奥的难点不在算法,而在「怎么把游戏改造成环境」 —— 要 mock 掉 canvas、document、localStorage、音频一堆浏览器依赖,让纯物理/碰撞逻辑能跑。
我踩的奖励设计的坑(Day 2 真正的学费)
Day 1 我提过奖励拆分(往右走+1、死亡-100),Day 2 真正落地时才发现没那么简单。我一共改了 4 版奖励,每一版都暴露一个新问题:
第 1 版:前进分太弱,死亡太狠
往右走 +0.05/单位,死亡 -10。结果 PPO 学到的不是前进,而是少动、晚死 —— 因为动就有撞死的风险,不动反而安全。净收益恒为负。
第 2 版:前进分加大
往右走 +0.5/单位,死亡 -1。这次 reward 转正了(+25),但 maxX 反而下降。因为 PPO 发现:在一个安全区域来回走(没敌人没坑的地方)能持续赚前进分,比冲到危险区划算。PPO 学会「安全区刷分」。
第 3 版:改用 maxX 增量
改成「只有本局最远推进量(maxX)创新高才得分」,想消除刷分。结果 PPO 直接站桩不动 —— 因为「不动=0 分(安全)」优于「前进=可能死(-1)」。
第 4 版:加终点距离 + 里程碑奖励
加了「越接近终点增量越高」和「每突破一段给大奖励」,想让 PPO 有动力往前冲。这一版观测也加了「前方视野」(读取前方 pipe、Goomba 的距离),让 PPO 能看到障碍。
结果:所有 episode 都停在出生点(maxX=16),reward=-1。 比之前更糟。
AI 的评价与纠错
这一路 AI 帮我校准了很多认知,几个关键点:
奖励整形的本质是博弈,不是数字 单纯调「前进分」「死亡罚」的权重往往无解 —— 因为 PPO 总能找到「钻空子」的策略:安全区刷分、站桩、少动晚死。奖励设计的关键是让「推进」成为唯一划算的选择,而不是调大某个数字。
「前方视野」只是输入,不是规则 我给观测加了 pipe/Goomba 距离,但没有写死「看到 pipe 就跳」。决策逻辑全靠 PPO 自己学。视野只是给模型更多信息,怎么用是训练出来的。
真正的问题往往在环境,不在算法 一路改奖励不是徒劳,但它掩盖了一个更底层的问题:玩家有时会在平坦地面上被判定死亡(没有敌人、没有坑,却 dying=true)。这个环境 bug 不修,PPO 就永远学不会「往前」,只会学会「别动」。
撞见的真问题:为什么 PPO 会「站桩」
Day 2 最深的教训是最后这个发现。我一直在调奖励、加视野,却忽略了最基础的现象:训练日志里总有约 40% 的 episode 停在出生点(maxX=16)。我一直以为是「正常波动」,直到最后一版全部站桩,才意识到这是信号,不是噪声。
站桩的根本原因:当「动」有风险(可能撞死 -1)、「不动」无风险(0 分)时,PPO 的最优解就是不动。而且我发现 玩家在无头环境里,明明在平坦地面上也会被判定死亡 —— 环境本身阻止了玩家稳定前进。这个环境 bug 不修,上层再好的奖励、再全的视野都是空中楼阁。
明天的方向
Day 2 的结论很清醒:先别急着调算法、改奖励,先把「环境为什么让玩家无法稳定前进」这个根问题查清楚、修掉。 具体来说:
- 彻底查清玩家在平坦地面被判「死亡」的真实原因(某个碰撞对象?某个判定 bug?)
- 确认「写死右移」这种标准动作序列,玩家能否稳定且自然地前进
- 在环境健康的基础上,再谈奖励、视野、课程学习
一点心得
Day 2 最大的收获不是技术,而是一种警惕:在 RL 里,「模型没学好」往往是表象,真正的问题躲在环境里。一味调参、改奖励,很容易在错误的土壤上反复施肥。先确认土壤(环境)是健康的,再谈种什么(算法)、怎么浇(奖励)。
路还长,但方向清楚了很多。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!

