1. 进展总览:为什么这个阶段值得单独拎出来写
先说明一下,这篇文章是上一轮 On-Policy Distillation(OPD)进展梳理的续篇,覆盖的是 6 月到 9 月这段时间的工作。之所以要单独拆出来写,是因为这段时间的推进节奏和前几个月完全不一样——前几月主要是在 OPD 这条主线上做单点突破,而这几个月的工作重心明显转向了“先把 reward shaping 用明白,再让它反过来约束蒸馏过程”这条更复杂的路径。
写这篇文章的初衷很简单:我在这四个月里踩了不少坑,有的坑现在回头看简直是低级错误,但当时确实卡了很久。把这些过程整理出来,既是对自己工作的复盘,也希望给正在做策略蒸馏、奖励塑形或者自适应监督方向的同学提供一些可复现的参考。内容会涉及一部分公式和伪代码,但重心放在思路演进和实操细节上,毕竟论文里不会写的东西,往往才是真正花时间的地方。
先说结论:6 到 9 月这四个月的实质进展可以压缩成三件事——第一,把 reward shaping 从“可有可无的 trick”提升到了“影响蒸馏稳定性的关键变量”;第二,找到了 OPD 在非平稳奖励环境下的失效边界,并针对性地设计了自适应监督机制;第三,把在线样本的利用率提高了将近一倍,同时把专家策略的灾难性遗忘问题基本压住了。
当然,任何进展都不是线性的。这期间也走过弯路,比如一度想用统一框架同时解决奖励稀疏和策略漂移两个问题,最后发现二者在时间尺度上的需求是冲突的,强行耦合反而让训练过程变得更难调试。这个教训我会在后面详细展开。
2. 核心问题复盘:OPD 到底卡在哪里
2.1 回顾 OPD 的基础设定
先把 OPD 的基本框架说清楚,方便上下文连贯。On-Policy Distillation 是策略蒸馏的一个变体,核心思想是用一个已经训练好的专家策略去指导学生策略的学习。传统蒸馏一般是用专家生成的离线数据做行为克隆,而 OPD 的特点是学生策略在和环境交互的在线过程中,实时参考专家策略的输出来修正自己的行为。
具体实现上,OPD 通常包含两条 loss 支路:一条是环境奖励对应的策略梯度损失,另一条是模仿损失,负责拉近学生策略和专家策略在动作分布上的距离。训练过程中,学生策略一直在和环境互动,同时每一步都会拿自己的动作概率和专家的动作概率做对比,差异大了就加大惩罚,差异小了就相对放松。
听上去很顺,但实际跑起来问题不少。最典型的场景是:当专家策略和学生策略的能力差距很大的时候,模仿损失会让学生策略陷入“想学但学不动”的状态——专家的动作分布对学生来说过于陡峭,学生策略的梯度方向被模仿损失主导,环境奖励反而成了次要信号,于是策略收敛到一个局部最优,整体性能卡在中间水平。
2.2 之前版本遗留的三个痛点
3 到 5 月的工作解决了一部分问题,但遗留了三个明显的痛点,6 月一开始就是在跟这三个问题较劲。
第一个痛点是奖励尺度不匹配。模仿损失和策略梯度损失在数值尺度上经常差一个数量级,导致训练过程中两条支路的实际影响力严重失衡。调 loss 权重是一个办法,但只要环境一变或者专家策略一换,原来的权重又要重新调,这个过程非常费时。
第二个痛点是稀疏奖励环境下策略启动困难。如果环境奖励大部分时候是 0,学生策略在初期几乎没有有效的梯度信号,只能靠模仿损失勉强拖着走。但模仿损失本身在动作分布差距较大的时候效率很低,于是学生策略前期学习速度极慢,甚至出现训练很久还在原地打转的现象。
第三个痛点是专家策略的利用效率低。OPD 只在每一步把专家的输出当作“标准答案”来模仿,但专家策略内部包含的长期规划信息、对状态的偏好结构,全都被简化成了逐动作的分布对齐,信息利用效率其实是浪费的。
这三个痛点叠加在一起,表现就是训练曲线长时间不增长、loss 震荡、以及学生策略在简单状态下学会、复杂状态下又退化的“跷跷板”现象。
3. Reward Shaping 的实验路径:从补救到关键变量
3.1 为什么选 reward shaping,而不是换网络结构
面对上面三个痛点,第一个直觉反应通常是调网络结构、换优化器、加归一化层之类的。但我当时选择先动 reward shaping,原因有两个。
第一,OPD 已经是一个两路 loss 叠加的框架,如果再动网络结构,问题排查的变量会变得非常多。reward shaping 是在奖励信号层面做文章,不改变模型结构,介入成本低,回滚也容易。第二,reward shaping 直接作用于策略梯度那条支路,正好可以缓解模仿损失和环境奖励之间的失衡问题——如果环境奖励本身已经包含了足够多的结构信息,模仿损失的负担就会降下来。
这里补充一个生活化的类比。OPD 像是让一个新手跟着一位老师傅学手艺。老师傅做菜很快,新手每一步都在看老师傅的手法,但自己动手的时候总是不对味。reward shaping 就相当于在做的过程中,把“火候对不对”“调味顺序对不对”这些即时反馈拆成更细的评价信号,让新手每一步都清楚自己做得怎么样,而不是等到出锅了才知道整盘菜失败了。
当然,reward shaping 用不好也会出问题。最典型的是 shaping reward 设计过于密集,导致策略过度拟合辅助信号,反而忽略了真实目标。这个在实验中遇到过,后面会详细讲。
3.2 静态 shaping 方案的三个迭代版本
6 月到 7 月初,我一直在做静态 shaping 的版本迭代,就是 shaping reward 的形式固定,幅度固定,不随训练进度变化。一共试了三个版本。
第一版是简单距离奖励。做法是取专家轨迹里的状态访问频率分布,给高频状态一个正向 shaping 奖励,状态访问频率低就适当给负向惩罚,意图是引导学生策略多靠近专家常走的状态区域。这个版本的问题在于,学生策略前期的状态分布和专家差异非常大,距离奖励的梯度方向不稳定,前期反而加剧了探索的盲目性。
第二版加入了进度奖励。具体做法是在一个 episode 里,根据学生策略当前到达的“进度节点”加权给奖励——比如在导航类任务中,每通过一个关卡节点就多给一份奖励。这一版的效果好了不少,因为进度奖励提供了中间时刻的反馈信号,缓解了稀疏奖励下策略启动慢的问题。但它的参数敏感性很高,奖励幅度稍微调大一点,学生策略就容易过度追求节点目标,放弃了对最终目标的优化。
第三版是分段势函数。这是我目前觉得静态 shaping 里最稳定的一版。用一个势函数记录当前状态距离任务目标的“距离变化”,每一步的 shaping reward 等于前后两个状态势函数值的差。这个形式在理论上有一个很好的性质,就是满足势函数 shaping 的最优策略不变性——也就是说,加了这个 shaping reward,理论上不该改变真正的最优策略。当然这是理论性质,实际因为函数逼近误差,最优策略还是会偏。但至少训练稳定性比前两版好很多。
这里提示一下,分段势函数实现时要注意势函数的尺度应当和环境原始奖励保持在一个数量级。我当时第一版实现里势函数量级是原始奖励的十倍,训练起来学生策略很快就“飘”了,动作分布变得很激进,后来把势函数压缩回同一个量级才稳下来。
3.3 从静态到动态:为什么 shaping 必须跟着策略走
静态 shaping 做到 7 月中旬,效果基本到顶了。训练曲线比之前平滑,启动速度也快了,但有一个问题很扎眼:一旦学生策略的能力超过了 shaping reward 的设计假设,shaping reward 就开始帮倒忙。
举个例子。如果一个 shaping reward 是鼓励学生策略进入某些区域的,那么当学生策略的能力已经足够好、可以走更优路径的时候,shaping reward 仍然在把策略往老路子上拉。这时候 shaping reward 变成了一个“经验包袱”,限制了策略的进一步优化。
在这个观察的基础上,我开始尝试动态 shaping。思路是把 shaping reward 的权重设计成随训练进度衰减的函数,训练前期 shaping 占比高,帮助学生快速建立基础行为模式;训练后期 shaping 占比低,把主导权交还给环境奖励。这个思路实现起来不复杂,就是一个简单的退火公式,但效果比静态版本好不少。
不过动态 shaping 只是解决了“什么时候用 shaping”的问题,还没解决“shaping 本身给得对不对”的问题。这个问题的答案,要等到自适应监督上线之后才逐渐清晰。
4. 自适应监督机制:从“固定模仿”到“按需模仿”
4.1 自适应监督要解决的本质上是什么
OPD 里的模仿损失本质上是一种监督信号。标准做法是每步都让专家和学生策略的动作分布尽量对齐,权重固定。这样做的问题是:不同状态下,模仿的“必要性”其实是不一样的。
有的状态下,学生策略已经学得很好,动作分布和专家已经比较接近,这时候再强行拉对齐,收益很小。有的状态下,学生策略完全不会,动作分布和专家差了十万八千里,这时候如果模仿权重不够,学生就学不进去。用同一个固定权重处理这两种情况,必然顾此失彼。
自适应监督的目标就是让模仿权重随状态和学生策略的实际水平动态调整。学得好的地方少管一点,学得差的地方多管一点。这个思路和课程学习有相似之处,但更细粒度,不再是一个训练阶段的课程安排,而是逐状态、逐时间步的监督强度调节。
4.2 置信度加权蒸馏的具体实现
7 月下旬开始,我实现了一个置信度加权的蒸馏版本。核心做法是在模仿损失前面乘一个权重系数,这个系数由学生策略自身的置信度决定。
具体实现分两步。第一步,用学生策略在当前状态下的动作分布熵来度量置信度。熵低说明策略对动作选择很有把握,熵高说明策略对动作选择很不确定。第二步,把熵映射到注意力系数上,熵越低,模仿权重越低;熵越高,模仿权重越高,让模型把精力集中在自己真正拿不准的状态上。公式形式不算复杂,但实际调参过程花了不少时间。注意力系数的上下限、温度参数、学生策略熵的滑动平均窗口长度,每一个都会影响最终的训练行为,必须一组一组试。
这个机制上线后,一个直观的变化是训练曲线前期的抖动明显变小了。之前学生策略经常出现“这步会了、下一步又忘了”的现象,引入置信度加权之后,策略在低置信度状态下能得到更强的监督,所以抢回来的技能不容易再丢掉。
但这里还有一个遗留问题——置信度本身是一个可能被“骗”的指标。学生策略可能在某个状态下动作分布很尖锐,但动作选择却是错的。这种情况下熵很低,自适应监督会降低权重,结果反而放过了需要纠正的错误。这个问题后面是通过引入专家和学生策略的价值估计差来进一步修正的。
4.3 价值差异驱动的自适应监督
这是 8 月中旬到 9 月的主线工作。思路是基于一个观察:专家策略和学生策略对同一状态的长期价值判断往往存在系统性差异,而这个差异比动作分布的 KL 散度更能反映“该不该多管”。
实现上,我在蒸馏框架里引入了两个 critic。一个 critic 估计专家策略的价值,另一个 critic 估计学生策略的价值。在每一步,计算两者对当前状态的估值差,如果差异大,说明学生策略对当前状态的理解和专家出现了明显分歧,这时加大模仿权重;如果差异小,说明学生策略的状态理解已经接近专家,可以放心降低模仿权重。
这个方案相比置信度加权有一个明显优势:价值差异是基于长期累积回报的估计,不只看当前动作分布的尖锐程度,更不容易被“高置信度但错误”的状态欺骗。代价是训练里多了两个 critic,体积、显存、稳定性都要重新调试。
这里分享一个调试经验:价值差异的估计对 critic 的更新频率很敏感。更新太频繁,价值估计方差大,监督权重震荡;更新太少,价值估计滞后,监督信号失真。我最后采用的方法是 critic 更新频率和学生策略的 rollout 频率异步配置——学生策略每 4 步更新一次,critic 每 16 步更新一次,同时给价值差套了一个简单的滑动平均平滑层。
这套自适应监督机制上线后,和动态 reward shaping 配合,整体性能在三个基准任务上都有提升。提升幅度最大的是一个奖励极其稀疏的导航任务,对比固定权重的 OPD 基线,平均回报提升了 37%,训练步数节省了 29%。
4.4 自适应监督和 reward shaping 的联动效果
需要强调一点,reward shaping 和自适应监督并不是两条平行的工作线,它们在 9 月之后实际上是协同的。reward shaping 改变了学生策略收到的即时反馈,而自适应监督改变了学生策略在模仿专家时的学习强度。二者一个负责“让环境经验更有信息量”,一个负责“让模仿行为更高效”,形成了一种双通道的修正机制。
具体到实验表现上,reward shaping 单独用的时候,训练速度提升,但最终收敛水平略低于不 shaping 的版本,主要原因是 shaping 上限受势函数设计质量影响。自适应监督单独用的时候,最终收敛水平高,但训练前期如果稀疏奖励,启动速度还是不快。两个一起用之后,前期 shaping 提供快速启动,后期自适应监督保证策略能在专家指导下稳步优化,整体的训练曲线几乎看不到前期长时间平台期的问题。
另外一个现象也很有意思:加了自适应监督之后,reward shaping 的退火速度可以明显加快。因为当学生策略在高置信度状态下可以不依赖 shaping 信号,shaping 的负担就降低了的。
5. 核心实验设计与结果拆解
5.1 基线选择与消融配置
这次实验我没有直接用论文里的现成 baseline,而是以三个月前自己实现的 OPD 框架为基线,因为不同实现之间细节差异太大,直接和论文数字对比会带来很多不可控变量。我最终设置了四个对照组:
- 基线 A:固定权重 OPD,无 shaping,无自适应监督。
- 基线 B:OPD + 静态分段势函数 shaping。
- 基线 C:OPD + 动态 shaping(退火权重)。
- 实验组 D:OPD + 动态 shaping + 置信度加权蒸馏 + 价值差异监督。
所有对照组的超参数尽量保持一致,只允许 shapping 策略和监督机制这一条变量变化。训练步数统一设定、随机种子对齐、环境版本固定。实验环境方面,用了三个任务组,奖励稀疏程度依次递增。第一组是中等稠密的控制任务,第二组是稀疏奖励的导航任务,第三组是极度稀疏且带有随机扰动的高难任务。
5.2 数据结果与关键趋势
先说总体趋势:
| 对照组 | 平均回报 | 收敛步数 | 训练稳定性 | 采样效率 |
|---|---|---|---|---|
| 基线 A | 1.00x | 1.00x | 中 | 1.00x |
| 基线 B | 1.08x | 0.82x | 中高 | 1.12x |
| 基线 C | 1.15x | 0.74x | 较高 | 1.26x |
| 实验组 D | 1.37x | 0.71x | 高 | 1.41x |
这里所有数值都以基线 A 为 1.00 做归一化。可以看出从 B 到 D 提升是逐步累积的,不是某个单一改动带来的跳变。
关键趋势有三点值得展开。
第一,静态 shaping 对收敛步数的改善最明显,但对最终性能帮助有限。基B 的收敛步数比基线 A 快了 18%,但平均回报只多了 8%,说明静态 shaping 主要在优化“学习节奏”,并没有从根本上提升策略的上限。这支持了前面的判断:静态 shaping 的能力上限受限于势函数本身的设计质量。
第二,动态 shaping 的增益来自后期策略优化不再被固定的 shaping 信号束缚。基线 C 相比基线 B 在平均回报上提升了 7%,这个增益在训练的后期出现。前期两条曲线几乎重合,中期开始分化。
第三,自适应监督是拉高最终性能的最大功臣。实验组 D 相比基线 C 提升了 22% 的平均回报,而且这个提升曲线是单调的,没有出现先升后降的情况。这意味着价值差异监督和置信度加权这两个机制,确实把专家策略的信息利用效率提上去了。
5.3 消融实验:每个组件是否真的有用
为了验证每个组件的独立性,我把实验组 D 的机制拆开,做了一组消融对比:
- D1:动态 shaping + 置信度加权,去掉价值差异监督。
- D2:动态 shaping + 价值差异监督,去掉置信度加权。
结果很有意思。D1 的平均回报比 D 差 8%,D2 比 D 倒是只差了 3%。这说明价值差异监督在这个任务组合里贡献了绝大部分自适应能力,置信度加权更像是“锦上添花”。
不过需要注意,这个结论在简单任务上不成立。在奖励相对稠密的控制任务上,去掉价值差异监督、只保留置信度加权的版本,差幅微乎其微,说明价值差异监督在简单任务上其实是个“冗余”组件——它不带来危害,但也帮不上太多忙。换一个角度说,如果目标任务相对简单,只做置信度加权就足够,价值差异监督的额外开销可以省掉。
5.4 专家策略的遗忘问题:好像被解决了但又没完全解决
前面提到专家策略的灾难性遗忘,这是 6 月到 9 月一直关注的一个问题。严格来说,灾难性遗忘指的是学生策略在训练后期把早期学会的技能丢掉了。但我也发现一个容易忽略的相关问题——专家策略自身的遗忘。当我们用在线蒸馏不断更新学生策略时,专家策略如果也参与微调,就很有可能在后期被学生策略带偏。
为了解决这个问题,我在实验组 D 里把专家策略完全冻结,只作为监督信号源使用。冻结之后,专家策略的稳定性得到保证,但代价是专家策略无法适应环境变化。如果环境本身是非平稳的,冻结的专家反而可能成为“过时的经验”。这个问题我们没有在 9 月底之前拿到完美解法,只是通过动态 shaping 和自适应监督的组合,在非平稳程度不高的环境上缓解了症状。
这里要做一个明确的提醒:**如果环境是非平稳的,而且这种非平稳不是少量扰动而是结构性变化,那么冻结专家策略的方案一定会遇到天花板。**这部分的扩展方向,我在后面专门展开。
6. 实操过程与踩坑记录
6.1 训练流程的最终版本
原本想把所有细节都放出来,但字数有限,这里只保留一个可以直接复用的流程骨架,好让跟做的同学心里有个数。
最终的训练流程大概是这个顺序:
- 先用一个小规模的 rollout 收集初始经验,计算状态访问频率分布,用于初始化势函数的先验。
- 训练学生策略若干步,同时维护两个 critic(专家价值 critic、学生价值 critic)和它们的异步更新时钟。
- 每一步 rollout,计算当前状态下的势函数 shaping reward,叠加到环境奖励上。
- 同时计算学生策略的动作分布熵,映射成置信度,结合价值差异估计,得到最终的自适应监督权重。
- 用策略梯度损失 + 加权模仿损失联合更新学生策略。
- 每隔一定步数,调整 shaping 退火权重,让它逐渐衰减。
- 训练收敛后,把学生策略和环境交互一批额外数据,做一次 finetune,用来修复在训练过程中因为 shaping 退火带来的行为偏移。
第七步是我最后补上的。当时发现一个现象:训练收敛后,如果直接把 shaping 关掉,学生策略的短期性能会掉一点。后来在不改变 shaping 机制的情况下,关掉 shaping 让策略在原始奖励下再微调几十步,性能就能恢复,甚至超过之前。这个 finetune 的步骤虽然小,但对最终提交模型的效果影响很大。
6.2 实验环境与硬件配置参考
这里不推荐具体硬件品牌,直接说我这组实验的配置供参考。训练环境是单机 8 卡 GPU,每张卡显存 24G。三个任务组共享同一套环境代码,并发开 32 个并行进程采样。学生策略是三层 MLP 加一个 GRU 的循环策略,专家策略用了更大的网络。两个 critic 分别各自是一个两层 MLP。
显存方面,因为实验组 D 多了两个 critic,残差网络的参数量比基线上了一个台阶。最初在 24G 显存下跑得比较吃力,后来通过梯度检查点、以及减少 critic 网络层数的方法解决了。如果你跟我一样是在 8G 到 16G 显存的环境下跑,建议优先省 critic 网络的规模,不要省学生策略的容量——学生策略容量直接决定蒸馏效果上限。
6.3 踩坑实录:五个有价值的问题
这里分享五个我在 6 到 9 月实际踩过的坑,按“踩坑时间 + 问题表现 + 解决方案”的方式写,方便检索。
坑一:势函数尺度偏离导致策略“激进化”。
出现时间:6 月中旬。表现:训练前期 loss 下降很快,但策略行为明显偏离合理范围,动作幅度变大。排查后发现,shaping reward 的数值尺度是环境奖励的十倍,策略梯度算出来之后,shaping 支路的梯度完全压过了环境奖励支路。解决方式:把势函数幅度压到环境奖励的 0.2 到 0.5 倍,重新训练,问题立刻消失。
坑二:置信度加权导致“自满陷阱”。
出现时间:8 月上旬。表现:学生策略熵快速下降,训练中后期性能停滞。原因:置信度低的时候监督权重高,策略学得快、熵降得快,于是监督权重降得更快,形成恶性循环,学生策略过早固化。解决方式:给注意力系数加了上界,不让学生策略“完全放飞”,同时又用价值差异监督兜底。
坑三:critic 更新太频繁引发震荡。
出现时间:8 月下旬。表现:训练曲线在中后期频繁波动没有任何单调性。查了一下更新频率,发现学生策略和 critic 同步更新,每步都在变。解决方式:critic 改为延迟更新,并加入滑动平均平滑,波动立刻消失了一大半。
坑四:静态 shaping 在中期“拖后腿”。
出现时间:7 月上旬。表现:中期训练曲线出现长期平台,加训练步数也过不去。排查后发现静态 shaping 不断奖励旧路径,阻碍策略探索新路径。解决方式:换成退火权重,平台期明显缩短。这个问题在 3.3 节已有详述。
坑五:专家策略生成的数据分布不平衡。
出现时间:9 月初。表现:学生策略在高频状态上学得很好,在低频状态上几乎不进步。原因是专家策略的 rollout 偏好访问某些区域,导致监督信号分布失衡。解决方式:在采样器里增加状态覆盖率控制,让低频状态也有足够的采样概率。这个改动简单,收益却很大。
7. 关键参数速查与调参思路
7.1 二次整理的调参清单
整理一份速查表,方便你对着调。这些参数没有通用的绝对最优值,但要给一个安全范围。括号内是我自己在三个任务上最终使用的值。
| 参数 | 作用 | 安全范围 | 我的最终值 |
|---|---|---|---|
| 势函数缩放系数 | 控制 shaping 幅度 | 0.1 ~ 0.8 | 0.35 |
| shaping 退火速率 | 控制 shaping 衰减 | 0.001 ~ 0.01 / 千步 | 0.004 / 千步 |
| 置信度注意力下界 | 防止监督完全消失 | 0.2 ~ 0.6 | 0.35 |
| 置信度注意力上界 | 防止监督过强 | 0.8 ~ 1.2 | 0.95 |
| 价值差异滑动窗口 | 平滑价值差 | 4 ~ 64 | 32 |
| critic 延迟更新步数 | 控制 critic 更新频率 | 4 ~ 32 | 16 |
| 模仿损失最大截断 | 防止梯度爆炸 | 0.5 ~ 2.0 | 1.0 |
这里有一个关于调参思路的提醒:这些参数之间不是完全独立的。比如势函数缩放系数调大了,shaping 退火速率往往也要加快,不然训练后期 shaping 的负面影响会被放大。再比如价值差异滑动窗口调短了,可以适当把模仿损失最大截断调高一点,让监督信号更敏感,但前提是策略容量足够大,能消化更敏感的监督信号。
7.2 压测时的注意事项
如果你准备在更大规模环境下复现这套方案,有几个和调参无关但影响工程的细节要特别注意。
第一,**奖励归一化优先级高于一切。**如果环境奖励本身数值变化很大,必须先做归一化再做 shaping,否则 shaping 的退火速率的标定一定会出错。我第一套分布式环境里就是忘了做归一化,导致不同子环境的 shaping 退火曲线完全不同,训练怎么调都怪。
第二,**采样并行度影响 shaping 退火的稳定性。**并行进程多的情况下,同一时刻不同进程看到的策略版本也不完全一致,shaping 退火曲线如果按全局步数算,会和局部进程的步数对不上。后来我把 shaping 退火改成每个进程独立调度,才算彻底解决了这个不一致的问题。
第三,**注意 critic 输入特征的一致性。**两个 critic 的输入如果一个是拼接观察值、一个是拼接动作值,那么它们的 loss 曲线没有可比性,排查问题的难度会指数上升。建议两个 critic 统一用同样的输入头,只在网络内部做分支。
8. 扩展方向与下一步计划
8.1 非平稳环境下的专家策略更新问题
前面已经说过,冻结专家策略在非平稳环境下会遇到天花板。9 月中旬我设计了一个小规模实验,模拟环境奖励分布偏移的场景。具体做法是每隔一定轮次修改环境奖励函数,观察冻结专家策略的学生会怎么反应。
结果不意外:前两轮偏移还能跟上,第三轮开始性能明显下滑,蒸馏效率也随之降低。这个实验结果很清晰指向下一步工作的方向——需要设计一种“专家策略低速适应机制”,让专家策略在保持稳定性的前提下,适度跟随环境变化进行调整。当然这个机制必须和学生策略的自适应监督联动,避免专家和学生同时漂移。
8.2 自适应监督与大语言模型蒸馏的结合
另一个正在探索的方向,是把自适应监督的思路移植到语言模型的蒸馏任务中。语言模型蒸馏时,教师模型通常是一个大规模稠密模型,学生模型是一个参数量小很多的版本,这跟强化学习里的专家-学生结构非常相似。目前初步的想法是,用学生模型在不同 token 位置上的置信度作为监督权重的一部分,同时用教师模型和学生模型在语义层面的“价值差”设计类似价值差异监督的信号。
到目前为止只做了非常初期的验证,结论还很初步,但我倾向于认为这个方向值得在这个季度内深入下去。因为语言任务的监督信号比控制任务更稀疏、更依赖上下文,而自适应监督天然为这类问题提供了结构化的解决方案。
8.3 关于“监督信号应该长什么样”的一点思考
9 月底的时候,我停下来重新审视了自己这两个多月的工作,发现一个有意思的转变。最开始做 reward shaping 的时候,我把它当成“一个可以迅速让训练跑起来的 trick”,做自适应监督的时候,我把它当成“一个提升蒸馏效率的组件”。但做完之后回头再看,这两件事本质上是同一件事——都在解决一个核心问题:监督信号的形态应该随训练阶段动态变化,而不是一股脑堆给策略网络。
reward shaping 是改变外界反馈的分布,自适应监督是改变算法对既有反馈的使用权重。二者最终都指向一个问题:策略学习过程中,什么样的监督信号在什么时间点是有用的、什么是有害的。这个问题没有一个通用的答案,但它值得每个做策略学习的人在实践中持续观察和积累。
这也是我接下来计划把这两个方向合并成一个统一框架去做进一步探索的原因。框架目前还只存在于笔记里,等实践成熟一些再单独整理一篇文章出来。
9. 写在最后的实操体会
这篇梳理写到这里差不多是全部内容了,最后说几句这段时间经验性的东西。
第一,**不要把 reward shaping 当成“小技巧”。**它是一个和主目标强耦合的变量,设计不好会彻底改变策略的优化路径。我踩过的最痛的一个坑就是最开始对 shaping 的威力认识不足,导致前两周的实验方向整体偏掉。
第二,**自适应监督不是越复杂越好。**价值差异监督在最简单的任务上几乎没有带来额外收益,反而多花了显存和训练时间。如果你的任务不是特别复杂,置信度加权蒸馏已经完全够用,不用盲目追求全量机制。
第三,**调参顺序比调参本身更重要。**我花了很多时间在单独调 shaping 幅度和退火速率上,后来发现只要先把 critic 的更新频率稳定住,再回来调 shaping 参数,要调的变量少了一大半。很多参数之间是耦合的,一个个单独调只会让问题变得更难排查。
第四,也是最重要的一点:**做这类实验,一定要保证消融实验和最终结果的可复现性。**因为这类实验的随机性非常强,稍微改一下采样方式和随机种子,结果变化就很大。建议从一开始就固定实验配置、固定随机种子,甚至固定环境版本,否则到后面分析的时候会非常痛苦。
如果这篇进展梳理能帮到正在做策略蒸馏或奖励塑形方向的同学,哪怕只是少踩一个坑,我也觉得这一大篇没白写。有更多细节问题可以在评论区交流,我看到了会尽量回复。