OPSFT:RL 泛化好的秘密藏在参数更新方向里,借给 SFT 就行

"SFT 记东西,RL 会泛化"——这个说法在圈子里流传很久了,Chu et al. 2025 那篇对比研究把它写成了标题,大家也就默认接受了这个分工:想要泛化就老实跑 RL,SFT 只配当冷启动。

但 RL 贵啊。rollout、reward、KL、动辄十几个小时的训练时间,每一步都在烧卡。所以一个自然的问题是:RL 的泛化优势到底是怎么来的?如果找到了这个"开关",能不能直接把它移植到便宜的 SFT 上?

之前已经有人在这条路上刨过:Mukherjee et al. 发现 RL 微调只动了一小撮子网络的参数,Shen et al. 发现 RL 的谱偏移很小。但这些研究都把观察到的现象当"副产品"记录下来就完了——知道了 RL 更新稀疏、谱偏移小,然后呢?没人把这些行为当成可以主动利用的优化原则。

这篇论文(arXiv:2609.36659)补上了这一环。它做的事一句话就能说完:先用几十步 GRPO 探出每个参数该往哪个方向走,然后强制 SFT 只许沿这个方向更新。就这么个改动,SFT 的泛化直接追平甚至反超 GRPO,训练时间还砍了一半多。

核心摘要:作者先证明 SFT 训练时参数更新方向几乎不变(累计方向余弦相似度接近 1.0),而 on-policy 范式在持续调整方向(相似度只有 0.5 左右),并据此提出 OPSFT——把 on-policy 训练得到的逐参数更新方向(一个 \(\{-1,0,1\}^d\) 的符号向量)作为硬约束套在 SFT 上。结果相当能打:Qwen3-4B 上 OPSFT 平均分 40.11 反超 100 步 GRPO 的 38.96,耗时只有 6.4 小时对 16.5 小时;只动 0.408% 参数的 BF16 设置下都比全量 SFT 高 2.6 个点。这不是又一个刷榜 trick,而是给"RL 为什么泛化好"提供了一个可迁移的机制解释,值这个时间读。

论文信息 - 标题:On-Policy Parameter Update Direction Underlies Generalization in LLM Post-Training - 作者:Shufan Shen, Zhongni Hou, Junshu Sun, Yufei Zhang, Wei Lin, Guojun Yin, Qingming Huang, Shuhui Wang - 机构:中科院计算所人工智能安全重点实验室 / 中国科学院大学 / 美团 - 链接:https://arxiv.org/abs/2609.36659 (代码:https://github.com/ssfgunner/OPSFT)


📖 先搞清楚:SFT 和 on-policy 的更新方向到底差在哪

作者的切入角度很朴素。既然前人已经发现 on-policy 更新的"位置"很特别(稀疏、集中在小子网络),那就把考察对象往前推一步——不只看更新哪些参数,还要看每个参数是往大了调还是往小了调,也就是更新方向(location + sign)。

理论上两者的差别可以写得很干净。给定 prompt \(x\) 和轨迹 \(\tau\),记轨迹对数概率的梯度为:

\[s_{\boldsymbol{\theta}}(x,\tau)=\nabla_{\boldsymbol{\theta}}\log\pi_{\boldsymbol{\theta}}(\tau\mid x)\]

它有个关键性质:在当前策略下条件期望为零,\(\mathbb{E}_{\tau\sim\pi_\theta}[s_\theta(x,\tau)]=\boldsymbol{0}_d\)。

于是 on-policy 的策略梯度沿任意符号向量 \(\boldsymbol{v}\) 的投影,可以改写成优势函数和轨迹梯度的协方差:

\[\boldsymbol{v}^{\top}g_{\mathrm{on}}(\boldsymbol{\theta})=\mathbb{E}_{x}\big[\boldsymbol{v}^{\top}\mathrm{Cov}_{\tau\sim\pi_{\boldsymbol{\theta}}}\left[A_{\boldsymbol{\theta}}(x,\tau),s_{\boldsymbol{\theta}}(x,\tau)\right]\big]\]

而 SFT 的对应量是:

\[\boldsymbol{v}^{\top}g_{\mathrm{sft}}(\boldsymbol{\theta})=-\mathbb{E}_{x}\big[\boldsymbol{v}^{\top}\mathbb{E}_{\tau\sim\pi_{\mathrm{teacher}}}\left[s_{\boldsymbol{\theta}}(x,\tau)\right]\big]\]

对比一下就看明白了。SFT 的轨迹来自固定的 teacher 分布,更新方向盯着一个不动的目标怼;on-policy 的轨迹来自当前策略 \(\pi_\theta\),而 \(\pi_\theta\) 自己一直在变,优势分布跟着变,更新方向自然也得跟着变。

说实话这个推导谈不上多深奥,但它把一个模糊的直觉("RL 在探索")落到了可测量的量上。

实验验证也干脆:拿 Qwen3-1.7B 在 DeepMath 上分别跑 SFT、OPD、GRPO,看不同训练阶段更新方向的余弦相似度矩阵。

图2:SFT 与 on-policy 范式更新方向对比

图2:左半部分是"区间更新"(相邻阶段之间)的方向相似度,右半是"累计更新"的相似度。SFT 的累计方向热力图红得发紫——相似度接近 1.0,从头到尾一条道走到黑;OPD 和 GRPO 只有 0.5 上下,说明方向在持续调整。区间更新那边更明显:SFT 各阶段方向正相关,on-policy 各阶段之间近乎正交。

这个对比就是整篇论文的支点:on-policy 范式花那么多算力 rollout,换来的核心动作是不断修正每个参数该往哪走。那如果把这个修正完的方向直接"抄"给 SFT 呢?

图1:方法核心示意

图1:(a) SFT 沿固定方向一头扎进弱泛化区域;(b) on-policy 范式不断拐弯,最终到达强泛化区域;(c) OPSFT 的思路——把 on-policy 探出来的方向投影给 SFT 的每一步更新,让 SFT 沿着别人探好的路走。


🧠 OPSFT:给 SFT 的梯度装一个"方向闸门"

方法本身简单到可以一行写完。先用 on-policy 训练(比如 100 步 GRPO)得到前后参数 \(\boldsymbol{\theta}_{\mathrm{base}}\) 和 \(\boldsymbol{\theta}_{\mathrm{on}}\),算出逐参数的符号向量:

\[\boldsymbol{v}=\mathrm{sign}(\boldsymbol{\theta}_{\mathrm{on}}-\boldsymbol{\theta}_{\mathrm{base}})\in\{-1,0,1\}^{d}\]

然后 SFT 的每一步,把梯度里方向不对的元素直接清零:

\[\boldsymbol{g}_{s}=\mathbb{I}\left(\mathrm{sign}(-\boldsymbol{g})=\boldsymbol{v}\right)\odot\boldsymbol{g}\]

注意 \(\boldsymbol{v}\) 里的 0 同时起到 location 约束的作用——on-policy 没动的参数,SFT 也不许动。所以这一个符号向量其实同时编码了"更新哪些参数"和"每个参数往哪边更新"两件事。

工程上有个细节值得说:光在梯度层面 mask 还不够。AdamW 的 weight decay 和动量项可能把参数偷偷拽回反方向,所以 OPSFT 在 optimizer step 之后还做了一次硬投影——凡是累计位移方向和 \(\boldsymbol{v}\) 相反的参数,直接重置回初始值。附录里的伪代码把这个两阶段约束写得很清楚:stage 1 清梯度,stage 2 掰参数。这个设计挺务实的,不做投影的话约束会被优化器自己的正则项稀释掉。

整套流程的训练配置也不花哨:SFT/OPSFT 用交叉熵,FP32 + FSDP2 跑在 8 张 H20 上,global batch 64,学习率 \(1\times 10^{-7}\),700 步;提供方向的 GRPO 用标准配置(rollout \(n=8\),lr \(1\times 10^{-6}\),KL 系数 0)。SFT 数据是 Qwen3-30B-A3B 生成并经 math_verify 验证过的轨迹(数学 44,810 条,代码 9,585 条)。


📊 实验:方向借过来,SFT 真的能打

主实验在 Qwen3-1.7B/4B/8B 和 DeepSeek-R1-Distill-Llama-3-8B 上跑,训练用 DeepMath,评测用 AIME24/25 和 HMMT25 Feb/Nov 四个竞赛级数学基准(每个题采 8 个解算 Acc@8)。

图3:不同模型和基准上的性能对比

图3:三行分别是 Qwen3-1.7B/4B/8B,五列是四个基准加平均分。绿色线(OPSFT direction)在绝大多数设置下压过蓝色线(Vanilla SFT),并贴着甚至越过灰色虚线(GRPO)。橙色的 OPSFT location——只约束更新位置不约束方向——反而经常比 vanilla SFT 还差。

橙色那条线是我觉得这篇论文里最值钱的一个对照。它说明之前大家发现的"on-policy 更新位置稀疏"这个性质单独拿出来没用,甚至有害;真正把泛化优势带过来的是方向(符号)。从 \(\{0,1\}^d\) 的位置约束扩展到 \(\{-1,0,1\}^d\) 的方向约束,看似只加了一个 bit 的信息,效果却是天壤之别。

效率场景:50 步 GRPO 探路 + 100 步 OPSFT

这是论文最实用的卖点。先用 50 步 GRPO 探方向,再跑 100 步 OPSFT,对比 100 步 GRPO、700 步 SFT、700 步 DFT(DFT 是 ICLR 2026 那篇用 token 概率重加权修复 SFT 隐式奖励的工作,算是"改进 SFT 泛化"这条线上最直接的竞品):

模型 方法 耗时 AIME24 AIME25 HMMT-Feb HMMT-Nov 平均
Qwen3-1.7B GRPO 4.9h 16.67 17.08 7.92 6.67 12.09
SFT 3.5h 19.48 17.92 8.96 6.25 13.15
DFT 3.9h 18.25 17.72 10.00 6.67 13.16
OPSFT 2.3h 20.00 21.67 9.58 9.17 15.11
Qwen3-4B GRPO 16.5h 50.83 45.31 26.35 33.33 38.96
SFT 8.1h 46.67 39.79 23.02 27.40 34.22
DFT 8.6h 46.44 39.19 25.08 28.04 34.69
OPSFT 6.4h 52.92 50.42 25.83 31.25 40.11
Qwen3-8B GRPO 19.3h 54.17 44.58 28.33 34.17 40.31
SFT 13.2h 52.60 44.48 23.85 32.71 38.41
DFT 13.9h 54.23 43.92 24.50 33.23 38.97
OPSFT 8.9h 57.92 42.92 26.67 39.17 41.67
R1-Distill-Llama-8B GRPO 18.2h 36.25 29.17 17.50 17.92 25.21
SFT 13.6h 24.16 23.75 12.50 11.67 18.02
DFT 14.1h 31.67 24.58 14.58 8.75 19.90
OPSFT 8.1h 37.91 30.41 17.92 20.00 26.56

表2:训练时间含方向识别开销。所有模型上 OPSFT 平均分都是最高,时间比 GRPO 少一半以上(8.9h vs 19.3h),比 SFT/DFT 还快。

有几个点值得停下来看一眼。OPSFT 用的方向只来自 50 步 GRPO,而对比的 GRPO 跑了 100 步——也就是说探路用的信息是残缺的,结果照样反超。8B 上 OPSFT 比 GRPO 高 1.36 个点、省 54% 时间;R1-Distill 上差距拉得更开,26.56 对 19.90 的 DFT,高了 6.7 个点。这个幅度不是噪声能解释的。

代码任务上结论一致:Qwen3-4B 在 Eurus 上训练,OPSFT 平均 58.07 对 GRPO 的 57.19、SFT 的 54.30,耗时 9.5h 对 20.3h。

OOD 泛化:数学训完,别的任务也跟着涨

在 DeepMath 上训完,拿去测 IFEval、ARC、HaluEval、Hellaswag、Winogrande、PIQA 六个域外基准:

模型 方法 IFEval ARC HaluEval Hellaswag Winogrande PIQA 平均
Qwen3-4B Base 87.65 87.71 72.20 52.25 65.82 74.97 73.43
SFT 86.45 87.88 73.40 52.41 66.30 75.46 73.65
GRPO 88.61 87.88 73.70 52.25 66.22 75.03 73.95
OPSFT 88.97 87.97 73.80 52.22 66.46 75.24 74.11
Qwen3-8B Base 87.05 90.53 75.60 57.20 67.96 76.77 75.85
SFT 87.53 90.61 72.70 57.21 68.19 76.99 75.54
GRPO 89.09 90.53 76.00 57.14 67.80 76.66 76.20
OPSFT 88.13 90.70 77.10 57.15 68.35 76.88 76.39

表1:域外基准上 OPSFT 平均分最高,甚至略高于提供方向的 GRPO。注意 8B 上 SFT 的平均分(75.54)比 base(75.85)还低——SFT 学数学把通用能力学退化了,OPSFT 没有这个问题。

坦率的讲,这些 OOD 基准的绝对差距都在 1 个点以内,单个看都不大。但方向是一致的:OPSFT 在 12 个格子(2 模型 × 6 基准)里几乎全占优,而且避免了 SFT 那种"学了这个忘了那个"的退化。

方向可以跨数据集复用,但不能跨领域

图4:更新位置与方向的跨数据集/跨领域对比

图4:左图,更新位置的 Jaccard 重叠度在同领域(DAPO vs DeepMath,都是数学)和跨领域(Eurus 代码 vs DeepMath)之间差不多,都是 0.4 上下;中图,方向余弦相似度差别巨大——同领域 0.16,跨领域只有 0.016~0.063;右图,在 DeepMath 上用 DAPO 探的方向训 OPSFT(棕色线)效果跟用 DeepMath 自己的方向(绿色)几乎一样好,用 Eurus 的方向(灰色)则明显拖后腿。

这组实验信息量很大。位置重叠度跨不跨领域都差不多,再次说明"位置"携带的领域信息很少;方向才是领域能力的载体。另一个有点反直觉的发现:DAPO 和 DeepMath 明明都是数学,方向余弦相似度也只有 0.2 左右,说明同一个领域里存在多条都能通往强泛化的方向——方向不是唯一的"真理解",更像是一簇可行解。

继续训练:RL 完的模型,拿新数据接着喂

这是我个人觉得工程价值最高的一个应用场景。现实里经常遇到:模型 RL 训完了,过段时间又攒了一批高质量轨迹,想再提升一波。直接 SFT?论文里的数据告诉你不行——Qwen3-4B 的 GRPO 后模型(38.96)被 700 步 SFT 直接干到 36.25,R1-Distill 更惨,25.21 掉到 16.36。辛辛苦苦 RL 出来的能力被 SFT 一把洗掉。

模型 方法 AIME24 AIME25 HMMT-Feb HMMT-Nov 平均
Qwen3-4B Base (GRPO 后) 50.83 45.31 26.35 33.33 38.96
继续 SFT 50.00 42.08 24.17 28.75 36.25
继续 OPSFT 56.67 44.17 27.92 36.67 41.36
Qwen3-8B Base (GRPO 后) 54.17 44.58 28.33 34.17 40.31
继续 SFT 52.92 39.58 25.00 32.50 37.50
继续 OPSFT 57.08 48.75 27.91 35.83 42.39
R1-Distill-Llama-8B Base (GRPO 后) 36.25 29.17 17.50 17.92 25.21
继续 SFT 21.25 22.08 11.67 10.42 16.36
继续 OPSFT 37.10 31.67 17.92 17.92 26.15

表3:在 GRPO 后模型上继续训 700 步。SFT 全线掉点,OPSFT 全线涨点。代码任务同样如此:Eurus 上 SFT 把 57.19 掉到 48.71,OPSFT 推到 60.05。

OPSFT 相当于把"增量学习"变成了可能:不用从头再来一遍 SFT→RL 流水线,沿原来的方向继续走就行。对持续迭代的业务场景来说这个价值很实在。


🔬 消融与分析

探方向要探多久? 用 GRPO 第 50/100/150 步的方向分别训 OPSFT:

图5:不同 GRPO 步数识别的方向对 OPSFT 的影响

图5:越晚识别的方向效果越好,但边际收益递减——100 步方向比 50 步的提升,大于 150 步比 100 步的提升。结合表2(50 步方向就够用),实践中探方向的预算不用给太多。

约束起作用是因为方向本身,还是因为梯度 mask 的正则化副作用? 这是这类方法最容易被质疑的点,作者用一组随机对照堵住了:随机位置约束平均 30.84,on-policy 位置约束 34.07,on-policy 位置 + 随机方向 27.71(方向乱给比不给还糟),完整 on-policy 方向 41.15。梯度 mask 本身没有带来增益,增益确实来自"正确的方向"。

只更新 0.4% 的参数还能涨 24.6 个点? 精度消融挺震撼。BF16 下小梯度会被数值精度吃掉,vanilla SFT 只有 2.702% 参数真正动了,OPSFT 更是稀疏到 0.408%——但就这 0.4% 的更新,平均分 40.94 对 SFT 的 38.33,比 base 的 16.35 高出 24.59 个点。换 FP32 后 SFT 更新变密(89.286% 参数),OPSFT 仍只动 9.454%,42.81 分反超提供方向的 GRPO(42.01)。稀疏到这个程度还有效,说明方向信息的"含智量"极高。

图6:OPSFT 训练中的更新行为

图6:OPSFT 的更新位置被约束在固定子集内(稀疏度稳定在 90%+ 高稀疏、Jaccard 接近 1.0),但矩阵级别的累计方向相似度在早期和后期差异明显——参数级的符号约束先把优化轨迹"掰"到一个利于泛化的矩阵级方向上,之后沿该方向继续优化。

行为层面像不像 RL? 作者统计了回答长度、多次采样的准确率标准差、每千词的分类讨论提示词(if / otherwise / consider a case)和逻辑连接词(therefore / because)频率:

图7:推理行为对比

图7:OPSFT 的回答长度和 vanilla SFT 相当(不是简单变长),但准确率标准差更接近 GRPO,分类讨论和逻辑连接词的使用频率也随训练向 GRPO 靠拢。方向约束改变的是推理的"行为模式",不只是输出长度。

附录还有一组谱分析(Figure A8):OPSFT 的更新矩阵奇异值分布比 SFT 更均匀、stable rank 高出一个数量级(比如 layer 24 的 down_proj:SFT 3.1,GRPO 37.9,OPSFT 58.1),主奇异向量的旋转角度也更小——之前被认为是 on-policy 内在属性的谱特征,原来只要方向对了,SFT 也能复现。

另外补一句附录 B 的 OPD 实验:换 OPD 作为方向提供者,结论完全复现(OPSFT direction 16.71 vs OPD 16.75 vs vanilla SFT 13.83),说明这个机制不绑定 GRPO。


🤔 我的判断

这篇论文最值钱的地方不是 OPSFT 这个方法本身——方法简单到看完公式就能手写——而是它把"RL 为什么比 SFT 泛化好"这个老大难问题的答案压缩到了一个可迁移的载体上:逐参数的累计更新方向。

跟同期工作比一下位置。DFT 从损失函数里 SFT 隐式奖励的 \(1/\pi_\theta\) 权重入手,改的是"梯度多大";OPSFT 改的是"梯度往哪"。一个调幅度,一个调方向,表2 里两者正面对刚,OPSFT 全面占优(4B 上 40.11 vs 34.69)。而那些分析 on-policy 更新几何性质的工作(更新位置稀疏、谱偏移小),这篇论文用 location-only 的对照实验证明了它们找的东西不完整——位置只是方向的载体,符号才是灵魂。

但有几个地方得泼点冷水。

第一,OPSFT 并不是"不用跑 RL"。你还是得先跑几十到一百多步 on-policy 训练把方向探出来,rollout 的钱一分没省,只是后面的大头训练变便宜了。把它说成"SFT 替代 RL"是不准确的,它更像"RL 探路 + SFT 赶路"的两段式流水线。

第二,方向是个静态的、一次性的量。探完就固定了,后面 700 步 SFT 都沿这一个方向走。on-policy 训练里方向是随策略演化持续修正的(图2 右半的热力图清楚地显示这一点),OPSFT 相当于把这个动态过程冻结成了快照。快照够不够用取决于任务,论文没讨论方向在 SFT 过程中"过期"的问题——图5 显示越晚的方向越好,那如果 SFT 要训更久,是不是得中途重新探方向?没答案。

第三,作者自己也承认的 limitation:所有实验的 SFT 轨迹都是 Qwen3-30B-A3B 这种比学生强得多的 teacher 生成并验证过的。真实场景里轨迹的多样性、正确率、与目标模型的匹配度都会影响结论,这块论文明确说没控制住。方向约束 + 烂数据会发生什么,是个开放问题。

第四,评测集中在数学和代码推理,模型最大 8B。方向迁移这套在更大模型、通用对话场景上是否成立,还得看后续。

瑕不掩瑜。如果你手头的 pipeline 是"RL 太贵跑不起、SFT 又泛化差",这篇给了一个很具体的中间路线:花小钱跑几十步 GRPO 探方向,剩下的交给带方向闸门的 SFT。如果你已经在跑 RL,那"继续训练不毁能力"这个用法可能更实用——新数据来了不用重开流水线。

更深一层的启发是:后训练方法之间差的也许不是目标函数、不是数据构造,而是参数空间里那条轨迹的几何形状。把优化行为本身当成可以跨范式迁移的一等公民,这个视角比 OPSFT 本身更值得记住。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我