从理解强化学习及其在 LLM 中的作用开始手把手教你构建DeepSeek-R1推理模型

本篇内容较多,2.8万余字!请耐心阅读,届时你将得到很多!欢迎收藏!
推理模型通过使用强化学习来鼓励LLMs“思考”和推理。简单来说,模型被训练生成思维和输出,并将这些思维和输出结构化,以便用户可以分别处理它们。

先看个例子。如果我们给自己一个解决以下问题的任务,我们可能会这样思考:

问题:"我有3个苹果和2个橙子。我一共有多少个水果?"

思维:"我需要将苹果和橙子的数量相加,得到水果的总数。"

答案:"5"

然后,我们可以将这些思维和答案结构化,以便用户可以分别处理它们。对于推理任务,LLMs可以被训练生成以下格式的思维和答案:

<think>我需要将苹果和橙子的数量相加,得到水果的总数。</think>
5

然后我们就可以从模型的输出中提取思维和答案,并用它们来解决问题。
我们将通过以下内容的学习教您构建一个推理模型:

  • 强化学习简介及其在 LLM 中的作用
  • 阅读DeepSeek R1 报告,看一下DeepSeek R1的关键创新和突破
  • 研究在TRL中实现GRPO
  • 实现在TRL中使用GRPO训练模型

强化学习及其在大型语言模型中的作用

在这里插入图片描述

什么是强化学习(RL)?

想象你在训练一只狗。你想教它坐下。你可能会说“坐下!”,如果狗坐下了,你就给它一块点心和表扬。如果它没有坐下,你可能会轻轻地引导它,或者再试一次。随着时间的推移,狗学会了将坐下与积极的奖励(点心和表扬)联系起来,当你说“坐下!”时,它更有可能坐下。在强化学习中,我们将这种反馈称为奖励

简而言之,这就是强化学习的基本概念!只不过在这里,我们不是训练狗,而是训练一个语言模型(在强化学习中,我们称之为智能体),而你不是训练者,而是提供反馈的环境

让我们分解一下强化学习的关键部分:

智能体

这是我们的学习者。在狗的例子中,狗就是智能体。在大型语言模型的上下文中,大型语言模型本身就成为我们想要训练的智能体。智能体是做出决策并从环境和其奖励中学习的实体。

环境

这是智能体生活和与之交互的世界。对于狗来说,环境就是你的家和你自己。对于大型语言模型来说,环境更加抽象——它可以是模型与之交互的用户,或者我们为其设置的模拟场景。环境为智能体提供反馈。

动作

这是智能体在环境中可以做出的选择。狗的动作包括“坐下”、“站立”、“吠叫”等。对于大型语言模型来说,动作可以是生成句子中的单词、选择回答问题的答案,或者决定在对话中如何回应。

奖励

这是智能体采取动作后环境给予的反馈。奖励通常是数字。

正向奖励就像点心和表扬——它们告诉智能体“做得好,你做对了!”。

负向奖励(或惩罚)就像温柔的“不”——它们告诉智能体“那不太对,试试别的”。对于狗来说,点心就是奖励。

对于大型语言模型来说,奖励的设计是为了反映模型在特定任务中的表现——可能是它的回答有多有帮助、真实或无害。

策略

这是智能体选择动作的策略。就像狗理解当你说“坐下!”时它应该做什么一样。在强化学习中,策略是我们真正想要学习和改进的东西。它是一组规则或函数,告诉智能体在不同情况下应该采取什么动作。最初,策略可能是随机的,但随着智能体的学习,策略会变得更擅长选择能带来更高奖励的动作。

强化学习过程:试错在这里插入图片描述

强化学习通过试错的过程进行:

步骤 过程 描述
1. 观察 智能体观察环境 智能体接收关于其当前状态和周围环境的信息
2. 动作 智能体根据当前策略采取动作 使用其学习到的策略(策略),智能体决定下一步做什么
3. 反馈 环境给予智能体奖励 智能体收到关于其动作好坏的反馈
4. 学习 智能体根据奖励更新其策略 智能体调整其策略——强化导致高奖励的动作,避免导致低奖励的动作
5. 迭代 重复此过程 这个循环不断进行,使智能体能够持续改进其决策能力

想想学习骑自行车的过程。一开始你可能会摇晃和摔倒(负向奖励!)。但当你成功平衡并平稳地踩踏板时,你会感觉良好(正向奖励!)。你根据这些反馈调整动作——稍微倾斜、更快地踩踏板等——直到你学会骑得很好。强化学习也是如此——它是通过互动和反馈进行学习。

强化学习在大型语言模型中的作用

现在,为什么强化学习对大型语言模型如此重要?

训练真正好的大型语言模型是很棘手的。我们可以在大量互联网文本上训练它们,它们会变得非常擅长预测句子中的下一个单词。这样大模型就学会生成流畅且语法正确的文本

然而,仅仅流畅是不够的。我们希望我们的大型语言模型不仅仅是擅长将单词串在一起。我们希望它们:

  • 有帮助:提供有用且相关的信息。
  • 无害:避免生成有毒、偏见或有害的内容。
  • 与人类偏好一致:以人类认为自然、有帮助和吸引人的方式回应。

预训练的大型语言模型方法,主要依赖于从文本数据中预测下一个单词,有时在这些方面表现不足。

虽然监督训练在生成结构化输出方面非常出色,但在生成有帮助、无害和一致的回答方面可能效果较差。

微调模型可能会生成流畅且结构化的文本,但这些文本可能在事实上不正确、存在偏见,或者没有真正以有帮助的方式回答用户的问题。

这就是强化学习的用武之地! 强化学习为我们提供了一种微调这些预训练大型语言模型的方法,以更好地实现这些期望的特性。就像给我们的狗进行额外训练,使其成为一个行为良好且有用的伴侣,而不仅仅是一只知道如何流畅吠叫的狗!

从人类反馈中进行强化学习(RLHF)

一种非常流行的语言模型对齐技术是从人类反馈中进行强化学习(Reinforcement Learning from Human Feedback, RLHF)。在RLHF中,我们使用人类反馈作为强化学习中“奖励”信号的代理。以下是它的工作原理:

  1. 获取人类偏好:我们可能会让人类比较大型语言模型生成的针对同一输入提示的不同回答,并告诉我们他们更喜欢哪个回答。例如,我们可能会向人类展示两个不同的回答“法国的首都是什么?”,并问他们“哪个回答更好?”。
  2. 训练奖励模型:我们使用这些人类偏好数据来训练一个单独的模型,称为奖励模型。这个奖励模型学会预测人类会喜欢哪种回答。它学会根据回答的有帮助性、无害性和与人类偏好的一致性来评分。
  3. 使用强化学习微调大型语言模型:现在我们使用奖励模型作为我们大型语言模型智能体的环境。大型语言模型生成回答(动作),奖励模型对这些回答进行评分(提供奖励)。本质上,我们是在训练大型语言模型生成我们的奖励模型(从人类偏好中学习)认为好的文本。
    在这里插入图片描述

从广义上讲,让我们看看在大型语言模型中使用强化学习的好处:

好处 描述
改进控制 强化学习使我们能够更好地控制大型语言模型生成的文本类型。我们可以引导它们生成更符合特定目标的文本,如有帮助、创造性或简洁。
增强与人类价值观的一致性 特别是RLHF,帮助我们使大型语言模型与复杂且通常主观的人类偏好保持一致。很难写出“什么是好答案”的规则,但人类可以轻松判断和比较回答。RLHF让模型从这些人类判断中学习。
减轻不良行为 强化学习可用于减少大型语言模型中的负面行为,如生成有毒语言、传播错误信息或表现出偏见。通过设计惩罚这些行为的奖励,我们可以引导模型避免它们。

从人类反馈中进行强化学习已被用于训练当今许多最受欢迎的大型语言模型,如OpenAI的GPT-4、Google的Gemini和DeepSeek的R1。RLHF有多种技术,复杂度和精细度各不相同。在本章中,我们将重点介绍组相对策略优化(Group Relative Policy Optimization, GRPO),这是一种RLHF技术,已被证明在训练有帮助、无害且与人类偏好一致的大型语言模型方面非常有效。

为什么我们应该关注GRPO(组相对策略优化)?

RLHF有许多技术,但本课程重点关注GRPO,因为它代表了语言模型强化学习领域的重大进步。

让我们简要考虑一下其他两种流行的RLHF技术:

  • 近端策略优化(Proximal Policy Optimization, PPO)
  • 直接偏好优化(Direct Preference Optimization, DPO)

PPO

近端策略优化(PPO) 是最早的高效RLHF技术之一。它使用策略梯度方法根据来自单独奖励模型的奖励更新策略。

InstructGPT、ChatGPT便在底层使用了PPO进行强化学习。

  • 原理:一种强化学习算法,通过优化策略函数,使模型生成的文本能够获得更高的奖励分数。PPO 算法通过引入截断的概率比,限制策略更新的幅度,从而提高训练的稳定性和效率。
  • 流程在这里插入图片描述
    在Proximal Policy Optimization (PPO) 算法中,使用固定长度轨迹段的方法通常涉及以下步骤。这个算法通常采用Actor-Critic架构,并且可以在并行环境中运行多个Actor来加速数据收集。以下是PPO算法的一个简化流程:
    示例图
[LLM生成文本] → [人类评分/奖励模型] → [计算优势函数] → [PPO更新策略]
           ↑________价值函数评估________|
  • 代码示例(简化版)
    用伪代码展示PPO更新LLM策略的关键步骤,例如:
# 生成文本
text = LLM.generate(input)
# 计算奖励(来自奖励模型)
reward = reward_model(text)
# 计算优势(需要价值网络)
advantage = calculate_advantage(text)
# PPO更新策略参数
loss = advantage * log_prob + KL约束项
LLM.update(loss)
  • PPO算法流程

    1. 初始化
    • 初始化策略模型 π θ \pi_{\theta} πθ价值模型 V ϕ V_{\phi} Vϕ 的参数。
    • 设置超参数,如轨迹长度 T T T、优化轮数 K K K、小批量大小 M M M 等。
    1. 并行数据收集
    • 对于每个Actor(通常是多个并行运行的实例):
      - 在环境中运行策略 π θ old \pi_{\theta_{\text{old}}} πθold 以收集 T T T 步的数据。
      - 记录状态 s t s_t st、动作 a t a_t at、奖励 r t r_t rt、下一个状态 s t + 1 s_{t+1} st+1 和终止标志 d t d_t dt
    1. 计算优势估计
    • 使用收集的数据计算优势函数 A ^ t \hat{A}_t A^t。这通常涉及到使用**广义优势估计(GAE)**或其他方法来估计每个时间步的优势。 #### A ^ t \hat{A}_t A^t优势估计
      GAE的优势估计公式如下:

A ^ t = ∑ k = 0 ∞ ( γ λ ) k δ t + k \hat{A}_t^= \sum_{k=0}^{\infty} (\gamma \lambda)^k \delta_{t+k} A^t=k=0(γλ)kδt+k

其中, δ t \delta_t δt 是单步TD误差:

δ t = r t + 1 + γ V ( s t + 1 ) − V ( s t ) \delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t) δt=rt+1+γV(st+1)V(st)

这里, r t + 1 r_{t+1} rt+1 是时间步 t + 1 t+1 t+1 的奖励, V ( s t + 1 ) V(s_{t+1}) V(st+1) V ( s t ) V(s_t) V(st) 分别是状态 s t + 1 s_{t+1} st+1
s t s_t st 的值函数估计。

实现细节

在实际应用中,由于无法计算无限项的和,通常会截断这个求和过程。具体来说,GAE的优势估计可以通过以下方式计算:

  1. 计算单步TD误差:对于每个时间步 t t t,计算 δ t \delta_t δt

  2. 累积优势估计:使用一个有限长度的窗口来计算累积优势估计:

A ^ t = ∑ k = 0 N − 1 ( γ λ ) k δ t + k \hat{A}_t = \sum_{k=0}^{N-1} (\gamma \lambda)^k \delta_{t+k} A^t=k=0N1(γλ)kδt+k
在这里插入图片描述
其中, N N N 是轨迹的长度或一个固定的时间窗口大小。

  1. 平滑处理:通过调整 λ \lambda λ 的值(通常在 [ 0 , 1 ] [0, 1] [0,1] 之间),可以在短期和长期奖励之间进行平滑权衡。
  2. 构建目标函数
  • 构建PPO的目标函数,通常形式为:
    L t C L I P ( θ ) = E ^ t [ min ⁡ ( r t ( θ ) A ^ t , clip ⁡ ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A ^ t ) ] L_{t}^{C L I P}(\theta) = \hat{E}_{t}\left[\min\left(r_t(\theta)\hat{A}_t, \operatorname{clip}\left(r_t(\theta), 1-\epsilon, 1+\epsilon\right)\hat{A}_t\right)\right] LtCLIP(θ)=E^t[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]
    其中 r t ( θ ) r_t(\theta) rt(θ) 是概率比, ϵ \epsilon </
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI仙人掌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值