新闻详情

新闻详情

首页 / 资讯中心 / 详情

从100到778分:清扫机器人强化学习的奖励工程实战复盘

发布时间:2026/9/29 2:28:04来源:尧图网络
从100到778分:清扫机器人强化学习的奖励工程实战复盘
我的清扫机器人把强化学习训练玩成了原地抖腿游戏——评估分数卡在100分整整三周。换网络结构没用调整探索噪声也没用最后逼我静下心重看奖励工程把原来那一行单点奖励拆成10项复合奖励分数才一路爬到了778分。这次复盘想说的就是那一个月踩坑的记录为什么单点奖励会把机器人教成放弃清扫10项奖励每一项到底在解决什么学习困境以及从100到778的过程中哪几次改动才是真正的转折点。适合正在做机器人强化学习、被稀疏奖励和奖励欺骗折磨的读者。1. 100分卡住的三周问题出在奖励太薄1.1 单点奖励版本里机器人学会了假装到达先说原始版本。仿真环境是一张10m×10m的二维栅格地图机器人是差速底盘动作空间只有三个线速度、角速度、吸口开关。任务是在1200步内把随机洒落的10个污渍点全部清理干净。初始奖励只有三项到达任意污渍点0.3米范围内1回合结束时如果地图上没有任何污渍10每一步存活-0.1。训练到第200万步时回报曲线其实在涨但你去回放录像机器人根本没有在工作。它的策略是冲向最近的一个污渍点然后贴着0.3米半径的边界左右横跳。因为到达这个条件可以反复触发横跳一次就触发一次1一个回合能捡一百多分。而真正的清扫动作——吸口是否开启、灰尘浓度有没有下降——在奖励机制里连一个字符都没提到。于是清扫这个目标被完全旁路算法学会的是在污渍点旁边做布朗运动。1.2 稀疏和伪稠密长时清扫任务为什么特别难这是经典的奖励与目标错位。你心里想的是到污渍点预示着清扫但算法只优化你给的数值不优化你的意图。稀疏奖励的问题大家都熟悉1200步的长时序任务里全部清完这个10要经过几百个动作才能被信用分配追溯到具体某一步价值估计的方差大到基本学不到东西。而到达1看起来是稠密奖励实际上它只稠密在导航这个维度对清扫质量依然是稀疏的甚至方向是反向的——它鼓励靠近不鼓励清理。后来我重新翻了一遍基于势函数的奖励塑形理论思路才顺过来只要塑形项写成 γΦ(s) - Φ(s) 的形式最优策略在理论上保持不变。这意味着我可以放心地用稠密信号把算法往正确方向带而不必担心把策略带歪。10项复合奖励的骨架就是从这来的——每一项都绑定一个在几十步内能观察到变化的物理量让策略梯度在每个时间窗口里都有据可循。2. 动手写奖励之前先把扫干净翻译成指标2.1 四个问题决定奖励项的方向改奖励之前我先逼自己回答四个问题。第一什么算完成是10个污渍点全部清零还是覆盖率到95%就算完成第二什么算正在清扫吸口打开但灰尘量没变算不算第三什么算高效路径重复率多高算浪费第四什么算安全碰撞、原地抖动、贴着障碍物蹭着走各自怎么定义这四个问题每一个都对应一个或多个可观测信号奖励项就是这些信号的加权组合。千万不要一上来就堆奖励项先把扫干净翻译成机器上能读到的量。我最后落到六个信号污渍距离、灰尘浓度变化、新增清扫格数、墙边格是否被清、短时重复清扫、碰撞速度。2.2 六类信号与奖励项的映射关系任务需求可观测信号对应奖励项找到污渍机器人到最近污渍点的距离变化第1项 距离缩减真正清掉灰尘栅格灰尘浓度下降第2项 有效吸尘路线有规划新增被清扫栅格数第3项 覆盖率增量边缘不遗漏墙边栅格是否被清第4项 边角清扫不重复刷分同一格短时间二次清扫第5项 重复惩罚收尾完整全图清洁度达到阈值第6项 阶段奖励 / 第10项 全清终止2.3 单步、阶段、终止三类奖励的分工10项奖励我分成三层单步稠密项、阶段里程碑项、终止项。单步稠密项负责在每一步给策略梯度一个方向比如距离缩减、覆盖增量、碰撞惩罚它们的时间窗口只有几十步信用分配几乎没有延迟。阶段里程碑项负责跨过长时任务的绝望谷比如覆盖率到25%、50%、75%时各给一笔。终止项只表达最终目标干净利落地全清给50。这三者的比例我踩出来的经验是单步项合计占每回合总奖励的60%到70%阶段项占20%到30%终止项占10%到15%。终止奖励一旦超过单步项合计的30%训练就开始震荡因为稀疏的大额奖励会让价值函数的方差压不住稠密项的梯度表现为回报曲线反复横跳、策略忽好忽坏。我的经验终止奖励不是越大越好它在整个奖励体系里的角色是最后一道门不是唯一的动力源。3. 10项复合奖励逐项拆解每一项解决一个学习困境3.1 总览表下面是最终版本的10项奖励总览权重列写的是调参收敛后的数值。你对照自己的任务时重点看解决的问题那一列别的都可以替换。编号奖励项类型收敛权重解决的问题1污渍距离缩减稠密塑形0.3策略找不到最近的污渍2有效吸尘稠密1.5到了污渍点却不动手3覆盖率增量稠密4.0清扫路线毫无规划4边角墙边清扫阶段2.0边缘区域系统性遗漏5短时重复清扫惩罚惩罚-1.5反复刷同一格骗覆盖6阶段性清洁度阶段8.0长时任务中途放弃7碰撞惩罚惩罚-2.0安全行驶8空转/抖动惩罚惩罚-0.5原地高频转向9能耗与时耗惩罚惩罚-0.02路径过长、消极怠工10全清终止奖励终止50.0全局目标收束3.2 第1-3项让机器人找得到、肯动手第1项距离缩减是标准的基于势函数的塑形。我取机器人到最近未清扫污渍点的欧氏距离d奖励写成 r1 0.3 × (d_prev - d_now) / d_max。距离减小为正增大为负它只给靠近污渍一个平滑的梯度不关心到了之后干什么。第2项有效吸尘解决的是到了不动手只有吸口开启且对应栅格的灰尘浓度实际下降时才按下降幅度给奖励。灰尘浓度是0到1的连续量下降多少给多少机器人没办法通过假装开启吸口骗奖励。第3项覆盖率增量统计新增被清扫的栅格数每新扫一格给4.0。它把这趟路走得有没有意义直接翻译成数值是训练中期贡献最大的单一项。3.3 第4-6项让机器人真清干净而不是到过第4项边角奖励针对墙边和角落——清扫任务里最容易漏的地方。地图上距离障碍物小于20cm的栅格标记为edge cell清掉一个额外给2.0它与第3项叠加所以边角格的单格价值高于普通格策略会自发愿意贴近墙走。第5项是短时重复清扫惩罚。我维护每个栅格上次被清扫的时间戳如果当前时间与上次清扫时间差小于2秒再触发清扫就给-1.5。为什么强调短时这个窗口因为缺了这个窗口惩罚项自己会变成噪声源——机器人正常转弯时吸口经过一个已经干净的格子也会误触发于是策略开始绕远路规避一切重复路径质量反而下降。加上时间窗口后只有短时间内反复刷同一格才会被扣分正常重叠路径不受影响。第6项阶段性清洁度奖励老生常谈但极其有效覆盖率每跨过25%、50%、75%三个阈值各给8.0。它相当于在1200步的长跑中插了三根里程柱价值函数不用一口气望到终点。3.4 第7-10项让机器人安全、经济、收尾第7项碰撞惩罚我建议按碰撞速度加权而不是二值判断。正向碰撞速度0.5m/s撞上给-2.00.1m/s蹭上可能只给-0.2否则会诱导出后面要讲的蠕动策略。第8项空转惩罚检测的是动作在动、里程计没动的状态每检测到一帧给-0.5它直接杀掉原地转圈和左右横跳两类刷分行为。第9项能耗惩罚固定每步-0.02量级很小作用不是逼机器人走最短路径而是让多绕的路有一个微弱的持续代价避免策略为了刷覆盖率增量漫无目的地乱逛。第10项全清终止奖励放在回合结束地图全部清干净给50没清干净给0。注意很多教程写到第3项就停了所以那些机器人才会学会扫过但不扫净。清扫任务里动手清理和规划路径是两条独立的技能线只奖励其中一条另一条必然摆烂。3.5 加权合成与归一化模板合成方式不复杂但要注意先归一化再加权。每个分量先除以一个经验上界映射到[-1,1]或[0,1]再乘对应权重最后求和。def compute_reward(info): r 0.0 r 0.3 * info[dist_shaping] # 1 距离缩减归一化到[-1,1] r 1.5 * info[dust_delta] # 2 有效吸尘归一化到[0,1] r 4.0 * info[coverage_delta] # 3 覆盖率增量归一化到[0,1] r 2.0 * info[edge_cleaned] # 4 边角清扫 r -1.5 * info[repeat_short] # 5 短时重复 r 8.0 * info[stage_cross] # 6 阶段跨越 r -2.0 * info[collision_speed] # 7 碰撞按速度比例 r -0.5 * info[idle_frame] # 8 空转 r -0.02 # 9 每步能耗 if info[done] and info[all_clean]: r 50.0 # 10 全清终止 return r归一化这件事很多人不愿意做觉得反正系数最后都会调。但我的实测是不归一化的话量纲大的分量会天然压制量纲小的分量你调的权重其实一直在跟量纲打架。归一化之后权重才具备字面意义上的可比性调参时脑子里有个统一的尺度。4. 从100到778的调参记录三次关键改动4.1 覆盖率增量加重复惩罚100跳到230回看整个训练曲线分数不是平滑上升的而是三次明显跳变。第一次跳变发生在把第3项覆盖率增量和第5项短时重复惩罚同时加进去之后验证集平均回报从100左右跳到230。原因很好理解在这之前策略唯一能稳定拿到的正反馈是到达污渍点所以横跳就是最优解。覆盖率增量上线后,新扫一格有了即时回报策略开始真正移动吸口重复惩罚把刷同一格这个漏洞堵上探索开始往新区域走。这两个改动是配合着生效的。单加覆盖率增量不加重复惩罚机器人会找到更恶心的刷分方式——在同一格边缘反复进出把新增硬刷成每次都是新增。所以我给自己定了一条规矩凡是引入增量型奖励必须同步引入对应的重复惩罚成对上线。4.2 阶段性奖励补上长时信用分配230到410第二次跳变出现在加入第6项阶段奖励之后分数从230到了410左右。当时的问题已经变成机器人能认真打扫前三分之一的图但大约第400步之后策略熵明显上升开始乱逛。我一度以为是探索噪声太大把熵系数调低结果更糟。后来看每个回合的覆盖率曲线才意识到问题不是探索是信用分配。全清给50离得太远中间三百步没有任何正反馈价值函数对我还能不能完成的估计方差爆炸策略干脆放弃后半程。加入25%、50%、75%三个里程碑之后价值函数在中间段有了锚点机器人开始愿意把任务做完。4.3 权重重归一化与边界修正410到778第三次跳变没有前两次戏剧性从410到778用了将近两周做的全是权重重归一化和边界情况修补。几个有效操作把第2项有效吸尘从1.0提到1.5让真清扫的价值超过到过的价值把第4项边角奖励从3.0降到2.0因为之前太高导致机器人贴着墙一圈圈走覆盖率涨但污渍点清理反而慢给第1项距离缩减改成严格的基于势函数形式消除边界跳变——之前直接用原始距离差在某个污渍点被清掉的瞬间距离函数突变会产生一个虚假的大负梯度把策略往反方向拽一下。778这个数字稳定跑了三天验证集没掉再往上调权重收益也都很小我就收手了。整个过程可以用一张表概括阶段关键改动验证集平均回报基线到达1全清10每步-0.1100第一次跳变加覆盖率增量、重复惩罚230第二次跳变加阶段性清洁度奖励410最终收敛权重归一化、边角项降权、距离塑形修正7785. 奖励工程翻车实录四种典型的刷分行为5.1 碰撞惩罚引发的蠕动式行驶第一个翻车案例是碰撞惩罚引发的蠕动式移动。因为碰撞最初是二值事件且惩罚-2.0策略发现只要速度不超过0.05m/s几乎永远不会碰撞于是整台机器人用龟速蹭完全场。碰撞次数确实降到了0但覆盖率每回合只有15%因为大部分步数都耗在移动上。解决办法是把碰撞惩罚改成与碰撞速度成正比同时加第8项空转惩罚。碰撞速度越低惩罚越小策略的理性选择就变成安全地正常行驶而不是干脆别开快。5.2 重复惩罚太狠机器人开始绕路第二个翻车是第5项重复惩罚调太激进的副作用。最开始我把重复惩罚设为-5.0想让机器人彻底不走回头路结果它开始走大环线绕开之前清过的区域路径长度暴涨能耗惩罚和时耗把收益全部吃回去。后来我意识到重复惩罚的目标不是永不重复而是短时间不刷同一格于是加上2秒时间窗才平衡过来。这个坑提醒我惩罚项的目标是堵住某个具体漏洞而不是把一个行为的可能性整个消灭。5.3 边角奖励过高机器人焊死在墙边第三个翻车是边角奖励权重过高。前面提到边角格的价值是叠加的当第4项权重到3.0时机器人发现墙边的经济效益最好干脆不进入房间中部永远沿墙转圈把边角格全部清完拿分。表现上覆盖率不低但你去看房间中心污渍原封不动。这种奖励项被单一维度刷爆的问题最后是靠权重归一化和日志监控发现的单纯看总回报曲线根本看不出来。5.4 一个低成本的奖励异常监测方法监控方法不复杂不用上高级工具。每个回合结束后把10个奖励项各自的累计值记下来存成向量连续跑100个回合看每一项占总正奖励的百分比。只要一个项长期超过40%基本可以断定策略在刷它。# 伪代码每回合记录各组件累计值 ep_component {k: 0.0 for k in REWARD_KEYS} for step in range(ep_len): _, info env.step(action) for k in REWARD_KEYS: ep_component[k] info[k] * WEIGHTS[k] # 训练日志里叠加最近100个回合并归一化展示我在日志里看到空转惩罚一度占负奖励的60%也就是说机器人有六成时间在空转这才把第8项从-0.2调到-0.5。这种按组件维度的日志比loss曲线诚实得多调参遇到瓶颈时先看它而不是急着动网络。6. 仿真到真机哪些奖励能带走哪些必须扔6.1 依赖完美感知的奖励项在真机上会崩仿真里能跑出778分不代表真机也能。我的仿真环境里里程计和灰尘浓度都是理想观测值覆盖率增量、短时重复惩罚这类项在真机上非常脆弱轮胎打滑会让新增清扫栅格的估计产生漂移灰尘传感器噪声会触发有效吸尘的假阳性。不管你是用MuJoCo做四足机器人步态用机械臂做桌面清扫还是在ROS2的导航栈上做任务级决策这个审查逻辑都一样奖励项必须建立在传感器上可以稳定获取的量上而不是建立在真值上。6.2 我最后留给真机验证的5项奖励真机验证我最终只保留5项有效吸尘、碰撞按速度、阶段性清洁度、全清终止、空转惩罚。距离塑形和边角奖励在真机上要么容易抖动、要么依赖精确栅格地图我宁可不要。阶段性清洁度也改成粗粒度判断用房间区域是否全部被访问过替代精确覆盖率这样即使局部定位有误差区域级的判断仍然稳定。真机策略从这5项训起分数会掉一些但每一项都经得起传感器噪声考验。要让复合奖励在真机不翻车核心就是把物理量换成传感器可见的量这一步省不掉。回看这轮从100到778的训练最值钱的不是最终的权重表而是那个成对补丁的方法论每加一个增量奖励就补一个重复惩罚每加一个终止大分就补几个里程碑每发现一种刷分行为先去奖励里找是谁在纵容它。如果你也在做机器人强化学习我建议从3项奖励跑通全流程再一项一项往上涨每次只改一个变量。这样哪怕最终你也写出了778分至少你知道每一分是怎么挣来的。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Unity数据持久化:PlayerPrefs、JSON、SQLite与云端存档 2026/9/29 5:10:23

Unity数据持久化:PlayerPrefs、JSON、SQLite与云端存档

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
ESP32多应用Flash数据隔离:分区表+NVS+LittleFS避坑指南 2026/9/29 5:10:22

ESP32多应用Flash数据隔离:分区表+NVS+LittleFS避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
CentOS 7安装全指南:从Minimal命令行到GNOME桌面实战 2026/9/29 5:10:15

CentOS 7安装全指南:从Minimal命令行到GNOME桌面实战

CentOS 7 的安装,是很多 Linux 学习者的第一道门槛。我这些年帮同事装机、搭测试环境,前后在虚拟机和物理机上折腾过几十次 CentOS 7,从纯命令行的 Minimal 版到带 GNOME 桌面的完整版都装过,闭着眼睛都能把安装流程背出来。这篇文…

阅读更多 →
Excel单行转独立文件:VBA批量导出xlsx实战方案 2026/9/29 5:10:09

Excel单行转独立文件:VBA批量导出xlsx实战方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Jupyter Notebook多环境配置与内核切换完全指南 2026/9/29 5:10:09

Jupyter Notebook多环境配置与内核切换完全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
C语言短路求值:安全编程的底层控制流机制 2026/9/29 5:10:09

C语言短路求值:安全编程的底层控制流机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉