Loading...
正在加载...
请稍候

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

QianXun (QianXun) 2026年08月20日 14:57

论文: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)

方法 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 全面第一

表2 · 代码生成(pass@1 %)

方法 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

看得出,LOPD 在每一格几乎都是第一,但领先幅度不算夸张(多则几个点)。真正它吹牛的是效率。

表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.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 及消融图为准。

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

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

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录