2026/1/10 16:16:57
网站建设
项目流程
网站直播间怎么做,天津室内设计公司排名,大庆油田内网主页网址,网上申请营业执照入口后训练Qwen3进行数学推理#xff1a;使用GRPO
预训练语言模型就像通过展示数百万本书来教某人阅读。他们会学习语言模式、理解语法#xff0c;甚至在这个过程中学到一些事实。但他们能遵循具体指令吗#xff1f;他们能推理多步骤数学问题吗#xff1f;他们能使自己的回答与…后训练Qwen3进行数学推理使用GRPO预训练语言模型就像通过展示数百万本书来教某人阅读。他们会学习语言模式、理解语法甚至在这个过程中学到一些事实。但他们能遵循具体指令吗他们能推理多步骤数学问题吗他们能使自己的回答与人类实际期望听到的内容保持一致吗并不完全如此。这就是后训练技术发挥作用的地方。这些方法将基础模型从通用文本生成器转变为能够进行复杂推理的专用系统。后训练优化涵盖了一系列技术包括监督微调、指令调优、基于人类反馈的强化学习以及先进策略优化方法。这一阶段的重要性怎么强调都不为过最近在推理能力模型上的突破证明了这一点这表明复杂的后训练技术可以显著增强多步推理和数学问题解决能力。数学推理领域带来了传统后训练方法难以有效应对的独特挑战。数学问题解决不仅需要准确的事实检索还需要执行多步逻辑推理、在扩展推理链中保持一致性以及将抽象原理应用于新问题配置的能力。在本文中我们将理解并应用群组相对策略优化——这是某机构R1成功的主要支柱之一——来对小型语言模型进行数学推理的后训练。本教程是关于偏好优化的2部分系列中的最后一课使用直接偏好优化微调SmolVLM以实现人类对齐使用GRPO后训练Qwen3进行数学推理要学习如何使用GRPO对Qwen3进行数学推理的后训练请继续阅读。群组相对策略优化近端策略优化的挑战近端策略优化长期以来一直被认为是大型语言模型训练中强化学习的黄金标准尤其是在RLHF流程中。然而尽管其应用广泛PPO存在几个基本挑战在应用于语言模型训练和复杂推理任务时尤为突出。计算开销和内存需求PPO最显著的局限性之一是其巨大的计算开销和内存需求。PPO需要在训练期间同时维护多个模型策略网络执行者、价值函数网络评论者、参考策略通常还有一个奖励模型。这种多模型架构带来了几个问题PPO的内存需求可能是监督微调的三倍以上这使得计算资源有限的许多实践者无法使用。在训练期间加载和维护多个模型内存的需求造成了显著的瓶颈尤其是在处理已经逼近可用GPU内存边界的大型语言模型时。价值函数不稳定和表征坍塌PPO对独立价值函数网络的依赖引入了额外的复杂性和潜在的故障点。价值网络必须准确估计给定状态的预期未来奖励但这种估计在由持续更新的策略创建的非平稳环境中变得越来越困难。研究表明PPO智能体会随时间遭受特征秩下降和塑性丧失导致研究人员所称的“表征坍塌”。这种现象表现为学习到的表征秩的降低这与价值网络无法继续学习和适应新观察结果相关。这种坍塌在较长的训练运行中尤为明显并最终可能导致执行者性能的崩溃无论评论者性能如何。超参数敏感性和训练不稳定性PPO以对超参数选择敏感而闻名需要仔细调整学习率、裁剪参数、价值函数系数和熵奖励。这些参数的微小变化可能导致截然不同的训练结果使得PPO难以在不同的任务和模型规模上可靠地部署。该算法的训练动态可能不稳定特别是在对数学推理任务至关重要的长链推理场景中。当奖励稀疏且延迟时——这在多步推理问题中通常是这种情况——PPO可能难以处理时间信用分配问题。价值函数估计中的偏差PPO中的价值函数会在优势估计中引入偏差特别是当价值网络未能准确表示状态的真正价值时。这种偏差会在训练迭代中累积导致次优的策略更新并可能导致模型学习到动作和奖励之间的错误关联。PPO的这些基本局限性促使研究人员开发替代方法这些方法既能保持强化学习的优势又能解决这些计算和稳定性问题。群组相对策略优化代表了这样一种进步专门设计用于克服许多这些局限性同时为复杂推理任务提供高效稳定的训练。GRPO目标函数群组相对策略优化代表了对传统策略优化方法的根本性转变它消除了对独立价值函数的需求同时保持了稳定高效的训练动态。GRPO的数学基础建立在组相对优势估计的原则之上这提供了计算效率和方差减少。核心GRPO目标GRPO目标函数可以正式表示为其中x表示输入提示或问题y_i表示针对同一提示生成的一组输出/完成项A_clip表示裁剪后的优势函数D_KL表示KL散度惩罚项β表示正则化系数组相对优势估计GRPO的关键创新在于其优势估计机制。与依赖学习到的价值函数不同GRPO相对于采样的输出组计算优势其中r(y_i)是输出y_i的奖励μ_group是组平均奖励σ_group是组标准差这种归一化服务于多个目的。它通过将每个输出与其同行进行比较来提供自然基线通过在每个组内进行局部比较来减少方差并消除了对独立价值函数逼近器的需求。裁剪替代目标遵循PPO的方法GRPO采用裁剪替代目标来保持训练稳定性其中ϵ将r_t限制在[1-ϵ, 1ϵ]范围内防止可能破坏训练稳定性的过大策略更新。KL散度正则化GRPO目标中的KL散度项用于使更新后的策略接近参考策略π_ref通常是初始监督微调模型这个正则化项在语言模型训练中尤为重要可以防止模型忘记其预训练的能力。GRPO在数学推理中表现出色的原因群组相对策略优化已迅速确立为大型语言模型数学推理的领先微调方法这归功于使其特别适合该领域的几个结构性特征。最近的大规模研究表明在RLHF流程中用GRPO替换PPO可以在数学推理基准上带来显著改进。例如使用GRPO训练的模型在数学推理准确性上优于基于PPO的方法同时降低了计算成本。对可验证奖励的内在支持数学问题解决提供了一个异常清晰且可验证的奖励机制答案要么正确要么错误并且可以准确定义部分信用。GRPO利用这一点使用明确定义的奖励模型对每个问题生成的多个解决方案进行评分——通常只是标记正确的步骤或最终答案。这种直接可靠的奖励分配增强了模型更新的信噪比因为每个策略改进步骤都基于明确的性能反馈。相比之下开放式任务通常依赖于主观或有噪声的奖励模型使得稳定的策略优化更加困难。GRPO的每组成分优势估计与奖励计算透明且客观的环境高度兼容例如数学。从多样化解决方案尝试中高效学习数学推理通常要求模型在得出正确答案或优雅推导之前尝试多种解决路径。GRPO的核心机制——组采样——直接支持这一点因为为每个问题实例生成多个输出。通过将每个解决方案的奖励与组平均值进行比较GRPO使模型能够强化在组中优于常见错误或幼稚猜测的方法。这促进了对问题解决策略的系统探索并减轻了对可能从单个样本中产生的虚假模式的过拟合。实际上这种方法能够快速区分有价值的推理序列和早期LLM输出中常见的无效或“捷径”答案。使用GRPO后训练Qwen3在本节中我们将看到如何使用GRPO后训练小型语言模型以提高其数学推理能力。对于此实现我们将使用数据集该数据集包含来自数据集的问题重点关注那些具有数值输出的问题其中大多数是整数。原始数据集旨在增强大型语言模型的数学推理能力。它是有史以来发布的数学领域最大的数据集。数据集包含从高中水平到高级竞赛水平的问题所有问题都附有精心注释的伴随推理链。我们将首先安装必要的库。pipinstalltrl0.14.0 peft math_verify pipinstall-U datasets加载和可视化数据集设置好环境后我们将首先加载数据集并可视化几个示例。fromdatasetsimportload_dataset dataset_idAI-MO/NuminaMath-TIRtrain_dataset,test_datasetload_dataset(dataset_id,split[train[:1%],test[:10%]])print(Train set: ,len(train_dataset))print(Test set: ,len(test_dataset))fromIPython.displayimportMarkdown,display display(Markdown(r**Problem Statement**: train_dataset[0][problem]))display(Markdown(train_dataset[0][solution]))第1行我们从datasets库导入load_dataset函数该函数能够通过其ID访问特定数据集。第3行我们定义数据集标识符。然后在第4行我们使用load_dataset从集合中获取训练1%和测试10%划分的小子集。第6行和第7行我们打印每个子集的大小以进行确认。最后在第8-11行我们使用IPython的Markdown显示功能在笔记本中优美地呈现第一个训练样本的问题陈述及其解决方案。接下来我们将训练和测试数据的问题陈述转换为对话式提示。defmake_conversation(example):return{prompt:[{role:user,content:example[problem]},],}train_datasettrain_dataset.map(make_conversation)test_datasettest_dataset.map(make_conversation)display(train_dataset[0][prompt])在第12-17行我们定义了一个辅助函数make_conversation它将每个数据集示例转换为具有单个prompt条目的结构化字典——这包括作为用户输入的数学问题格式化为聊天式训练。在第19行和第20行我们将此映射函数应用于训练和测试数据集从而将原始问题数据转换为对话形式。最后在第21行我们显示第一个转换后的训练示例的提示以验证与基于对话的模型训练相一致的新格式。加载和准备Qwen3模型现在我们开始加载模型并定义LoRA配置用于Qwen3的参数高效微调而不是完全微调所有模型参数这成本高昂。importtorchfromtransformersimportAutoModelForCausalLM,AutoProcessor model_idQwen/Qwen3-0.6B# 加载模型和分词器modelAutoModelForCausalLM.from_pretrained(model_id,device_mapauto,torch_dtypetorch.bfloat16)processorAutoProcessor.from_pretrained(model_id)frompeftimportLoraConfig,get_peft_model# 配置LoRApeft_configLoraConfig(r8,lora_alpha8,lora_dropout0.1,target_modules[q_proj,v_proj],)# 应用PEFT模型适配peft_modelget_peft_model(model,peft_config)# 打印可训练参数peft_model.print_trainable_parameters()第22行和第23行我们导入必要的PyTorch和Hugging Face类以加载因果语言模型及其关联的处理器。第25行我们指定Qwen3-0.6B的模型ID。然后在第28-32行我们使用AutoModelForCausalLM.from_pretrained()加载模型采用自动设备放置和bfloat16精度以提高内存效率。第34行我们加载相应的处理器它处理分词和输入格式化。第36行我们引入用于基于LoRA的微调的PEFT工具。在第39-44行我们设置LoraConfig调整诸如秩r、缩放因子lora_alpha、丢弃率和目标注意力投影层等参数。第47行我们使用此LoRA配置来适配原始模型将低秩更新注入模型权重。最后在第50行我们打印可训练参数——让我们了解在训练期间模型的哪些部分将被更新。下面我们实现一个推理函数使用上述模型根据提示生成解决方案。importtimedefgenerate_solution(model,prompt):# 从数据集构建提示prompt .join(entry[content]forentryinprompt)# 分词并移动到与模型相同的设备inputsprocessor(prompt,return_tensorspt).to(model.device)# 生成文本无需梯度start_timetime.time()withtorch.no_grad():output_idsmodel.generate(**inputs,max_new_tokens512)end_timetime.time()# 解码并提取模型响应generated_textprocessor.decode(output_ids[0],skip_special_tokensTrue)# 获取推理时间inference_durationend_time-start_time# 获取生成的令牌数量num_input_tokensinputs[input_ids].shape[1]num_generated_tokensoutput_ids.shape[1]-num_input_tokensreturngenerated_text,inference_duration,num_generated_tokens第51行我们导入time模块以帮助跟踪推理持续时间。然后在第53行我们定义generate_solution函数该函数接收模型和结构化提示将聊天条目连接成单个文本字符串。在第55-58行我们使用处理器对该提示进行分词并将输入移动到与模型相同的设备以实现无缝执行。在第61-64行我们使用torch.no_grad()测量生成响应所花费的时间这避免了计算梯度——实现了速度和简单性。第67行我们将生成的令牌解码为可读文本跳过任何特殊令牌。最后在第73-76行我们返回生成的输出、其推理时间和令牌计数以便轻松评估模型性能。实现可验证的奖励函数由于我们正在训练模型进行数学推理因此可以为GRPO使用可验证的奖励。为了验证生成的解决方案相对于原始解决方案是否正确我们将使用Hugging Face的Math-Verify库。Math-Verify是一个健壮的数学表达式评估系统专为评估数学任务中的大型语言模型输出而设计。与MATH数据集上的现有评估器相比该评估器实现了最高的准确性和最正确的分数。以下代码实现了我们的奖励函数如果生成的解决方案正确则分配更高的奖励。frommath_verifyimportLatexExtractionConfig,parse,verifydefaccuracy_reward(completions,**kwargs):奖励函数检查完成项是否与真实情况相同。solutionskwargs[solution]completion_contents[completion[0][content]forcompletionincompletions]rewards[]forcontent,solutioninzip(completion_contents,solutions):try:gold_parsedparse(solution,extraction_modefirst_match,extraction_config[LatexExtractionConfig()])answer_parsedparse(content,extraction_modefirst_match,extraction_config[LatexExtractionConfig()])iflen(gold_parsed)!0:rewards.append(float(verify(answer_parsed,gold_parsed)))else:rewards.append(1.0)except:rewards.append(0.0)returnrewards第77行我们从math_verify库导入实用工具该库支持基于LaTeX的数学内容解析和验证。然后在第78行我们定义accuracy_reward函数该函数将模型生成的完成项与真实情况解决方案进行比较。第80行和第81行我们提取这些解决方案并从完成项列表中提取生成的内容。第83行我们遍历每个预测-答案对使用LaTeX提取配置为获取第一个有效匹配解析两者并应用verify()来检查正确性。如果无法提取gold答案我们分配默认奖励1.0否则验证决定奖励。解析或验证过程中的错误会导致奖励回退到0.0。最后在第93行返回完整的奖励分数列表。以上代码提供了可在GRPO中使用的可验证奖励函数的基本实现。现在我们将在测试数据示例上测试我们的模型尚未进行任何GRPO训练使用准确性奖励函数查看其表现。exampletest_dataset[4]## 测试生成generated_text,inference_duration,num_generated_tokensgenerate_solution(model,example[prompt])display(Markdown(generated_text))print(fInference Duration:{inference_duration}seconds)print(fNumber of Generated Tokens:{num_generated_tokens})## 测试奖励函数solutions[example[solution]]completions[[{content:generated_text}]]print(fAccuracy Reward:{accuracy_reward(completions,solutionsolutions)})可以看到未经任何GRPO训练的Qwen3模型尚未能正确回答问题反而陷入了混乱的循环。在下一节中我们将看看GRPO训练是否可以提高模型在同一示例上的推理能力。GRPO训练我们已经为GRPO训练准备好了一切模型、数据集和奖励函数。是时候配置并开始我们的GRPO训练了。我们将利用Hugging Face TRL的GRPOTrainer和GRPOConfig进行快速简洁的实现。fromtrlimportGRPOConfig,GRPOTrainer# 使用GRPOConfig配置训练参数training_argsGRPOConfig(output_dirQwen3-0.6B-NuminaMath-GRPO,learning_rate1e-5,remove_unused_columnsFalse,# 以便在accuracy_reward中访问solution列gradient_accumulation_steps16,num_train_epochs1,bf16True,# 控制数据预处理的参数max_completion_length256,num_generations4,max_prompt_length512,# 与报告和保存相关的参数logging_steps10,save_strategysteps,save_steps10,)trainerGRPOTrainer(modelmodel,reward_funcs[accuracy_reward],argstraining_args,train_datasettrain_dataset.remove_columns([messages,problem]))trainer.train()trainer.save_model(training_args.output_dir)第106行我们从trl库导入GRPOConfig和GRPOTrainer以设置和运行GRPO风格的强化学习。然后在第109-126行我们通过GRPOConfig配置训练参数设置输出目录、学习率、LoRA兼容性、批次累积、周期和精度类型。我们还定义了生成控制参数。日志记录和检查点设置确保每隔几步跟踪并保存进度。在第128-133行我们使用LoRA适配的模型、我们的accuracy_reward函数、训练参数和过滤后的数据集实例化GRPOTrainer。最后在第135和136行我们启动训练并将微调后的模型保存到配置的目录。训练完成后让我们在同一测试数据示例上尝试训练后的模型看看它的表现。exampletest_dataset[4]## 测试生成generated_text,inference_duration,num_generated_tokensgenerate_solution(model,example[prompt])display(Markdown(generated_text))print(fInference Duration:{inference_duration}seconds)print(fNumber of Generated Tokens:{num_generated_tokens})## 测试奖励函数solutions[example[solution]]completions[[{content:generated_text}]]print(fAccuracy Reward:{accuracy_reward(completions,solutionsolutions)})我们可以看到经过GRPO训练并使用少于1000个示例后模型现在能够正确回答复杂的数学问题。总结群组相对策略优化是一种强化学习技术旨在克服近端策略优化的关键局限性。我们首先认识到PPO由于依赖价值网络而存在高内存开销、价值函数估计不稳定以及对超参数敏感的问题。GRPO通过消除对独立价值函数的需求转而使用跨多个采样完成项的组相对优势估计来解决这些问题。这不仅降低了计算成本还提高了训练稳定性和可扩展性。我们通过定义一个结合了裁剪替代损失和KL散度正则化的核心目标来实现GRPO。通过对每个提示采样多个响应我们计算相对奖励并在每个组内进行归一化从而使模型能够强化优于平均水平的完成项。这种设置对于数学推理任务特别有效因为可验证的奖励函数可以以编程方式定义。GRPO从多样化解决方案尝试中学习并奖励结构化推理的能力使其成为需要精确性和逻辑一致性的领域的理想选择。在我们使用Qwen3的后训练工作流中我们使用LoRA适配器准备模型以进行高效微调并实现自定义奖励函数来指导学习过程。GRPO训练通过生成多个完成项、通过确定性启发式方法对它们进行评分并更新模型以支持高奖励输出来进行。这种方法使我们能够将Qwen3的输出与期望的推理格式和正确性标准对齐从而产生一个擅长结构化问题解决且只需最少监督的模型。更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手或者 我的个人博客 https://blog.qife122.com/对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号网络安全技术点滴分享