Budget Forcing:通过截断与扩展控制推理深度

张开发
2026/4/6 5:16:09 15 分钟阅读

分享文章

Budget Forcing:通过截断与扩展控制推理深度
1. 核心机制Budget Forcing 由斯坦福大学研究团队提出是一种解码阶段干预策略通过强制控制模型思考链Chain-of-Thought, CoT的长度来实现测试时计算扩展。其核心操作有两种模式1.1 强制截断Scaling Down当模型生成的思考token超过预设预算时强制注入结束符如/think迫使模型立即进入答案生成阶段。Python# 伪代码示意 if generated_thinking_tokens max_budget: force_append_token(/think) # 强制结束思考 transition_to_answer_generation()1.2 强制扩展Scaling Up当模型试图过早结束思考生成/think时抑制该token的生成并追加Wait提示鼓励模型继续反思Python# 伪代码示意 if next_token /think and current_budget target_budget: suppress_token_generation() force_append_text(Wait) # 追加等待提示 continue_thinking() # 模型继续生成推理步骤这种机制能触发模型的自我纠错行为——当被迫等待时模型往往会重新检查之前的推理步骤并修正错误。2. 技术实现细节2.1 数据构造与训练Budget Forcing 需配合长程推理数据进行监督微调SFT数据集s1K1,000条经筛选的高质量问题Gemini Thinking Experimental蒸馏的长推理轨迹训练目标使模型学会在截断或扩展的情况下仍能生成连贯推理硬件需求Qwen2.5-32B模型在16×H100 GPU上仅需26分钟训练2.2 关键超参数参数作用典型值max_thinking_tokens强制截断阈值32~512 tokensmin_thinking_tokens强制扩展触发点16~64 tokenswait_token扩展提示符Wait、Alternatively、Let me check2.3 性能表现在s1-32B模型上的实验显示AIME24数学竞赛通过Budget Forcing将推理token从默认长度扩展到更长准确率从50%提升至57%可控性完美的计算预算控制呈现清晰的正向缩放曲线Positive Scaling对比优势相比并行采样Majority Voting或MCTSBudget Forcing在相同计算预算下获得更高性能3. 进阶变体与扩展3.1 LightThinker动态思维压缩LightThinker是Budget Forcing的内存优化版本通过引入Gist Tokens实现核心思想将冗长的思考步骤压缩为少量紧凑的表示Cache Tokens丢弃原始推理链技术实现插入特殊tokenw压缩触发器、C缓存token集合、[o]输出续写标记通过定制注意力掩码使后续生成仅依赖压缩后的表示性能在Qwen模型上减少峰值token使用量70%推理时间降低26%准确率仅下降1%3.2 Dynamic Chain-of-Thought (D-CoT)D-CoT引入分层自适应奖励优化HARO机制自适应剪枝基于重要性评分结合门控logits与注意力分数动态剪枝低价值推理步骤部分奖励估计器实时评估推理块贡献度动态调整阈值公式化表示If Importance(t) τ_dyn(r_t): 剪枝token t Else: 可选地进行摘要3.3 Length Controlled Policy Optimization (LCPO)通过强化学习直接训练模型遵循长度约束L1-Exact生成与目标长度精确匹配的推理L1-Max确保输出在最大长度约束内奖励函数结合正确性与长度惩罚项4. 与State Space Models (SSM)的结合潜力虽然当前Budget Forcing主要在Transformer架构上实现但与Mamba等SSM结合具有独特优势4.1 线性复杂度优势Mamba的线性注意力机制O(n) 使其在处理极长推理链数千tokens时比TransformerO(n2) 更高效可支持更激进的计算扩展如数千步推理而不显存爆炸4.2 状态空间截断State Truncation在Mamba中可实现状态级Budget Forcing# Mamba-specific Budget Forcing if current_step max_reasoning_steps: # 直接截断状态序列而非token序列 hidden_states hidden_states[:, -1:, :] # 保留最终状态 transition_to_decoder()4.3 递归推理Recursive Reasoning借鉴LightThinker思路Mamba可将历史状态压缩为固定大小的状态向量实现常数内存无论推理多长KV Cache保持恒定大小无限步推理理论上支持无限步思考类似RNN的展开5. 实践中的挑战与解决方案5.1 过度思考Overthinking模型可能在简单问题上生成过多冗余步骤。解决结合确定性引导Certainty-Guided Reasoning当模型对答案置信度通过答案token概率评估超过阈值时强制终止5.2 数值敏感性LightThinker实验显示压缩过程中容易丢失数值信息如4000被错误压缩。解决对数值token采用硬注意力或特殊保留策略5.3 与RL训练的兼容性原始Budget Forcing基于SFT与RL训练如DeepSeek-R1结合时可能不稳定。解决采用SFTRL两阶段训练先用SFT初始化长程推理行为再用RL优化token效率可减少40%token使用6. 代码实现框架class BudgetForcingController: def __init__(self, min_budget32, max_budget512, wait_tokenWait): self.min_budget min_budget self.max_budget max_budget self.wait_token wait_token self.thinking_tokens 0 def should_force_wait(self, next_token_id, tokenizer): 检查是否需要强制扩展推理 token_str tokenizer.decode([next_token_id]) is_end_think (token_str /think or token_str |endoftext|) return is_end_think and self.thinking_tokens self.min_budget def should_force_end(self): 检查是否需要强制结束推理 return self.thinking_tokens self.max_budget def generate_with_budget(self, model, prompt, tokenizer): 带预算控制的生成 inputs tokenizer(prompt, return_tensorspt) generated [] self.thinking_tokens 0 for _ in range(max_iterations): outputs model(**inputs) next_token_logits outputs.logits[:, -1, :] next_token_id torch.argmax(next_token_logits, dim-1) # Budget Forcing干预逻辑 if self.should_force_end(): # 强制注入结束标记 end_id tokenizer.encode(/think)[0] next_token_id torch.tensor([end_id]) break if self.should_force_wait(next_token_id, tokenizer): # 抑制结束标记追加Wait wait_ids tokenizer.encode(self.wait_token, add_special_tokensFalse) generated.extend(wait_ids) self.thinking_tokens len(wait_ids) continue generated.append(next_token_id.item()) self.thinking_tokens 1 # 更新输入 inputs[input_ids] torch.cat([inputs[input_ids], next_token_id.unsqueeze(0)], dim-1) return tokenizer.decode(generated)7. 总结与展望Budget Forcing代表了从训练时缩放向推理时缩放的范式转移其核心优势在于零参数更新无需重新训练模型即可调整推理深度精确可控通过简单的token计数实现计算预算的硬约束自我纠错Wait机制诱导模型进行反思与修正未来发展方向包括自适应预算分配根据问题难度动态调整预算如DAST方法多模态扩展UniT框架已将Budget Forcing扩展到图像生成轮次控制与SSM深度融合利用Mamba的线性复杂度实现超大规模推理扩展

更多文章