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_φ\))。
第③步 · 条件化自老师(Teacher Conditioning)
- 学生:只看当前状态 \(s_t\),正常生成。
- 老师:冻结 backbone 副本
θ̄(不更新梯度,省得老师自己也在变),额外把那 96 个潜 token 注进去。注入方式挺巧:在 chat 模板里塞一个占位符 \(<|LATENT_PH|>\),用潜 token 的 embedding 直接替换掉这个位置的向量(SGLang/vLLM 都支持)。
第④步 · 反向 KL 密集蒸馏 + 特权边界 学生在自己的轨迹上每走一步、每生一个 token,都拿老师的分布来对齐(细节见下一节)。再加一个「特权边界」目标把潜变量稳住,别让它学飘。训完,潜 token、检索、老师全丢,学生独立部署。
冷启动也得提一句:一开始先拿成功轨迹做一轮 SFT,把 backbone 冻住、只训 LoRA/QFormer,让压缩器先学会「把经验压成有用的暗语」,再进联合训练。
---
三、数学内核:凭什么能训稳?
1. 反向 KL + Top-M+Tail 分布匹配
老师每步取概率最高的 M=20 个词,再配一个「尾巴桶」 ⊥(装剩下所有词的概率和),拼成一个 M+1 维的小分布。学生也照此构造。蒸馏损失就是让学生的「小分布」去贴近老师的:
ω 是掩码,只在某些 token 上教。用 reverse-KL(学生逼近老师),好处是学生不会被老师尾巴里那一堆乱七八糟的低概率词带偏。
2. 特权边界目标(Privileged-Margin)—— 整个方法最巧的一笔
光教还不够。得防一种病:潜变量索性「偷懒」,把老师变成学生的复制品,那等于没教。于是作者定义了一个每 token 的特权度:
即「老师比学生,多认得这个动作多少」。再用整条轨迹的成败信号 \(A(τ)=2r(τ)−1 ∈ [−1,1]\) 加权,求个平均特权 \(Δ(φ)\)。
总目标写成一个 Lagrange 极大极小:
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)
| 方法 | EnvScaler | BFCL-v3 | ACEBench | 备注 |
|---|---|---|---|---|
| Vanilla | 48.6 / 49.2 | 22.88 / 28.38 | 50.6 / 54.6 | 没训练 |
| GRPO | 61.8 / 57.3 | 25.25 / 29.00 | 56.0 / 58.0 | 强化学习基线 |
| Skill-SD | 59.1 / 60.2 | 24.63 / 27.38 | 56.0 / 56.0 | 动态技能自蒸馏 |
| OPSD | 51.2 / 52.0 | 25.13 / 25.75 | 48.6 / 52.7 | 冻结小抄 |
| SDPO | 50.6 / 55.3 | 15.75 / 25.00 | 38.0 / 52.0 | 反向KL自蒸馏 |
| SDFT | 50.3 / 56.2 | 21.75 / 26.88 | 50.0 / 54.7 | 自蒸馏微调 |
| LOPD | 63.7 / 66.4 | 27.38 / 29.88 | 60.6 / 62.7 | 全面第一 |
| 方法 | LCB均 | HumanEval+ | MBPP+ |
|---|---|---|---|
| Qwen3-4B Vanilla | 45.61 | 85.37 | 75.93 |
| Qwen3-4B GRPO | 48.29 | 86.59 | 76.19 |
| Qwen3-4B LOPD | 48.78 | 87.80 | 78.57 |
| OLMo3-7B Vanilla | 46.34 | 86.59 | 70.37 |
| OLMo3-7B GRPO | 48.29 | 89.02 | 72.75 |
| OLMo3-7B LOPD | 50.98 | 90.24 | 73.28 |
表3 · 行为内化(EnvScaler,Qwen3-4B,奖励 0–1)
| 指标 | Vanilla | +Composer | LOPD |
|---|---|---|---|
| 奖励 | 0.486 | 0.631 | 0.637 |
| 每步工具调用 | 3.50 | 1.21 | 1.11 |
| 首步长度(token) | 9,937 | 6,695 | 6,210 |
| 重复工具调用 | 8.89 | 4.49 | 5.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.5,3→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 比它更狠:连「总结成技能」这步都省了,直接压成不可读的潜向量。
---
八、短板与批判性评点
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 及消融图为准。*