从rnn到llms:5个关键训练策略提升deepseek-r1的性能
从递归神经网络到大语言模型,训练方案如何变化的全面概述。
推理模型 #1 — 训练概述
您可能已经了解推理模型的潜力。使用 O1 或 DeepSeek-R1 进行实验向我们展示了这些模型的巨大前景。作为爱好者,我们都渴望构建类似于这些模型的东西。
我们也都是从这条路开始的。然而,面对庞大的规模,我们常常感到不知从何入手。可以说,在大约 6-7 年前,我们只需要输入和输出就可以训练一个模块。作为构建这些模型的人,我们知道将这两件事做好是很困难的。然而,如今的事情要复杂得多。我们需要为每个任务提供额外的特定任务数据。
作为一个爱好者,我想深入挖掘这些“推理”模型,了解它们是什么以及它们是如何工作的。作为这个过程的一部分,我还计划将我所学到的所有内容分享为一系列文章。
不再耽搁,我想深入今天的话题 — 训练机制。
这些推理模型中的“推理”是什么?
一切是如何开始的。
让我们回到ChatGPT首次发布并运行GPT-3.5-Turbo的时候。还记得那个时候吗?那时不是很平静吗?……人们对其能力感到非常兴奋,但发现响应不准确且范围奇怪地有限。
为了尝试获得更好的输出,人们开始在提示的末尾添加一个短语。这个短语有很多版本,但“逐步思考”是最常见的短语。
它产生了与用户提示相关的更多标记。但一些神奇的事情开始发生。答案的准确性提高了。这就是推理模型的开始。人们意识到添加这些“思考步骤”会有更高的机会获得期望的输出。所以,他们就是这样做的。(顺便说一下,人们现在在技术上称之为“推理时间缩放。”)
为什么这有效?
好吧,从本质上讲,一切仍然是一个语言模型。它只是根据前一个标记预测一个新的标记。假设前一个标记是一个银行术语(如支票、现金、信用等)。在这种情况下,新的标记成为医学术语(如麻醉、注射、糖浆等)的概率非常低。
“思维步骤”本质上生成与用户输入相关的更多标记,减少后续标记的随机性。当然,随着模型的发展,还有一些其他内容被添加到这个解释中,但归根结底,这就是基本逻辑。
这些“推理”步骤最终推动模型选择更接近用户输入的标记。
这些是如何训练的。
经典
在最早的应用中,生活非常简单。我们有一个数据集,我们将几个层混合成一个网络。我们只是对这个网络在数据集上进行训练。简单易行。
然而,事情并没有顺利进行。除了某些简单的分类任务,这些方法需要大规模的数据集(不是现在“庞大”的指的是几TB,而是旧时的“庞大”)。而且很难为每个任务提供这些数据集。那么人们是怎么做的呢?
我们开始构建大型的、通用的数据集,以掌握上下文。然后,我们使用这些数据集来训练基础模型,并对其进行微调以适应相关任务。我们慢慢意识到,小模型现在无法从这些大型数据集中学习。因此,我们开始增加复杂架构的开发以解决这些问题。
转移学习过程的示意图和示例。该图像来自BERT论文、T5论文以及这篇来自Deep (learning) Focus的博客。
最终,现在我们面临着拥有数十亿参数和TB级数据的模型来解决我们的任务。在这一过程的早期阶段,分类、回归、检索等区分任务迅速改善。然而,输出对于生成任务来说并不够流畅,无法称之为“自然”。我们看到太多重复的句子、荒谬的文本内容等。这导致人们开发了一种新的训练方式。
RLHF的时代
我们从未通过监督训练达到“人类水平”的自然主义。我们需要一种方法来推动模型尽可能接近这种行为。为此,我们要么需要极大、经过过滤的自然数据集,要么需要一种新的训练这些模型的方法,这导致了收益递减。
或者我们必须使用不同的方法来训练模型。这种不同的方法最终被证明是强化学习。强化学习是一种通过一系列惩罚和奖励来训练模型行为的学习方式。在我们的案例中,我们首先定义了一个奖励度量,并调整模型以最大化该度量。
那么,我们如何确定奖励哪些响应呢?好吧,我们会坐下来对模型的多个响应进行排名。这是一项耗时的任务,但最终,它已经完成。利用这些排名,我们训练一个简单的模块,根据生成的输出预测排名。
奖励模型训练。图片来源于InstructGPT论文。
使用这个模块和原始模型,我们使用一种叫做近端策略优化(PPO)的算法进行调整。类似于我们如何使用梯度下降来减少损失,我们使用梯度上升的方法来增加模型输出的奖励。
大语言模型训练的高级概述。(1)大语言模型的监督训练。(2)训练奖励模型和(3)使用PPO更新大语言模型。图片来源于InstructGPT论文。
当然,这只是基于第一篇讨论RLHF的论文。对此方法有多种变体。例如,在训练Llama模型时开发了两个奖励模型,而不是一个。一个侧重于输出的安全性,而另一个侧重于“有用性”。
甚至还有PPO的替代方案,例如对比偏好学习(CPL)、直接偏好优化(DPO)等,这些方法更高效。
那么……这对推理模型有什么意义呢?
我们不会使用人类来评分提示以训练模型。然而,我们仍然遵循在推理数据集上调整模型的基本方法。这个推理数据集最好有三列:提示、思维链(CoT)和完成。我们在这个数据集上对模型进行微调,然后使用强化学习进一步改善推理步骤。
我计划很快讨论思维链构建和奖励模型决策!
DeepSeek革命
现在,DeepSeek模型之所以引起如此关注,是因为它的成本。整个训练迭代的费用极其低廉。当然,仍然有人声称定价可能不准确。然而,这并不是我们目前担心的问题。
DeepSeek-R1的整体训练过程。
然而,让我们担心的是他们训练模型的方式。基本上,DeepSeek-R1有三个不同的训练阶段。
- 基于RL的推理训练
- 监督微调 + 带验证的RL
- 蒸馏。
我们目前关心的是前两个阶段。蒸馏阶段用于训练较小的1.5B、8B、32B和70B模型,这些是以后要讨论的话题。
1. 训练 DeepSeek-R1-Zero
与常见的监督微调 + 强化学习方法不同,DeepSeek-R1-Zero 在没有任何监督数据集的情况下进行训练。相反,团队直接使用强化学习对 DeepSeek-V3 进行了调优。
使用强化学习的结果很有趣,因为它突显了推理作为纯强化学习而非监督微调中的行为的出现。但更令人惊讶的是,这与模型训练所关注的奖励有关。
基于推理进行奖励是我们用来提高模型推理能力的直接方法之一。然而,直接将这个想法转化为数字是非常困难的。因此,我们通常使用一些代理来近似这个结果。因此,奖励的选择方式间接地作为模型推理的指南。这些包括:
- 输出准确性
- 输出格式准确性
有趣的是,关于格式和输出的反馈足以让模型学习基本的推理技能。
当然,这并不意味着 R1-Zero 是最好的推理模型。它只是证明了通过纯强化学习实现推理是可能的。然而,它在开发更大和更具泛化能力的模型中扮演着更重要的角色。
2. 训练 DeepSeek-R1
我在阅读论文时最感兴趣的部分不是 DeepSeek-V3 如何微调成 DeepSeek-R1,而是用于微调 DeepSeek-V3 的数据生成步骤让我感到好奇。
团队首先使用 R1-Zero 模型生成了一组 Chain-Of-Thought 文本,并创建了一个数据集。在这个设置下,他们训练了一个版本的 DeepSeek-V3。我们暂且称之为 meta-R1。这次基于强化学习的调优引入了一个新的“一致性奖励模型”,以及两个早期的奖励模型。这防止了输出生成多种语言的标记,而是坚持使用单一语言。
使用这个 meta-R1,他们生成了一组新的 CoT 数据,大约有 600k 个样本。他们用大约 200k 个使用 DeepSeek-V3 生成的样本增强了这个数据集。利用这些新生成的数据,一个基础的 DeepSeek-V3 通过监督微调和随后进行的强化学习进行了调优。这个新调优的模型是托管在 DeepSeek 网站上的 671B 参数模型。
与 DeepSeek-R1-Zero 和 DeepSeek-R1 在不同数学和代码基准上的结果比较可以在下面的表格中看到。
微调您的推理模型
现在我们了解了事物是如何发展的,是时候提出最重要的问题了:我们如何才能使其对我们的应用有用?
在这次讨论中,我仍然会保持讨论在一个全面的层面。我们需要的第一件也是最重要的事情是数据集。幸运的是,我们不需要追随DeepSeek-R1的脚步。我们可以使用最终模型生成一组链式思维提示,并用它们来调整我们的模型。当然,这有点昂贵(使用DeepSeek API需要大约$650来获取50k样本)。然而,还有一个意外更好的选择。人们已经在HuggingFace库上研究并发布了他们的推理数据集。
我们可以使用该数据集来做DeepSeek-R1所做的事情:直接使用纯SFT训练一个较小的模型。然而,您可以使用HuggingFace的trl
库采用传统的SFT+RL方法。
深入代码并生成数据集或使用HuggingFace数据集,选择适合数据集的模型并进行调整和评估是我们将详细讨论的主题。
在这方面,我想让您自行探索。是时候自己去探索并了解它了!不过,我提供了一些我认为对这个过程非常有帮助的资源。我相信它们是一个好的起点。
我希望您能在这次讨论中找到一些价值。
参考文献:
- 理解推理大语言模型 — Sebastian Raschka
- RLHF的故事 — Cameron R. Wolfe
- 从人类反馈中阐释强化学习 — HuggingFace
- 插图版DeepSeek-R1 — Jay Alammar
- 大语言模型训练:RLHF及其替代方案 — Sebastian Raschka
- 训练语言模型以遵循人类反馈的指令 — OpenAI
- 教大语言模型通过强化学习进行推理 — Meta