GCPO 阅读笔记:为什么某些 GRPO 更新会悄悄搞垮模型,以及如何从结构上禁止它们

笔记日期: 2026-08-18 作者: Zhongzhu Zhou 阅读论文: GCPO: Diagnosing and Constraining Subspace Geometry in Rollout RL for LLMs 论文作者: Kai Yang, Jingwei Xu, Wanyu Wang, Kai-Yuan Guo, Zhenbo Yu, Yi Wang, Yu Qiao(上海交通大学、上海人工智能实验室、NovaCore、华中科技大学) arXiv: 2608.11674 发表情况: arXiv 预印本,2026 年 8 月

1. 问题背景:RL 后训练会自己把自己搞不稳定,但没人说得清为什么

如果你在大模型上跑过 GRPO、DAPO、GSPO 或者其他任何基于 rollout 的 RL 后训练方案,大概率见过以下三种症状中的至少一种:准确率不是平滑上升,而是剧烈震荡;模型在训练任务上变强了,但在其他任务上肉眼可见地变差;策略学会了用没用的 token 把回答填长,因为长回答恰好和高奖励相关。这些都不是什么新鲜观察——在 RLHF/RLVR 圈子里已经算是常识级别的经验之谈了。缺的是一个机制层面的解释:这些失败到底是在参数更新这个层面上怎么发生的,而不是”KL 惩罚太弱了""裁剪范围不对""奖励被 hack 了”这种症状级别的解释。

这篇论文的贡献,是用数值线性代数的工具而不是 RL 理论,把这个黑箱打开。作者问了一个听起来非常朴素、甚至有点”平淡”的问题:当一个基于 rollout 的 RL 算法更新一个权重矩阵时,这个更新的方向跟这个预训练权重矩阵自身主导的奇异方向之间,到底是什么关系?他们发现的东西一点都不平淡:这个重叠度出现瞬时尖峰——也就是 RL 更新短暂地对齐到预训练模型最”承重”的方向上——会可靠地先于性能下降出现。基于这个诊断,他们构建了 GCPO(Geometrically Constrained Policy Optimization,几何约束策略优化),它不是用一个惩罚项去劝阻这种行为(我们后面会看到,这种做法悄悄地失败了),而是通过一种巧妙的可训练更新重参数化,让这种行为从结构上根本不可能发生

这篇笔记会完整走一遍其中的线性代数机制——更新的四路分解、让重叠统计量有意义的维度修正、把相关性变成因果证据的受控干预实验——然后拆解 GCPO 的参数化本身,过一遍完整的实验图景(六个基准设置、跨任务迁移、训练动态、四个独立的消融维度),最后带着批判性视角看看这篇论文还欠缺什么。

有一个框架值得贯穿全文记在心里:这篇论文同时在做两件逻辑上可以分开的事情,值得把它们当成两条独立的线索来追踪。第一是一个测量层面的贡献——一种便宜、且有统计学上站得住脚的基线的方法,来量化任意一次参数更新触及预训练模型结构上主导方向的程度。第二是一个设计层面的贡献——利用这个测量结果来构造一个训练时约束的具体方式。原则上你完全可以只接受第一个而不接受第二个(也许你更愿意把这个重叠统计量纯粹当作一个监控仪表盘,用人工或者别的机制去干预,而不是用一个硬性重参数化),也完全可以想象在同一个诊断基础上构建出别的修复方案。把这两个贡献分开看,有助于评估论文的证据:诊断层面的主张(第 3 节)需要经受住住“相关性 vs. 因果性”的推敏;设计层面的主张(第 4–5 节)则需要经受另一种推敏——GCPO 是否真的是基于这个诊断采取行动的最佳方式,还只是一种合理但非唯一的方式。

2. 前置知识

基于 rollout 的 LLM RL,简要回顾。 在 RLHF/RLVR 式的后训练中,策略 πθ\pi_\theta 针对每个 prompt 生成多个候选回答(“rollout”),每个回答得到一个标量奖励(来自学到的奖励模型、基于规则的验证器,或执行反馈),然后更新策略以提高高奖励 rollout 相对于低奖励 rollout 的概率。GRPO(Group Relative Policy Optimization,组相对策略优化)是这个领域里最主流的方案:它不像经典 PPO 那样训练一个单独的价值函数/critic 来估计基线,而是对每个 prompt 采样 KK 个 rollout,用组内平均奖励作为基线,把每个 rollout 的优势变成相对于同组”兄弟”的标准化 z-score。这个做法便宜(不需要 critic 网络)且实践中效果不错,但它产生的更新仍然来自一个在移动的目标:每一步梯度更新会改变策略,策略的改变会改变下一批 rollout,下一批 rollout 又会改变下一步梯度。这是一个反馈回路,而反馈回路正是那种朴素的一阶分析容易漏掉不稳定性的系统。

GSPO、DAPO、GMPO 都是在这套方案的某个环节上做修改的变体——重要性比值裁剪应用的层级(token 级 vs. 序列级)、过滤异常/退化组的方式,或者聚合 token 级比值时用几何平均还是算术平均——但都保留了整体的组相对优势骨架。这四个都是本文实验中的基线,值得具体说说每一个到底改了什么,因为论文把它们当作”目标函数层面修复方案现状”的代表性切片来用,而对比的信息量取决于读者对它们具体差异的理解。GSPO序列级别而不是逐 token 应用重要性比值裁剪,理由是长生成序列里逐 token 的比值即使整体更新是合理的也可能剧烈波动,序列级视角能减少一种特定的梯度方差爆炸。DAPO(解耦裁剪与动态采样策略优化)把裁剪的上下阈值解耦(而不是用一个对称范围),并动态过滤掉那些整组 rollout 优势退化的 prompt(全对或全错的组本身不贡献学习信号却仍要花计算),这往往让训练在每个 prompt 上更样本高效,但也可能——正如本文图 5 的结果所暗示的——沿途容忍更多探索性(也更长)的 rollout。GMPO(几何平均策略优化)把序列内聚合 token 级重要性比值用的算术平均换成几何平均,对少数极端比值的 token 主导整体聚合信号不那么敏感。这四个基线没有一个触及更新的参数空间方向——它们全都作用于”目标函数标量值如何从 rollout 计算出来”这一层,这正是 GCPO 要填补的空白,也是为什么这个对比是公平且有信息量的,而不是牛头不对马嘴:GCPO 和这四种目标函数层面的选择是兼容关系而不是竞争关系,因为它约束的是更新参数化本身,而目标函数的计算方式完全不动。

把这四个基线放在一起看,可以理清一条脉络:GRPO 提供了最基础的组相对基线思想,GSPO/GMPO 主要在解决”聚合粒度/聚合方式”带来的方差问题,DAPO 则更进一步在样本效率和探索行为上做文章。这条脉络本身也说明了一个事实——目标函数层面的迭代,已经打磨了相当长时间,能榨出来的边际收益正在变小(表 1 中 GSPO/DAPO/GMPO 三者之间的差距往往只有零点几分),这从侧面凸显出 GCPO 从完全不同的维度(参数空间几何)切入所带来的收益为什么显得格外亮眼。

SVD(奇异值分解)作为观察权重矩阵的透镜。 任意实矩阵 WrefRdout×dinW_{\text{ref}} \in \mathbb{R}^{d_{\text{out}} \times d_{\text{in}}} 都可以写成 Wref=ΦΣΨW_{\text{ref}} = \Phi \Sigma \Psi^\top,其中 Φ\PhiΨ\Psi 是正交矩阵(它们的列分别是左、右奇异向量),Σ\Sigma 是对角矩阵,对角元非负且按降序排列。Ψ\Psi 中对应最大奇异值的那些列,张成了这个矩阵在输入空间中响应最强烈的方向;Φ\Phi 中对应最大奇异值的那些列,张成了这个矩阵在输出空间中写入最强烈的方向。如果只截断到前 kk 个奇异向量,ΦkΣkΨk\Phi_k \Sigma_k \Psi_k^\top 就是 WrefW_{\text{ref}} 在 Frobenius 范数意义下最好的秩-kk 近似——这是经典的 Eckart–Young–Mirsky 定理。本文把 span(Φk)\text{span}(\Phi_k)span(Ψk)\text{span}(\Psi_k) 称为预训练权重矩阵的主子空间(principal subspace):不是因为它们代表某种字面意义上可解释的”概念”,而是因为它们是这个矩阵线性行为里结构上最主导的部分,计算成本低(训练开始前做一次 SVD 即可),几何上也容易推理。

奇异值谱的形状为什么重要。 值得多说一句的是,实际神经网络的权重矩阵往往并不是奇异值均匀分布的(那样的矩阵地位接近于随机高斯矩阵),而是往往展现出一个“少数奇异值很大、大多数奇异值快速衰减”的长尾形状,这在预训练 Transformer 的注意力投影矩阵、MLP 权重里都被反复观察到。正因为存在这种形状,把前几个奇异方向单独拿出来当作一个有意义的“主干线”才是合理的:它们真实地承载了不成比例的能量占比。如果奇异值谱本身很平坦(所有奇异值差不多大),那么“前 8 个方向”这个概念就会变得相对任意,保护它们带来的收益也会相应变小——这一点在后面讨论规模外推问题时会再次用到。

Frobenius 内积与正交投影算子。 对两个形状相同的矩阵 A,BA, B,它们的 Frobenius 内积是 A,BF=tr(AB)\langle A, B \rangle_F = \text{tr}(A^\top B),AF2=A,AF\|A\|_F^2 = \langle A, A \rangle_F 就是所有元素的平方和——对一个矩阵更新而言,这是很自然的”能量”概念。给定一个 kk 维子空间的标准正交基 Φk\Phi_k,ΠΦ=ΦkΦk\Pi_\Phi = \Phi_k \Phi_k^\top 是投影到这个子空间的正交投影算子(把它作用在任意向量上,得到子空间中离它最近的点),ΠΦ=IΠΦ\Pi_\Phi^\perp = I - \Pi_\Phi 则投影到正交补空间。这两个投影算子是幂等的(ΠΦ2=ΠΦ\Pi_\Phi^2 = \Pi_\Phi),并且互相湮灭(ΠΦΠΦ=0\Pi_\Phi \Pi_\Phi^\perp = 0)——正是这个代数事实,使得下一节的四路能量分解是精确成立而非近似的。

从矩阵范数到「结构化脆弱性」的直觉过渡。 在正式进入四路分解之前,值得先用一个不那么正式的方式感受一下「主子空间」这个概念到底在说什么。想象一个巨大的、高度冗余的电路板,上面绝大多数导线其实并不承载多少实际功率,只有少数几条「主干线」承担了绝大部分电流。如果你要在这块电路板上做一次小改动(比如加一个新元件),两种做法风险完全不同:一种是把新元件焊在那些不起眼的支线上,即使接错了,对整块板子的功能影响也有限;另一种是直接改动主干线,哪怕改动幅度很小,也可能让整个电路的行为发生剧烈变化。预训练权重矩阵的奇异值谱,在几何直觉上跟这个电路板类比很接近:排在前面的奇异值对应的方向,承载了这个线性变换里「能量」最集中的部分,扰动它们,哪怕幅度不大,也可能对模型在很多输入上的行为产生不成比例的影响;而排在后面、对应奇异值很小的方向,即使被大幅扰动,单位扰动能量带来的行为改变也小得多。GCPO 的整个诊断与设计思路,可以粗略理解为:先找出这些「主干线」,再想办法让 RL 训练时的更新只能焊在「支线」上。

LoRA 简述,作为对照。 低秩自适应(LoRA)用一个低秩乘积 ΔW=BA\Delta W = BA(其中 BRdout×rB \in \mathbb{R}^{d_{\text{out}} \times r},ARr×dinA \in \mathbb{R}^{r \times d_{\text{in}}},rmin(dout,din)r \ll \min(d_{\text{out}}, d_{\text{in}}))取代全秩权重更新 ΔW\Delta W。这主要是一种参数效率技巧:它减少了可训练参数数量以及相应的优化器状态,但它本身并不限制更新在完整 dout×dind_{\text{out}} \times d_{\text{in}} 空间中可以指向哪些方向——这样参数化出来的秩-rr 更新,在训练过程中依然可能漂移到任意方向,包括预训练模型的主子空间。这个区别——低秩作为”压缩”vs. 低秩作为”实现精确方向约束的载体”——正是 GCPO 与在 RL 目标下直接做 LoRA 微调之间的关键差异,论文也专门设计实验把这两种效应分离开来(详见第 6 节)。

3. 诊断:把一次更新分解成四个几何区块

3.1 四路拆分

关注对象不是原始梯度,而是第 tt 步优化后实际发生的更新:

δ(t)W=WtWt1.\delta^{(t)} W = W_t - W_{t-1}.

这个选择很重要:实际发生的更新里已经包含了优化器的学习率、动量,以及(对 AdamW 而言)逐坐标的自适应缩放,所以这个分析衡量的是权重实际上发生了什么,而不是一个理想化的梯度方向。这个看似小的建模选择其实改变了整个分析的意义:如果只看原始梯度,你会错过 Adam 类优化器对不同坐标不同缩放带来的方向旋转——而正是这种旋转,可能把一个本身与主子空间没什么关系的原始梯度,变成一个在实际权重空间里确实对齐了主子空间的实际更新。因此,直接对实际发生的权重差分做分析,比对原始梯度做分析更能反映训练过程中真实发生的事情。

给定由预训练权重的前 kk 个奇异向量构造出的主子空间投影算子 ΠΦ,ΠΨ\Pi_\Phi, \Pi_\Psi,以及它们的补空间 ΠΦ,ΠΨ\Pi_\Phi^\perp, \Pi_\Psi^\perp,任意更新都可以通过把每一侧(左/输出、右/输入)分别投影到主子空间或其补空间,拆成四个互相正交的区块:

δ(t)W=ΠΦδ(t)WΠΨδ(t)WPP+ΠΦδ(t)WΠΨδ(t)WPO+ΠΦδ(t)WΠΨδ(t)WOP+ΠΦδ(t)WΠΨδ(t)WOO.(1)\delta^{(t)} W = \underbrace{\Pi_\Phi \delta^{(t)} W \Pi_\Psi}_{\delta^{(t)} W^{PP}} + \underbrace{\Pi_\Phi \delta^{(t)} W \Pi_\Psi^\perp}_{\delta^{(t)} W^{PO}} + \underbrace{\Pi_\Phi^\perp \delta^{(t)} W \Pi_\Psi}_{\delta^{(t)} W^{OP}} + \underbrace{\Pi_\Phi^\perp \delta^{(t)} W \Pi_\Psi^\perp}_{\delta^{(t)} W^{OO}}. \tag{1}

把上标读成(输出侧,输入侧):PPPP 表示这次更新既写入了一个主导输出方向、又读取了一个主导输入方向;OOOO 表示两边都避开了。因为 ΠΦΠΦ=0\Pi_\Phi \Pi_\Phi^\perp = 0ΠΨΠΨ=0\Pi_\Psi \Pi_\Psi^\perp = 0,这四个区块在 Frobenius 内积意义下两两正交——可以直接验证:PPPPPOPO 区块的内积是 tr(ΠΨδ(t)WΠΦδ(t)WΠΨ)\text{tr}(\Pi_\Psi \delta^{(t)}W^\top \Pi_\Phi \delta^{(t)}W \Pi_\Psi^\perp),利用迹的循环不变性加上 ΠΨΠΨ=0\Pi_\Psi^\perp \Pi_\Psi = 0,这一项直接坍缩为零,其余交叉项同理。正是这个正交性,使得下面这个能量分解是精确的(勾股定理式的恒等式),而不是近似:

δ(t)WF2=EPP+EPO+EOP+EOO,Eij=δ(t)WijF2.(9)\|\delta^{(t)} W\|_F^2 = E_{PP} + E_{PO} + E_{OP} + E_{OO}, \qquad E_{ij} = \|\delta^{(t)} W^{ij}\|_F^2. \tag{9}

于是核心重叠统计量就是更新能量中至少有一侧触及主子空间的比例:

Ot=EPP+EPO+EOPEtotal=1EOOEtotal.(2)O_t = \frac{E_{PP} + E_{PO} + E_{OP}}{E_{\text{total}}} = 1 - \frac{E_{OO}}{E_{\text{total}}}. \tag{2}

3.2 为什么需要维度修正

这里有一个让这个测量并不平凡的微妙之处:即使是一个完全随机、各向同性的更新,也会跟任意固定的 kk 维子空间有非零的期望重叠,原因仅仅是这个子空间维数为正。如果不修正这一点,就没法判断观察到的 OtO_t 究竟反映了真实的方向偏好,还是仅仅反映了"k>0k > 0"这个几何事实带来的基线噪声。

论文推导出了精确的修正量。把更新向量化,z=vec(δW)RDz = \text{vec}(\delta W) \in \mathbb{R}^D,D=doutdinD = d_{\text{out}} d_{\text{in}}。双正交分量可以写成对 zz 的一个单一线性投影 QzQz,其中 Q=ΠΨΠΦQ = \Pi_\Psi^\perp \otimes \Pi_\Phi^\perp(利用 Kronecker 积的向量化恒等式),而 QQ 本身是一个秩为 (doutk)(dink)(d_{\text{out}} - k)(d_{\text{in}} - k) 的正交投影算子——两个补空间维数的乘积。对于单位球面上均匀随机的方向 z/z2z / \|z\|_2,关于各向同性随机向量的一个标准事实给出 E[zz/z22]=ID/D\mathbb{E}[zz^\top / \|z\|_2^2] = I_D / D,因此:

E[Qz22z22]=tr(QE[zzz22])=rank(Q)D=(doutk)(dink)doutdin.(18-20)\mathbb{E}\left[\frac{\|Qz\|_2^2}{\|z\|_2^2}\right] = \text{tr}\left(Q \, \mathbb{E}\left[\frac{zz^\top}{\|z\|_2^2}\right]\right) = \frac{\text{rank}(Q)}{D} = \frac{(d_{\text{out}} - k)(d_{\text{in}} - k)}{d_{\text{out}} d_{\text{in}}}. \tag{18-20}

由于重叠统计量是 O=1Qz22/z22O = 1 - \|Qz\|_2^2 / \|z\|_2^2(不在双正交区块中的能量比例),这立刻给出零假设值:

Onull=1(doutk)(dink)doutdin.(3)O_{\text{null}} = 1 - \frac{(d_{\text{out}} - k)(d_{\text{in}} - k)}{d_{\text{out}} d_{\text{in}}}. \tag{3}

报告的量是相对于这个零假设的超额重叠:

Otexcess=OtOnull.(4)O_t^{\text{excess}} = O_t - O_{\text{null}}. \tag{4}

OtexcessO_t^{\text{excess}} 为正,意味着这次更新比同等大小的各向同性更新对齐主子空间——这是真实的方向信号,不是维度带来的假象。

用一个具体数字来感受一下量级。以 Qwen3-8B 的某个注意力投影矩阵为例,设 dout=din=4096d_{\text{out}} = d_{\text{in}} = 4096,保护秩 k=8k=8(消融实验找到的最优值,见第 5.5 节)。代入公式 3:

Onull=1(40968)(40968)4096×4096=1408824096210.9961=0.0039.O_{\text{null}} = 1 - \frac{(4096-8)(4096-8)}{4096 \times 4096} = 1 - \frac{4088^2}{4096^2} \approx 1 - 0.9961 = 0.0039.

也就是说,一个纯随机方向的更新,仅凭随机性就已经跟一个 4096 维矩阵里的 8 维主子空间有大约 0.39% 的重叠——不算大,但也不是零,而这正是必须先减掉的基线,之后观察到的重叠才能被解读为真实的方向偏好。图 1 中报告的超额重叠数值(Qwen3-8B 大约在 0.03–0.05 量级,GLM4-9B 大约在 0.0135–0.018 量级)比这个零假设值大了一到两个数量级,这也算是一个有用的合理性检验,说明观测到的尖峰不是这个维度修正基线本身悄悄抬升带来的假象。

3.3 数据说明了什么

在看图之前,值得先总结一下上面推导出来的公式组在整个流水线里怎么组合在一起。公式 1 把一次更新拆成四块;公式 2 把其中三块汇总成一个百分比;公式 3 给出一个环境噪声基准线(如果什么都不做,随机更新应该看到多少重叠);公式 4 把公式 2 减去公式 3,得到一个只反映真实方向偏好的信号。图 1 就是把公式 4 的输出沿着训练时间轴画出来,并与同期的验证集准确率放在一起对照。

图 1(复现如下)绘制了 Qwen3-8B 在 GSM8K 和 GLM4-9B 在 MATH500 上训练时,这个超额重叠随训练步数的变化,以及同期的验证集准确率。

Figure 1 (paper Fig.1): 逐步更新的超额主子空间重叠(红色)与验证准确率(蓝/灰色)在 GRPO 训练过程中的变化。(a)/(d) 面板展示随时间变化的四路区块富集情况;(b)/(e) 面板展示瞬时重叠集中在哪些层;(c)/(f) 面板展示聚合重叠统计量与准确率轨迹的对比,阴影区域标出了重叠升高的时段。

有两个发现很突出。第一,从聚合角度看,绝大部分更新能量确实落在双正交(OOOO)区块——Qwen3-8B 平均 93.8%,GLM4-9B 平均 97.7%——这与前人工作”RL 更新长期来看主要是离主方向的”这一发现一致。第二,也是本文真正的经验性贡献:这个聚合统计量掩盖了有趣的行为——超额重叠存在持续或反复出现的尖峰,而这些尖峰会可靠地先于验证准确率的下降,有时表现为渐进式的衰退,有时表现为陡峭的下跌。(b)/(e) 逐层面板进一步显示,这些尖峰不是均匀分布在所有层上——它们集中在特定的、往往是中上层,这本身也是有信息量的:它暗示这种不稳定性有一个局部化的机制起源,而不是一个全局性的漂移。

需要说清楚这张图能证明什么、不能证明什么。论文明确说这是一个相关性观察——重叠升高与随后的性能下降共同出现,前者在时间上先于后者,但仅凭时间先后关系并不能排除存在共同的底层原因(比如某种其他的训练病理,既让重叠升高、又独立地导致几步之后性能下降)。这正是下一个实验的意义所在。

3.4 受控干预:把相关性变成证据

为了更接近因果性的结论,作者拿了单独一次 GRPO 更新(第 150 步,Qwen3-8B 在 ToolAlpaca 上)出来,直接操纵它的主子空间重叠分量,乘以一个缩放因子 η\eta,同时保持每一层更新的 Frobenius 范数不变(这样任何准确率变化就不能简单归因于更新整体变大或变小了)。η=1\eta = 1 对应原始更新(这个切片里是 56.89% 准确率);η=0\eta = 0 完全移除主子空间重叠分量(即正交化更新);η>1\eta > 1 则注入比原本更多的主子空间对齐。

Figure 2 (paper Fig.2): 对单次 GRPO 更新的受控干预。(a) 随着主子空间重叠分量被放大(η 从 0 到 4),准确率单调下降,呈现清晰的剂量-响应关系。(b) 匹配幅度地注入到主子空间,比注入到同等幅度的随机子空间要有害得多,这把"方向"——而不仅仅是"幅度"——分离出来作为致因。

这里还有一个值得追问的细节:为什么需要“保持每层更新的 Frobenius 范数不变”这个限制条件?如果不加这个限制,直接把 η\eta 乘到整个更新上,那么准确率下降就可以很平常地被解释为“更新变大了,所以偏离了原来的优化轨迹”——这是一个与方向无关的平凡解释。固定每层更新的范数,相当于把“多少能量”这个混淆变量控制住,只让“能量分布在哪里”这个变量自由变化,从而把准确率变化干净地归因于方向本身,而不是幂雑在幅度里。这是实验设计上一个看似小但实际上很关键的控制变量。

这个结果在”对实际训练中的 LLM checkpoint 做受控干预”这个范畴里已经算相当干净了:随着 η\eta 增大,准确率单调且明显下降(清晰的剂量-响应曲线);移除重叠(η=0\eta=0)相对原始更新提升了准确率;而且—对排除”仅仅是幅度问题”这一解释来说至关重要—把同样数量的额外能量注入到一个匹配维度的随机子空间里,造成的损害远小于注入到主子空间。这个实验也值得拆开看它的实验控制细节,因为这正是它说服力的来源。如果只是简单地把整个更新乘以 η\eta,没有任何人会惊讶于准确率下降——把任何一个已经训练好的更新放大到足够大都会破坏模型。真正有信息量的是固定每层 Frobenius 范数不变这个控制变量,以及把目标子空间从主子空间换成同维随机子空间这个对照组。前者把“更新大小”这个混淆变量控制住了,后者把“方向特殊性”这个混淆变量控制住了。只有同时满足这两个控制条件,才能真正把“方向”本身单独隔离出来,作为唯一的自变量。这是把论文从“这是个有趣的相关性”推进到“这是一个我们有理由相信存在因果关联的机制”的关键证据,也是 GCPO 设计针对方向而不是仅仅加大梯度裁剪或加大 KL 惩罚(那些只能控制幅度/散度,不能控制方向)的直接经验依据。

4. 解法:GCPO 的投影式低秩参数化

4.1 问题形式化

有了这个诊断,自然的下一步问题是:与其仅仅用惩罚项去劝阻主子空间重叠(软约束),能不能让它从结构上根本不可能发生(硬约束)?论文把这个想法形式化成一个带约束的 RL 目标变体。设 θ0\theta_0 为预训练策略,MM 为被调整的线性层集合,Δθ\Delta\theta 为可训练更新。带约束问题为:

maxΔθ  Jrollout(πθ0+Δθ)βDKL(πθ0+Δθπref)(5)\max_{\Delta\theta} \; J_{\text{rollout}}(\pi_{\theta_0 + \Delta\theta}) - \beta D_{\text{KL}}(\pi_{\theta_0+\Delta\theta} \,\|\, \pi_{\text{ref}}) \tag{5} s.t.Φk()δ(t)W()=0,δ(t)W()Ψk()=0,M.(6, 7)\text{s.t.} \quad \Phi_k^{(\ell)\top} \delta^{(t)} W^{(\ell)} = 0, \qquad \delta^{(t)} W^{(\ell)} \Psi_k^{(\ell)} = 0, \quad \forall \ell \in M. \tag{6, 7}

这两个约束合起来就是”在每一层、每一步都只保留 OOOO 区块”——对每一次实际发生的更新都要求与主子空间在任一侧都零重叠,而不仅仅是平均意义上如此。要特别指出的是,这被明确定位为 KL 正则化的补充,而不是替代:KL 控制策略输出分布可以移动多少;新约束控制更新在参数空间中允许朝哪些方向移动。原则上,你可以有一个 KL 很小但仍然集中在危险主方向上的更新,也可以有一个 KL 很大但完全离主方向的更新——这确实是两个不同的控制轴。

论文很坦诚地指出,一个软约束版本——比如在损失里加一个类似 ΦkδWF2+δWΨkF2\|\Phi_k^\top \delta W\|_F^2 + \|\delta W \Psi_k\|_F^2 的惩罚项——是最直观的第一选择,并且确实被尝试过,但表现不佳(见表 3,第 6 节讨论)。给出的原因是:在 RL 这种迭代反馈回路里——每次更新都会改变产生下一次更新梯度的 rollout 分布——软惩罚只是与(通常大得多、也变化更剧烈的)任务奖励梯度竞争的众多项之一,而在训练过程中,主导性的任务梯度确实能够、也确实会压过它。硬约束不存在这个失败模式,因为它根本不是一种权衡;它改变的是什么是可表示的

4.2 让约束变得”免费”的参数化

这是整篇论文最核心的设计巧思,值得放慢速度走一遍。对每个被调整的层,固定住投影算子 ΠΦ,ΠΨ\Pi_\Phi^\perp, \Pi_\Psi^\perp(在训练开始前,由预训练权重的 SVD 一次性算出),把这一层的更新参数化为:

δ(t)W()=αΠΦ()L()R()ΠΨ(),(8)\delta^{(t)} W^{(\ell)} = \alpha \, \Pi_\Phi^{\perp(\ell)} L^{(\ell)} R^{(\ell)} \Pi_\Psi^{\perp(\ell)}, \tag{8}

其中 L()L^{(\ell)}R()R^{(\ell)} 是普通的可训练低秩因子(形状分别是 dout×rd_{\text{out}} \times rr×dinr \times d_{\text{in}},跟 LoRA 一样),α\alpha 是固定的缩放常数。巧妙之处在于投影算子被放在可训练因子的外侧,把它们夹在中间。因为 ΠΦ\Pi_\Phi^{\perp}ΠΨ\Pi_\Psi^{\perp} 本身是固定的(不参与训练),无论可训练因子 L,RL, R 在优化过程中取什么值,得到的更新都已经保证满足两个约束——这一点可以直接验证:左乘 Φk\Phi_k^\top 得到 ΦkΠΦ()=0\Phi_k^\top \Pi_\Phi^\perp (\cdot) = 0,因为按定义 ΦkΠΦ=0\Phi_k^\top \Pi_\Phi^\perp = 0,右边用 Ψk\Psi_k 的对称论证同理成立。

这就是论文最核心的一招:它把”一个本来需要在优化过程中被强制执行、检查或惩罚的约束”,转化成了”参数化本身固有的结构性质”。优化器自己根本感觉不到这个约束的存在——它只是对 LLRR 做普通的无约束梯度下降,而投影算子会悄无声息地吸收掉任何本来会把有效更新推向主子空间的梯度信号,因为不管 L,RL, R 里包含什么,那部分分量都会被 ΠΦ()ΠΨ\Pi_\Phi^\perp (\cdot) \Pi_\Psi^\perp 直接湮灭。这在精神上类似于经典优化里用重参数化(而不是拉格朗日乘子)来强制线性等式约束的做法——只不过这里是应用在一个深层、反复重新训练的 RL 循环内部,而软的拉格朗日式方法(如第 4.1 节所述)在这种场景下已被证明会失效。

这里有个细节值得多想一想:为什么投影要放在可训练因子的外侧,而不是把 L,RL, R 本身限定在某个子空间里(比如强行要求 LL 的列空间与 Φk\Phi_k 正交)?答案在于可微分性和优化器兼容性。把投影写成对乘积结果的一次线性变换,意味着梯度可以直接通过标准的反向传播机制求得,不需要在流形(manifold)上做任何特殊处理,AdamW 这类带有逐坐标自适应缩放的优化器也能直接拿来用,不需要任何 Riemannian 优化方案那种额外的工程复杂度。这也是为什么论文选择把约束写成一个可微分的重参数化,而不是一个流形上的显式黎曼投影步骤——前者把一个本来可能很麻烦的约束优化问题,降级成了一个普通的无约束优化问题外加两次仿射变换,工程实现的复杂度和调试成本都低得多。

4.3 算法逐步拆解

论文中的算法 1 给出了完整的训练循环;下面把它拆成散文式解释配合伪代码。

准备阶段(训练开始前,一次性完成):

  1. 对每个被调整的层 M\ell \in M,计算预训练权重 Wref()W_{\text{ref}}^{(\ell)} 的前 kk 个奇异向量 Φk(),Ψk()\Phi_k^{(\ell)}, \Psi_k^{(\ell)}。这是每层一次的 SVD,训练过程中不会重复计算。
  2. 把可训练因子 L()L^{(\ell)} 初始化为零,R()R^{(\ell)} 用标准 LoRA 初始化(通常是较小的随机值),沿用 LoRA 的惯例,让适配器在第 0 步就是恒等映射(LR=0LR = 0,模型正好从预训练权重开始)。

每个训练步 t=1,,Tt = 1, \dots, T,对每个被调整的层 \ell:

  1. 原始可训练因子投影到补空间上:Lˉ()L()Φk()(Φk()L())\bar{L}^{(\ell)} \leftarrow L^{(\ell)} - \Phi_k^{(\ell)} (\Phi_k^{(\ell)\top} L^{(\ell)}),以及 Rˉ()R()(R()Ψk())Ψk()\bar{R}^{(\ell)} \leftarrow R^{(\ell)} - (R^{(\ell)} \Psi_k^{(\ell)}) \Psi_k^{(\ell)\top}。这正是在 LLRR 相乘、注入层之前先各自应用投影,代数上等价于对乘积应用 ΠΦ()ΠΨ\Pi_\Phi^\perp(\cdot)\Pi_\Psi^\perp,但计算更便宜(投影两个瘦矩阵,而不是一个稠密矩阵)。
  2. 构造这一步的有效权重:Wt()Wref()+sLˉ()Rˉ()W_t^{(\ell)} \leftarrow W_{\text{ref}}^{(\ell)} + s \bar{L}^{(\ell)} \bar{R}^{(\ell)},其中 s=α/rs = \alpha / r 是标准的 LoRA 缩放常数。
  3. 把这些投影后的权重同步给 rollout 生成引擎(比如 vLLM),因为 rollout 必须由当前实际的策略(包含投影)生成。
  4. 在这个策略下生成 rollout,计算常规的 GRPO 式策略优化损失。
  5. 反向传播,用优化器(AdamW)更新原始的、未投影的因子 L(),R()L^{(\ell)}, R^{(\ell)}。注意梯度会反传经过投影这一步,所以优化器看到的原始因子梯度反映的是投影后的前向传播——但每一步开始时都会重新应用投影,所以原始因子朝主子空间方向的漂移,对模型行为完全没有影响;这是不可见的、被浪费掉的容量,而不是一个等着被违反的约束。

相对于普通 LoRA,额外开销确实很小:每个被调整层每一步多两次小矩阵投影(每次大约 O(dkr)O(d \cdot k \cdot r),因为 kkrr 相对于 dd 都很小,所以很便宜),外加每层一次的前置 SVD。论文报告 GCPO 的峰值 GPU 显存与普通 LoRA 几乎完全相同(图 6,第 5 节讨论),这符合预期,因为可训练参数量和优化器状态都没变——唯一的增量是前向传播里一点点额外计算,而不是额外的状态。

具体来说:以 d=4096d = 4096k=8k=8r=32r=32(主实验配置)为例,两次投影步骤各自的开销大约是 4096×8×321.05M4096 \times 8 \times 32 \approx 1.05\text{M} 次乘加——相比低秩矩阵乘积 LˉRˉ\bar{L}\bar{R} 本身 4096×4096×32537M4096 \times 4096 \times 32 \approx 537\text{M} 次乘加(这是普通 LoRA 本来就要付出的开销)可以忽略不计。一次性的 SVD 成本(为每个被调整的权重矩阵计算一次前 kk 个奇异向量)同样在大局中很小:对一个 4096×40964096\times4096 矩阵做 k=8k=8 的随机化/截断 SVD,远比完整 SVD 便宜,分摊到一整次 RL 训练的数百步中,只占单步 wall-clock 时间的很小一部分。

还有一个容易被忽略的实现细节值得指出:因为每步都会从原始因子重新投影,而不是对已经投影过的因子累加投影,数值稳定性上也比一种“只投影一次然后一直累加”的写法更好——后者在数百步的训练中可能因浮点误差累积而逐渐漂移出真正的正交补空间,而前者每一步都重新归零这种漂移,代价仅仅是多一次短矩阵乘法,属于用微小的额外计算换取长期数值稳健性的典型工程权衡。

4.4 为什么这真的保住了预训练映射(不只是”平均意义上”)

论文证明了一个相当强的保证,不只是平均情形的论证。因为累积适应量 ΔWt()=Wt()Wref()\Delta W_t^{(\ell)} = W_t^{(\ell)} - W_{\text{ref}}^{(\ell)} 在每一步都具有相同的”夹心投影”形式(它是若干项之和,每一项各自都满足约束,而约束是线性的,所以和也满足),就能得到一个干净的推论:对任意恰好落在主输入子空间中的输入 xx(xspan(Ψk())x \in \text{span}(\Psi_k^{(\ell)})),经过适应后的层输出与预训练层的输出完全相同,Wt()x=Wref()xW_t^{(\ell)} x = W_{\text{ref}}^{(\ell)} x——不是近似保持,是在每一个训练步都精确保持,而不仅仅是收敛之后。输出侧的对称陈述同样成立:对主输出子空间中的任意 yy,yWt()=yWref()y^\top W_t^{(\ell)} = y^\top W_{\text{ref}}^{(\ell)}

这是一个真实有用、可验证、局部于单层的性质——但需要说清楚它的适用范围,这也是我认为论文在表述上可以更谨慎的一处。这个保证是关于某个具体线性层对某个具体子空间中输入的响应的;它明确不是在说模型的某种语义能力——事实性知识、某项技能、某种行为——就”活”在这个子空间里因而受到保护。论文自己也标注了这一点(“我们把它们视为功能上有区分度但可操作的结构性参照”,而不是”字面意义上对语义知识的分解”),代数上的推论 B.4 也明确说了同样的事:这是一个逐层、逐子空间的输入/输出保证,不是模型级别的能力保持保证。第 5.2 节的经验性能力保持结果,与”保护这些方向有助于保持通用能力”这一假设是一致的,但这是叠加在一个不相关的、关于单个线性映射的精确代数事实之上的一个独立的、相关性的经验发现。把两者混为一谈——把这个精确的逐层保证当作直接蕴含了经验性的能力保持结果——会是一个错误,细心的读者应该把它们分开看待,尽管论文的叙事节奏很容易把两者揉在一起。

4.5 GCPO 与 LoRA 式持续学习约束的区别

有一类前人工作(论文引用了 GeoLoRA、MiLoRA 以及正交子空间持续学习)同样用子空间几何来防止有监督微调过程中的灾难性遗忘——把更新限制在远离对之前学过的任务重要的方向。GCPO 的出发点有一个重要区别:那些方法针对的是相对静态的数据分布(固定的微调数据、顺序任务),关心的是学任务 B 时会不会忘记任务 A。GCPO 针对的失败模式是 on-policy RL 特有的一种动态现象:rollout 由当前策略生成,所以每次更新都会改变产生下一次更新训练信号的分布,正是这个反馈回路,在本文的诊断工作(第 3 节)中表现为瞬时的——而非持续的——主子空间越界。这也是为什么设计选择是一个硬的、始终生效的约束(而不是一个原则上可以在训练稳定后放松的惩罚项):你没法轻易预测下一次瞬时尖峰什么时候出现,所以约束需要在整个训练过程中无条件地保持激活。这个对比也顺带出一个实践启示:如果你的系统里确实存在类似持续学习的静态任务切换场景(比如先在任务 A 上完成一轮完整微调、再切换到任务 B),那么 GeoLoRA/MiLoRA 这类专为防忘设计的方法可能更合适;而如果你面对的是单一任务上长时间运行的 on-policy RL,且关心的是训练过程中的瞬时不稳定而不是任务间的遗忘,GCPO 这种针对反馈回路的硬约束设计才是更合适的工具。两类方法虽然都用了奇异子空间几何,但针对的“病因”不同,盲目把一个领域的方案搬到另一个领域不一定能自动奇效。

这个区别也提醒我们一个更广泛的设计原则:当一个系统的不稳定性来源于间歇性、不可预测的事件(比如本文的瞬时重叠尖峰),而不是持续、可预测的漂移时,选择“硬约束”而不是“监控+干预”往往是更稳健的工程选择——因为监控需要一个反应延迟(发现异常到采取行动之间的时间差),而对于瞬时事件而言,这个延迟本身就足以让损害已经发生。这在工程实践中其实有一个相当直接的类比:内存安全领域里,对于那些只会在运行时才诱发、且一旦发生就不可逆的内存错误类型(比如缓冲区溢出),业界长期以来的共识也是尽量在编译期/类型系统层面把这类错误排除掉,而不是仅仅依靠运行时检测+报错。这也是为什么 GCPO 选择了一次性地“从可行集中删除”,而不是“实时监测+回滚”这种也许工程上更灵活、但本质上总是慢一拍的方案。

5. 实验:是否真的有效,以及是否因为论文所说的原因而有效

5.1 实验设置

评测用了两个骨干模型——Qwen3-8B 和 GLM4-9B——横跨三个刻意选取、具有不同奖励结构的任务领域:数学推理 MATH500(奖励 = 通过基于规则的解析对最终 boxed 答案做精确匹配)、代码生成 HumanEval+(奖励 = 通过单元测试的比例)、工具调用 ToolAlpaca(奖励是函数名匹配、参数键一致性、归一化参数值匹配的综合)。三者都是二元或分级的响应级奖励,没有用学到的奖励模型。所有方法使用固定的留出集(种子 42),每个训练配置都独立重复三个随机种子,结果报告均值 ±\pm 标准差。评测用 majority@16 准确率(每个测试样例采样 16 个响应,多数投票,再对 1000 次重采样做 bootstrap 估计)——这是一个相当稳健的选择,能降低对单次不走运采样的敏感度。

GCPO 与一套相当全面的基线做对比:朴素 GRPO;三个修改裁剪/聚合方案的目标函数层变体(GSPODAPOGMPO);以及——对隔离 GCPO 真正贡献而言最关键的——GRPO-LoRA,它用与 GCPO 完全相同的秩和缩放,但没有双侧正交约束。这最后一个基线对干净的因果论证最重要:如果 GCPO 仅仅是打败了全参数 GRPO,持怀疑态度的人完全可以合理地把这个提升归因于低秩本身的隐式正则效应(这在微调里是众所周知的现象)。在匹配秩的条件下直接对比 GRPO-LoRA,能把正交投影本身单独隔离出来,作为任何额外提升的来源。

适应秩为 r=32r=32,α=16\alpha=16,LoRA 和 GCPO 都一样,受保护的主子空间秩为 k=8k=8(由第 5.4 节的消融实验选出)。训练最多跑 300 步,rollout 组大小 K=16K=16;完整超参数(各方法的学习率、裁剪阈值、批大小)见论文附录 D,并且在各方法间保持一致以确保公平对比。还有一个实验细节值得多说一句:论文对每个方法都使用了各自专属的学习率和裁剪阈值(而不是强行统一成一套超参数),这个选择其实有利也有弊。好处是避免了因为共享超参数不合适、导致某个基线被人为削弱的情况(比如如果强行用 GRPO 的学习率跑 GSPO,可能会因为两者裁剪机制不同而不公平);代价是读者无法完全确信每个方法都已经被调到了它自己的最佳点,这对任何包含多个基线的对比实验都是一个没有完美解的张力。

具体训练规模也值得交代一下:MATH500 有效训练步数为 300 步(450 个训练样例、批大小 32、每轮 14 步、最多 30 轮内封顶);ToolAlpaca 因为训练集更大(4046 个样例),同样在 300 步内封顶,但实际只走过了完整数据集的一小部分;而 HumanEval+ 由于数据集本身小得多(147 个训练样例),只能跑到 120 有效步。这意味着三个任务在“模型实际看到多少数据”这一维度上并不完全可比,解读跨任务的差异时应该考虑进去。

还有一个实验设计细节值得单独拿出来说:为什么需要同时报告三个不同任务领域的结果,而不是只汇报一个总体平均分数?因为三个任务在奖励结构上差异很大:MATH500 的奖励是稀疏且确定的(只有最后答案对错,中间推理过程完全不受奖励监督),ToolAlpaca 的奖励是组合式的(几个子项加权),而 HumanEval+ 的奖励本质上是一个硬性通过/不通过信号。如果只看平均分数,很容易隐藏一个方法在某一种奖励结构下特别强、在另一种下特别弱的情况。分任务报告,才能让读者看到 GCPO 的优势是否在三种截然不同的奖励结构下都能稳定复现,这对判断一个方法是否真正具备通用性而非针对某种奖励类型的过拟合,非常关键。

5.2 主要准确率结果:GCPO 全面领先,方差也最小

方法MATH500HumanEval+ToolAlpaca
Qwen3-8B
Base (Instruct)67.4673.5856.53
GRPO72.00 ± 1.3684.24 ± 0.8859.56 ± 1.52
GSPO77.80 ± 0.7487.81 ± 0.5166.18 ± 0.82
DAPO78.33 ± 0.6188.13 ± 0.4865.99 ± 0.76
GMPO77.64 ± 0.6988.14 ± 0.4566.16 ± 0.71
GRPO-LoRA77.87 ± 0.5887.36 ± 0.6266.05 ± 0.67
GCPO79.47 ± 0.3189.16 ± 0.2767.26 ± 0.39
GLM4-9B
Base (Instruct)66.5176.5542.47
GRPO59.43 ± 1.8472.43 ± 1.4265.70 ± 1.65
GSPO71.29 ± 0.9779.55 ± 0.8366.22 ± 1.08
DAPO72.41 ± 0.8281.43 ± 0.7167.35 ± 0.93
GMPO71.33 ± 0.9180.63 ± 0.7667.79 ± 0.88
GRPO-LoRA72.34 ± 0.6681.48 ± 0.5966.19 ± 0.75
GCPO74.56 ± 0.3483.64 ± 0.2970.16 ± 0.41

GCPO 在全部六个模型-任务组合上都拿到了最好的准确率,在每一格上都比最强的竞争基线高出 1.02–2.37 分,而且——值得一提——在每一个设置上标准差都是最小的。最后这个细节很容易被一眼扫过去,但它可能跟均值提升同样重要:一个硬几何约束的方法,同时还能降低跨种子的方差,说明它做的事情跟”平均意义上碰巧找到了略好的最优点”是结构性不同的。这和第 5.4 节的训练稳定性发现是一致的——一个不稳定性摇摆更少的训练过程,理应也是一个跨随机种子更可复现的过程。

把这六个设置拆开看还能发现一个模式:GCPO 相对最强基线的提升幅度,在 GLM4-9B 上比在 Qwen3-8B 上更大(例如 ToolAlpaca 上 GLM4-9B 提升 2.37 分,Qwen3-8B 上提升 1.08 分)。这与两个模型在 GRPO 基线上的表现差异一致:GRPO 在 GLM4-9B 上的表现明显更差(甚至在 MATH500 上低于基础模型),说明 GLM4-9B 对未受保护的 RL 更新本身就更敏感。这个相关性可以被解读为对本文核心故事的一个间接支持:一个模型本身对主子空间扰动越敏感(本例中的 GLM4-9B),GCPO 这种硬性保护就越能发挥作用——这是一个值得进一步验证的相关性,但论文并没有直接对此展开讨论。对实践者而言,这个观察也暗示着一个可能有用的筛选思路:在选择是否为某个新的预训练模型引入 GCPO 之前,可以先尝试在小规模上跑一下普通 GRPO,看看它对主子空间扰动的敏感程度如何——如果很敏感,GCPO 可能收益更大;如果本身就相对稳健,那么抄一个完整的消融或许优先级会候低一些。

与 GRPO-LoRA 的对比直接印证了论文的因果主张:在匹配秩的条件下,GCPO 在全部六个设置上都赢过 GRPO-LoRA,说明正交投影本身贡献了低秩参数化单独无法提供的东西。一个直观的数字感受:在 GLM4-9B 上,GCPO 相对 GRPO-LoRA 在 MATH500/HumanEval+/ToolAlpaca 上分别多拿了约 2.2、2.2、4.0 分,而在 Qwen3-8B 上相应的差距约为 1.6、1.8、1.2 分。虽然这些数字本身不能直接得出“GLM4-9B 更需要正交约束”这样的结论(两个模型在其他很多变量上也不完全可控),但它至少说明,这个方法的收益并不是在两个模型上均匀分布的常数,而与具体模型自身的训练动态有关。这正是你希望看到的那种消融实验,它的存在相当有力地加强了论文的核心主张。

还有一个容易被忽略的角度:GRPO-LoRA 本身就已经比全参数 GRPO 要强(两者对比参见表中 GRPO 行 对 GRPO-LoRA 行),这提醒我们低秩本身在 RL 后训练中就有一定的隐式正则化作用——可能是因为可训练参数更少降低了过拟合风险,也可能是因为低秩结构本身对梯度方差有一定阵尼作用。正因为存在这个背景效应,GCPO 相对 GRPO-LoRA 的提升就变得更有含金量:它不是在与一个弱基线比,而是在一个已经很强、自己就包含了低秩正则化效果的基线上,纯粹因为方向约束而又多摆了 1–2.4 分。

5.3 跨任务能力保持:ToolAlpaca 的崩溃

单一领域的 RL 训练如果搞垮了模型其他能力,就没什么用处。作者只在 MATH500 上做后训练,然后评测 HumanEval+ 和 ToolAlpaca——这次训练中模型完全没见过的任务。

方法HumanEval+ (Δ)ToolAlpaca (Δ)最差 Δ
Qwen3-8B,基线:73.58 / 56.53
GRPO64.71 (−8.87)50.72 (−5.81)−8.87
GSPO76.82 (+3.24)53.41 (−3.12)−3.12
DAPO75.54 (+1.96)53.09 (−3.44)−3.44
GMPO74.31 (+0.73)52.90 (−3.63)−3.63
GRPO-LoRA74.63 (+1.05)56.69 (+0.16)+0.16
GCPO77.57 (+3.99)57.56 (+1.03)+1.03
GLM4-9B,基线:76.55 / 42.47
GRPO76.91 (+0.36)27.50 (−14.97)−14.97
GSPO81.58 (+5.03)41.29 (−1.18)−1.18
DAPO81.39 (+4.84)37.68 (−4.79)−4.79
GMPO79.76 (+3.21)41.33 (−1.14)−1.14
GRPO-LoRA81.00 (+4.45)43.14 (+0.67)+0.67
GCPO82.43 (+5.88)43.38 (+0.91)+0.91

这里最抢眼的数字是 GRPO 在 GLM4-9B 上的 ToolAlpaca 灾难性崩溃:只训练数学任务,工具调用准确率就从 42.47 掉到 27.50,跌了将近 15 分。这生动展示了 RL 后训练可能对训练任务之外的能力施加的”遗忘”伤害,而且每一个目标函数层面的基线(GSPO、DAPO、GMPO)也都出现了真实的 ToolAlpaca 退化,只是幅度小一些——这说明仅在裁剪/聚合层面做修复,并不能触及底层的参数空间成因。GCPO 和(程度稍弱的)普通 GRPO-LoRA 是仅有的两个在只训练数学的情况下、还能相对基线模型提升 ToolAlpaca 的方法,而 GCPO 在两个骨干模型上都拿到了最好的最差情况保持度。有意思的是,数学到代码的迁移对所有方法而言大都是正向的(两个任务都依赖分步符号推理),这提醒我们”跨任务退化”不是均匀的——它取决于留出任务背后的技能与训练任务的技能有多相关,而工具调用(一项对格式和精确度要求更高的技能)在这里显得是更脆弱的能力。

5.4 训练动态:稳定性、熵与长度控制

论文考察了三个独立的动态性质,三者都指向同一个方向。

Figure 3 (paper Fig.3): Qwen3-8B 在 ToolAlpaca 上的准确率轨迹,每 5 个训练步评测一次。GRPO 剧烈震荡,中途还出现一次明显崩溃;GCPO 平滑且单调地上升。

在继续看具体数据之前,值得先拆解一下为什么这三个动态指标值得分开看,而不是当作一个指标的三种等价表现形式。准确率轨迹反映的是“模型学到了多少”这个目标本身的波动;策略熵反映的是“模型对自己的输出有多确定”这个探索-利用平衡,与准确率本身不完全重合(一个模型完全可以在高准确率的同时保持高熵,反之亦然);响应长度反映的则是一种具体的行为模式(输出冗长程度),与前两者都无直接数学关系,但可能共享同一个根本原因(不受控制的高方差梯度信号)。正因为这三者在数学上独立,它们在 GCPO 上同时变好,才是一个真正有信息量的信号,而不是单一指标改善的巧合。

还有一个对照组也值得多看一眼:虽然 GCPO 在三项动态指标上都最稳,但 GRPO-LoRA(也就是去掉正交约束、只保留低秩化的版本)在这些图中通常也比全参数 GRPO 更稳一些,只是不如 GCPO 彻底。这个中间层次的存在其实很有启发性:它提示着低秩化本身(即使没有正交约束)就已经对训练动态有一定的稳定化作用(可能是因为可训练自由度变小了,隔开了一些高方差方向),而 GCPO 在这个已经部分稳定化的基础上,再通过方向性约束进一步迈出了一步。这也与第 5.2 节主结果中 GRPO-LoRA 一直具备介于 GRPO 和 GCPO 之间的中间性能这个观察一致。

训练稳定性。 GRPO 在 ToolAlpaca 上的准确率轨迹极不稳定——训练过程中一度崩溃到大约 45%,随后部分恢复——而 GCPO 的曲线在全部 300 步中平滑且几乎单调上升。论文的解读是,双侧正交约束起到了一种结构性屏障的作用,阻止高方差梯度侵入主子空间,考虑到第 3 节的诊断结论(主子空间越界先于性能下降出现,而 GCPO 让这种越界从结构上不可能发生),这个机制性解释是合理的:更平滑的轨迹正是这一诊断所预测的结果。

Figure 4 (paper Fig.4): GLM4-9B 在 MATH500 上的策略熵随训练变化。GRPO 剧烈震荡;多数基线表现出过早的熵坍缩;GCPO 平滑、渐进地衰减。

策略熵。 一个健康的 RL 训练轨迹,熵应该随着策略专精化而逐渐降低,既不应剧烈震荡(不稳定的标志),也不应过早坍缩(策略过早停止探索的标志,这通常会损害泛化能力)。GRPO 表现出大幅震荡;多数其他基线表现出快速的、过早的熵坍缩;唯有 GCPO 在整个训练过程中呈现平滑渐进的衰减。这是一个不错的例子,展示了一个次要诊断指标(熵动态并不是设计 GCPO 时的初衷)与主要诊断指标(子空间重叠)得出一致的结论——这是适度但真实的证据,说明这个机制的解释力超出了它最初被设计针对的那个具体指标。

Figure 5 (paper Fig.5): Qwen3-8B 在 MATH500 上的响应长度分布(箱线图,标注了各方法运行的中位数)。GRPO 的中位响应长度膨胀到 2722 个 token;GCPO 保持在约 1054,是所有测试方法中最紧凑的之一。

响应长度膨胀。 这是 RLVR 里最令人头疼的失败模式之一:策略发现,在不涉及长度惩罚的验证器下,用额外的(常常是冗余或填充性的)token 把输出撑长,恰好跟更高的奖励相关,于是响应长度随训练不断膨胀,却没有带来相应的推理质量提升。GRPO 在 MATH500 上的中位响应长度膨胀到 2722 个 token;DAPO 达到 4654(论文没有深入讨论为什么 DAPO 膨胀得最厉害,不过 DAPO 解耦裁剪与动态采样的设计本就以能容忍更长、更具探索性的 rollout 著称,这可能与此现象存在合理的关联)。GCPO 的中位数停在 1054,基本与一个控制良好的基线持平。论文提出的机制是:预训练模型的一些主导方向很可能编码了与长度相关的先验(比如停止行为、在预训练/指令微调阶段学到的冗长度校准),把这些方向从高方差的 RL 梯度中屏蔽出来,就消除了策略最初借以学会这种基于长度的奖励 hack 捷径的一条途径。这被呈现为一个假说,而不是被证明的机制——我会把它标注为论文里相对更思辨性的主张之一(见第 7 节)——它是合理的,但没有被直接检验(比如检查长度相关的方向是否真的不成比例地落在主子空间里)。

在看图 6 之前,值得先说明为什么显存对比要放在“训练动态”这一大类下讨论,而不是当作一个独立的工程指标。原因在于,显存成本直接决定了一个方法在实际生产环境中能否被部署——如果一个方法在准确率、稳定性、长度控制上都很好,但需要两倍于现有方案的显存,它在很多团队那里就失去了实用价值。GCPO 恰好在这个维度上不需要任何权衡——它的所有好处都是“额外赠送”,而不是用显存换来的。

显存效率。 图 6(GLM4-9B 在 MATH500 上的峰值单卡训练显存)显示,全参数 GRPO、GSPO、DAPO、GMPO 都在 94–96 GB 左右,而 GRPO-LoRA 和 GCPO 都在 68–69 GB 左右——两者几乎完全一样。这证实了 GCPO 的额外投影操作相对普通 LoRA 带来的显存开销可以忽略不计,这符合前面的分析:额外成本是一小部分计算(每层每步两次瘦矩阵投影),而不是额外的可训练参数或优化器状态。对已经在用 LoRA 式适应做 RL 后训练的实践者来说,GCPO 在资源成本上几乎是”免费升级”。

5.5 消融实验:哪些设计选择真正起作用

表 3 在 MATH500、GLM4-9B 上系统性地对三个独立设计维度做了消融,结果对理解 GCPO 为什么有效(而不仅仅是是否有效)很有信息量。

维度变体MATH500 准确率
投影无约束72.34
仅左侧73.49
仅右侧73.56
双侧(本文)74.56
子空间随机66.47
主子空间62.59
正交补(本文)74.56
约束方式软损失正则71.11
KL 正则67.83
硬约束(本文)74.56

投影维度——双侧是必需的,不是锦上添花。 只约束左(输出)侧或只约束右(输入)侧,相比完全不约束有适度提升(72.34 → 约 73.5),但离完整双侧约束(74.56)仍有明显差距。机制层面的解读很直接:如果只封住一侧,另一侧仍然可以自由地对齐主导任务梯度,所以单侧约束只能部分堵住这个漏洞。这直接验证了公式 6–7 里双侧形式化在数学上的必要性,而不是一个随意的设计选择。

在继续看子空间轴之前,值得先把整个消融实验的设计思路讲清楚:三个轴分别对应了 GCPO 设计中三个独立的选择——“投影到哪里”、“投影什么子空间”、“怎么强制投影”,而且每个轴都恶意地设计了一个与直觉相反的对照组,目的就是把“为什么 GCPO 这么设计”变成一个可以用数据回答的问题,而不是交给直觉。

子空间维度——这是全文最重要的合理性检验。 故意把更新约束主子空间(与 GCPO 实际设计相反)导致严重崩溃,降到 62.59,甚至低于无约束基线(72.34),更远低于匹配维度的随机子空间约束(66.47)。这直接证实了起作用的是子空间本身——而不是任意的秩限制,也不是任意子空间。如果 GCPO 的收益主要是把更新限制在某个低维子空间带来的通用正则化效应,你会预期随机子空间变体也表现不错;但事实相反,它同样不如无约束基线(66.47 < 72.34),只有特意选取”与主子空间正交”这个方向,才能恢复并超越基线表现。这是整个消融表里最有说服力的一条证据,说明这个机制真正关乎的是预训练权重的这一特定几何结构,而不是一种泛泛的容量限制效应。

在看硬约束 vs. 软约束的对比之前,值得先把两种软约束变体的具体形式说清楚,因为它们失败的原因并不完全相同。软损失正则是把 ΦkδWF2+δWΨkF2\|\Phi_k^\top \delta W\|_F^2 + \|\delta W \Psi_k\|_F^2 作为额外项加入总损失,与任务奖励直接竞争同一个梯度预算;KL 正则则是通过加强现有的 KL 惩罚项来间接地希望限制策略变化、从而间接地限制主子空间重叠。两者都不是硬性强制,而是希望优化器自己“学会”避开那个方向。

约束机制维度——硬约束胜过软约束,与反馈回路论证的预测一致。 软正交损失惩罚和(单独地)加强 KL 正则,都大幅落后于硬约束(71.11 和 67.83 对比 74.56)。这正是第 4.1 节预测的失败模式:在 RL 的迭代反馈回路下,软惩罚只是被优化的求和式中的一项,面对的是能够、也确实会压过它的奖励梯度。KL 正则变体表现软损失变体还差,这是一个有用的额外数据点——它暗示,单纯在输出空间劝阻策略散度,对于防止一种特定的参数空间方向性病理而言是相对钝的工具;输出空间散度控制和参数空间方向控制这两种控制手段相关但不可互相替代,这与论文把 GCPO 定位为 KL 正则的补充而非替代品的框架是一致的。

Figure 7 (paper Fig.7): 保护秩 k 对 Qwen3-8B 在 MATH500 和 ToolAlpaca 上准确率的影响。两条曲线都在 k=8 处达到峰值,两侧都会下降。

保护秩 kk 是一个真实存在权衡的超参数,不是免费午餐。k{4,8,16,32,64}k \in \{4, 8, 16, 32, 64\} 上扫描,MATH500 和 ToolAlpaca 上准确率都在 k=8k=8 处尖锐地达到峰值,两侧都出现退化:kk 太小则对真正主导的方向保护不足(一些接近主导的重叠仍然可以通过未受保护的更高阶奇异方向发生,而这些方向可能仍然重要);kk 太大则过度限制可行更新空间,留给真正任务适应的余地太少。论文对此有一个明确的设计选择讨论:主子空间越大,其补空间(有效学习可以发生的空间)就越小,所以 kk 本质上是保护与容量之间偏差-方差式的权衡,不是一个可以设成某个”安全”大值然后一劳永逸的参数。论文没有给出一个不用做扫描就能为新模型/新任务选定 kk 的先验方法,这一点我会放到局限性部分再谈。

5.6 把消融串起来看:一个连贯的因果叙事

值得退一步注意一下,这四条独立的证据线(诊断相关性、受控干预、主实验结果、消融实验)彼此强化的程度有多不寻常,而不只是并存。诊断工作(第 3 节)找出了问题何时发生(瞬时重叠尖峰)、大致在哪里发生(集中在特定层)。受控干预(第 3.4 节)确立了直接操纵重叠会直接改变性能,排除了纯相关性的解释。主实验结果(第 5.2 节)表明,从结构上移除这种重叠发生的可能性,在六个独立的模型-任务组合上都带来了一致的提升,且方差更小。消融实验(第 5.5 节)则表明,GCPO 内部的每一个独立设计决策——双侧(而非单侧)投影、针对主(而非随机)子空间、硬(而非软)执行——都在做真实的、可分离的工作,而不是把整体提升归因于其中任何单一选择。这是一个构建得相当扎实的实证论证,也是我愿意比一般单一基准的 RL 论文更信任这篇文章核心主张的部分原因。强调一下这四条证据链之间的依赖关系也很有意思:如果受控干预实验(第 3.4 节)没有做,那么图 1 的相关性就永远只是相关性,后面所有设计决策都建立在一个未经验证的假设之上;如果消融实验(第 5.5 节)没有做,那么就无法排除 GCPO 的收益只是一种泤泛的正则化效应(比如单纯限制了有效参数量)。正是因为这四条链环环相扣,缺少任何一环都会让整个论点的说服力大幅下降——这也是为什么我把它们放在一起单独总结,而不是分散地提一句。

6. 复现性说明

除了这些已经列表怡的内容之外,还有一个对想自己实现的人比较实用的细节:GRPO-LoRA 这个关键对照组的存在,意味着你只需要在现有 LoRA-GRPO 实现的基础上加一个前置 SVD 步骤和两行投影代码,就能得到一个可与论文结果直接对齐的实现,这对想在自己的业务任务上快速验证这个方法的团队来说,迁移成本相当低。

对一篇偏系统方向的 RL 论文而言,这篇论文在复现性上的用心程度值得专门指出。所有方法共享固定的数据切分(种子 42),避免训练/测试划分变化与方法差异混淆;每个主配置都独立训练三个随机种子,全文统一报告均值 ± 标准差而非单次运行数字;确切的 rollout 引擎(vLLM,张量并行 2)、精度(bf16 配合 FSDP)、序列长度上限(2048 prompt / 8192 response token)以及各方法的具体超参数(学习率、裁剪阈值、批大小)都在附录中列成了表格。代码和数据集在论文头部的 GitHub 链接中发布。想精确复现的人需要留意一个细节:MATH500(50 个样例)和 HumanEval+(17 个样例)的留出集相当小,这是为了在众多方法和种子间做受控对比而做出的刻意权衡,但意味着单个配置的准确率数字应该结合报告的标准差来看,而不是当作精确的总体估计——论文对多种子报告的投入直接弥补了这一点,但相比文献里通常说的”完整 MATH500 测试集”(500 个样例)仍然是更小的评测集,因为按本文的留出集协议,其中 450 个都用于训练了。

7. 论文自己承认的局限,以及一些没完全说透的局限

论文自己陈述的局限(原文第 5.5 节)相当克制:尚不清楚观察到的几何模式是否能推广到 DPO、KTO、on-policy distillation 等非 rollout 后训练范式;主子空间重叠与具体失败模式(长度膨胀、奖励 hack)之间的因果关系,除了与准确率下降的关联之外,尚未完全厘清;当前方法对每层使用单一的全局 kk,而不是自适应的逐层选择,第 5.5 节的消融表明这一点其实相当重要。

这些局限性反过来也说明了一件事:论文自己对“本文能证明什么、不能证明什么”有相当清醒的自我认知,这本身就是一个值得认可的学术习惯。但自我陈述的局限性往往会們向于先写好对自己最有利的那个版本,作为读者,仍然需要自己补上一些论文没有主动提及、但从实验设计本身就能看出端倮的地方。

除了论文自己说的这些,还有几点我认为讨论得不够充分:

  • 规模。 全部实验都用的是 8B–9B 参数规模的模型。RL 后训练的不稳定性、熵坍缩动态,以及预训练权重矩阵本身的几何结构,都已知会随规模变化(更大的模型某些层类型的奇异值谱往往更平坦,这会直接改变”前 8 个方向”占总能量的比例)。同样的 k=8k=8 最优值,乃至”重叠先于性能下降”这一定性关系本身,在 70B 以上规模是否依然成立,是这篇论文完全没有触及的开放问题,而考虑到 RL 训练动态已知会随模型规模有多大变化,这正是那种在没有证据支撑的情况下外推会有风险的主张。
  • 长度膨胀机制是被断言的,而不是被检验的。 如第 5.4 节所述,“主方向编码了长度先验”这个说法是合理的叙事粘合剂,但没有被直接探测过(比如通过类似图 2 准确率干预实验的方式,但把目标换成长度而不是正确率)。考虑到这个结果对论文的实践吸引力有多核心(响应长度膨胀是一个被广泛感受到的痛点),在这里做一个专门的实验,本可以显著加强论文,而不是把它留作一个假说。
  • kk 的选择没有给出有原则的方法。 消融实验清楚地表明 kk 很重要且存在真实的最优值,但论文没有提供比完整扫描更便宜的替代方案——没有基于奇异值谱衰减速率、层的角色(注意力 vs. MLP)或模型规模的启发式方法。对一个主打卖点是”接近免费的结构性修复”的方法来说,需要针对每个模型、每个任务都做一次超参数扫描来找 kk,是论文没有完全承认的一项实际成本。
  • 除了上述四点之外,还有一个比较难直接定量、但实践中很重要的问题值得提一下:论文选择的三个任务(数学推理、代码生成、工具调用)都属于“结果可验证”型任务,也就是说模型的输出可以被一个确定性程序直接打分。很多工业界应用场景——比如开放域对话、长文档总结、创意写作、多轮客户服务——并没有这种确定性结构,奇异重叠诊断在这些场景下能否同样预示性能下降,本质上是一个待验证的外推。具体而言,在没有确定性验证信号的任务中,奖励本身就已经带有噪声或偏差,这种情况下“重叠尖峰预示性能下降”这个相关关系可能会被奖励本身的噪声淹没,因为你无法区分一次准确率下降到底是来自奖励本身的噪声,还是真正的参数空间异常。

奖励类型全都是基于规则/可验证的。 三个任务用的都是二元或基于执行的奖励,而不是在人类偏好数据上训练出来的学习型奖励模型。使用带噪声、可能校准不准的学习型奖励模型的 RLHF 流水线,恰恰是历史上奖励 hack 和不稳定性记录最严重的场景(这本身就是 RLHF 文献最初的核心关切),当奖励信号本身噪声更大、也更可能以基于规则的奖励所没有的方式被利用时,主子空间重叠是否还能扮演同样的预警信号角色,是一个悬而未决的问题。

  • SVD 子空间在整个训练过程中是静态的。 Φk,Ψk\Phi_k, \Psi_k 在训练开始前根据 WrefW_{\text{ref}} 一次性算出,此后再也不更新。这是一个合理且便宜的设计选择,但也意味着,即便有效权重 WtW_t 在数百步训练中不断演化,GCPO 对”主导方向”的定义始终冻结在预训练 checkpoint 上;预训练模型的主子空间在训练深入之后是否仍然是最值得保护的那一个(相对于,比如说,当前 checkpoint 自身演化出的主子空间),是被假设而非被论证的。

具体的后续改进建议: (1) 在 70B 以上规模重跑同样的重叠诊断流程,检查定性关系(瞬时尖峰先于性能下降)和最优 kk 是否依然成立,还是需要按规模重新推导;(2) 设计一个针对长度的专门干预实验(类似图 2 的准确率干预,但以响应长度作为结果变量),直接检验长度膨胀机制,而不是靠推断;(3) 开发并测试一种从预训练奇异值谱出发、按层选择 kk 的廉价启发式方法(比如拐点检测或方差解释率阈值),从而免去完整扫描的需要;(4) 把诊断方法推广到使用学习型、可能校准不准的奖励模型的场景,看看当奖励信号本身是一个合理的混淆因素时,主子空间重叠是否依然对性能下降具有预测力。

8. 写在最后

回到开头那个框架性区分:这篇论文同时完成了一个测量贡献和一个设计贡献,而它们在证据强度上并不完全对称。测量贡献(重叠统计量及其维度修正)建立在经典、严谨的线性代数上,几乎无可挑剔;受控干预实验进一步强化了它的可信度。但设计贡献(GCPO 本身)的证据强度相对弱一些——它建立在“这个设计在六个设置上都赢了”这个经验事实之上,而不是建立在“这是唯一或最优的设计”这个理论保证之上。这个区分对读者的建议是:可以很有信心地接受重叠统计量这个工具本身,同时对 GCPO 是否是利用它的最佳方式保留一定的开放态度。

GCPO 是一个很好的例子,说明一篇论文如何通过扎实的诊断工作、而不是提出一个听起来合理的修复方案再指望它能泛化,来赢得它的核心设计决策。四路能量分解、维度修正的重叠统计量,以及——最重要的——受控干预实验,三者共同构建了一个相当有说服力的论证:瞬时的主子空间重叠不仅与 RL 后训练的不稳定性相关,而且至少部分地在因果上牵涉其中。由此得出的修复方案之所以优雅,正是因为它没有用另一个软惩罚项去对抗反馈回路(消融实验表明这种做法出于一个可以被机制性理解的具体原因而失败),而是把有问题的方向从可行集中彻底移除,而且相对普通 LoRA 几乎没有额外的显存成本。

除了上面提到的规模和奖励模型问题之外,我更想知道的是,这种诊断视角能否作为一种通用工具、独立于 GCPO 这个具体修复方案而推广开来——重叠统计量本身,只需每层一次 SVD 就能便宜地算出来,似乎可以作为任何基于 rollout 的 RL 方案的实践者都能用的一种监控信号,而不仅仅是设计一个新算法的原则。如果未来有论文证明,实时监控这个统计量并触发 checkpoint 回滚(而不是一个硬性的架构约束),能以更低的工程成本达到类似的稳定性,那将是这篇论文核心洞见的一个很自然、也很有意思的延伸。

对于正在考虑是否要采用 GCPO 的实践者来说,现实的算账相当划算:如果你已经在用 LoRA 式的参数高效 RL 后训练(考虑到全参数 RL 的显存成本,这在很多生产流水线里已经是默认选择),换成 GCPO 的投影式参数化,代价是为每个被适应的层做一次前置 SVD、每步一点点固定的计算开销,以及多调一个超参数(kk)——换来的是可衡量的准确率提升、更好的跨任务能力保持、更平滑的训练曲线,以及更受控的响应长度膨胀,而且这些结论横跨两个模型家族、三个相当不同的任务领域都得到了验证。这是一笔不错的交易,前提是上面提到的这些开放问题——尤其是规模问题——在被检验之后不会推翻这个核心发现。

最后想多说一句自己的感受:这类“先把一个现象诊断清楚、再把修复方案设计成一个结构性事实而不是一个要与其他目标权衡的软约束”的思路,其实在系统工程里比在 RL 算法设计里更常见一些——比如内存安全中用类型系统在编译期排除整类错误,而不是靠运行时检查。GCPO 的有趣之处在于,它把这种思路引入到了一个本质上动态、非线性的训练环境里,而且代价小得可以徽忽不计,这个性价比在同类工作里算是相当窀有的。