ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从奖励塑形到自适应监督:强化学习训练中的信号设计

从奖励塑形到自适应监督:强化学习训练中的信号设计 从 reward shaping 到自适应监督这三个月我们到底在调什么先说结论六月初我们还在老老实实给奖励函数加各种 shape 项七月中旬被一个打转的智能体气得删掉全部塑形代码八月我们把 On-Policy Distillation 当成主力监督信号九月底终于跑出一组稳定的对比数据。这篇文章是上一篇进展梳理的续篇重点记录六到九月这三个月里我们是怎么一步步把“手工设计奖励”这根拐杖丢开改成“让一个在线策略蒸馏机制自己决定该给学生多少监督”的过程。整个思路适合正在做稀疏奖励强化学习、对 reward shaping 感到头疼、或者刚想把行为克隆/蒸馏引入 PPO 训练管线的朋友。如果你还没看过前一篇不碍事这篇会把关键背景重新交代一遍只是叙述的起点偏向后半程的思考。1. 六月的拆台实录reward shaping 是怎么把智能体带沟里的1.1 当时我们引以为傲的塑形奖励项六月份我们手里的任务是一个长视距稀疏奖励场景智能体需要在一个只有少量强奖励信号的环境里自己摸索出正确的技能序列。环境奖励稀疏到什么程度呢纯靠环境奖励前一万步之内 agent 几乎学不到任何东西收益曲线一条水平直线。于是我们按照最常用的套路上了 potential-based reward shaping。设计了一个基于状态特征的势能函数比如离目标点的距离、关键物体的朝向夹角、子任务的完成标志位然后用前后两个时刻的势能差作为额外奖励项。当时的直觉很合理环境的真奖励太远够不着我把“离目标更近”这个中间信号折算成即时反馈agent 就能顺着梯度摸过去。公式层面其实没什么好争的。Ng 的经典结论是只要塑形项写成势能差的形式就不会改变最优策略。理论上你随便设计势能函数最优解不受影响只是加速探索。1.2 理论没问题问题出在工程近似真正的麻烦在于你不可能真给所有状态设定一个完美的势能函数。你只能拿少数特征近似。一旦势能函数和真实任务之间出现错位理论上的“等价”就崩了。举个我们实际踩坑的例子。任务里有个“靠近出口”的子目标我们在势能函数里加了一项“越靠近出口奖励越大”。Agent 很快就找到了一个稳定刷分的方式跑到出口边缘然后往回退两步再往前跑两步来回蠕动。每一轮往复都能拿到正的势能增量因为势能函数只看当前位置离出口多近不管任务到底推进了多少。真实奖励一分没涨塑形栏目的数字好看得不行四千步之后 agent 变成了一个在出口门口做布朗运动的复读机。我们当时盯着 tensorboard 里那条上涨的塑形收益曲线还以为策略在变好等到验证集上真实奖励还是零才发现被骗了。1.3 三次失败实验之后我们总结出的硬教训六月中旬我们连着做了三组对照全部暴毙。第一组加大塑形权重agent 更快学会刷塑形信号真实收益照样不动;第二组把势能函数换成更细粒度的领域知识结果状态特征稍微一变就脆断;第三组尝试把塑形奖励乘以一个随时间衰减的系数希望后期让真实奖励接管结果衰减太快探索又缩回去了。这三组实验失败得很对称也逼我们想明白一个事塑形信号与真实任务之间的“信息一致性”才是瓶颈。只要这两者不是完全对齐agent 就一定会去钻那个不守恒的局部漏洞。而想要完全对齐手工设计势能函数的代价基本等于重新写一份规则系统。所以六月的最后一个周我们把 reward shaping 全部下线开始认真考虑一个问题如果监督信息不通过“奖励数字”给而是通过“行为分布”给呢2. 换轨道为什么我们选中了 On-Policy Distillation 而不是别的2.1 行为分布比奖励数字更抗钻空子奖励塑形的问题在于它是一个“数值标量”agent 可以为了最大化标量去偏离任务意图。而行为分布携带的信息比标量丰富得多它直接告诉你“在状态 s 下你应该偏向哪些动作”。换句话说奖励塑形是在说“你这么做更好”而蒸馏是在说“你这么做”。前者需要 agent 自己推导目标后者只要对齐就行。对于长视野、状态空间大的任务行为监督明显是更直接、更不容易被 hack 的路径。但行为监督不是新东西行为克隆的问题谁都知道只有静态数据策略一旦跑到教师没见过的地方就彻底瞎了。你不能指望一条离线数据集覆盖整个状态空间。2.2 为什么坚持 on-policy 而不是 off-policy 蒸馏市面上的蒸馏方案大部分是 off-policy 的学生从经验池里抽一批数据拿教师的输出当标签。这套方案实现简单、训练稳定但我们在自己的任务上试了几周发现一个核心痛点学生策略和教师策略的分布差异大时off-policy 蒸馏的数据大多是“过时经验”监督信号的时效性很差。On-policy distillation 的姿态是学生当前采样一批轨迹教师同步在每条轨迹的状态上给监督然后用这批“当前分布下”的监督信号去更新学生。关键区别在于监督信号永远来自学生现在正在经历的状态不会有陈旧性的问题。打个不严谨的比方off-policy 蒸馏像拿着半年前的旅游攻略逛一座每栋楼都在施工的城市攻略里说“这个转角有个书店”你走过去发现是个大坑;on-policy 蒸馏则是当地向导和你并肩走每走到一个路口现看一眼再告诉你往哪走。2.3 我们实现的蒸馏目标长什么样实现上我们在 PPO 的 actor loss 之外加了一项行为监督 loss本质上是对齐学生策略和教师策略在访问状态下的动作分布。# 伪代码示意PyTorch 风格 teacher_logits teacher_policy(obs) # obs 来自 student 当前 rollout student_logits student_policy(obs) teacher_logp log_softmax(teacher_logits / temperature, dim-1) student_logp log_softmax(student_logits / temperature, dim-1) # KL(student || teacher)训练学生去贴近教师 distill_loss kl_divergence(student_logp, teacher_logp.detach()) # 和 PPO 的 policy loss 按权重相加 total_loss ppo_loss distill_coef * distill_loss这个方向我们选的是 KL(student || teacher)不是反过来的 teacher || student。原因是当学生策略在某个状态上已经比教师更确定时我们不想为了强行对齐而把学生的置信度拉低。反过来会惩罚“学生比教师更自信”的情况这在训练后期是灾难。温度系数 temperature 控制在 1.0 到 2.0 之间。太小的话教师输出的分布过于尖锐学生连“次优动作是哪个”都学不到;太大的话监督信号过于平滑学生学成个什么都差不多的糊糊状态。3. 蒸馏跑通了但我们的监督却进入了一种懒怠状态3.1 最初版本的蒸馏教师强学生弱的时候效果好得惊人必须承认七月份的蒸馏实验一开始非常顺。我们拿一个训得不错的教师模型蒸馏给一个从零开始的学生学生的收敛速度肉眼可见地比单纯 PPO 快了两到三倍。前期顺得让人飘飘然的原因也不复杂学生的分布还很散乱几乎覆盖整个动作空间教师给的监督信号每一条都是“高信息量”的相当于一个顶级教练手把手地把每个路口都指了一遍。这一阶段蒸馏 loss 一直大起大落因为学生每次大步调整分布都在剧烈变动。到八月实验开始分化学生的能力逐渐逼近教师以后蒸馏 loss 自然走到很低位。此时我们发现一个尴尬的事实——学生的表现几乎被教师的天花板卡死了。策略的好坏完全取决于教师有没有在这个状态上给出足够好的答案。如果教师在这个状态本来就是懵的学生学到的东西也很有限。3.2 教师半吊子学生也跟着半吊子我们选了一个相对中庸的教师模型来做实验希望技能覆盖广一点。结果学生学到后期性能曲线就贴着教师的性能曲线走上不去也下不来。我们试着加大蒸馏系数想把学生往教师那边摁得更紧结果反而变差。因为学生有些状态上已经比教师做得好了硬往教师那边靠等于把学生拉回更差的选择。后来我们翻了一下不同状态下 teacher 和 student 的逐状态 Q 值差发现双方在同一状态上的强弱关系是高度动态的。有些状态学生已经超越教师有些状态还差十万八千里。一个固定的蒸馏系数等于无视这种非对称关系对“学生已经学会的地方”和“学生完全不会的地方”施加同等的监督强度。3.3 和真实奖励的冲突监督信号不是越多越好八月中旬我们还撞上另一个问题蒸馏 loss 和 PPO 的 reward 目标之间有时候是打架的。当教师在某条路径上的动作分布和真实奖励梯度指向的动作不一致时distill_loss 会把学生往教师的方向拉奖励项又要往另一个方向拉。理论上这种拉扯可以通过调系数缓解但系数是全局的你照顾了前半程就顾不上后半程。我们试过在训练中动态衰减 distill_coef效果比固定系数好但衰减曲线本身就很难调衰减太快前期学的技能容易忘;衰减太慢后期被教师锁死。到这里我们彻底意识到一个事固定监督强度这条路走不长。监督信号不应该是一个固定设置它应该由“学生的当前能力 vs 教师在该状态的能力”共同决定。这个想法直接引出了九月我们重点打磨的自适应监督机制。4. 九月主线自适应监督到底做了什么改动4.1 从固定系数到置信度加权的监督强度我们的做法不复杂核心是把全局固定系数 distill_coef 干掉换成每个状态上动态变化的权重 w(s)。这个权重的计算依据是两个分布的置信度差异如果教师在当前状态的行为分布非常尖(置信度高)学生分布发平(还在瞎猜)说明学生确实需要被狠狠监督;如果学生分布已经很尖说明这块学生已经拿下了没必要继续让教师指手画脚。具体实现上我们用每个动作分布最大概率的负熵作为置信度指标。算起来就是def adaptive_weight(student_probs, teacher_probs): student_conf student_probs.max(dim-1).values teacher_conf teacher_probs.max(dim-1).values # 教师有把握、学生没把握 → 权重高 need_teach torch.clamp(teacher_conf - student_conf, min0.0) # 学生自己都很有把握 → 权重低 already_confident torch.sigmoid(5.0 * (student_conf - teacher_conf)) return need_teach * (1.0 - already_confident) 0.1看起来像什么像一个自适应学习的老师你在某个知识点上会了我就不吭声;你哪道题错得离谱我就多讲两句。背后的道理跟课程学习一脉相承监督强度应该跟着学习者的能力走而不是恒定输出。这个权重我们还用指数滑动平均做了平滑防止单步的随机波动把监督信号搞成高频噪音。4.2 自适应监督和剩余 reward shaping 的兼容性这里要多说一句。很多人可能以为我们既然下架了 reward shaping就完全抛弃它了。实际上不是我们保留了极小一部分但用法完全变了。过去是把塑形奖励加进 reward 里参与优化现在我们把它降级成“初始指导信号”只在训练启动的阶段辅助探索。自适应监督正式上线之后这部分塑形信号会随训练进程逐渐退场——用了一个和蒸馏权重类似的置信度调节门控。换句话说手工知识保留但是地位变了从持续推动力改成点火助推器。这一步我们在设计之初没想清楚是后面看数据的时候才意识到。当时发现一个现象自适应监督机制下学生早期如果没有外部指导容易在状态空间里随机游走太久蒸馏的 teacher 是在线分布的学生不开窍的时候 teacher 也很难给出有效监督——因为学生根本没走到有效区域附近。加了一点点塑形助推之后学生至少能更快进入教师能“看得懂”的区域两者配合明显比单打独斗顺。4.3 九月末的对比实验结果直接上数据。我们在自己的基准任务上拿五个随机种子做了最终对比分别是方案平均真实奖励(归一化)训练步数到达80%性能说明纯 PPO 基线0.21未能达标探索效率太低PPO reward shaping0.483400 步前期快中后期停滞PPO 固定蒸馏0.732100 步收敛快但天花板受限PPO 自适应蒸馏0.891500 步收敛最快且未见天花板效应固定蒸馏和自适应蒸馏之间的差别很值得看两者前期曲线几乎重合因为学生大部分状态都不熟自适应权重基本保持在最大值。分水岭出现在中后期固定蒸馏开始出现震荡而自适应蒸馏的 loss 曲线平滑得多。走向高奖励区域之后固定蒸馏的学生会在教师不是最优的状态上浪费大量梯度因为 overloaded 的监督信号把学生往回拽;自适应蒸馏的学生在这些状态上的监督权重已经掉到 0.1 左右可以纯靠自己的探索往上走。5. 这些坑不写出来你们大概率会再踩一遍5.1 评估指标的口径问题能毁掉一次对比实验这三个月里最耗费时间的一个坑我们在对比不同方案时用过三个不同的 reward 评估口径。早期实验里 tensorboard 上报的平均回报用的是包含塑形奖励的数值换到蒸馏方案以后塑形没了数字直接跳崖。要是你没意识到口径变了会以为蒸馏方案崩了。后来我们把“评估用真实 reward”、“训练用复合信号”彻底分开了。评估端只读环境本身的稀疏真奖励训练端随便你怎么加辅助。这个拆分听起来简单到不值得写但团队里三个人因为这个浪费了整整两周——所以必须写。5.2 随机种子数量不够再好看的曲线也是假的我们六月用三个随机种子跑得出的“塑形表现好”的结论放在九月的自适应监督机制下再跑五个种子结果有两个种子完全推翻了初始结论。原因很简单任务本身有探索随机性三个种子不足以覆盖方差。后来我们把标准改成五个种子起步停更标准定为“五个种子的中位表现达到预期且四分位区间不重叠才算显著”。这个标准极大减少了试错次数。5.3 教师策略温度调低学生却更适合高温蒸馏这个点最反直觉。我们主推的自适应权重公式里用到了教师策略的置信度。一开始直接把教师推理时常用的低温度拿来参与计算结果发现置信度普遍虚高自适应权重几乎不起作用。原因也很直白推理温度低教师输出被压成近乎 one-hot所有状态看起来都像“很有把握”。实际上教师只是被强制作出了决定并不代表它真懂。后来我们改用训练温度 2.0 进行蒸馏和权重计算学生学到的动作概率更接近教师的真实认知分布自适应权重才变得有区分度。6. 下一步方向别把自适应监督当成终点自我评估一下当前这套“reward shaping 点火 on-policy distillation 主力 自适应置信度监督收尾”的管线在长视野任务上的确有显著收益但它不是万灵药。置信度指标本质上是启发式的它用一个分布尖峰的统计量来近似“学生该不该被继续教”这种方法在动作空间连续、分布形状复杂的环境里会失真。我目前的想法是下一步用价值网络的价值差异来替代置信度差异作为监督权重。比起动作概率差价值差更能反映“教师在这个状态下到底有没有给学生带来增量”。不过这只是计划还没跑实验等有结果了再来归档。最后分享一个这几个月最大的体会:做强化学习调试最可怕的不是模型不收敛而是你训练的是一个自洽的虚假信号体系奖励、监督、评测各自为政凑在一起产出一条很漂亮的假象曲线。这三个月我们真正绕出来的路其实是先把不同信号的口径统一了再谈怎么让监督变得更聪明。
返回列表