博客

  • PRIME:通过隐式奖励实现过程强化的可扩展强化学习解决方案

    摘要

    近年来,大规模语言模型(LLMs)的推理能力在数据驱动的模仿学习(Imitation Learning)下不断提升,但其扩展性仍面临严峻挑战。为了突破这些瓶颈,PRIME团队提出了一种新颖的强化学习方法——PRIME(Process Reinforcement through Implicit Rewards),通过隐式过程奖励(Implicit Process Reward)有效地解决了奖励稀疏和可扩展性的问题。本文将详细介绍PRIME算法的具体实现,包括完整的算法流程、关键设计以及实验结果,以展示其在提升语言模型复杂推理能力方面的卓越性能。

    引言

    大规模语言模型在自然语言处理任务中展现出强大的能力,但随着模型规模的增加,基于模仿学习的方法逐渐暴露出扩展性不足的问题。更强的推理能力通常需要更多高质量的数据进行训练,而高质量数据资源的获取成本高且数量有限,导致持续改进变得困难。为了解决这一问题,PRIME团队提出了将数据驱动的方法转化为基于探索的强化学习方法,通过强化学习(Reinforcement Learning, RL)实现模型能力的进一步提升。

    PRIME方法基于隐式过程奖励模型(Implicit Process Reward Model, PRM),无需任何过程标签,仅通过结果奖励模型(Outcome Reward Model, ORM)进行训练,隐式地建模过程奖励。这一方法不仅提升了模型的推理能力,还在在线强化学习训练中展现出三大显著优势:密集奖励(Dense Reward)、可扩展性(Scalability)和简洁性(Simplicity)。本文将深入探讨PRIME算法的实现细节及其在多个数学基准测试中的表现。

    PRIME算法概述

    PRIME(Process Reinforcement through Implicit Rewards)是一种在线强化学习算法,旨在通过隐式过程奖励有效提升语言模型的推理能力。其核心思想是利用隐式过程奖励模型为每个生成的token提供奖励,从而解决奖励稀疏的问题,并通过在线更新机制实现奖励模型的可扩展性和简洁性。

    隐式过程奖励模型

    隐式过程奖励模型(Implicit PRM)通过结果奖励模型(ORM)进行训练,仅依赖答案的最终对错信息,自动学习过程奖励。这一模型直接学习一个Q函数,为每个token提供奖励估计,避免了额外价值模型的需求。此外,隐式PRM能够仅通过结果标签在线更新,使其更具可扩展性,并能够有效缓解分布偏移问题。

    PRIME算法流程

    PRIME算法的具体实现流程如下所示:

    1. 初始化:使用SFT(Supervised Fine-Tuning)模型作为策略模型(Policy Model, πθ\pi_\thetaπθ​)和隐式PRM(πψ\pi_\psiπψ​)的初始模型。
    2. 生成Rollouts:策略模型生成一批rollouts,即多个任务的回答序列。
    3. 奖励计算
      • 结果奖励(Outcome Reward, ror_oro​):通过结果验证器对生成的回答进行评分,确定答案的最终对错。
      • 过程奖励(Process Reward, rpr_prp​):隐式PRM基于每个生成的token提供的奖励估计。
    4. 更新隐式PRM:利用生成的rollouts和结果奖励,在线更新隐式PRM。
    5. 优势估计(Advantage Estimation):分别计算结果奖励和过程奖励的回报,通过RLOO(Reward Leave-One-Out)方法估计优势(Advantage)。
    6. 策略更新:结合结果奖励和过程奖励,通过PPO(Proximal Policy Optimization)损失函数更新策略模型。
    7. 迭代训练:重复上述步骤,直至模型性能达到预期目标。

    以下是PRIME算法的伪代码示意:

    PRIME算法伪代码:
    
    1. 初始化策略模型 πθ 和隐式PRM πψ 使用SFT模型
    2. 重复直到收敛:
        a. 使用策略模型 πθ 生成rollouts
        b. 使用隐式PRM πψ 和结果验证器对rollouts评分,获得 r_o 和 r_p
        c. 在线更新隐式PRM πψ 基于 r_p 和实际结果 r
        d. 计算结果奖励 R_o 和过程奖励 R_p
        e. 估计优势 A = R_o + R_p
        f. 使用PPO损失函数更新策略模型 πθ
    

    具体实现细节

    数据准备与预处理

    PRIME算法依赖高质量的数学数据进行训练。数据预处理步骤主要包括:

    • 数据收集:从多个公开数据集(如NuminaMath、APPS、CodeContests、TACO、Codeforces)收集数学问题和代码竞赛题目。
    • 数据清洗:过滤掉无关或错误的数据,确保数据的质量和多样性。
    • 数据格式化:将收集到的数据转换为适合模型训练的格式,便于后续的训练和评估。

    模型训练

    PRIME的训练过程包括初始的SFT训练和在线的强化学习训练。

    1. 初始SFT训练
      • 使用Qwen2.5-Math-7B作为基座模型,进行监督微调(SFT),得到初始的策略模型Eurus-2-7B-SFT。
    2. 隐式PRM训练
      • 隐式PRM不需要额外的过程标签,仅通过结果奖励模型进行训练。
      • 利用生成的rollouts和对应的结果奖励,在线更新隐式PRM,使其能够为每个token提供准确的奖励估计。
    3. 强化学习训练
      • 使用PRIME算法的完整流程,结合PPO优化策略模型,使其在数学推理任务上表现更为优秀。
      • 通过在线更新隐式PRM,不断提升模型在复杂推理任务中的表现。

    算法关键步骤详解

    Prompt Filtering

    在每次强化学习迭代中,首先对生成的rollouts进行过滤,只保留那些模型性能在一定范围内(准确率在0.2至0.8之间)的样本。这一过滤步骤旨在确保模型在有挑战性的任务上进行训练,避免过于简单或过于复杂的问题影响训练效果。

    计算隐式过程奖励

    使用隐式PRM对每个token计算过程奖励(rtr^trt),这一奖励直接反映了每个生成的token对最终结果的贡献。隐式PRM通过学习Q函数,为每个token提供密集的奖励信号,解决了奖励稀疏的问题。

    更新隐式PRM

    根据预测的隐式过程奖励(rtr^trt)和实际的结果奖励(rrr),在线更新隐式PRM。这一更新过程仅依赖于结果标签,避免了对额外过程标签的需求,提高了训练的可扩展性。

    优势估计(Advantage Estimation)

    优势估计是强化学习中的关键步骤,用于评估当前策略相对于基准策略的改进程度。在PRIME算法中,优势估计分为两部分:

    1. 结果奖励的回报:直接采用RLOO方法计算结果奖励的回报。
    2. 过程奖励的回报
      • 使用平均隐式过程奖励计算leave-one-out基线(baseline)。
      • 对每个时间步的过程奖励进行归一化处理(即减去基线)。
      • 计算每个响应的折扣回报。

    最终,优势(A)被设定为结果奖励和过程奖励回报的组合。

    策略更新

    利用PPO(Proximal Policy Optimization)损失函数,结合优势估计,对策略模型进行更新。PPO通过限制策略更新的步幅,确保训练的稳定性和效率。

    使用示例

    PRIME算法提供了针对编码和数学任务的定制化提示(prompt),以下分别展示其应用方式:

    编码任务提示

    {question} + "\n\nWrite Python code to solve the problem. Present the code in \n```python\nYour code\n```\nat the end."
    

    数学任务提示

    {question} + "\n\nPresent the answer in LaTex format: \boxed{Your answer}"
    

    以下是一个具体的Inference代码示例,用于生成数学问题的解答:

    import os
    from tqdm import tqdm
    import torch
    from transformers import AutoTokenizer
    from vllm import LLM, SamplingParams
    
    os.environ["NCCL_IGNORE_DISABLED_P2P"] = "1"
    os.environ["TOKENIZERS_PARALLELISM"] = "true"
    
    def generate(question_list, model_path):
        llm = LLM(
            model=model_path,
            trust_remote_code=True,
            tensor_parallel_size=torch.cuda.device_count(),
            gpu_memory_utilization=0.90,
        )
        sampling_params = SamplingParams(max_tokens=8192, temperature=0.0, n=1)
        outputs = llm.generate(question_list, sampling_params, use_tqdm=True)
        completions = [[output.text for output in output_item.outputs] for output_item in outputs]
        return completions
    
    def make_conv_hf(question, tokenizer):
        # 针对数学问题
        content = question + "\n\nPresent the answer in LaTex format: \boxed{Your answer}"
        msg = [{"role": "user", "content": content}]
        chat = tokenizer.apply_chat_template(msg, tokenize=False, add_generation_prompt=True)
        return chat
    
    def run():
        model_path = "PRIME-RL/Eurus-2-7B-PRIME"
        all_problems = [
            "which number is larger? 9.11 or 9.9?"
        ]
        tokenizer = AutoTokenizer.from_pretrained(model_path)
        completions = generate([make_conv_hf(problem_data, tokenizer) for problem_data in all_problems], model_path)
        print(completions)
        # 输出示例:
        # [['[ASSESS]\n\n# The problem asks us to compare two decimal numbers, 9.11 and 9.9, to determine which one is larger.\n# We need to compare the whole parts and the decimal parts of the numbers.\n\nNext action: [ADVANCE]\n\n# Compare the whole parts of the numbers: both 9.11 and 9.9 have the same whole part, which is 9.\n# Compare the decimal parts of the numbers: 0.11 (from 9.11) is less than 0.9 (from 9.9).\n\nNext action: [ADVANCE]\n\n# Since the whole parts are the same and the decimal part of 9.9 is greater than the decimal part of 9.11, we can conclude that 9.9 is larger than 9.11.\n\nNext action: [OUTPUT]\n\nThe final answer is \boxed{9.9}.\n\n']]
    if __name__ == "__main__":
        run()
    

    实验结果

    PRIME算法在多个数学推理基准测试中相较于监督微调(SFT)模型和其他先进模型表现出显著提升。以下是主要实验结果:

    Eurus-2-7B-PRIMEEurus-2-7B-SFTQwen-2.5-Math-7B-InstructLlama-3.1-70B-InstructGPT-4o
    AIME 202426.7 (+23.3)3.313.316.79.3
    MATH-50079.2 (+14.1)65.179.864.676.4
    AMC57.8 (+27.7)30.150.630.145.8
    Minerva Math38.6 (+5.9)32.734.635.336.8
    OlympiadBench42.1 (+12.3)29.840.731.943.3
    Avg.48.9 (+16.7)32.243.835.743.3

    数据与资源对比

    PRIME方法在数据和模型资源的需求上相比于Qwen-Math展示了更高的效率:

    Eurus-2-7B-PRIMEQwen2.5-Math-7B-Instruct
    Base ModelQwen2.5-Math-7BQwen2.5-Math-7B
    SFT Data230K (开源)2.5M (开源及内部)
    RM Data0618K (内部)
    RMEurus-2-7B-SFTQwen2.5-Math-RM (72B)
    RL Data150K queries × 4 samples66K queries × 32 samples

    结论

    PRIME(Process Reinforcement through Implicit Rewards)通过隐式过程奖励模型,有效地解决了大规模语言模型在强化学习中的奖励稀疏和可扩展性问题。该方法不仅提升了模型在多个数学推理基准测试中的表现,还在数据和计算资源的利用效率上表现出色。未来,结合更强大的基座模型,PRIME有望进一步缩小与最先进模型(如OpenAI o1)的性能差距,推动大规模语言模型在复杂推理任务中的应用前景。

    参考文献

    @misc{cui2024process,
      title={Process Reinforcement through Implicit Rewards},
      author={Ganqu Cui and Lifan Yuan and Zefan Wang and Hanbin Wang and Wendi Li and Bingxiang He and Yuchen Fan and Tianyu Yu and Qixin Xu and Weize Chen and Jiarui Yuan and Huayu Chen and Kaiyan Zhang and Xingtai Lv and Shuo Wang and Yuan Yao and Hao Peng and Yu Cheng and Zhiyuan Liu and Maosong Sun and Bowen Zhou and Ning Ding},
      year={2025},
      howpublished={\url{https://curvy-check-498.notion.site/Process-Reinforcement-through-Implicit-Rewards-15f4fcb9c42180f1b498cc9b2eaf896f}},
      note={Notion Blog}
    }
    
    @article{yuan2024implicitprm,
      title={Free Process Rewards without Process Labels},
      author={Lifan Yuan and Wendi Li and Huayu Chen and Ganqu Cui and Ning Ding and Kaiyan Zhang and Bowen Zhou and Zhiyuan Liu and Hao Peng},
      journal={arXiv preprint arXiv:2412.01981},
      year={2024}
    }
    

    致谢

    我们在算法实现上扩展自veRL的强化学习算法。推理过程中我们使用vLLM,并基于EurusQwen2.5-Math以及LiveCodeBench开发了评估脚本。我们的数据来源主要包括NuminaMathAPPSCodeContestsTACOCodeforces。感谢这些数据集的贡献者们!

    GitHub Star 历史

    [Star History Chart](https://star-history.com/#PRIME-RL/PRIME&Date)

    版权声明

    本文基于PRIME项目的公开资料撰写,内容详实,旨在全面介绍PRIME算法及其实现细节,供学术交流与研究参考。

    联系我们

    更多信息请访问我们的GitHub仓库或阅读我们的Notion博客

    免责声明

    本文内容基于现有公开资料整理,所涉及的观点和结论仅代表作者个人理解,与项目团队观点一致。任何未经授权的转载和使用均属侵权,敬请谅解。

    结束语

    PRIME算法通过创新性的隐式过程奖励机制,成功地提升了大规模语言模型在复杂推理任务中的表现,展示了强化学习在语言模型训练中的巨大潜力。随着算法的进一步优化和数据资源的丰富,PRIME有望在未来的人工智能发展中扮演重要角色,推动语言模型能力的持续进步。

  • Tülu 3:开放语言模型后训练中的前沿推动——算法实现详解

    摘要

    开放语言模型的后训练(Post-Training)是提升模型行为和解锁新技能的重要步骤。尽管这些技术在闭源模型中得到了广泛应用,但开放资源和具体训练方案相对滞后。为填补这一空白,我们介绍了Tülu 3,作为一系列完全开放的先进后训练模型,配套提供了数据集、代码及训练配方,旨在为现代后训练技术提供全面的指导。Tülu 3基于Llama 3.1模型,通过监督微调(SFT)、直接偏好优化(DPO)以及一种新颖的方法——具有可验证奖励的强化学习(RLVR),实现了在多项基准测试中超越现有开放和闭源模型的性能。本文重点详述了Tülu 3中算法的具体实现过程及其细节。

    1. 引言

    后训练技术,包括指令调优、基于人类反馈的强化学习(RLHF)等,已成为构建前沿语言模型的关键步骤。然而,这些技术的开放实现和资源相对闭源方法仍有较大差距。Tülu 3的提出旨在通过公开的训练数据、代码和训练配方,推动开放语言模型后训练研究的发展,缩小与闭源方法之间的差距。

    2. Tülu 3 概述

    Tülu 3采用多阶段的训练流程,逐步优化模型性能,具体包括数据策划、监督微调、偏好调优以及增强的强化学习阶段。以下将详细介绍每个阶段的算法实现和细节。

    2.1 数据策划(Data Curation)

    数据策划是后训练流程的基础,目标是收集和生成多样化、高质量的指令和响应,以覆盖模型需提升的核心技能,如推理、数学、编程等。

    2.1.1 公共数据集来源

    通过广泛调研现有公开数据集,选择能够促进多样性和覆盖目标技能的高质量数据集,如WildChat、OpenAssistant、FLAN v2等。数据集的选择基于多样性、质量和许可证的透明度,确保训练数据的合法性和多样性。

    2.1.2 针对目标技能的合成数据生成

    为了弥补公共数据集在特定技能上的不足,采用基于角色驱动的方法生成合成数据。具体步骤包括:

    1. 定义角色:从Persona Hub中选取约25万个不同的角色描述,如“专注于神经网络的机器学习研究员”。
    2. 生成指令:利用预训练语言模型(如GPT-4)根据角色描述和数据生成提示(prompt)生成相关技能的指令,如精确指令遵循、数学问题、编程任务等。
    3. 确保多样性:通过不同角色和指令类型,避免数据产生重复模式或低多样性。

    2.2 监督微调(Supervised Finetuning, SFT)

    监督微调阶段旨在通过已有的高质量指令-响应对进一步优化模型,使其能够更好地理解和执行指令。

    2.2.1 SFT 数据准备

    1. 现有响应的过滤与选择:保留人类或高性能模型(如GPT-4)的响应,同时过滤掉空响应或包含模型开发者信息的回复。
    2. 生成新的响应:对于缺乏高质量响应的指令,使用GPT-4生成新的响应,确保每条指令至少有一个高质量的响应配对。

    2.2.2 Tülu 3 SFT 混合数据集

    通过多轮实验优化数据混合比例,确保各类核心技能的均衡提升。具体步骤包括:

    1. 技能专注的数据混合:针对推理、数学、编程等不同技能,分别构建技能特定的数据混合,并训练独立模型评估其对单一技能的提升。
    2. 数据组合与迭代优化:将各技能特定的数据混合组合,进行多轮数据混合调整,包括数据去污染和下采样,优化整体性能。

    2.3 偏好调优(Preference Tuning)

    偏好调优旨在通过学习人类或模拟偏好,进一步优化模型输出的质量和符合性。Tülu 3采用直接偏好优化(DPO)作为主要方法,并进行了多项优化实验。

    2.3.1 偏好数据生成

    1. 提示选择:从SFT阶段的指令中选择用于生成偏好数据的提示,并补充未使用过的提示来源,如未见数据集中的指令。
    2. 响应生成:从多个模型(包括Tülu 3 SFT模型和其他开放模型)随机采样生成对这些提示的多种响应。
    3. 偏好标注:利用GPT-4作为评审器,对生成的响应进行多方面评分(如有用性、指令遵循性、真实性等),生成偏好对(preferred, rejected)。

    2.3.2 长度归一化的DPO(Length-Normalized DPO)

    为解决偏好优化过程中长度偏差问题,Tülu 3采用长度归一化的DPO方法,其目标函数为:

    通过对响应长度进行归一化,减轻了模型在偏好优化中的长度偏差,提升了训练效率和输出质量。

    2.4 强化学习与可验证奖励(Reinforcement Learning with Verifiable Rewards, RLVR)

    RLVR是一种新颖的方法,旨在通过强化学习仅在模型生成的输出经过验证正确时给予奖励,从而提升模型在特定任务上的性能。

    2.4.1 RLVR 数据准备

    1. 任务选择与验证函数定义:选择具有可验证结果的任务,如数学问题解决和精确指令遵循,为每类任务定义相应的验证函数。
    2. 奖励函数设计:定义奖励函数v(x,y)v(x, y)v(x,y),当输出yyy在给定提示xxx下是正确时,给予固定奖励值α\alphaα,否则奖励为零。

    2.4.2 RLVR 训练流程

    1. 初始模型选择:选择通过DPO微调的模型作为RLVR训练的初始模型。
    2. PPO 算法应用:使用Proximal Policy Optimization (PPO)算法,优化语言模型策略以最大化可验证奖励。
    3. 训练细节优化
      • 值函数初始化:将值函数初始化为训练中的奖励模型,确保值函数能有效估计奖励。
      • 去除Dropout:在训练过程中禁用Dropout,保证推理过程和学习过程中的一致性。
      • 分离前向传播:分别对选择和拒绝的响应进行前向传播,减少GPU内存占用,提高训练效率。

    2.4.3 RLVR 训练细节与优化

    通过多轮实验,调整了PPO的关键超参数,如学习率、KL惩罚系数等,确保RLVR训练的稳定性和有效性。此外,引入异步RL训练架构,利用vLLM加速大规模模型的推理过程,提高了训练效率。

    2.5 评估与结果

    Tülu 3通过广泛的基准测试验证了其性能,具体包括开发集和未见评估集的表现。实验结果显示,Tülu 3在多项核心技能上显著优于现有的开放和闭源模型,尤其在数学推理和精确指令遵循方面表现突出。

    3. 结论

    Tülu 3作为一系列完全开放的语言模型,展示了现代后训练框架的先进性。通过结合监督微调、直接偏好优化以及具有可验证奖励的强化学习,Tülu 3在多项基准测试中超越了现有的开放和闭源模型。我们详细阐述了Tülu 3中各个算法阶段的具体实现过程及其优化细节,为未来的开放后训练研究提供了宝贵的参考。

    致谢

    我们感谢John Schulman在项目中的宝贵建议,感谢National Artificial Intelligence Research Resource (NAIRR) Pilot和Microsoft Azure对本工作的支持。此外,感谢Ai2和华盛顿大学NLP社区的无数成员在项目

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网
Page Stats: PV: 1 | UV: 1
Last updated: 2025-06-18 04:01:45
沪ICP备2024052574号-1