当前位置:首页 > 编程开发 > 正文

StepBack 复现:省 78% 的 token,前提是定位准

约 4748 字 · 预计阅读 12 分钟
一句话总结:把自洽投票的"每条链都重跑"改成"只重跑出错那一步之后",我跑出来的 token 消耗降了 78%,准确率能不能涨完全取决于定位准确率——定位掉到 35% 就会亏。

自洽投票(Self-Consistency)的做法很朴素:同一个问题采样 8 条推理链,投票取多数。

它有效,也贵。8 条链就是 8 倍成本。

StepBack 这篇论文的想法是:大部分链在第二步就错了,后面的五步全白跑。如果能找到第一个出错的步骤,只从那里重跑,是不是能省一大半?

逻辑上没问题。我照着实现了一遍,结论是:省下来的 token 是确定的,涨上去的准确率不确定。

StepBack 只做一件事:回退到最早出错那步

流程分四步:

  1. 先采少量草稿轨迹(论文用的是"一小批")
  2. 用轻量信号定位每条草稿里最可能出错的第一个位置
  3. 从那个位置起重采这一步和它之后的所有步骤
  4. 对答案投票

原文的说法是:在七个数学推理和多跳问答基准上,平均准确率追平自洽投票,token 用量最多降 41.26%。

41.26% 这个数字我复现不出来,我跑出来的更高。原因下面说。

自洽投票贵在哪:一次完整重采样

先把基线写出来。

STEPS, P_STEP = 7, 0.92        # 每条链 7 步,单步正确率 92%

def chain(q, k):
    first_err = None
    for i in range(STEPS):
        if rnd(f"{q}:{k}:{i}") >= P_STEP and first_err is None:
            first_err = i
    return first_err            # None = 整条链都对

def sc(q, n):
    votes = [chain(q, k) is None for k in range(n)]
    return sum(votes) > n / 2, n * STEPS

单步 92% 听起来很高,但 7 步连乘是 0.92^7 = 0.558。也就是接近一半的链至少错一步。

n 取 8、16、32 各跑 4000 道题:

方法 准确率 token
SC n=849.55%224,000
SC n=1658.20%448,000
SC n=3268.47%896,000

投票数翻倍,准确率涨 8 到 10 个点,成本线性涨。这就是自洽投票的天花板:想再准一点,只能再翻倍。

StepBack 的重采样:只重跑后缀

def stepback(q, drafts, res, signal):
    cost = drafts * STEPS
    errs = [chain(q, k) for k in range(drafts)]
    votes = [e is None for e in errs]
    bad = next((e for e in errs if e is not None), None)
    if bad is None:
        return sum(votes) > len(votes) / 2, cost
    target = bad if rnd(f"{q}:hit") < signal else int(rnd(f"{q}:miss") * STEPS)
    prefix_ok = target <= bad          # 指到错步之后 = 把错误前缀固化了
    for j in range(res):
        suffix_ok = all(rnd(f"{q}:rs{j}:{i}") < P_STEP for i in range(target, STEPS))
        votes.append(prefix_ok and suffix_ok)
        cost += STEPS - target
    return sum(votes) > len(votes) / 2, cost

有一行值得单独说:prefix_ok = target <= bad。

如果定位指到了真正的首个错步,前缀是干净的,重采后缀就有意义。如果指到了错步之后,前缀里已经带着错误,重采后缀再多次也没用——这就是"把错误前缀固化下来"。

第一版我漏了这一行,把每张票都算成"后缀全对",结果 StepBack 准确率 77%,比 SC 高了近 20 个点。太好看的数字先怀疑,补上这一行才是真结果。

定位准确率决定一切

以 SC n=32(68.47% / 896,000 token)为基准:

定位准确率 草稿 2 + 重采 12 token 变化 相对基准
90%81.70%−77.8%+13.2pt
72%76.25%−78.1%+7.8pt
55%71.85%−78.3%+3.4pt
35%66.53%−78.5%−1.9pt

两个现象。

第一,token 节省几乎不随定位准确率变化。 四行的节省都在 77.8% 到 78.5% 之间。因为重采多少步取决于"定位到第几步",不取决于"定得对不对"。定错了照样省 token,只是省下来的钱买不到准确率。

第二,准确率对定位准确率极度敏感。 90% 时 +13.2 个点,35% 时 −1.9 个点。拐点大概在 40% 附近。

这说明 StepBack 的收益不是"结构红利",是"信号红利"。结构只保证省钱,赚不赚看信号质量。

定位低于 40%,不如不做

StepBack 复现:省 78% 的 token,前提是定位准

图 1:横轴为定位准确率,纵轴为最终准确率。虚线是 SC n=32 的基准线 68.47%,交点约在 40%

把四个点连起来,和基准线的交点在 40% 左右。

这个阈值有实际意义:如果你手上那个"轻量信号"的定位准确率低于 40%,用它做 StepBack 还不如老老实实跑自洽投票——省下的 token 换不回掉的准确率。

40% 是什么概念?比随机猜(1/7 = 14%)高不少,但离可用(80% 以上)还很远。论文说用的是"轻量信号",没具体说是哪种。我猜是每步的 logprob 或者自评置信度,这类信号的准确率通常在 50% 到 70% 之间,刚好在能赚一点的范围里。

坑清单

1. 忘了"前缀固化",跑出漂亮结果。

第一版没加 prefix_ok 判断,StepBack 准确率 77%,比基准高 19 个点。数字太好看的时候先别高兴,检查一遍逻辑。上次复现 GIF 那次也是这么栽的:第一版指标选错,两组只差 0.9,换个算法才看出 1.17 对 7.12。

2. token 节省按"重采步数"算,忘了草稿成本。

草稿也是要花钱的。2 条草稿 14 步,加上 12 次重采平均 5.5 步 = 66 步,对比 SC n=32 的 224 步。要是把草稿成本漏掉,节省率会虚高到 85%。

3. 用 hash() 做随机源,两次跑结果不同。

老问题。hash() 受字符串哈希随机化影响,每次进程启动的 salt 不一样。用 sha256 前 8 位转整数。

4. 定位到第 0 步时,StepBack 退化成 SC。

如果信号总是说"第一步就错了",那重采就是从第 0 步重跑整条链,成本和 SC 一样。实际的信号分布得看一眼,别假设它均匀。

5. 投票基数不一致。

草稿 2 票 + 重采 12 票 = 14 票,和 SC 的 32 票不是一个量级。要比准确率就得控制这个变量,我这里是"同等预算下"而不是"同等票数下"。

这套 StepBack 模拟的边界

P_STEP = 0.92 是我拍的。真实的单步正确率随题目难度变化,简单的题 99%,难的题 60%,用一个常数会掩盖分布。

STEPS = 7 也是拍的。真实推理链的长度从 3 步到 30 步都有,链越长,StepBack 的优势越大——因为后缀占总长的比例更小。

定位信号我用的是一步到位的概率模型(signal 概率指对,否则随机指),真实信号会跟步骤位置相关:早期步骤更容易定位,后期步骤因为上下文长反而难。

这三条都影响绝对数值,不影响那个结论的形状:省 token 是结构性的,涨准确率是信号决定的。

论文报的 41.26% 比我低,可能是因为他们的重采预算更大、草稿更多,摊薄了节省率。我这个 78% 是"用 SC 32 分之一的成本达到 68% 以上的准确率"这种算法,口径不一样。

结语

这篇论文最值得抄的不是算法,是那个切分:把"重采样"从轨迹级降到步骤级。

一旦降到步骤级,优化的对象就从"采样多少条"变成"从哪一步开始采"。前者靠加钱,后者靠判断。

而判断质量,决定了这个方法是赚还是亏。上周那个时钟协议模拟器也是同一个教训:结构给你方向,参数决定你是赚还是亏。

参考资料

目录导航
  • StepBack 只做一件事:回退到最早出错那步
  • 自洽投票贵在哪:一次完整重采样
  • StepBack 的重采样:只重跑后缀
  • 定位准确率决定一切
  • 定位低于 40%,不如不做
  • 坑清单
  • 这套 StepBack 模拟的边界
  • 结语
    • 参考资料
  • 相关文章:

  • 10.87 倍需要什么条件:把 SpecPilot 的数字反解一遍
  • 发表评论

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。