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\),记轨迹对数概率的梯度为:
它有个关键性质:在当前策略下条件期望为零,\(\mathbb{E}_{\tau\sim\pi_\theta}[s_\theta(x,\tau)]=\boldsymbol{0}_d\)。
于是 on-policy 的策略梯度沿任意符号向量 \(\boldsymbol{v}\) 的投影,可以改写成优势函数和轨迹梯度的协方差:
而 SFT 的对应量是:
对比一下就看明白了。SFT 的轨迹来自固定的 teacher 分布,更新方向盯着一个不动的目标怼;on-policy 的轨迹来自当前策略 \(\pi_\theta\),而 \(\pi_\theta\) 自己一直在变,优势分布跟着变,更新方向自然也得跟着变。
说实话这个推导谈不上多深奥,但它把一个模糊的直觉("RL 在探索")落到了可测量的量上。
实验验证也干脆:拿 Qwen3-1.7B 在 DeepMath 上分别跑 SFT、OPD、GRPO,看不同训练阶段更新方向的余弦相似度矩阵。

图2:左半部分是"区间更新"(相邻阶段之间)的方向相似度,右半是"累计更新"的相似度。SFT 的累计方向热力图红得发紫——相似度接近 1.0,从头到尾一条道走到黑;OPD 和 GRPO 只有 0.5 上下,说明方向在持续调整。区间更新那边更明显:SFT 各阶段方向正相关,on-policy 各阶段之间近乎正交。
这个对比就是整篇论文的支点:on-policy 范式花那么多算力 rollout,换来的核心动作是不断修正每个参数该往哪走。那如果把这个修正完的方向直接"抄"给 SFT 呢?

图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}}\),算出逐参数的符号向量:
然后 SFT 的每一步,把梯度里方向不对的元素直接清零:
注意 \(\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:三行分别是 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:左图,更新位置的 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:越晚识别的方向效果越好,但边际收益递减——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 的更新位置被约束在固定子集内(稀疏度稳定在 90%+ 高稀疏、Jaccard 接近 1.0),但矩阵级别的累计方向相似度在早期和后期差异明显——参数级的符号约束先把优化轨迹"掰"到一个利于泛化的矩阵级方向上,之后沿该方向继续优化。
行为层面像不像 RL? 作者统计了回答长度、多次采样的准确率标准差、每千词的分类讨论提示词(if / otherwise / consider a case)和逻辑连接词(therefore / because)频率:

图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前沿,关注我