跳到主要内容

锐化是 @1 自带的,别为它造优化器

原石
原石

· 阅读约 4 分钟

先把带 KL 正则的 @1 目标贴上,缩到最简就这几行。

loss = -E[ r(x, y) * log π(y|x) ] + β * KL(π(·|x) || π_ref(·|x))

r 是 1/0 的答案对不对,β 是 KL 系数,π_ref 是参考策略。

这个 loss 里有个东西一直没被人正眼看:β 是一个数。数学竞赛题是它,1+1 等于几也是它。每个 prompt 承受同一个压力。

然后你就看到锐化。准确率涨,行为覆盖掉。模型把所有概率押在那条最可能对的路径上,采样十条出来,八条一模一样。

这不是训练失误。这是 @1 的定义替你做的选择。

上个月 arXiv 上贴了一篇,编号 2611.03146,Simon Matrenok 那几个人写的。核心论点是:锐化不是现象,是 @1 跟 @k 之间差的那点东西。他们在带 KL 正则的 pass@k 和 max@k 上给出了最优策略的闭式解。

我把那个解按我的理解重画一遍。这不是论文原式,是骨架。

# π*_k(y|x) ∝ π_ref(y|x) * exp( r(x,y) * w(x) / β )
# 其中 w(x) 只跟 prompt 难度有关,越难越大

看第二行那个 w(x)。就这一个东西。

@k 最优策略跟 @1 最优策略,全部区别在这儿:@1 里那个全局的 β,在 @k 里变成一个跟着 prompt 走的 β(x)。难题的权重抬上去,简单题的松下来。学习压力按提示难度重新分配。

说穿了就一句话:@k 优化学的不是"多采几条然后挑好的",是"哪些题还值得使劲"。

我前面说锐化是 @1 的签名,这话说满了。准确点:锐化是 @1 在"所有 prompt 一视同仁"这个隐含假设下的签名。这个假设一拆,锐化就散了。

真正让我坐直的是论文第 9 条那句。

既然 @k 的最优策略长成那个样子,那它就不需要一套新算法去逼近。对 @1 目标动一行,就能落到同一个最优策略上。两个方向:

# 方向一:把 β 变成 β(x)
loss = -E[ r * log π ] + β(x) * KL(π || π_ref)

# 方向二:β 不动,动奖励
loss = -E[ r * g(x) * log π ] + β * KL(π || π_ref)
# g(x) 同样只依赖 prompt 难度

一个提示自适应正则,一个提示自适应奖励变换。都是一行。都能把 @1 推到 @k 的最优解上。

这就是我为什么对现在那堆 @k 专用优化器没什么好感。

它们没错。重要性采样修正、方差缩减、独立实现、另一套超参——本质是把同一个重新加权过程用更贵的办法走一遍。你付的是 k 倍采样加一套新流程,拿到的是那个 w(x)。等价的东西,复杂度差一个数量级。

作者提的方法叫 KAPPO。我第一次看它的流程改动时愣了两秒。

  for prompt in batch:
      ys = sample(π, prompt)
      adv = reward(ys) - baseline
-     loss = -adv * log π(ys|prompt) + β * KL(π || π_ref)
+     loss = -adv * log π(ys|prompt) + β_x(prompt) * KL(π || π_ref)
      update(π, loss)

一个 diff 就完了。采样是一个,batch 是一个,优化器是一个,PPO 的 clip 还在原位。前面加一次参考校准拿到每个 prompt 的难度信号,此后全程只改这一个系数。

我原先以为 @k 压力怎么着也得训练时多采几条吧——不采 k 条,你怎么知道第 k 条对不对?后来发现它连这个都省了。压力来自 β(x) 的形状,不来自样本数量。单次补全训练就能拿到 @k 压力,成本跟原来的 @1 训练一样。

这个结论我愿意替它站台,因为它符合一个我一直信的东西:能改一个系数解决的,别改流程。

不过有一处我还没想明白。难度的估计是拿一次参考校准的通过率当信号,那个通过率本身有噪声,特别是难题——参考模型在难题上本来就采不准,你拿它算出来的"难"到底有多可信?论文里没细说这个传导,我倾向于认为这是这套方法最脆的一环。等有功夫我自己拿那个玩具引擎的后训练脚本试一下。

回到主线。

这篇论文最值钱的地方,不在 KAPPO 这个名字,在于它把 @k 优化从一个"算法问题"重新归类成一个"目标形状问题"。归类一变,后面所有的工程复杂度就塌了。

剩下那些专用实现,不是被证明错了,是被证明多余了。

所以留一条规则:凡是有人告诉你某件事需要一个新优化器,先让他回答——这个新优化器的最优策略,能不能写成旧目标乘一个系数?

答不上的,先别加。

原石
原石

把代码当文章写的系统工程师,以源码立论、单线程式拒绝复杂度。

查看主页 →