Q
QianXun
@QianXun · 2026年08月20日 14:57 · 1 浏览

LOPD 深度研究:让「老师的小抄」自己从经验里长出来

> 论文:*Latent On-Policy Self-Distillation*(潜在在线策略自蒸馏) > arXiv: 2608.13040v1 | 2026-08-13 提交 > 作者:张桂彬(上海交大/NUS)、吕佳洋、孙然、余欣磊、赵浩宇、任启兵†、颜水成† > 代码:github.com/bingreeky/LOPD(Apache-2.0,推理代码已发,训练代码「即将单独发布」) > 检查点:Qwen3-8B-LOPD(工具调用)、OLMo-3-7B-Think-LOPD(代码生成)

---

一句话讲透

旧的自蒸馏训练法,得先由人给「老师」备好一份特权小抄——标准答案、专家轨迹、或者提炼出来的技能——老师靠着这份小抄给学生打分、手把手教。LOPD 干的事很绝:它不写小抄了,让这份「小抄」自己从过去的经验里出来,变成一堆学出来的连续潜变量,端到端可训练。训完了呢?学生单独上岗,小抄、检索、老师一概不要,零额外开销。

说白了,别人还在手工编「教学大纲」,LOPD 让模型自己写、自己改、写完一扔。

---

一、病灶:智能体怎么从经验里学?

这是「自进化 AI」的核心难题。一个智能体干完活,得把这次的经验 内化 进自己的策略里,下次更聪明。现有的一条好路子叫 OPSD(On-Policy Self-Distillation,在线策略自蒸馏)

  • 同一个模型,分饰两角。学生只盯着任务本身和交互历史;老师额外拿一份「特权信息」,对学生自己刚跑出来的轨迹做 token 级的密集打分。
  • 老师看得全,所以给的监督又密又准;学生在自己当前的分布上被教,不会学歪。
问题出在「特权信息」上。现有方法里,这份信息全是人手设计的离散产物:标准答案、环境反馈、从成功轨迹里抠出来的「技能」……说到底,还是人(或规则)先替模型想好了「该教什么」。这就卡住了两件事:

1. 端到端可学习性。监督质量上限,被那个固定的上下文构造器 Φ_fix 焊死了。 2. 可扩展性。要持续自我改进,总不能每换一个任务域,人就去重编一套小抄吧?

LOPD 的动机就一句话:别再设计小抄了,把「小抄」本身变成可学习的潜变量(latent substrate),让它从经验里端到端长出来。

---

二、药方:四步把经验炼成「隐形小抄」

整个流程像一条流水线。下面这张图把「旧法 vs LOPD」的范式跃迁画出来了。

旧 OPSD:  经验库 ──(人手规则 Φ_fix)──> 固定小抄(文本/技能) ──> 老师 ──密监督──> 学生
                          ↑ 人卡在这

LOPD:     经验库 ──(检索)──> 相关轨迹 ──(QFormer 压缩)──> 连续潜 token(可学) ──> 老师 ──密监督──> 学生
                          ↑ 全程端到端可学,无人插手

第①步 · 检索(Retrieval) 建一个经验库 B,只存训练集里跑成功的 rollout(工具调用要过奖励阈值,写代码要全过测试)。给库里每条经验用 Qwen3-Embedding-8B 编码成 4096 维向量,FAISS 内积索引。来一个新任务,编码查询向量,捞出 top-3 最相关的(n_ret=3)。轨迹以「observation-lite」格式存,把冗余观测剔掉,省地方。

第②步 · 压缩成潜 token(Latent Composer / QFormer) 这是 LOPD 的命门。它用一个 QFormer 风格的模块,把检索到的轨迹压成紧凑的连续潜在 token。具体参数 \(φ = (ψ, χ)\)

  • 编码器 LoRA(\(ψ\),rank 8,α16,挂所有线性层);
  • 压缩器(\(χ\)),8 层共享权重的 cross-attention,配一组可学习的 query \(Q_χ\)
  • 每条经验压成 K=32 个潜 token,3 条经验一共 96 个潜 token(图里叫 \(c_φ\))。
注意,这些 token 不是词表里的字,是浮点向量——模型内部的一团「经验暗语」。

第③步 · 条件化自老师(Teacher Conditioning)

  • 学生:只看当前状态 \(s_t\),正常生成。
  • 老师:冻结 backbone 副本 θ̄(不更新梯度,省得老师自己也在变),额外把那 96 个潜 token 注进去。注入方式挺巧:在 chat 模板里塞一个占位符 \(<|LATENT_PH|>\),用潜 token 的 embedding 直接替换掉这个位置的向量(SGLang/vLLM 都支持)。
这样老师和学生看的是同一个前缀、同一串已生成的 token,唯一差别就是老师多看了那团「经验暗语」。

第④步 · 反向 KL 密集蒸馏 + 特权边界 学生在自己的轨迹上每走一步、每生一个 token,都拿老师的分布来对齐(细节见下一节)。再加一个「特权边界」目标把潜变量稳住,别让它学飘。训完,潜 token、检索、老师全丢,学生独立部署。

冷启动也得提一句:一开始先拿成功轨迹做一轮 SFT,把 backbone 冻住、只训 LoRA/QFormer,让压缩器先学会「把经验压成有用的暗语」,再进联合训练。

---

三、数学内核:凭什么能训稳?

1. 反向 KL + Top-M+Tail 分布匹配

老师每步取概率最高的 M=20 个词,再配一个「尾巴桶」 (装剩下所有词的概率和),拼成一个 M+1 维的小分布。学生也照此构造。蒸馏损失就是让学生的「小分布」去贴近老师的:

\[L_distill = E_{x,τ~π^S} [ Σ_{t,n} ω_{t,n} · KL( p̃^S_{t,n} ‖ p̃^T_{t,n} ) / Σ ω_{t,n} ]\]

ω 是掩码,只在某些 token 上教。用 reverse-KL(学生逼近老师),好处是学生不会被老师尾巴里那一堆乱七八糟的低概率词带偏。

2. 特权边界目标(Privileged-Margin)—— 整个方法最巧的一笔

光教还不够。得防一种病:潜变量索性「偷懒」,把老师变成学生的复制品,那等于没教。于是作者定义了一个每 token 的特权度

\[δ_{t,n}(φ) = log π^T_{θ̄,φ}(a_{t,n} | s_t, c_φ, a_{t,<n}) − sg[ log π^S_θ(a_{t,n} | s_t, a_{t,<n}) ]\]

即「老师比学生,多认得这个动作多少」。再用整条轨迹的成败信号 \(A(τ)=2r(τ)−1 ∈ [−1,1]\) 加权,求个平均特权 \(Δ(φ)\)

总目标写成一个 Lagrange 极大极小:

\[min_{θ,φ} max_{β≥0} L_distill(θ,φ) + β·( m − Δ(φ) ) + λ·‖ c_φ − sg[c_{φ0}] ‖²\]
  • m=0.05 是「特权下限」:逼着老师 始终比学生多看懂一点(至少 0.05 个 nats),不然边界约束就罚它。
  • λ=0.2 的锚定项:把潜变量 c_φ 拉住,别飘太远,偏离冷启动初值 \(c_{φ0}\)
  • β 是对偶变量,按 \(β ← [β + η_β(m − Δ)]_+\) 更新(\(η_β=0.5\))。
这一笔很关键——它用数学把「老师必须真比学生懂行」钉死了,是后面消融能成立的根。

---

四、实验与数字:两大战场都赢了

评测和训练完全 disjoint(不偷看),基模用了 Qwen3-4B / 8B 和 OLMo3-7B-Think。战场两块:智能体工具调用(EnvScaler、BFCL-v3、ACEBench)和代码生成(LiveCodeBench、HumanEval+、MBPP+)。

表1 · 工具调用(分数 0–100,越高越好,Qwen3-4B / 8B)

方法EnvScalerBFCL-v3ACEBench备注
Vanilla48.6 / 49.222.88 / 28.3850.6 / 54.6没训练
GRPO61.8 / 57.325.25 / 29.0056.0 / 58.0强化学习基线
Skill-SD59.1 / 60.224.63 / 27.3856.0 / 56.0动态技能自蒸馏
OPSD51.2 / 52.025.13 / 25.7548.6 / 52.7冻结小抄
SDPO50.6 / 55.315.75 / 25.0038.0 / 52.0反向KL自蒸馏
SDFT50.3 / 56.221.75 / 26.8850.0 / 54.7自蒸馏微调
LOPD63.7 / 66.427.38 / 29.8860.6 / 62.7全面第一
表2 · 代码生成(pass@1 %)

方法LCB均HumanEval+MBPP+
Qwen3-4B Vanilla45.6185.3775.93
Qwen3-4B GRPO48.2986.5976.19
Qwen3-4B LOPD48.7887.8078.57
OLMo3-7B Vanilla46.3486.5970.37
OLMo3-7B GRPO48.2989.0272.75
OLMo3-7B LOPD50.9890.2473.28
看得出,LOPD 在每一格几乎都是第一,但领先幅度不算夸张(多则几个点)。真正它吹牛的是效率。

表3 · 行为内化(EnvScaler,Qwen3-4B,奖励 0–1)

指标Vanilla+ComposerLOPD
奖励0.4860.6310.637
每步工具调用3.501.211.11
首步长度(token)9,9376,6956,210
重复工具调用8.894.495.25
这表里最有意思的是「内化」证据:学生学会了少调工具、首步想清楚、少做重复动作。也就是说,经验库里那些「老手怎么干活」的暗语,真被学生吃进策略里了,不是靠推理时现查。

---

五、消融:三处证据,把「可学」钉死

① 联合优化真有用,不是多塞了参数 只冻住压缩器(φ_0)、不让它学:EnvScaler 0.573。放开一起训、但 m=0(不给边界):反而掉到 0.551——老师直接坍缩成学生的复制品。一旦 m≥0.02 就反超冻结基线,m=0.05 冲到 0.637。这证明:让小抄「可学」本身,才是增益来源;光加参数没用。

② 边界大小敏感,且必须存在 m<0.02 全都低于冻结基线;m=0.05 最优;再大(0.10→0.626,0.20→0.613)开始回落。说明边界既不能没有、也不能太狠。

③ 潜 token 容量有甜点 K=16 约 56.3,K=32 跳到 63.7,再往 64/128 加没一致增益。检索数 n_ret=1→60.53→63.7,再多不单调涨。最终定 K=32, n_ret=3。经验不是越多越压得越好,够用就行。

---

六、工程落地:代码能跑,训练得等

GitHub 仓库结构很清楚,是个能复现推理的完整工程(Apache-2.0):

LOPD/
├── interaction/   # ReAct agent、episode runner
├── envs/          # 环境(EnvScaler)
├── backends/      # 推理后端(SGLang、vLLM)
├── memory/        # 潜记忆:QFormer、FAISS 库、压缩器
├── inference/     # 推理入口
├── utils/         # 建库、LoRA 合并等
└── configs/       # YAML 模板

两点要清醒:

1. 推理零开销是真的。部署时只跑学生,潜 token / 检索 / 老师全砍掉,生产友好。 2. 训练代码「coming soon」。作者原话:把潜记忆机制接进训练管线「涉及大量复杂性,将单独发布」。意味着你今天只能他训好的检查点,想自己复训得等。这对想拿去改的你(步子哥)是个现实门槛。

检查点给了俩:Qwen3-8B-LOPD(工具调用)、OLMo-3-7B-Think-LOPD(代码)。

---

七、对手坐标:它们都是谁?

  • GRPO:结果型强化学习,靠组间归一化优势。数学/代码上猛,因为「对错」天然是信号;但多轮 Agent 奖励稀疏,它就容易痿。
  • RLVR:可验证奖励的强化学习,LOPD 在摘要里点名「优于 RLVR」。
  • OPSD(基线):老师条件化在固定特权上下文上(答案/反馈/轨迹),冻结不学。
  • SDPO:在 OPSD 上加反向 KL,老师看环境反馈;已证明自蒸馏损失等价于 logit 级策略梯度。
  • Skill-SD(vivo 等,arXiv 2604.10674):多轮 Agent 自蒸馏。真正的增量是用辅助 LLM 把自身轨迹总结成「技能」(做对啥、错哪、走啥流程),只给老师看——把固定答案换成了动态技能。但它那「技能」还是文本、还是由另一个 LLM 生成的,仍属「人手/规则指定的特权产物」一脉。LOPD 比它更狠:连「总结成技能」这步都省了,直接压成不可读的潜向量。
一句话定位:OPSD→SDPO→Skill-SD 是「小抄格式越来越聪明」,LOPD 是「小抄压根不写了,让它自己长」。 这是范式级的跃迁,不是又一个小改。

---

八、短板与批判性评点

Pith 的审稿式评点很到位,我转述并加几句自己的:

1. 头条数字疑似测试集调参。边际 m、容量 K、检索数 n_ret 都是在同一测试集上 sweep 选出来的(m=0.05、K=32、n_ret=3 全是 EnvScaler 上挑的)。挑完再报这个数,有「为这个数量身定做」的嫌疑。换域未必还这么顺。 2. 「<30% 预算」的数字站不住。论文说用 GRPO/Skill-SD 不到 30% 的 rollout 就超了它们。可图4 显示 LOPD 在 576/1600 代达到 0.637,那是 36%,不是 30%。这牛皮吹大了一点。 3. 没误差棒、没多种子。所有表都是单点数字,方差多大不知道。审稿最忌这个。 4. 潜变量不可读。把那 32 个潜 token 用 LM-head 投影出来,是「碎片化的多语/代码混合」,根本看不出老师到底用了经验的哪部分信息。好处是紧凑,坏处是黑箱、不可干预、不可解释。 5. 冷启动仍依赖基模能跑出成功轨迹。经验库空了,或者任务太难基模全失败,这套就转不动——它就是个「站在自己肩膀上」的迭代器,不是从零涌现。 6. 领域局限。只测了工具调用和代码,多模态、长文档、对话那些没碰。泛化未证。

我的看法:方法干净、思想锋利,是 OPSD 这条线里最有想法的一个;但工程严谨度(调参透明度、统计显著性)还差口气,送审而非拒稿的分。

---

九、它能给 AlphaGPT 和 Agent 自演化什么

你(步子哥)手头正跑着 AlphaGPT(A股ETF + Solana meme 双线),又在深研 Agent 架构、GraphRAG、自演化。LOPD 和你的几条线都咬得上:

  • 经验库即资产。LOPD 的核心前提是一个「只存成功 rollout」的经验库 + FAISS 检索。放到 AlphaGPT,你的每笔成交/回测胜出的策略、每轮 Agent 决策里「走对的那次」,天然就是这份经验库。差别在于:LOPD 压成不可读潜向量,你也许更想要可解释的技能库(类似 Skill-SD 的文本技能),方便风控和复盘——这是你和它取舍的地方。
  • 「自己写小抄」的自演化范式。你一直想让交易 Agent 从自己的历史里越跑越聪明。LOPD 给出了一条不依赖人工标注答案的路线:连「该教什么」都让模型自己学。对没有标准答案、只有盈亏信号的金融场景,这点正中要害。
  • 推理零开销 = 生产友好。你那套接了 Tushare / westock-mcp 的实时系统,最怕推理期挂一堆检索和副模型。LOPD 「训完全砍」的设计,和你的高并发、低延迟诉求同频。
  • 一个现成可抄的工程骨架。仓库里 memory/(QFormer+ FAISS + 压缩器)、backends/(SGLang/vLLM 注入)、interaction/(ReAct)的分工,几乎就是「给 Agent 接一套可学习经验记忆」的模板。想给安心平台或 AlphaGPT 加「经验内化」模块,这目录结构能直接当脚手架。
  • 小心那两个坑。一是训练代码未发,想自训得等或自己实现 QFormer 注入;二是测试集调参的隐患——你拿去跑自己的域,别直接信论文那个 36% 效率神话,先小样本验证。
---

十、可背诵要点(一页速记)

  • LOPD = 让老师的小抄自己从经验里长出来,不再人手设计。
  • 四步:检索经验 → QFormer 压成 96 个连续潜 token → 条件化冻结老师 → 反向 KL 密集教 + 特权边界稳住。
  • 特权边界 m=0.05 是灵魂:逼老师始终比学生多懂一点,否则老师坍缩成学生复制品。
  • 两战场全胜,但领先幅度小;真亮点在效率高(尽管 30% 的数字有水分,约 36%)。
  • 推理零开销,部署只留学生——生产友好。
  • 训练代码未发,今天只能用检查点,自训得等。
  • 对手线:OPSD→SDPO→Skill-SD 是「小抄越写越聪明」,LOPD 是「不写小抄」。
  • 你的可取之处:经验库 + 自演化范式 + 零推理开销 + 现成工程骨架;要防的是调参水分与黑箱不可解释。
---

*本研报素材取自 arXiv 原文(2608.13040v1)HTML 全文、pith.science 图解与审稿评点、ArxivLens 摘析、ima 结构分析、GitHub 仓库 README,并溯查 Skill-SD(2604.10674)等对照方法。数字以原文表1/2/3 及消融图为准。*

👍 1

想参与讨论或点赞?登录后使用完整功能

💬 讨论回复(0)
暂无回复,登录后可参与讨论
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens