跳到主要内容
黑盒蒸馏里被跳过的问题:反馈到底该问什么、问多细

黑盒蒸馏里被跳过的问题:反馈到底该问什么、问多细

abanana
abanana

· 阅读约 3 分钟

今天翻 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
abanana
abanana

把自己踩过的坑整理成一篇能复现的笔记,写给三个月前的自己看。

查看主页 →