模型训练到模型应用的整个过程主要分为六步,所有的优化都发生在这几个步骤中,前三步是基座模型生成的过程,后三步是目前Agent应用中着重优化的部分,具体为:pre-train、STF、RL、RAG vs STF、STF vs RL、评测。
一、pre-train
通过transformer训练出编码器-解码器的矩阵,通过预测下一个token产生答案,主要是让模型学会互联网上的知识。
【STEP1】语料准备
以一个预训练阶段常用的数据集FineWeb为例:它包含15-trillion tokens,44TB disk space.
【STEP2】TOKENIZATION
把文本输入变成一串token id,比如gpt-4o中,词表大小由20万,“i”在20万的词标中排第40,所以token化后的结果是40,不同模型词表大小不一样,token化后的token个数也不一样。
一个可以看tokenization结果的网站:tiktokenizer.vercel.app/ 【STEP3】predict next token 大模型的输入是一串token,输出是含有20万个数字的向量,代表每一个token的概率。 训练的时候:知道正确的next token是美,在梯度反向传播的时候,增大【美】的概率(0.350->0.351),缩小其他token的概率。 推理的时候:根据概率sample next token输出,【美】的概率最大,所以最可能输出【美】。 (一个不错的可视化网络结构的网站:bbycroft.net/llm )
二、STF
pre-train训练出来的其实是个接话怪,但我们希望模型能干具体的事情,训练目标和pre-train一样,预测next-token,以Alpaca训练数据集为例,不断通过如下内容做STF,模型就知道当他收到一个问题作为输入时,我们希望的是他输出回答。
训练目的和常用数据集如下: 1、提升通用指令跟随能力: Alpaca、Dolly 15k、OASST1。
2、提高事实性问答能力:SQuAD、TriviaQA、Natural Questions。
3、训练对话能力:Vicuna、WizardLM、OpenOrca。
4、代码生成能力:The Stack、CodeSearchNet。
对话能力也是在SFT阶段教会大模型的,Function Call和Web Search也是。
三、RL (Reinforcement Learning)/RLHF
通常用于价值观对齐、输出人类价值观相关的内容,也叫强化学习,常用的技术有PPO、GRPO、DPO。 强化学习是一种机器学习技术,和监督学习、无监督学习为同一层面的技术,算法在处理数据时,引入奖励机制,根据奖励和惩罚来纠正过程,最终发现实现最终结果的最佳处理路径。
3.1 为什么要做这件事情呢?
因为传统的STF(监督微调)是给大模型一个输入和标准的输出,利用大量的正确输入输出训练大模型按照我们想要的方式说话,但是有两个局限的问题:1.人类偏好是复杂的,有些问题没有唯一答案,如”为我写一首诗“;2.高质量STF数据集成本非常高。因此需要RL,让STF模型生成多个答案,人类来为其评分,将这些评分反哺训练出一个奖励模型,将奖励模型作为RL的环境反馈,基于“奖励”或者“惩罚”机制,不断更新模型参数。
这个过程通常分为三个阶段:
- 监督微调 (SFT):使用高质量的标注数据对预训练模型进行初步微调,使其适应特定的指令格式。
- 奖励模型 (RM) 训练:让 SFT 模型对同一个指令生成多个不同的回答。人类标注者对这些回答进行排序,形成偏好数据(例如,回答 A > 回答 B)。然后,用这些偏好数据训练一个奖励模型,该模型能够对任意一个“指令-回答”对打分,分数高低代表了人类的偏好程度。
- 强化学习 (RL) 优化:将奖励模型作为环境的“裁判”,使用强化学习算法(如 PPO)来微调 SFT 模型。模型(即 RL 中的“智能体”或“策略”)会不断生成回答,奖励模型会为其打分,RL 算法则根据分数来更新模型的参数,目标是最大化奖励模型的总得分。
3.2 有哪些好处?
- 在传统的监督学习中,需要标注数据来指导算法,而强化学习则根据环境的反馈自行学习。
- 在传统吴监督学习中,算法接受无标签的输入,使用统计手段发现其隐藏的模式和关系。RL 有预先确定的最终目标。虽然 RL 需要探索性方法,但探索会不断得到验证和改进,以提高实现最终目标的可能性。
- 在复杂环境中表现出色, RL 算法可以快速适应不断变化的环境,并找到新的策略来优化结果。
3.3 强化学习中关键技术主要有三种:PPO、DPO、GRPO
算法基础
基于马尔可夫决策过程,在每一步,agent会执行新的操作,从而产生新的环境状态。构建一组规则给Agent的操作评分,Agent根据评分调整自身状态。
| PPO | DPO | GRPO | |
|---|---|---|---|
| 核心思想 | 在可信区域内小步更新策略,以最大化奖励模型给出的分数 | 有一个三元组(输入、正向输出、不良输出),通过计算策略模型和参考模型对正向输出、不良输出的概率,分别计算参考模型和策略模型对正向输出差值,获取“隐形奖励”;计算参考模型和策略模型对正向输出差值,获取“隐形惩罚”。目标就是最大化这个差值。也就是说,它希望当前模型生成“获胜”回答的概率相对于参考模型的增幅,要远大于生成“失败”回答的概率的增幅。 | GRPO是PPO的变体,抛弃价值模型的训练,通过获取一批数据的平均奖励 和标准差,进行归一化【组内奖励归一化】后,作为价值。计算优势【优势*价值】,反向更新参数。 |
| 方法论 | On-policy 强化学习 | Off-policy 偏好学习 (类似于分类) | On-policy 强化学习 |
| 执行步骤 | 让模型生成多个不同的回答,基于奖励模型和价值模型计算优势,反向传播参数更新。为了防止模型在优化过程中“忘记”SFT 阶段学到的知识,或者为了防止模型生成一些虽然奖励高但内容乱七八糟的文本,PPO 的损失函数中通常还会加入一个 KL 散度惩罚项。 1.初始化:用 SFT 模型的权重初始化策略模型(Policy Model),并通常也用它来初始化价值模型(Value Model)。 2.采样:从一个指令数据集中随机抽取一个指令(Prompt)。 3.生成:策略模型根据指令生成一个回答。 4.评估:奖励模型(RM)对“指令-回答”对打分,得到奖励(Reward)。价值模型(Value Model)对指令进行评估,得到价值(Value)。 5.计算优势:根据奖励和价值计算优势函数。 6.更新:使用 PPO 的 Clipped Surrogate Objective 计算损失,并更新策略模型和价值模型的参数。 7.循环:重复步骤 2-6,直到模型收敛。 | 直接将成对的偏好数据转化为一个分类损失,绕过奖励建模。 1.准备数据:收集偏好数据集,每条数据是 指令胜出回答失败回答 的形式。 2.初始化:加载 SFT 模型作为训练的初始模型 ,并复制一份作为参考模型 (在训练中其参数被冻结)。 3.训练:使用上述 DPO 损失函数进行训练。在每个训练步骤中: 取一个批次(batch)的偏好数据。 分别计算模型 和 在指令下,生成 和 的概率。 代入 DPO 损失函数公式,计算损失。 反向传播,更新 的参数。 4.完成:训练结束后, 就是对齐好的模型。 | 通过组内回答的相对好坏来估计优势,从而指导策略更新。 GRPO 的核心是对 PPO 中优势函数的计算方式进行了修改。其步骤如下: 1.组采样 (Group Sampling) :对于一个给定的指令 ,使用当前的策略模型 生成一个包含 个回答的组 。 2.组评估 (Group Evaluation) :使用一个奖励函数(可以是一个训练好的奖励模型,也可以是某种可计算的启发式规则,例如代码的执行结果、数学题的答案是否正确等)为组内的每一个回答 打分,得到奖励 。 3.组内优势计算 (Group-Relative Advantage Estimation) :计算组内所有回答的平均奖励 和标准差 。对于组内的每一个回答 ,其优势被定义为其归一化后的奖励: 这种方法被称为组内奖励归一化(Group-wise Reward Normalization)。它直接用组内的统计量(均值和标准差)来替代了 PPO 中需要专门训练的价值模型所扮演的角色。 4.策略更新:一旦计算出了每个样本的优势 ,接下来的步骤就和 PPO 非常相似了。GRPO 同样使用 Clipped Surrogate Objective 来更新策略模型。 其中 是概率比, 是上面计算出的组内相对优势。 |
| 关键因素 | 4个:策略模型、价值模型 (Critic)、奖励模型 (RM)、SFT 参考模型。 | 2个:策略模型、SFT 参考模型。 | 3个 (通常):策略模型、奖励函数/模型、SFT 参考模型。无价值模型。 |
| 主要优势 | 灵活、鲁棒。适用于各种复杂的奖励函数,是久经考验的工业标准。 | 简洁、高效。训练稳定,实现简单,大大降低了 RLHF 的门槛 | 高效、灵活。显著降低了 PPO 的成本,且能灵活利用可验证奖励。 |
| 主要挑战 | 复杂、昂贵。实现和调试难度大,对资源消耗极高。 | 依赖数据质量。对偏好数据的一致性和质量要求高。 | 组采样开销。需要为每个指令生成多个样本,会增加推理开销。 |
| 适用场景 | 需要精细控制奖励函数、追求极限性能的通用场景。 | 数据集是成对偏好形式,希望快速、低成本地进行模型对齐的场景。 | 计算资源受限,或任务存在客观、可程序化验证的奖励标准的场景 (如代码、数学)。 |
四、补充领域知识 STF vs RAG
| RAG | SFT | |
|---|---|---|
| 系统流程 | ||
| 类比 | 考试前快乐玩耍,带书进场考试 | 提前大量复习,考试时轻装上阵 |
| 优点 | 1、信息准确:相比fine-tuning,RAG能把正确的领域知识直接注入prompt,大模型不是基于概率给答案,更准确。 2、上手成本低:不用调大模型,不用考虑专有模型部署等问题。 3、领域知识更新成本低,update知识库就可以了。 4、知识新鲜:更新成本低,可以快速将领域知识更新到知识库。 | 快:prompt里不用拼接超长领域知识,减少查询向量数据库的时间 解决上下文问题:当推理数据很大时,比RAG省钱。 |
| 缺点 | 慢:把领域知识拼接到prompt,prompt变长,推理时间变长 存量有限:LLM有上下文限制。 | 信息不准确:用fine-tuning的方式让大模型记住知识,本质是训练好的向量矩阵,是一种基于概率推理的方式,可能会出现幻觉,信息不准确的问题。 上手成本高:需要高质量的数据,还需要专门的训练部署。 更新成本高:新增一个领域知识,需要重新训练更新参数。 |
五、优化特定场景任务 STF VS RL
| SFT | RL | |
|---|---|---|
| 系统流程 | 训练目标是next token。 监督信号密集,相当于一步步教LLM下一个token生成什么,LLM没有可发挥的空间 | 反馈信号是最后的结果对错。 监督信号系数,相当于老师只在任务完成后,给一个打分,LLM可以有发挥的空间,所以泛化能力强 |
| 特点 | 技术门槛低:SFT相对来说是比较公认的训练方式。 | 泛化能力更好 |
六、评测
神经网络是个黑盒子,我们无法直接看懂他每个权重代表什么,组合在一起代表什么意思,如何评估盒子好坏?做实验,给个输入,看他的输出,需要模型具备啥能力,就评测什么。