今天翻 cs.LG 的列表,看到 11 月 4 号挂上去的一篇,编号 2611.06542,标题是 EvoOPD: Evolving Privileged Information Strategies for Black-Box On-Policy Distillation。标题念起来长,但摘要里那句「应从教师处获取什么样的 PI,才能最有效地支持学生学习」让我停了一会儿。平时做蒸馏,拿到教师的反馈就直接往学生身上放,很少回头问这段反馈的形态是不是当下最合适的——这个问法我们基本是默认跳过的。这篇笔记只拆它的机制,不复述论文的实验细节,读完能带走的东西只有一样:教师的反馈不是越细越好,问什么、问多细,本身是个该被优化的变量。
先把背景压成一句话:白盒蒸馏靠教师的 logits,黑盒模型拿不到输出分布,你看不到它内部的参数,也拿不到每个 token 的概率,能拿到的只有教师对某个输入的文本回答,token 级别的细粒度蒸馏这条路直接堵死,手上就只剩文本反馈这一种原料。作者把这堆文本反馈叫特权信息(PI),再搭一个以 PI 为条件的特权教师,把反馈转成学生自己轨迹上的密集监督。到这一步没什么新鲜的,关键在下一个问题:这堆文本反馈究竟该怎么要。
论文把 PI 策略拆成三个维度:关注位置(反馈盯着哪一段看)、信息类型(是指出哪里错了、直接给正确写法、还是只给一个方向提示)、细节程度。三个维度列出来,组合空间就出来了——同一个学生、同一道题,给它一段逐行的错误指认,和给它一句「回去检查第三步」,效果并不一样;哪种更好,取决于这个学生当下卡在什么地方。我读第一遍的时候觉得这不过是 prompt 措辞的差别,第二遍才反应过来,这是监督信号形态的问题,跟措辞无关。
把这三个维度写成配置,就能看出硬编码一套策略有多勉强:
pi_strategy:
focus: "错误所在的那一步" # 也可以是整条轨迹、或只看最终答案
type: "指出错误" # 或 "直接给正确解法" / "只给方向提示"
granularity: "step" # step / line / token
固定在某一组上,大概率只在训练早期有效。学生一开始连题意都没吃透,你给它一句方向提示等于没给;等它题型熟了,再逐行指认错误,边际收益就降下来了。反过来说,同一组配置换一个学生,表现最好的那一档可能完全不同,硬编码相当于赌这个学生永远停在同一个状态,这在训练里基本不成立。
EvoOPD 的做法是把 PI 获取本身当成优化问题,维护一个随学生状态演化的 Strategy Bank,循环大致长这样:
bank = init_strategies()
while training:
pi = teacher(student.trace, bank.sample()) # 以 PI 为条件的特权教师
student.update(pi) # on-policy,跑在学生自己的轨迹上
reward = fix_utility(student, pi) # 同一批题,反馈前后对比
bank.update(pi, reward) # 按效用调整三个维度
fix_utility 这一行是我觉得全文最值得借鉴的地方。它测的是「修复效用」——把这条反馈放回去之后,同一批题上学生到底有没有变好,而不是给反馈本身打个质量分。奖励那一栏,很多人(包括我)顺手就填最终准确率,但噪声大到基本看不出单个策略的差别,代码任务尤其明显,一道题的对错方差能盖掉一切。换成同题前后对比,信号就集中得多,代价是要多跑一遍:同一批题得跑两次,一次不带这条反馈、一次带上,两边的差才算这条反馈的贡献。bank 也不是静态的 prompt 池,它按效用去调三个维度,当前学生身上哪个方向起了作用,就往那个方向多进行变异。
实验覆盖数学推理和代码生成两类任务,学生是 Qwen3-1.7B、4B、8B,一共六个模型-任务设置:
6/6 settings : best overall
math avg Δ : +2.14
