在LLM火热之前,我一直从事强化学习相关的算法工作。最近几周一直在思考RL是如何在优化LLM中发挥做用的。从基于人类反馈的微调到确保在多样化场景中的稳定泛化,RL方法在现代AI中已经开辟了一个不可或缺的领域。在这篇文章中,我将讨论不同RL方法的差异,纯监督方法不足,为什么结合监督微调(SFT)和RL,比如DeepSeek-R1这样的训练方式下,会产生更好的结果,以及RL固有的探索如何增强泛化和处理分布外数据。
LLM中的强化学习
RL方法共享相同的更新原则:即通过对目标函数进行梯度更新来调整模型参数。最简单的形式表示为:
其中 代表模型参数, 是学习率, 是目标(通常是期望奖励)的梯度。然而,这个梯度( )的计算方式以及包含哪些项在不同方法之间可能有很大差异。近端策略优化(PPO)是一种策略梯度方法,它在优化目标的同时,确保策略更新与之前的策略保持"近端"。它通过计算概率比率来实现:
这个比率然后乘以优势估计(通常使用广义优势估计或GAE计算),并应用裁剪操作以防止更新过于偏离旧策略。由此对精心设计的目标进行更新,使得策略变化较大时提供稳定性。
人类反馈的强化学习(RLHF)就是在PPO方法的基础上集成了人类偏好数据的一种方法。首先使用人类评注者提供的成对的比较或评分来训练奖励模型。随后的RL阶段使用这个奖励信号来优化模型,通常将其与PPO的技术如裁剪和KL散度惩罚结合起来,以确保渐进的更新。DeepSeek-R1的GRPO进一步修改了这一思想,消除了对之前PPO单独价值函数的使用。不依赖于状态价值的外部估计,而是就每个提示词生成一组回复,标准化得到的奖励分之后来计算群体相对优势,简化了架构并减少了计算开销,同时仍能捕获组内回复的差异性。
在使用RL训练LLM的一个限制是奖励的计算。在模型输出可通过代码或某种测试验证的场景下,奖励更容易定义,我们可以提示模型,给出答案,让它运行并找到解决方案。这让RL无限训练模型成为可能,从而产生神奇效果。在输出不易验证的开放领域,我们通常训练奖励模型来判断输出。有不少研究表明这会导致"Reward Hacking"现象,模型学会输出内容以获得高奖励,而输出并不是我们想要的。这种情况下就不能使用RL训练模型。
RLHF的伪代码示例
算法:Actor-Critic PPO (Proximal Policy Optimization) 用于RLHF
输入:
- 预训练语言模型 π_θ (Actor,策略网络,参数为θ)
- 值函数网络 V_φ (Critic,参数为φ)
- 参考模型 π_ref (通常是π_θ的副本)
- 奖励模型 R
- 提示数据集 D
- 迭代次数 N
- 每轮样本数 M
- PPO截断参数 ε (通常为0.1或0.2)
- KL散度目标值 β_target
- Actor学习率 α_π
- Critic学习率 α_v
- 折扣因子 γ
- GAE参数 λ_GAE
输出:
- 优化后的语言模型 π_θ 和值函数网络 V_φ
过程:
初始化参考模型 π_ref ← π_θ
对于 iteration = 1 到 N:
// 1. 数据收集阶段
样本集 S = {}
从数据集D中随机采样M个提示 {x_1, x_2, ..., x_M}
对于每个提示 x_i:
使用当前策略模型π_θ生成响应序列 y_i = (y_i,1, y_i,2, ..., y_i,T)
对于每个时间步t:
计算状态值 V_φ(x_i, y_i,1:t-1)
使用参考模型计算动作概率 p_ref,t = π_ref(y_i,t | x_i, y_i,1:t-1)
使用奖励模型计算最终奖励 r_i = R(x_i, y_i)
S = S ∪ {(x_i, y_i, r_i, {p_ref,t}, {V_φ(x_i, y_i,1:t-1)})}
// 2. 计算GAE优势估计
对于每个样本(x_i, y_i, r_i, {p_ref,t}, {V_t})在S中:
// 计算每个时间步的奖励(简化为最终奖励分配到每个token)
r_i,t = r_i / T 为每个时间步t
// 计算TD残差
δ_t = r_i,t + γ*V_t+1 - V_t (假设最后一步V_T+1 = 0)
// 使用GAE计算优势值
A_i,t = 0
for t = T 到 1 (倒序):
A_i,t = δ_t + γ*λ_GAE*A_i,t+1
// 计算回报目标
G_i,t = V_t + A_i,t
// 3. 策略(Actor)和值函数(Critic)优化
对于 k = 1 到 K(PPO更新次数):
对于每个小批量(x_i, y_i, {r_i,t}, {p_ref,t}, {V_t}, {A_i,t}, {G_i,t})在S中:
// 3.1 Actor更新
对于每个时间步t:
// 计算当前策略下的概率
p_θ,t = π_θ(y_i,t | x_i, y_i,1:t-1)
// 计算重要性权重比例
ratio_i,t = p_θ,t / p_ref,t
// 计算PPO截断目标
objective1 = ratio_i,t * A_i,t
objective2 = clip(ratio_i,t, 1-ε, 1+ε) * A_i,t
actor_loss = -平均(min(objective1, objective2))
// 计算KL散度惩罚
KL = KL散度(p_ref,t, p_θ,t)
KL惩罚 = max(0, KL - β_target)
// 总Actor损失
L_actor = actor_loss + λ * KL惩罚
// 3.2 Critic更新
对于每个时间步t:
// 计算当前值函数估计
V_current = V_φ(x_i, y_i,1:t-1)
// 计算值函数损失(MSE)
critic_loss = 平均((V_current - G_i,t)²)
// 3.3 更新网络参数
使用梯度下降更新θ: θ ← θ - α_π * ∇_θL_actor
使用梯度下降更新φ: φ ← φ - α_v * ∇_φcritic_loss
// 3.4 检查KL散度是否过大
if 平均(KL) > 2 * β_target:
提前结束当前iteration
// 4. 定期更新参考模型
if iteration % update_frequency == 0:
π_ref ← π_θ
返回优化后的模型 π_θ 和 V_φ
GRPO方法中的”思考“与“回答”分离
GRPO的另一大亮点是思考与回答的分离。模型的输出可以结构化为两个部分: 部分:模型的思考过程,推理步骤,考虑的可能性等; 部分:最终给出的回答。奖励模型只对 部分进行评分和优化,而不评估 部分。这种设计精巧在于:
- 鼓励自由思考:模型可以在 部分探索多种可能性,尝试不同的推理路径,而不必担心这些思考过程会受奖励机制影响。
- 更符合人类思维方式:人类也会先在脑中考虑多个可能性,然后才给出最终回答
- 支持复杂推理:允许模型使用更长的推理链,而只对最终结论进行评价
在GRPO训练过程中, 部分虽然不直接参与奖励评分,但参与模型参数更新:即使不直接计算奖励, 部分仍然参与反向传播和梯度计算过程。也就是模型需要学习如何生成有用的思考过程,这些思考最终能导向高质量的回答。
在实际实现中,GRPO算法会:对每个提示生成完整的响应(包含 和 部分)对每个响应中的 部分应用奖励函数进行评分,使用这些奖励分数计算优势值并更新整个模型参数(包括生成 和 的部分)
GRPO的伪代码示例
算法:GRPO (Group-based Reinforcement Policy Optimization) 用于RLHF
输入:
- 预训练语言模型 π_θ (策略模型,参数为θ)
- 参考模型 π_ref (通常是π_θ的副本)
- 奖励模型 R
- 提示数据集 D
- 迭代次数 N
- 每轮样本数 M
- 每个提示生成的群体大小 G (如8或16)
- PPO截断参数 ε (通常为0.1或0.2)
- KL散度目标值 β_target
- 学习率 α
输出:
- 优化后的语言模型 π_θ
过程:
初始化参考模型 π_ref ← π_θ
对于 iteration = 1 到 N:
// 1. 数据收集阶段
样本集 S = {}
从数据集D中随机采样M个提示 {x_1, x_2, ..., x_M}
对于每个提示 x_i:
// 生成群体样本
使用当前策略模型π_θ生成G个响应 {y_i,1, y_i,2, ..., y_i,G}
// 计算每个响应的奖励
对于 g = 1 到 G:
r_i,g = R(x_i, y_i,g)
// 存储生成的样本及相关信息
对于 g = 1 到 G:
使用参考模型计算概率 p_ref,i,g = π_ref(y_i,g | x_i)
S = S ∪ {(x_i, y_i,g, r_i,g, p_ref,i,g)}
// 2. 基于群体计算优势值
对于每个提示 x_i:
// 提取该提示下的所有样本
S_i = {所有(x_i, y_i,g, r_i,g, p_ref,i,g) ∈ S}
// 计算群体内的奖励平均值作为基线
baseline_i = 平均({r_i,g | (x_i, y_i,g, r_i,g, p_ref,i,g) ∈ S_i})
// 计算每个样本的优势值
对于每个 (x_i, y_i,g, r_i,g, p_ref,i,g) ∈ S_i:
A_i,g = r_i,g - baseline_i
// 3. 策略优化阶段
对于 k = 1 到 K(PPO更新次数):
对于每个小批量B ⊂ S:
// 分组计算损失
total_loss = 0
对于每个 (x_i, y_i,g, r_i,g, p_ref,i,g, A_i,g) ∈ B:
// 计算当前策略下的概率
p_θ,i,g = π_θ(y_i,g | x_i)
// 计算重要性权重比例
ratio_i,g = p_θ,i,g / p_ref,i,g
// 计算PPO截断目标
objective1 = ratio_i,g * A_i,g
objective2 = clip(ratio_i,g, 1-ε, 1+ε) * A_i,g
clip_objective = min(objective1, objective2)
// 计算KL散度惩罚
KL = KL散度(p_ref,i,g, p_θ,i,g)
KL惩罚 = max(0, KL - β_target)
// 累加损失
sample_loss = -clip_objective + λ * KL惩罚
total_loss += sample_loss
// 更新策略
avg_loss = total_loss / |B|
使用梯度下降更新θ: θ ← θ - α * ∇_θavg_loss
// 检查KL散度是否过大
avg_KL = 平均({KL散度(p_ref,i,g, p_θ,i,g) | (x_i, y_i,g, r_i,g, p_ref,i,g, A_i,g) ∈ B})
if avg_KL > 2 * β_target:
提前结束当前iteration
// 4. 定期更新参考模型
if iteration % update_frequency == 0:
π_ref ← π_θ
返回优化后的模型 π_θ
为什么不只对最佳生成答案进行监督微调
如果人类或奖励模型明确识别出"最佳"答案,最直接的解决方案似乎是对该答案进行监督微调(SFT)。然而,这种方法在训练LLM时有几个缺点。
监督微调通常涉及训练模型以模仿单一目标输出。语言生成本质上是随机的,对于给定的提示,通常有多个有效的回答可用。如果你只关注"最佳"答案,模型可能过拟合到狭窄的输出空间。无法捕获语言的多样性,可能会错过在不同情境下可能更好的回答。在自动驾驶领域,模仿学习(在LLM领域称之为SFT)存在同样的问题,如果轨迹与训练数据集中的数据稍有偏离,学习的策略就无法驾驶汽车。这种域外(分布外)泛化是一个重要的研究课题,RL和离线RL是改进它的一些方法。
奖励或偏好信号通常由整个生成序列的质量而非孤立的词决定。输出质量只有在整个序列生成后才能测量。采用策略梯度的方法旨在跨决策序列分配奖励。通过优化长期奖励(使用优势估计和时间差分方法),可以有效地将奖励反馈传播回每个单独的决策。纯监督方法很难执行如此细微的分配。
许多人类反馈信号是不可微的,或者只作为标量评估(例如,"喜欢"或"不喜欢"评级)提供。监督方法需要可微目标,我们熟知的监督学习的简单分类问题中,虽然使用的是离散的分类标签,模型输出的是对每个类别的概率分布,交叉熵损失函数计算这两个分布之间的差异,并且这个损失函数是完全可微的。所以在这个过程中,我们将离散标签转换成了某种形式,关键是在简单分类问题中的这种转换是直接且无损的。人类反馈(如喜欢/不喜欢)虽然也是离散的,但更加复杂,是对整个生成序列的评价,而不是单个决策点。并且常常是相对的或比较性的。而策略梯度方法可以直接优化期望奖励,允许奖励函数的形式更加多样。
RL本身包含探索机制。RL不依赖单一答案,而是鼓励模型采样和评估多个轨迹。通过探索,模型不仅学习哪些输出是首选的,还了解所有可能的回答的整体情况。从而引导一个更强大的策略,可以更好地泛化到训练集以外的提示并适应不同的环境。
SFT后接RL的优势
现在LLM的训练范式是从监督微调(SFT)开始然后是强化学习(RL)的两阶段过程。DeepSeek-R1是典型例子。以下是我认为这种组合如此有效的原因。
第一阶段,SFT,涉及在高质量、人工整理的数据上微调模型。这一步骤至关重要,因为它为模型提供了坚实的基几做模型,能够捕获语言的基本模式和结构。监督数据有助于减少模型输出的初始方差,并为进一步细化设置基线分布。
一旦模型有了一个强健的基础,RL阶段通过结合反映人类偏好的奖励模型,或模拟人类偏好的训练模型,甚至是定义基于规则的奖励,来优化策略。在RL期间,使用策略梯度等技术来优化包含裁剪和KL散度惩罚等机制的目标函数。这些机制确保策略更新保持接近原始SFT模型,防止可能破坏性能的剧烈变化。可以看成是一种微调,根据定义的奖励推动模型朝着更好的性能和更好的推理,而不会丢失已经在SFT期间捕获的有价值信息。
模型首先学习更简单、定义明确的任务(通过SFT),然后逐渐处理更复杂的决策问题(通过RL)。有了良好的基础,RL阶段可以探索替代轨迹进行改进,同时保持在参考模型定义的"安全"区域内。强大的初始策略与通过裁剪和KL惩罚进行谨慎的策略更新相结合,保证更稳定和有效的学习过程。
从实际角度看,SFT基于专家数据提供明确指导。同时,RL允许优化长期奖励,捕捉人类偏好的细微差别,并允许模型探索可能比人类生成的数据更好的其他可能性,也学习数据集轨迹周围的分布。从而引导一个不仅模仿高质量输出,而且能够根据动态和有时模糊的奖励信号精细化其行为的模型。
通过RL探索增强泛化和分布外处理能力
将强化学习纳入LLM训练管道的一个显著优势是其增强泛化和处理分布外数据的能力。
与监督微调不同,RL强调探索。在训练期间,模型通过采样和策略梯度更新接触各种输出。这种探索使模型能够了解可能回答的分布,而不仅仅是单一的"正确"答案。通过接触多个轨迹,模型理解什么样的序列构成高奖励。
RL方法为每个轨迹计算比较优势,即一个序列比平均结果好多少的相对度量。这种相对比较有助于模型更有效地在序列的不同部分分配奖励。即使基础模型最初产生中等质量的回答,RL阶段的探索也可能发现产生更高奖励的替代序列。这些发现随后得到强化,提高了策略的整体质量。
当模型仅通过监督学习训练时,容易在训练数据上过拟合。相比之下,RL固有的探索机制意味着会接触各种输入和输出。这种接触使其能够构建更丰富的语言及其细微差别的表示。于是模型变得更能处理分布外场景并泛化到新的、未见过的提示。
通常在探索阶段,模型会发现与监督数据集中看到的相比更优的轨迹。即使SFT阶段提供了强大的基线,RL也可以通过探索替代方案并从奖励的相对差异中学习,帮助模型进一步细化其策略。这种持续的精炼过程最终导致性能的提升。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。