LLM解释
LLM解释
LLM 如何收集和清洗训练数据
垃圾数据无法训练出优秀的人工智能。那么,大公司是如何收集、清洗和处理那些驱动 LLM 的数万亿单词的呢?
“垃圾进,垃圾出”的规则,同样适用于 LLM。
LLM 背后的秘密在于数据
如果 ChatGPT 仅仅基于几百本教科书进行训练,它还能有现在这么强大吗?或者,如果它能接触到所有曾经写下的文本,但仅限于哲学领域,又会怎样?在这两种情况下,模型要么数据太少,要么世界观狭隘且带有偏见。LLM 不仅仅需要数据:它们需要海量、多样且结构良好的数据才能发挥作用。这就是为什么数据收集和整理与模型本身同等重要。
LLM 工作所需的数据规模
构建万亿词元模型需要多少单词?
两个基本概念:参数 (parameters) 和 词元 (tokens)。理解这两个概念有助于解释构建现代 LLM 所需的庞大数据量。
参数: 模型内部用于从数据中学习而调整的“旋钮”和“开关”。每个参数代表神经网络中的一个权重,帮助模型根据过去的训练来预测下一个单词/词元。
- 💡 类比: 把参数想象成大脑中连接的数量(更多的参数意味着有更大的能力学习复杂的模式)。
训练词元 (Training Tokens): 词元是我们把人类可读的格式转换成机器能理解的数字格式的方式。1 个词元不一定等于 1 个单词;它可以是一个单词的一部分,甚至是一个标点符号。
- 💡 类比: 训练词元就像一个人读过的书的数量(读得越多,知识面越广)。
模型 | 参数(容量) | 词元(知识量) | 预估词数 | 公司 | 来源 |
---|---|---|---|---|---|
GPT-4 | 1.8 万亿 | 13 万亿 | 9.7 万亿 | OpenAI | GPT-4 architecture |
Llama 3.1-405B | 0.4 万亿 | 15 万亿 | 11.25 万亿 | Meta | The Llama 3 Herd of Models |
Deepseek V3 | 0.6 万亿 | 15 万亿 | 11.1 万亿 | DeepSeek | DeepSeek-V3 Technical Report |
Qwen2.5-72B | 0.07 万亿 | 18 万亿 | 13.5 万亿 | Alibaba | Qwen2.5 Technical Report |
11 万亿 = 11,000,000,000,000。后面有 12 个零。这 11 万亿单词并非只是重复的文本。例如,“the”这个词可能出现数百万次,但 LLM 不会为每个实例单独存储——它被编码为单个词元。(有趣的是:在 GPT-4o 中,TikTokenizer 将 “the” 赋予以 3086 作为 ID 的词元。)
这些数据从何而来
据估计,互联网上有 180+ ZB(泽字节) 的数据(参考:1 ZB 等于 1 万亿 GB)。
在尝试从互联网收集数据时,主要存在两个问题:
- 网页的格式问题。 不幸的是,这并不像抓取“干净文本”那么简单,爬虫还会抓取到原始的 HTML、广告、侧边栏以及各种垃圾信息。
- 互联网上数据的质量问题。 垃圾邮件、错误信息和低质量内容需要被过滤掉。
问题1. 网页的格式问题。
互联网并没有一个“下载 PDF”按钮。需要进行大量的清理工作才能“仅仅”提取出人类可读的文本内容。
问题2. 互联网上数据的质量问题。
仅仅基于 Reddit 的数据来构建一个 LLM,会不会是一个有趣的实验?有趣是肯定的……但有用吗?这就很值得怀疑了。这个问题清楚地表明,有些来源比其他来源更可靠(至少如果你想构建一些基于事实的东西)。我们可以从 OpenAI 的 GPT-3 论文《Language Models are Few-Shot Learners》中一窥他们认为有价值的数据类型。
他们在这里提供了一些关于他们使用数据类型的细节:
- 过滤前: 45TB 的压缩纯文本(约 90TB 未压缩)。
- 过滤后: 数据集被缩减到 570GB。
此外,OpenAI 在他们的 GPT-3 论文中解释了他们使用的不同来源以及它们在 GPT-3 中的重要性。(另外,这里的总量是 490GB,所以可能还有其他来源也发挥了作用,以达到 570GB 的总数)
数据集 | 大小(GB 估计) | 训练组合权重 | 在300B词元训练中使用的轮次 |
---|---|---|---|
Wikipedia | 3 | 3% | 3.40 |
WebText2 | 20 | 21% | 2.90 |
Books1 | 12 | 8% | 1.90 |
Common Crawl (filtered) | 400 | 60% | 0.44 |
Books2 | 55 | 8% | 0.43 |
总计 | 490 | 100% | NA |
- 最大的数据量来自 CommonCrawl,有 400GB 的数据。
- 然而,学习过程在 Wikipedia、WebText2 和 Books1 上花费了更多时间学习(见轮次 (epochs) 列)。
这些是高质量的数据源,模型对它们的重视程度远高于 CommonCrawl 的蛮力数据。具体来说:
- Wikipedia: 英语维基百科,大小为 10GB,提供广泛的事实知识。
- 社交媒体和新闻: WebText,源自高“karma”值的 Reddit 链接页面,确保了质量,而新闻文章则增添了时事内容。
- Books1 和 Books2: 像 Books1 和 Books2 这样的数据集,在 GPT-3 中使用,提供了文学内容。尽管必须指出,由于版权侵权,OpenAI 似乎已经放弃了这些(是的,这方面的事情很多)。
- CommonCrawl: 一个提供最大型开放数据集的非营利组织,捕获了海量的网络内容。
公司如何为 LLM 清洗和准备数据
什么是 CommonCrawl,为什么它很重要?
CommonCrawl,一个开放的非营利性项目,自 2008 年以来一直在存档网络,存储了大量的网页内容、元数据和网站结构。每个月,它的爬虫会扫描数百万个网站,捕获从新闻文章和博客到科学论文和维基百科条目的所有内容。如今,CommonCrawl 的数据集跨越了 PB 级的数据,使其成为世界上最大的免费文本库之一。
CommonCrawl 的优缺点是什么?
✅ 优点 | 👎 缺点 |
---|---|
免费和开放。 免费和开放,托管在 AWS 上,所有人都可以访问 (托管在 AWS)。 | 未经过滤的垃圾信息。 包含从高质量新闻到 SEO 垃圾邮件、广告和机器人生成内容的所有内容。 |
规模巨大。 覆盖数十亿网页,跨越不同领域、语言和写作风格。 | 重复问题。 相同内容多次出现,可能导致模型过拟合和产生幻觉。例如,估计一个 Common Crawl 快照中有 14-52% 的文档是近似重复的。 |
定期更新。 每月拍摄新的快照,保持数据相对新鲜。 | 格式嘈杂。 原始 HTML、JavaScript、损坏的编码和网页残留物必须在使用前进行清理。(Common Crawl 有一篇解释数据格式的博客) |
内容多样。 包含从新闻文章和书籍到科学论文和开源代码的所有内容。 | 法律和道德问题。 一些抓取的内容可能包含受版权保护的材料、个人数据或专有数据库。 |
为什么 AI 公司使用 CommonCrawl(尽管它有缺陷)
尽管 CommonCrawl 杂乱无章、未经过滤,但它仍然是 LLM 训练的核心组成部分,因为没有其他数据集能免费提供其规模和多样性。像 OpenAI、Anthropic 和 Meta 这样的公司没有回避它,而是开发了复杂的过滤管道来清理、去重和增强 CommonCrawl 数据,然后再将其输入模型。
对于 AI 公司来说,CommonCrawl 是一个起点,而不是最终产品。事实上,我们知道 OpenAI 和 Anthropic 都有自己的爬虫,但我们不清楚他们如何清洗数据。在下一节中,我们将探讨如何通过 FineWeb 项目 来清洗这些杂乱的 CommonCrawl 数据。
FineWeb 项目:一个公开可用的 OpenAI 内部流程替代方案
OpenAI、Anthropic 和其他 AI 实验室使用专有方法来优化网络规模的数据集,确保模型从高质量、多样化和可靠的来源中学习,同时过滤掉垃圾邮件、重复内容和有害内容。
FineWeb 是一个开源项目,旨在复制像 OpenAI 这样的公司使用的高质量数据集整理过程。FineWeb 没有将过滤方法保密,而是记录了流程的每一步,让研究人员可以看到大规模网络数据在训练 LLM 之前是如何被清洗、去重和增强的。
一些 FineWeb 的统计数据
- 15 万亿词元
- 44TB 磁盘空间
- 源自 96 个 CommonCrawl 快照
- 在 FineWeb 上训练的模型已经证明比在其他数据集(如 C4、Dolma-v1.6、The Pile、SlimPajama 和 RedPajama2)上训练的模型表现更优越。
为什么 FineWeb 项目很重要?
基本上,它是了解像 OpenAI 这样的公司如何大规模准备数据的最佳窗口之一。
- 它揭示了过滤掉低质量内容、重复项和网络规模数据集中偏见的最佳实践。
- 它提供了一个可复现的框架,意味着其他人可以在现有过滤方法的基础上进行实验、调整和改进。
- 它弥合了知识鸿沟,使得主要 AI 实验室之外的人也能接触到高质量的数据集整理。
FineWeb 流程管道
步骤 | 描述 | 目的 | 示例 |
---|---|---|---|
1. URL 过滤 | 使用黑名单和子词检测,从恶意或不当网站中剔除文档。 | 移除不安全或不相关的内容,提高数据集质量。 | 过滤掉包含露骨内容或已知恶意软件分发者的 URL。 |
2. 文本提取 | 使用像 Trafilatura 这样的工具从原始 HTML 中提取主要的文本内容。 | 从网页中分离出有意义的文本,丢弃广告和导航元素。 | 从新闻网站中提取文章正文,同时忽略页眉、页脚和侧边栏。 |
3. 语言过滤 | 应用语言检测模型(如 FastText)只保留英语内容,丢弃英语语言得分低于 0.65 的文档。 | 确保语言一致性,这对于训练专注于特定语言的模型至关重要。 | 在构建英语数据集时,移除一篇主要是西班牙语的网页。 |
4. Gopher 过滤 | 基于重复率和整体内容质量等指标实施质量检查。 | 过滤掉低质量或无意义的文本,提高数据集的可靠性。 | 排除那些有过量关键词重复的页面,这些通常是 SEO 垃圾邮件的标志。 |
5. MinHash 去重 | 使用 MinHash 算法来识别并移除近似重复的文档。 | 减少冗余,防止模型在重复内容上过拟合。 | 检测并移除在不同网站上发布的同一篇博客文章的多个副本。 |
6. C4 过滤器 | 应用 C4 数据集的过滤器,排除词数少、标点过多或包含非标准字符的文档。 | 剔除不符合质量标准的内容,确保数据更干净。 | 移除少于 50 个单词或包含大量特殊字符的页面。 |
7. 自定义过滤器 | 实施额外的、项目特定的过滤规则,以根据特定需求定制数据集。 | 允许进行定制,以专注于特定的内容类型或质量指标。 | 过滤掉包含过时信息或与项目目标无关的特定主题的页面。 |
8. PII 移除 | 识别并移除个人可识别信息 (PII) 以保护隐私。 | 确保符合隐私法规和道德标准。 | 编辑文档中发现的姓名、地址或社会安全号码。 |
从 Token 到训练
原始文本如何转变为结构化数据,以及一个基线模型如何从中学习。
LLM 看不懂文字,它们看到的是数字。
当你向 ChatGPT 输入一个句子时,你看到的是文字。然而,模型看到的只是一堆数字。
在 LLM 能够生成文本之前,它需要将每个句子分解成微小的片段。这些片段就是我们所说的 Token。你知道吗,“running” 和 “runner” 根据模型的不同可能会被分解成不同的形式?或者 GPT-4 的分词器不会把“New York”当作一个单元,但有些模型会?
Tokenization 是 LLM 处理文本时隐藏的第一步。但即使文本被 Tokenize 之后,一个基线 LLM 仍然一无所知。它不理解语言、事实或上下文。它只学习一件事:如何预测下一个 Token。而正是从这个简单的任务中,涌现出了类似智能的行为。
重温数据清洗的重要性
FineWeb 项目解释 CommonCrawl 的清洗过程。CommonCrawl 是一个自 2007 年以来一直在抓取互联网的大型开源数据集。这个清洗过程是必需的,以确保 LLM 被投喂的是高质量、结构化的数据集。
即使经过清洗,大部分互联网内容还是被丢弃了。例如,OpenAI 在其 GPT-3 论文《Language Models are Few-Shot Learners》中提到,他们最初拥有 90TB 的未压缩文本,但经过清洗和过滤后,只剩下 570GB。
Tokenization. 文本如何变成数据
当我们读到像“Albert Einstein was a German-born theoretical physicist who developed the theory of relativity”这样的句子时,我们能理解其含义。我们认识到阿尔伯特·爱因斯坦是一个人,“German-born”是国籍,“theory of relativity”是一个科学概念。
但是,对于计算机来说,这只是一串字符:“A l b e r t …”。这种格式对于机器学习是无用的,因为计算机不处理单词或句子。机器需要数字。 这就是 Tokenization 发挥作用的地方。
什么是 Tokenization
在大型语言模型(LLM)和语言文本处理的背景下,Tokenization 是将文本分解成更小、可管理单元(称为 Token)的过程。这些 Token 可以是单词、子词(subwords)、字符,或者是单词和标点的组合。
Tokenization 的主要目的是将文本转换为数字格式,其中每个唯一的 Token 都被分配一个特定的数字索引或 ID,从而使模型能够基于这些 Token 序列分析关系。
这听起来可能有点理论化。理解 Tokenization 最好的方式是看它的实际应用。
[“Albert Einstein (14 March 1879… the theory of relativity.”如何被 Tokenize。空格可以被单独 Tokenize;数字可以被分成多个 Token;连续的三个点是一个 Token,而单个点是另一个 Token;单词也可以被分成多个 Token。例如,“relativity”被分为“relat”和“ivity”。]
那么,Token 是如何构建的?
上面的例子只是文本分解为 Token 的一种方式。由于语言的复杂性,存在多种 Tokenization 方法。一些模型需要更好地处理罕见词,而另一些则优先考虑效率。让我们看看不同公司是如何应对这一挑战的:
- 字节对编码 (Byte-Pair Encoding, BPE)。 OpenAI 的 GPT 系列,包括 GPT-3 和 GPT-4,都使用 BPE 进行 Tokenization。该方法通过迭代合并文本中最常见的字符对或字符序列,有效地平衡了常见词和罕见词的表示。BPE 对 OpenAI 的 GPT 模型特别有用,因为它在效率和灵活性之间取得了平衡,非常适合大规模生成任务。
- WordPiece Tokenization。 WordPiece 与 BPE 类似,但它更侧重于保存最终的词汇表而不是合并规则。它通过查找词汇表中最长的子词来对单词进行分词。谷歌的 WordPiece 专为 BERT 等模型优化,这些模型需要强大的词汇结构来执行句子分类和命名实体识别等任务。
- 基于字符的 Tokenization。 通常用于像中文这样的语言模型,因为在这些语言中,每个字符都可以代表一个概念或思想。
✅ 主要目标
一个基线 LLM 模型的目标是在任何给定的序列上正确预测下一个词。如果你仔细想想,它的黄金标准就是成为历史上最完美的自动补全工具。
❌ 非目标
当然,如果你达到了较好的自动补全水平,那么根据定义,这个 LLM 听起来会完全像人类。但听起来像人类并不意味着这个 LLM 就是事实准确的。
基线模型如何学习预测序列中的下一个词?
让我们先通过一个简单的例子来理解这一点。想象一下:
- 你的输入数据包含 9 个词(或 9 个 Token):
["The", "Eiffel", "tower", "is", "in", "France", "London", "New", "York"]
- 你只关心模型学习如何完成这个句子:”The Eiffel Tower is in ___”
- 在这个实验中,模型只能从 3 个可能的词中选择。
[左侧是输入短语“The Eiffel tower is in ??? ”。右侧是三个预测选项:“France”、“London”、“New”。一个箭头指向一个问题框:“模型应该选哪一个?”]
第一次迭代
预测模型做出选择的一种方式是通过概率。由于这是第一次迭代,模型可能会简单地给这 3 个选项一个均等的被选中机会。在下面的例子中,这表现为“France”、“London”和“New”各有 33.33% 的被选中几率。
在其第一次猜测中,模型随机选择了“France”。然后模型会检查正确答案,并说:“嘿!我猜对了!这意味着我应该调高我的 {France} 旋钮”。
[模型随机选择了“France”。初始概率都是 33.33%。由于猜对了,模型将“France”的概率更新为 60%,而其他选项的概率降低。]
第二次迭代
现在,我们让模型用相同的输入短语再试一次。这一次,因为它在上一轮中学到“France”更好(即,它比另外两个选项有更高的概率),所以它会再次选择“France”。而且,因为它又一次猜对了,于是“France”这个的数值再次被调高。
停止的时刻
在第二轮中,“France”的概率达到了 99%。我们是否需要进行第三轮,让它达到 99.999% 呢?答案其实不是一个简单的“是”或“否”。在机器学习和 LLM 中,有一个概念叫做**“错误率”(error rate)**,我们用它来计算在测试数据上调整我们的“旋钮”参数时所得到的平均错误数量。
在这个例子中,如果我们用输入短语“The Eiffel tower is in __”运行 1000 次,并将“France”设置为 99% 的被选中概率,那么我们可能会得到 1% 的错误率。如果我们对 1% 的错误率感到满意,我们就可以在这里停止训练这个基线模型。
例子
在 Karpathy 的教程中,大约在 38 分钟处,他展示了一个他正在构建的简单 LLM。
- 在 20 次迭代后,LLM 的输出是纯粹的胡言乱语。这完全没有意义。很明显,它的旋钮概率和我们第一次迭代时类似(可能每个词被选择的机会均等)。
- 在 400 次学习过程后,它开始变得更加连贯。当然,它还达不到 GPT-4 的连贯水平,但这展示了基线模型正在尝试做什么。
它能很好地从记忆中复述内容。例如,我复制粘贴了一段来自维基百科的摘要并喂给 LLM。我期望它能非常相似地延续我在维基百科上读到的序列,它也或多或少地做到了。几乎在所有其他情况下。它擅长写连贯的句子,但它就是会发散。
LLM 是编码-解码机器
现在我们已经理解了词语如何变成 Token,以及 Token 如何通过参数来预测序列中的下一个项目,让我们把这一切整合到一个可视化的图表中。
- 首先,我们需要词语。所以要进行收集和清洗。
- 词语对机器是无用的。所以我们需要将它们 Tokenize 成数字。
- 学习发生在我们传递序列并尝试预测序列中的下一个 Token 时。这是通过调整参数(“旋钮”)来完成的。
- 预测结果取自概率最高的 Token。
- 最后,这个 Token 被映射回其对应的词语/标点,以便人类能够解读。
模型 | 参数 (容量) | Tokens (知识) | 估算词数 | 公司 | 来源 |
---|---|---|---|---|---|
GPT4 | 1.8 万亿 | 13 万亿 | 9.7 万亿 | OpenAI | GPT-4 架构 |
Llama 3.1-405B | 0.4 万亿 | 15 万亿 | 11.25 万亿 | Meta | The Llama 3 Herd of Models |
Deepseek V3 | 0.6 万亿 | 15 万亿 | 11.1 万亿 | DeepSeek | DeepSeek-V3 技术报告 |
Qwen2.5-72B | 0.07 万亿 | 18 万亿 | 13.5 万亿 | Alibaba | Qwen2.5 技术报告 |
高昂的成本使得基线 LLM 模型训练仅为少数人所及
为什么不是全世界都在构建这些基线 LLM 模型?从概念上讲,它们与过去存在的技术并没有太大区别。
原因纯粹与蛮力和金钱有关。与传统的机器学习不同,训练拥有数十亿或数万亿参数的神经网络,不是租用一些 AWS 计算资源就能完成的。你需要非常雄厚的财力和强大的硬件才能实现这一点。更不用说,这些公司还雇佣了世界上顶尖的人才,所以薪水也绝不便宜。
关于 AI 训练成本的文章来自 Epoch AI,
通过微调让大语言模型真正变得实用
微调:这个过程能让模型变得更智能、更有用,并且(但愿)更少犯错。
微调:聊天机器人与真正助手之间的区别
基线LLM可以生成流畅的文本,但它们不擅长遵循指令。从本质上讲,LLM只是巨大的自动补全机器——它们被训练来预测下一个词,而不是进行推理或提供帮助。
微调改变了这一点。通过教导模型如何理解人类意图,微调使得LLM真正变得有用。
重温为什么基线LLM模型不够好
LLM的核心本质——它们只是基于统计模式的、被美化了的自动补全工具。它们不像人类那样“理解”语言,而是根据从互联网上抓取的数万亿个单词中学到的概率来预测下一个词元。这虽然令人印象深刻,但在实际应用中也存在严重缺陷。
GPT-4作为编码器-解码器机器的示意图
Karpathy在视频中对此总结如下:
- 基线LLM模型被训练来根据给定的输入序列准确预测下一个词元。这些预测由神经网络内部的参数权重控制。
- 可以将基础模型看作是互联网的一个ZIP压缩文件。基础模型中的参数试图存储互联网上的知识,但这些知识被杂乱无章地 crammed 在一起。
- 它可以轻松地复述它见过很多次或认为非常重要的文档(例如,它可以背诵维基百科的文档)。
- 但它无法推理。实际上,它只能“梦见”互联网文档。这就是我们所说的**“幻觉”**(hallucinations),即模型听起来非常连贯,但完全是在编造内容(例如,你可以试着向一个基础模型询问一个虚构的人物)。
这就是为什么当我们要求基线模型成为可靠的助手时,它们会表现不佳。它们没有被训练来遵循指令或判断自己何时出错——它们只是在重新组合互联网上的文本。如果我们想让它们成为有用的工具,就需要一种方法来教它们如何准确回应并遵循人类的意图。
我们想要的是一个有用的助手
我们如何定义“有用”?
OpenAI并没有想当然地定义“有用”,而是在其关于指令微调的著作中给出了明确的定义。在其出色的论文《使用人类反馈来训练语言模型遵循指令》中,他们讨论了“通过微调使语言模型与用户在广泛任务上的意图对齐”的所有步骤。在论文第36页,OpenAI定义了LLM在与用户互动时应具备的3个特征:
- 有用(Helpful)。 它应遵循用户的意图,提供简洁、清晰的回答,避免不必要的重复或假设。
- 真实(Truthful)。 它应避免捏造信息,保持事实准确性,并纠正误导性的前提,而不是强化它们。
- 无害(Harmless)。 它不应生成有害、有偏见或不道德的内容,并应公平、尊重地对待所有用户。
模型协助的示例用例
为了说明结构化交互的样子,这里有一个来自Karpathy视频的例子。这是一个非常简单的封闭式问答。人类可以准备问题和答案(即,这是一组有监督的生成范例)。
对话示例
人类: “2+2等于几?”
助手: “2+2 = 4”
人类: “如果把+换成呢?”
助手: “22 = 4,和2+2一样!”人类: “天空为什么是蓝色的?”
助手: “因为瑞利散射。”
人类: “哇!”
助手: “是的!如果还有其他我能帮忙的,请告诉我 :)”
模型如何理解这是人与助手的对话?
现在我们有了这些精心制作的范例,但这还不够。我们需要引入一个对话协议(Conversation Protocol)。
如果不做任何额外处理,模型无法分辨哪里是人类信息的结束,哪里是助手回应的开始。模型会把上述例子看作是一长串连续的文本,然后进行分词,并放入一个长序列中来预测下一个词元。我们需要一些额外的东西来让模型理解这里发生了问答交换。
这个额外的“东西”就是对话协议。听起来很高级,但其内在原理非常简单:创建代表特定动作的新词元。OpenAI使用像 <|im_start|>
和 <|im_end|>
这样的系统词元来定义其训练数据集中的交互。它们看起来可能像下面这样:
顺便一提,这些系统词元并非通用标准:Anthropic、Google和其他LLM提供商可能会使用不同类型的系统词元,这使得对话协议在今天看来有些混乱。
我们是否要再次重训一个庞大的神经网络?
训练一个基线LLM模型可能需要数月时间和数千万美元。我们不想重复这个过程!那么,如果我们不想更新GPT-4中全部1.8万亿个参数来适应这些新的专业化例子
引入迁移学习(Transfer Learning)。
可以把迁移学习想象成将一个熟练的作家培养成法律专家。他们已经知道如何写好文章(预训练),通过一些在法律领域的专注学习(微调),他们可以在不重新学习基本语法和词汇的情况下,专攻法律文书写作。
步骤1:基线LLM(预训练模型)
- 第一个图表代表基线LLM,它已经在海量的互联网数据上进行了训练。
- 该神经网络分为三个功能层:
- 早期层(绿色)→ 学习词元嵌入、句子结构和基本语法。
- 中间层(黄色)→ 捕捉更高阶的语言关系,如语法和上下文。
- 后期层(红色)→ 专攻任务特定的细节,如用户意图和细微含义。
步骤2:冻结早期层
- 如果我们冻结早期层的所有参数,模型仍然能够生成流畅、结构良好的句子,因为这些层已经学会了语言的基础。
- 这意味着我们不需要重训整个网络——我们只需要调整后期层,让模型专攻特定任务。
步骤3:微调后期层
- 微调引入了一个更小、更专业的数据集(例如,用于法律助手的法律文件)。
- 模型处理这些新数据的方式与预训练时相同——预测下一个词元。
- 然而,我们只允许后期层进行更新,同时保持早期和中间层被冻结。
- 这使得模型能够高效地适应新领域,同时保留其广泛的语言知识。
LoRA论文指出:“与使用Adam微调的GPT-3 175B相比,LoRA可以将可训练参数的数量减少10,000倍,GPU内存需求减少3倍。”多亏了迁移学习,我们不必从零开始;相反,我们重用预训练模型的知识。在微调期间,只有模型权重的一小部分被修改。
微调使模型更有用,但能保证其真实性吗?
现在基线模型的参数已经调整,使其变得更有用。但现实是,尽管你在“有用性”上会看到提升,但并不能保证模型是可信的。微调后的模型在多种情况下仍然会遇到困难。
- 案例1. 模型完全捏造信息。
- 案例2. 模型难以进行简单的数学计算。
- 案例3. 模型无法计算一个单词中的字符数。
- 案例4. 模型对自身身份没有记忆。
通过使用工具减少幻觉
LLM如何利用网络搜索和代码执行来减少幻觉。这些工具有助于模型获取实时信息并计算精确答案,而不是凭空猜测。微调并非万能药。你不能仅仅向模型投入更多数据,就指望它停止编造内容。LLM仍然会编造内容。为什么呢?
- 互联网在不断变化。 随着新的研究、新闻和趋势的出现,训练数据会变得过时。
- LLM无法存储一切。 即使拥有数十亿的令牌,它们也无法实现完美的记忆。
- 它们以概率方式生成答案。 它们不是在检索事实,而是在预测听起来最正确的内容。
要真正减少幻觉,我们需要超越微调。我们需要给LLM提供工具,以便在被提问的那一刻获取正确的答案。
- 使用网络搜索来获取实时信息和验证事实。
- 运行Python解释器来计算数字,而不是猜测。
这些工具对经过微调的LLM是很好的补充。网络搜索可以防止知识过时,而代码执行则能确保数学的准确性。两者结合,使LLM变得更真实、更可靠、也更有用。
更深入地介绍幻觉
LLM擅长生成类似人类的文本,但它们并不真正“知道”任何事情,它们只是预测最有可能的下一个词。这意味着,当面临知识缺失时,它们可能不会停止。它们会填补空白,即使生成的内容完全是错误的。这就是我们所说的幻觉:当AI自信地提供一个不正确、误导性或捏造的答案时(即使它听起来非常令人信服)。
以下是使用 Mistral-7B-Instruct
模型的对话截图。
用户: 汤姆·克鲁斯是谁? (非常知名的名人)
助手: 汤姆·克鲁斯是一位美国演员和制片人。他以在《壮志凌云》、《碟中谍》和《甜心先生》等电影中的角色而闻名。
✅ [评价] 回答正确
用户: Chori Dominguez是谁? (一名前职业足球运动员)
助手: Chori Chacón Domínguez 是一名西班牙足球运动员,司职前锋,效力于皇家马德里和西班牙国家队。
⚠️ [评价] 回答对了一些,也错了一些。 (原文标注: Argentinian, mid-fielder, Valencia CF)
用户: Rondon Dancundo是谁? (完全虚构的人物)
助手: Rondon Dancundo 是一名海地职业足球运动员,司职前锋,为海地国家队和沙特阿拉伯的Al-Faisaly俱乐部效力。
❌ [评价] 完全是编造的。 (原文注释: 由于某种原因,该模型喜欢编造与足球相关的实体,或者可能是Chori Dominguez的上下文让它认为我们在谈论足球)
为什么模型有些答案正确,有些错误?
知道LLM是建立在统计模式之上的,那么如果模型在其内部知识中有很多关于某个令牌序列(如“汤姆·克鲁斯”)的记录,它就能检索到一个可靠的事实性答案,这一点就不足为奇了。令牌序列出现的次数越少,答案的准确性就越低。我们甚至可能达到这样一个点,即某个令牌序列(如“Rondon Dancundo”)从未出现过,但LLM仍然会给出一个“最佳猜测”的答案。
[表格内容] 幻觉场景分析
场景 | 准确性 | 发生原因 |
---|---|---|
✅ 知名人物 (简单) | ✅ 准确 | - 汤姆·克鲁斯非常知名,在训练数据中出现了数千次。 - 模型具有高置信度的令牌概率,因此几乎没有歧义。 |
🤔 小众人物 (不确定) | 🤔 基本正确 - 可能有少量细节错误。 ❌ 或者可能将事实与另一人混淆。 |
- “Chori Domínguez” 不太出名,意味着训练数据中的引用较少。 - 模型可能会错误地归因事实(例如,将名字相似的球员混淆)。 - 模型具有较低置信度的令牌概率,依赖于松散的关联而非强有力的事实。 |
❌ 完全虚构的人物 (纯属幻觉) | ❌ 完全捏造 | - 模型以前从未见过这个名字,但它没有说“我不知道”,而是创造了一个虚假的答案。 - 它遵循了听起来相似的名字的模式(例如,“Borromeo”和“Dancundo”听起来像真实的历史人物)。 - LLM总是会生成一些东西——它们天生不会承认不确定性。 |
“我不知道”问题
当人类缺乏信息时,他们很自然会说“我不知道”。而LLM的设计初衷不是停止生成文本,所以它们会填补空白,而不是承认不确定性。一种解决方案是教LLM检测它们何时不确定并做出相应回应。这正是我们在第四部分中介绍的内容,人类标注员创建了大量对话,LLM可以从中学习。在这个新的数据语料库中,会有很多“我不知道”是正确答案的例子。
利用网络搜索避免幻觉
当我和你不知道某件事的答案时,我们会怎么做?我们会用谷歌搜索。我们打开多个标签页,浏览几篇文章,然后试着找出哪些来源是可信的。之前介绍过对话协议,其中特殊令牌(<|im_start|>
和 <|im_end|>
)表示人类助手的对话。
缓解策略 #2
=> 允许模型进行搜索!
人类: “Orson Kovacs是谁?”
助手: “Who is Orson Kovacs?
[…]
Orson Kovacs似乎是…”
[注释框]
如果模型学会了需要使用<SEARCH_START>
,
那么它就会被编程去运行一次网络搜索。
- 检索关键段落: LLM可能会从搜索结果中提取重要的片段。
- 基本清洗: 进行一些预处理(类似于第二部分的数据清洗,但更简单)。
- 令牌化(Tokenization): 提取的文本被转换成令牌,允许LLM将其作为一长串令牌序列来处理。
- 综合最终答案: LLM提炼所有检索到的数据并生成一个回应。
换句话说,LLM使用你的输入问题,用额外的检索文本扩展其上下文,然后生成一个信息更全面的回应。下面的示意图展示了LLM如何使用网络搜索来回答问题的过程。
这是一个概念图,展示了LLM如何结合网络搜索来生成答案。
graph TD
A["<b>问题</b><br>Pablo Aimar签约瓦伦西亚CF的确切日期是什么?"] --> B{LLM};
B -- "生成搜索查询" --> C["<b><SEARCH_START></b><br><br><i>miasanrot.com</i><br>MSR降临节日历:我们最喜欢的...<br><br><i>valenciacf.com</i><br>在像今天这样的日子里:Aimar...<br><br><i>Transfermarkt</i><br>Pablo Aimar - 转会历史...<br>...等9个网页结果<br><br><b><SEARCH_END></b>"];
C -- "将搜索结果作为上下文" --> B;
B -- "综合信息" --> D["<b>答案</b><br>答案基于原始问题和从互联网收集的所有信息。"];
LLM在一些更简单的事情上也会遇到困难:基础数学,即使是最好的模型也仍然会犯简单的算术错误。
模型需要令牌(token)来思考,尤其是在数学方面
如果LLM是在数十亿个例子上训练出来的,为什么它们仍然在基础数学上挣扎?让我们重用第四部分的截图。当我要求LLM一步解决一个数学问题时,它两次都给出了错误的答案。但当我让LLM一步步解释其推理过程时,它得到了正确的答案。
用户:
Emily买了23个苹果和177个橙子。每个橙子花费4美元。所有水果的总花费是869美元。每个苹果多少钱?
用1个令牌回答问题。只给我答案,别的不要。助手:
8 ❌
用户:
(同样的问题…)
用1个令牌回答问题。只给我答案,别的不要。助手:
29 ❌
用户:
(同样的问题…)
现在,你可以用任意多的令牌来思考答案。助手:
为了找出每个苹果的成本,我们首先需要计算橙子的总成本,然后从所有水果的总成本中减去这个数额。橙子的总成本是橙子的数量乘以每个橙子的成本:
177个橙子 * 4美元/橙子 = 708美元现在,我们从所有水果的总成本中减去橙子的总成本,以找出苹果的总成本:
869美元 - 708美元 = 161美元这意味着23个苹果的总成本是161美元。为了找出每个苹果的成本,我们将苹果的总成本除以苹果的数量:
161美元 / 23个苹果 = 7美元/苹果所以,每个苹果的成本是7美元。 ✅
为什么会这样?
首先,把LLM想象成一个在脑海中解决数学问题的人。如果你问某人“234 × 89等于多少?”并要求立即得到答案,他们可能会猜测或犯心算错误。但如果你让他们一步步写下计算过程,他们答对的可能性就大得多。
这同样适用于LLM。
单步推理 vs. 多步思考
- 当你要求单令牌答案时
- LLM必须在一次预测步骤中完成整个解决方案的计算。
- 如果它算错了或表示错了数字,答案就是错的——并且没有机会纠正。
下面的图表展示了以下内容:
- LLM接收了35个令牌作为输入。
- 我们要求LLM在下一个令牌就给出正确答案。
- LLM只能在神经网络中进行单次前向传播。
- 我们基本上是要求LLM放弃所有之前的层,而仅仅依赖于后面的层(那些控制特定任务/知识如数学的层)。
说真的,如果我们想让LLM一次性答对,LLM就必须在其训练数据集中见过这个一模一样的35个令牌序列。不是相似的,而是完全一样的。而这几乎是不可能的。
这个图表解释了当模型被限制在单步(一个令牌)内回答复杂问题时,内部发生了什么。
graph TD
subgraph "输入"
A["<b>问题 (35个令牌)</b><br>Emily-buys-23-apples-and-177-oranges..."]
end
subgraph "LLM (1.8万亿参数)"
B(编码器)
C{神经网络<br>早期层: 基础特征<br>中间层: 语言结构<br>后期层: 任务细节}
D(解码器)
end
subgraph "输出"
E["预测的<br>令牌"]
F[单词]
end
A --> B --> C
C -- "对于单步推理,<br>许多中间层可能<br>都用不上" --> D
D --> E --> F
style C fill:#f9f,stroke:#333,stroke-width:2px
- 当你让LLM生成多个令牌时
- 它可以将问题分解成更小的步骤。
- 有了更多的令牌,就有更高的机会生成一个与其在内存中见过的其他数学问题相似的序列。
下面的图表展示了以下内容:
- LLM利用所有神经网络层来开始构建一个更长的上下文窗口。
- LLM可能在模仿那些为数学问题精心制作的微调示例来构建这个上下文窗口。
- 通过构建一个更长的上下文窗口,LLM将有机会在其内存中找到相似的数学问题。
graph TD
subgraph "迭代推理过程"
A["输入问题"] --> B{"LLM Pass 1"};
B --> C["生成: To"];
D["输入 + 'To'"] --> E{"LLM Pass 2"};
E --> F["生成: find"];
G["输入 + 'To find'"] --> H{"LLM Pass 3"};
H --> I["生成: the"];
J[...] --> K[...];
end
subgraph "LLM内部"
M{1.8万亿参数模型}
N(解码器)
O[预测的令牌]
P[单词]
end
B -- "利用完整网络" --> M;
E -- "利用完整网络" --> M;
H -- "利用完整网络" --> M;
M --> N --> O --> P;
linkStyle 0 stroke-width:2px,fill:none,stroke:blue;
linkStyle 2 stroke-width:2px,fill:none,stroke:green;
linkStyle 4 stroke-width:2px,fill:none,stroke:orange;
LLM仍然不是计算器
即使通过多令牌生成,它们也不是像真正的数学引擎那样进行计算。记住,它们是基于概率生成文本,所以它们仍然可能犯错。
用Python解释器帮助模型提供数学答案
正如我们所见,让LLM提供良好数学(或科学)答案的一种缓解策略是让它“思考”。我们所说的思考是指拥有更长的上下文窗口来支持其答案。然而,它仍然可能出错,因为答案仍然基于统计模式。
不过,有一个更好的选择:构建并运行代码。
ChatGPT内置了运行Python脚本的可能性。LLM在语言之间的翻译方面做得非常好;而英语到Python的翻译仍然是一个语言翻译问题。所以,我们可以非常有信心地认为,较小的代码片段能够被很好地执行。
问题:
Emily买了23个苹果和177个橙子。每个橙子花费4美元。所有水果的总花费是869美元。每个苹果多少钱?ChatGPT响应(使用代码分析器):
▼ Analysis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 # Given data
num_apples = 23
num_oranges = 177
cost_per_orange = 4
total_cost = 869
# Calculate the total cost of oranges
total_cost_oranges = num_oranges * cost_per_orange
# Calculate the cost of apples
total_cost_apples = total_cost - total_cost_oranges
# Cost per apple
cost_per_apple = total_cost_apples / num_apples
cost_per_appleResult
7.0
通过强化学习实现更智能的AI
微调能让模型走得很远,但它有其局限性——它无法教会模型泛化偏好、适应复杂的人类意图,或做出更好的长期决策。这正是RLHF发挥作用的地方,它利用人类反馈来优化LLM的响应方式,使其更加一致、可靠且真正有用。
微调的局限性
在微调部分看到了监督式微调(SFT)对于特定任务的适应性(如翻译、摘要和自动补全)是非常出色的。在幻觉部分,我们知道了即使是微调过的LLM仍然会产生幻觉,以及添加外部工具(如网络搜索和代码执行)如何帮助缓解这些问题。尽管如此,SFT仍有我们希望克服的局限性:
它缺乏适应性学习。 SFT模型无法根据新的提示或价值观动态调整;它们受限于其训练数据。
- 例如,我很希望我的ChatGPT能随着时间的推移适应我的写作风格或答案偏好。仅使用SFT是无法实现这一点的。
它是一个一次性的学习过程。 一旦微调完成,模型在生产环境中就被“冻结”了,不会根据新的交互进行改进。
- 例如,如果LLM能够从网络搜索中提炼自己的知识会怎样?现在它们还做不到;微调(FT)将它们锁定在原始数据集中。
它为短期令牌预测进行优化。 专注于长期连贯性的模型,与那些仅在SFT上训练的模型不同,后者旨在基于静态数据集中的示例来预测下一个令牌。
- 例如,让一个经过SFT训练的模型写一个短篇故事,它可能会构思出一个很棒的开头。然后,它可能会突然改变角色名字或忘记情节。这是因为它在优化的是下一个词的准确性,而不是长期的连贯性。
一个来自高中数学的类比
想象一个学生只学会了一种解决数学问题的方法。如果考试题目稍有不同,他就会很吃力——不是因为他缺乏智力,而是因为他只被教了一种刻板的方法。嗯,这就是SFT训练的LLM的运作方式。它们模仿模式,但无法超越这些模式进行泛化。
针对客观任务的强化学习
客观任务,即那些有明确对/错答案的任务(如科学问题、分类或从文本中检索特定实体),可以纯粹通过SFT解决。但是,正如我们刚刚看到的,SFT受限于其训练所用的输入数据。
根据定义,如果SFT是精心策划的数据集和示例,那么人类能够生成的示例数量是有上限的。你不可能手动为某个特定的数学问题创造100万种不同的解法。更不用说,为我们想呈现给SFT的成千上万个问题都这样做。
强化学习如何改进数学问题解决能力
强化学习是一个试错的游戏。应用于LLM时,你可以这样想:
- LLM有一个探索空间。 例如,LLM可以探索用3个令牌(或300个)来提供答案。
- LLM有一个奖励。 在这种情况下,给出响应后,LLM可以检查它是否答对了。
- LLM对奖励有反应。 基于公式,LLM可以开始或多或少地积极探索那些倾向于提供最高奖励的空间(在这里,是令牌的数量)。
LLM的学习曲线不会如此平滑,这个例子能让我们更容易地理解RL在实践中是如何工作的。
- LLM开始时用很少的令牌探索空间。 也许它被训练成不要使用太多资源(令牌),所以它倾向于使用较少的数量。
- 在这个令牌空间里,LLM大多得到错误的答案。 这就是为什么它在第200次尝试左右开始增加探索空间。
- LLM随后开始看到更多的奖励。 因此,它鼓励自己继续增加令牌数量。
- LLM最终收敛到一个约100个令牌的空间。
1. 什么是“探索空间”?
探索空间(Exploration Space) 不是一个物理空间,而是一个所有可能行为(或决策)的集合。对于LLM来说,这个“行为”就是生成文本的方式。
这个空间是多维度的,可以包括但不限于:
- 回答的长度(Token数量): 这是最直观的维度。用10个token回答还是用300个token回答?
- 用词选择(Vocabulary Choice): 是用“简单”的词,还是用“专业”的词?是“直白”地回答,还是“委婉”地回答?
- 句子结构(Sentence Structure): 是用短句,还是用复杂的从句?
- 推理路径(Reasoning Path):g 对于一个数学题,是直接给出答案,还是分步推理?每一步推理的逻辑是什么?
- 信息详尽程度(Level of Detail): 是只给核心结论,还是附带背景信息、例子和解释?
- 语气和风格(Tone and Style): 是正式的、幽默的,还是共情的?
2. LLM是如何“探索”的?
“探索”不是漫无目的地瞎猜。它是一个由策略(Policy) 和随机性(Stochasticity) 驱动的、有目的的试错过程。
LLM内部有一个策略网络(Policy Network)。这个网络的作用是:给定一个输入(比如一个问题),输出一个生成后续文本的概率分布。
举个例子,当模型需要决定下一个token时,策略网络不会只给出一个“最优”的token,而是会给出一个包含所有可能token的概率列表:
- “the”: 40%
- “a”: 20%
- “it”: 15%
- … (其他所有词) …
探索就发生在这里:
a. 随机采样(Stochastic Sampling)
模型不是每次都选择概率最高的那个token(这叫“贪心策略”,Greedy Strategy),而是根据这个概率分布进行随机采样。
- 低探索(Low Exploration / Exploitation): 如果我们让模型更倾向于选择概率高的词(比如使用较低的
temperature
参数),它的回答会更稳定、更可预测,但可能缺乏创造性,容易陷入局部最优。这就是在“利用”已知的最佳路径。 - 高探索(High Exploration): 如果我们让采样的随机性更大(比如使用较高的
temperature
参数),模型就更有可能选到概率较低的词。这会让它的回答更多样化、更具创造性,但也可能更不稳定、更容易出错。这就是在“探索”未知的、可能更好的路径。
所以,探索是通过在模型的决策点(生成每个token时)引入受控的随机性来实现的。
b. 策略的调整(Policy Update)
当LLM完成一次回答后,它会得到一个奖励信号(Reward Signal)。
- 对于客观任务(如数学题): 奖励很简单,答案对就是+1,错就是-1。
- 对于主观任务(如写诗): 奖励来自一个“奖励模型”,这个模型是根据人类的偏好训练出来的,它会给“好”的诗打高分,“差”的诗打低分。
得到奖励后,强化学习算法(如PPO)会更新策略网络的参数。
- 如果一个行为(比如“使用更多token进行分步推理”)得到了高奖励,算法就会调整网络,使得未来在类似情况下,采取这种行为的概率会变高。
- 如果一个行为得到了低奖励,它的概率就会降低。
模型在学习什么?
随着时间的推移,RL教会LLM,更长的推理序列会带来更好的答案。不一定是它需要100个令牌。更多的是,对于这类数学问题,它会从统计学上理解,用很少的令牌是得不到正确答案的。
这只适用于数学吗?
不,不,不!这适用于任何可以被事实核查的问题空间。化学、物理、生物、代码生成、逻辑、从文本中提取实体、事实性历史问题等。问题空间可能各不相同,但强化学习的概念以及它如何帮助决定如何回答一个问题,将仍然是相同的。
针对开放式答案的强化学习
有明确对/错答案的问题,其中强化学习帮助模型发现更好的基于事实的解决方案。但是,对于没有唯一正确答案的任务该怎么办呢?
答案是:带有人类反馈的强化学习 (RLHF)。
RLHF需要验证者,而不是标签
监督式微调(SFT)依赖于有标签的数据,其中人类标注员为模型提供明确正确的答案以供学习。但对于开放式任务,这行不通。对于开放式任务,正确性是主观的。
例如,如果一个LLM生成了一篇文章的摘要,并不存在一个单一的“正确”摘要——有些人可能关注关键事实,其他人可能关注写作风格,还有些人甚至可能引入偏见。显然,我们需要一种不同的方式来评估LLM的输出。
与使用固定的标签不同,带有人类反馈的强化学习(RLHF)依赖于验证者:即根据质量、连贯性或人类偏好对响应进行评分的方法。
RLHF如何处理开放式任务
- 第一步:生成多个响应。 LLM被要求总结一篇文章或回答一个开放式问题。它不是只生成一个响应,而是生成几个不同版本。
- 第二步:人类标注员对响应进行排序。 与其标记响应的对错,人类标注员根据多个维度将它们从最好到最差进行排序。例如,与原始提示的相关性、清晰度和简洁性、事实准确性(如果适用)、连贯性和可读性等。
- 第三步:训练一个奖励模型。 奖励模型(RM)从这些人类排名中学习,并开始预测人类会偏好哪些响应。随着时间的推移,LLM会优化其响应,以与人类偏好保持一致,即使是对于主观任务。
OpenAI的真实案例
在其2022年的论文《训练LLM以遵循带有人类反馈的指令》中,OpenAI展示了一个绝佳的例子,说明他们如何构建一个系统,让个人类标注员可以对LLM的响应进行排名,并且所有数据都可以被收集。
OpenAI 标注界面
- 指令 (Instruction): “总结以下新闻文章:(文章内容)”
- 输出A (Output A): (生成的摘要内容)
- 评分 (Rating): 从1(最差)到7(最好)的评分条。
- 一系列问题 (Fails to follow…):
- 是否未能遵循正确的指令/任务? (是/否)
- 对于客户助理是否不合适? (是/否)
- 是否包含色情内容? (是/否)
- …等8个维度的判断。
- 备注 (Notes): 一个可选的文本框。
- 说明文字: 对于一个摘要任务,标注员需要对输出进行排名,并根据8个维度对其进行评分。
响应排序示例
5个不同的模型输出,并按照从最好到最差的顺序进行了排名。
- 排名 1 (最佳): 一个简洁、准确的摘要。
- 排名 2: 另一个摘要,可能在某些方面稍逊一筹。
- 排名 3: 一个关注不同方面的摘要。
- 排名 4 & 5 (最差): 质量更低的摘要。
- 说明文字: 标注员还可以审查响应之间的排名对比,并鼓励并列排名。
RLHF如何改进模型?
第一步:人类标注员对LLM响应进行排序(如我们所见)
- 标注员审查多个模型生成的摘要,并根据八个维度(如清晰度、事实性、连贯性)对它们进行评分。
- 标注员将响应从最好到最差进行排序,而不是简单地标记为“正确”或“不正确”。
第二步:训练一个奖励模型
- 奖励模型是一个独立的神经网络,经过训练以预测人类的排名。
- 给定一组七个响应,奖励模型学习哪些特征使一个答案更有可能被高度排名。
第三步:通过强化学习对LLM进行微调
- 一旦奖励模型能够准确预测排名,它就被用来通过近端策略优化 (PPO) 对LLM进行微调。
- 模型会自我调整以最大化奖励模型的预测得分,从而随着时间的推移动态地改善响应。
[流程图] OpenAI的RLHF三步流程
graph TD
subgraph Step 1 ["第一步:收集演示数据并训练一个监督策略"]
A["从我们的提示数据集中<br>抽取一个提示词"] --> B["向一个6岁的孩子<br>解释强化学习"];
B --> C["标注员演示<br>期望的输出行为"];
C --> D["我们给零食和惩罚<br>来教导..."];
D --> E["这些数据被用来通过<br>监督学习微调GPT-3.5"];
E --> F["SFT模型"];
end
subgraph Step 2 ["第二步:收集对比数据并训练一个奖励模型"]
G["抽取一个提示词和<br>几个模型的输出"] --> H["向一个6岁的孩子<br>解释强化学习"];
H --> I["输出 A<br>输出 B<br>输出 C<br>输出 D"];
I --> J["标注员将输出<br>从最好到最差排序"];
J --> K["D > C > A > B"];
K --> L["这些数据被用来<br>训练我们的奖励模型"];
L --> M["RM模型"];
end
subgraph Step 3 ["第三步:使用PPO强化学习算法优化策略"]
N["从数据集中<br>抽取一个新的提示词"] --> O["写一个关于<br>水獭的故事"];
O --> P["PPO模型<br>(从监督策略初始化)"];
P --> Q["从前..."];
Q -- "策略生成一个输出" --> R["奖励模型(RM)<br>为输出计算一个奖励"];
R -- "奖励被用来<br>通过PPO更新策略" --> P;
end
强化学习何时优于监督式微调
在某些情况下,RFT(强化微调)和RLHF对于实现更好的性能变得至关重要。
以下是4个关键场景,其中强化学习优于监督式微调,使模型更具适应性、更符合人类意图,并具有更强的推理能力。
[表格] SFT vs. RLHF/RFT
场景 | 无需RL(仅SFT) | 使用RLHF / RFT |
---|---|---|
当数据稀疏时,RFT优于SFT | 当仅在几十个样本上训练时,SFT会过拟合,记住数据而不是泛化。 | RFT可以从有限的样本中学习通用模式,当标注数据稀缺时效率更高。然而,当有大型数据集(>10万样本)时,SFT更好。 |
使模型与人类偏好对齐 | 聊天机器人的响应可能感觉像机器人、离题或无趣。 | RLHF帮助模型适应人类的语气、风格和意图,使互动更加自然(例如,正式与非正式的响应)。 |
改进代码生成 | 模型生成的代码在语法上是正确的,但通常效率低下或难以阅读。 | RLHF针对可读性、效率和最佳实践进行优化,产生更有用的代码。 |
通过思维链增强推理能力 | SFT可以将强大推理能力从一个大模型蒸馏到一个小模型中,但它无法超越教师模型的基线推理能力。 | RFT使模型能够改进其推理策略,使其在复杂的、多步骤的逻辑上表现更好(例如,DeepSeek-R1)。 |
[流程图] 选择SFT、RL还是RLHF的决策树
graph TD
A{"你有标注好的<br>真实数据吗?"} -->|是| B{"你有多少数据?"};
A -->|否| C{"任务是否<br>可以验证?"}
B -->|小于100个样本| D[RL]
B -->|小于10万个样本| E{"思维链推理<br>是否有帮助?"}
B -->|大于10万个样本| F[RL]
C -->|是| D
C -->|否| G[RLHF]
E -->|是| D
E -->|否| F
style G fill:#f9f,stroke:#333,stroke-width:2px
style D fill:#9ff,stroke:#333,stroke-width:2px
style F fill:#9ff,stroke:#333,stroke-width:2px