图解 DeepSeek-R1

256 阅读9分钟

构建具备推理能力的大型语言模型(LLM)的方法

DeepSeek-R1 是 AI 领域不断进步的又一力作。对于机器学习研发社区来说,这是一次重要的发布,原因如下:

  1. 它是一个开放权重模型,并提供更小、更精简的版本。
  2. 它分享并反思了一种训练方法,可以复现类似于 OpenAI O1 的推理模型。

下文将详细介绍其构建过程,内容包括:

  • 回顾:LLM 的训练方式

  • DeepSeek-R1 训练方法

    • 1- 长推理链的 SFT 数据

    • 2- 一个临时的、高质量的推理 LLM(但在非推理任务上表现较差)

    • 3- 利用大规模强化学习 (RL) 创建推理模型

      • 3.1- 面向大规模推理的强化学习 (R1-Zero)
      • 3.2- 使用临时推理模型创建 SFT 推理数据
      • 3.3- 通用 RL 训练阶段
  • 模型架构

回顾:LLM 的训练方式

在深入了解 DeepSeek-R1 的训练细节之前,我们先简要回顾一下大型语言模型的一般训练流程。

与大多数现有的 LLM 一样,DeepSeek-R1 每次生成一个 token(可以理解为文本中的一个基本单元,如一个词或一个标点符号)。但它更擅长解决数学和推理问题,因为它能生成解释其思考过程的 token,从而花费更多时间来处理问题。

下图展示了创建高质量 LLM 的三个步骤:

  1. 语言建模步骤:使用大量网络数据训练模型预测下一个单词,得到基础模型。
  2. 有监督微调步骤:让模型更好地遵循指令、回答问题,得到指令调优模型(也称为 SFT 模型,SFT 即一种使用标注数据对模型进行进一步训练的方法)。
  3. 偏好调整步骤:进一步优化模型行为、对齐人类偏好(通过强化学习等技术,使模型的输出更符合人类的偏好),最终得到可在应用中交互的偏好调整 LLM。

DeepSeek-R1 训练方法

DeepSeek-R1 的训练流程与通用方法类似,但在具体实现上有一些创新之处。

DeepSeek-R1 遵循这个通用方法。第一步的细节来自之前一篇关于 DeepSeek-V3 模型的论文。R1 使用了该论文中的基础模型(而非最终的 DeepSeek-v3 模型),并进行了 SFT 和偏好调整,但具体做法有所不同。

具体来说,在 R1 的创建过程中,有三个关键点值得强调。

1- 长推理链的 SFT 数据

这是大量的长链式推理示例(600,000 个)。这些数据难以获取,且大规模人工标注成本高昂,因此其创建过程是第二个亮点。

2- 一个临时的、高质量的推理 LLM(但在非推理任务上表现较差)

这些数据是由 R1 的一个前身模型(一个未命名的类似模型)创建的,该模型专门用于推理。这个类似模型受到了另一个名为 R1-Zero 的模型(我们稍后会讨论)的启发。它的重要性不在于它本身是一个非常适合使用的 LLM。它的意义在于,创建它只需要少量标注数据,结合大规模强化学习,就能产生一个擅长解决推理问题的模型。

然后,可以使用这个未命名的专业推理模型的输出,训练一个更通用的模型,使其也能执行其他非推理任务,达到用户期望的水平。

3- 利用大规模强化学习 (RL) 创建推理模型

这包括两个步骤:

3.1- 面向大规模推理的强化学习 (R1-Zero)

在 DeepSeek-R1 中,RL 用于创建临时的推理模型。然后,该模型用于生成 SFT 推理示例。而使创建该模型成为可能的,是一项更早的实验,该实验创建了一个名为 DeepSeek-R1-Zero 的早期模型。

R1-Zero 的特别之处在于,它能够在没有标注的 SFT 训练集的情况下,在推理任务上表现出色。R1-Zero 直接在预训练基础模型上进行 RL 训练(跳过了 SFT 步骤),性能达到了与 O1 相当的水平。

数据一直是机器学习模型性能的关键。但这个模型却有所不同,原因在于:

  1. 现代基础模型已经跨越了质量和能力的特定阈值(这个基础模型是在 14.8 万亿个高质量 token 上训练的)。
  2. 与一般的聊天或写作请求相比,推理问题可以自动验证或标记。让我们用一个例子来说明这一点。
示例:推理问题的自动验证

我们可以在训练步骤中向模型提出这样的问题:

编写一个 Python 函数,输入一个数字列表,函数需要对列表进行排序,并在排序后的列表开头添加数字 42。

针对这类问题,我们可以设计出一套自动验证机制。例如,对于上面给出的 Python 编程题,我们可以:

(1) 使用代码检查工具 (linter) 检查生成的代码是否符合 Python 语法;
(2) 运行生成的代码,检查是否会发生运行时错误;
(3) 利用其他 LLM 生成单元测试,验证代码是否实现了预期的功能;
(4) 进一步地,还可以评估代码的执行效率,并在训练中引入对执行时间的考量,从而选择更优的解决方案。

通过这种自动验证机制,我们可以筛选出多个候选输出,并判断其正确性:例如,第一个输出不是有效的代码;第二个输出不是 Python 代码;第三个输出虽然是 Python 代码,但无法通过单元测试;只有第四个输出是正确的解决方案。

[

这些都是可以直接用来改进模型的信号。这一过程通过许多示例(以小批量方式)和连续的训练步骤完成。

这些奖励信号和模型更新是模型在 RL 训练过程中不断改进任务的方式,如论文中的图 2 所示。

与这种能力的提高相对应的是生成答案的长度,模型生成更多的思考 token 来处理问题。

这个过程很有用,但 R1-Zero 模型尽管在这些推理问题上得分很高,但面临着其他问题,使其可用性低于预期。因此,DeepSeek-R1 的训练过程需要进一步优化。

尽管 DeepSeek-R1-Zero 表现出强大的推理能力,并自主开发出意想不到的强大推理行为,但它也面临着一些问题。例如,DeepSeek-R1-Zero 存在可读性差和语言混合等问题。

R1 旨在成为一个更实用的模型。因此,它不是完全依赖 RL 过程,而是在两个地方使用它,正如我们在本节前面提到的:

  1. 创建一个临时的推理模型来生成 SFT 数据点
  2. 训练 R1 模型以改进推理和非推理问题(使用其他类型的验证器)

3.2- 使用临时推理模型创建 SFT 推理数据

为了进一步提升临时推理模型的性能,它会基于几千个推理问题示例进行有监督微调 (SFT) 训练(其中一些是从 R1-Zero 生成和过滤的)。论文将此称为“冷启动数据”。

2.3.1. 冷启动

与 DeepSeek-R1-Zero 不同,为了避免从基础模型直接进行 RL 训练可能导致的早期不稳定,对于 DeepSeek-R1,我们构建并收集了少量长 CoT(思维链) 数据,对模型进行初步微调,将其作为 RL 的初始模型。为了收集这类数据,我们采用了多种方法:使用包含长 CoT 的示例进行少样本提示(few-shot prompting),直接提示模型生成包含反思和验证的详细解答,以可读格式收集 DeepSeek-R1-Zero 的输出,并由人工标注员对结果进行后处理和优化。

既然已经拥有这些数据,为什么还要依赖 RL 过程?这是因为数据的规模。虽然可以获取 5000 个示例的数据集,但训练 R1 需要 60 万个示例。这个临时模型弥补了这一差距,并允许合成生成大量非常有价值的数据。这种结合了少量人工标注和大量机器生成数据的方法,有效解决了数据瓶颈问题。

如果您不熟悉有监督微调 (SFT) 的概念,这是一个向模型提供提示和正确答案形式的训练示例的过程。下图展示了几个 SFT 训练示例:

3.3- 通用 RL 训练阶段

通过这一阶段的训练, R1 不仅提升了推理能力, 还在其他非推理任务上获得了良好表现。该过程类似于我们之前看到的 RL 过程。但由于它扩展到非推理应用,因此它利用了有用性和安全性奖励模型(类似于 Llama 模型)来处理属于这些应用的提示。

模型架构

与早期的 GPT-2 和 GPT-3 模型类似,DeepSeek-R1 是一系列 Transformer 解码器块。它由 61 个解码器块组成,其中前三个是密集层,其余的是混合专家层(混合专家层 (MoE) 是一种包含多个“专家”子网络的模型结构,可以提高模型的效率和性能。请参阅:混合专家 (MoE) 可视化指南

在模型维度大小和其他超参数方面,它们看起来像这样:

有关模型架构的更多详细信息,请参阅 DeepSeek 团队之前的两篇论文:

结论

至此,读者应该已经对 DeepSeek-R1 模型有了基本的了解。这些创新点是 DeepSeek-R1 性能提升的关键。

其他建议的资源包括: