LLM解释

LLM 如何收集和清洗训练数据

最近在研究大语言模型的时候,我一直在想一个问题:那些科技巨头是怎么收集和处理数万亿单词的训练数据的?毕竟,垃圾数据是训练不出好模型的。

垃圾进,垃圾出“这个道理,在 LLM 领域同样适用。

LLM 背后的秘密在于数据

我经常想,如果 ChatGPT 只是基于几百本教科书训练出来的,它还会有现在这么强大吗?或者说,如果它能接触到所有曾经写下的文本,但仅限于哲学领域,又会怎样?在这两种情况下,模型要么数据太少,要么视野太窄且带有偏见。所以我发现,LLM 不仅仅需要数据:它们需要海量、多样且结构良好的数据才能真正发挥作用。这也是为什么数据收集和整理与模型本身同等重要的原因。

LLM 工作所需的数据规模

构建万亿词元模型需要多少单词?

在深入了解这个问题之前,我觉得有必要先解释两个基本概念:参数 (parameters)词元 (tokens)。理解这两个概念能帮助我们明白构建现代 LLM 所需的庞大数据量。

参数: 简单来说,这些是模型内部用于从数据中学习而调整的"旋钮"和"开关”。每个参数代表神经网络中的一个权重,帮助模型根据过去的训练来预测下一个单词/词元。

  • 💡 我的理解: 把参数想象成大脑中连接的数量——更多的参数意味着有更大的能力学习复杂的模式。

训练词元 (Training Tokens): 词元是我们把人类可读的格式转换成机器能理解的数字格式的方式。1 个词元不一定等于 1 个单词;它可以是一个单词的一部分,甚至是一个标点符号。

  • 💡 我的理解: 训练词元就像一个人读过的书的数量——读得越多,知识面越广。
模型参数(容量)词元(知识量)预估词数公司来源
GPT-41.8 万亿13 万亿9.7 万亿OpenAIGPT-4 architecture
Llama 3.1-405B0.4 万亿15 万亿11.25 万亿MetaThe Llama 3 Herd of Models
Deepseek V30.6 万亿15 万亿11.1 万亿DeepSeekDeepSeek-V3 Technical Report
Qwen2.5-72B0.07 万亿18 万亿13.5 万亿AlibabaQwen2.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)。

在尝试从互联网收集数据时,主要存在两个问题:

  1. 网页的格式问题。 不幸的是,这并不像抓取“干净文本”那么简单,爬虫还会抓取到原始的 HTML、广告、侧边栏以及各种垃圾信息。
  2. 互联网上数据的质量问题。 垃圾邮件、错误信息和低质量内容需要被过滤掉。

问题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词元训练中使用的轮次
Wikipedia33%3.40
WebText22021%2.90
Books1128%1.90
Common Crawl (filtered)40060%0.44
Books2558%0.43
总计490100%NA
  1. 最大的数据量来自 CommonCrawl,有 400GB 的数据。
  2. 然而,学习过程在 Wikipedia、WebText2 和 Books1 上花费了更多时间学习(见轮次 (epochs) 列)。

这些是高质量的数据源,模型对它们的重视程度远高于 CommonCrawl 的蛮力数据。具体来说:

  1. Wikipedia: 英语维基百科,大小为 10GB,提供广泛的事实知识。
  2. 社交媒体和新闻: WebText,源自高“karma”值的 Reddit 链接页面,确保了质量,而新闻文章则增添了时事内容。
  3. Books1 和 Books2: 像 Books1 和 Books2 这样的数据集,在 GPT-3 中使用,提供了文学内容。尽管必须指出,由于版权侵权,OpenAI 似乎已经放弃了这些(是的,这方面的事情很多)。
  4. 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 就是事实准确的。

基线模型如何学习预测序列中的下一个词?

让我们先通过一个简单的例子来理解这一点。想象一下:

  1. 你的输入数据包含 9 个词(或 9 个 Token):["The", "Eiffel", "tower", "is", "in", "France", "London", "New", "York"]
  2. 你只关心模型学习如何完成这个句子:“The Eiffel Tower is in ___”
  3. 在这个实验中,模型只能从 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。

  1. 在 20 次迭代后,LLM 的输出是纯粹的胡言乱语。这完全没有意义。很明显,它的旋钮概率和我们第一次迭代时类似(可能每个词被选择的机会均等)。
  2. 在 400 次学习过程后,它开始变得更加连贯。当然,它还达不到 GPT-4 的连贯水平,但这展示了基线模型正在尝试做什么。

它能很好地从记忆中复述内容。例如,我复制粘贴了一段来自维基百科的摘要并喂给 LLM。我期望它能非常相似地延续我在维基百科上读到的序列,它也或多或少地做到了。几乎在所有其他情况下。它擅长写连贯的句子,但它就是会发散。

LLM 是编码-解码机器

现在我们已经理解了词语如何变成 Token,以及 Token 如何通过参数来预测序列中的下一个项目,让我们把这一切整合到一个可视化的图表中。

  1. 首先,我们需要词语。所以要进行收集和清洗。
  2. 词语对机器是无用的。所以我们需要将它们 Tokenize 成数字
  3. 学习发生在我们传递序列并尝试预测序列中的下一个 Token 时。这是通过调整参数(“旋钮”)来完成的。
  4. 预测结果取自概率最高的 Token。
  5. 最后,这个 Token 被映射回其对应的词语/标点,以便人类能够解读。
模型参数 (容量)Tokens (知识)估算词数公司来源
GPT41.8 万亿13 万亿9.7 万亿OpenAIGPT-4 架构
Llama 3.1-405B0.4 万亿15 万亿11.25 万亿MetaThe Llama 3 Herd of Models
Deepseek V30.6 万亿15 万亿11.1 万亿DeepSeekDeepSeek-V3 技术报告
Qwen2.5-72B0.07 万亿18 万亿13.5 万亿AlibabaQwen2.5 技术报告

高昂的成本使得基线 LLM 模型训练仅为少数人所及

为什么不是全世界都在构建这些基线 LLM 模型?从概念上讲,它们与过去存在的技术并没有太大区别。

原因纯粹与蛮力金钱有关。与传统的机器学习不同,训练拥有数十亿或数万亿参数的神经网络,不是租用一些 AWS 计算资源就能完成的。你需要非常雄厚的财力才能实现这一点。更不用说,这些公司还雇佣了世界上顶尖的人才,所以薪水也绝不便宜。

关于 AI 训练成本的文章来自 Epoch AI,

img

通过微调让大语言模型真正变得实用

微调:这个过程能让模型变得更智能、更有用,并且(但愿)更少犯错。

微调:聊天机器人与真正助手之间的区别

基线LLM可以生成流畅的文本,但它们不擅长遵循指令。从本质上讲,LLM只是巨大的自动补全机器——它们被训练来预测下一个词,而不是进行推理或提供帮助。

微调改变了这一点。通过教导模型如何理解人类意图,微调使得LLM真正变得有用。

重温为什么基线LLM模型不够好

LLM的核心本质——它们只是基于统计模式的、被美化了的自动补全工具。它们不像人类那样"理解"语言,而是根据从互联网上抓取的数万亿个单词中学到的概率来预测下一个词元。这虽然令人印象深刻,但在实际应用中也存在严重缺陷。

GPT-4作为编码器-解码器机器的示意图

Karpathy在视频中对此总结如下:

  1. 基线LLM模型被训练来根据给定的输入序列准确预测下一个词元。这些预测由神经网络内部的参数权重控制。
  2. 可以将基础模型看作是互联网的一个ZIP压缩文件。基础模型中的参数试图存储互联网上的知识,但这些知识被杂乱无章地塞在一起。
  3. 它可以轻松地复述它见过很多次或认为非常重要的文档(例如,它可以背诵维基百科的文档)。
  4. 但它无法推理。实际上,它只能"梦见"互联网文档。这就是我们所说的**“幻觉”**(hallucinations),即模型听起来非常连贯,但完全是在编造内容(例如,你可以试着向一个基础模型询问一个虚构的人物)。

这就是为什么当我们要求基线模型成为可靠的助手时,它们会表现不佳。它们没有被训练来遵循指令或判断自己何时出错——它们只是在重新组合互联网上的文本。如果我们想让它们成为有用的工具,就需要一种方法来教它们如何准确回应并遵循人类的意图。

我们想要的是一个有用的助手

我们如何定义"有用”?

OpenAI并没有想当然地定义"有用”,而是在其关于指令微调的著作中给出了明确的定义。在其出色的论文《使用人类反馈来训练语言模型遵循指令》中,他们讨论了"通过微调使语言模型与用户在广泛任务上的意图对齐"的所有步骤。在论文第36页,OpenAI定义了LLM在与用户互动时应具备的3个特征:

  1. 有用(Helpful)。 它应遵循用户的意图,提供简洁、清晰的回答,避免不必要的重复或假设。
  2. 真实(Truthful)。 它应避免捏造信息,保持事实准确性,并纠正误导性的前提,而不是强化它们。
  3. 无害(Harmless)。 它不应生成有害、有偏见或不道德的内容,并应公平、尊重地对待所有用户。

模型协助的示例用例

为了说明结构化交互的样子,这里有一个来自Karpathy视频的例子。这是一个非常简单的封闭式问答。人类可以准备问题和答案(即,这是一组有监督的生成范例)。

对话示例

人类: “2+2等于几?” 助手: “2+2 = 4” 人类: “如果把+换成呢?” 助手: “22 = 4,和2+2一样!”

人类: “天空为什么是蓝色的?” 助手: “因为瑞利散射。” 人类: “哇!” 助手: “是的!如果还有其他我能帮忙的,请告诉我 :)”

模型如何理解这是人与助手的对话?

现在我们有了这些精心制作的范例,但这还不够。我们需要引入一个对话协议(Conversation Protocol)

如果不做任何额外处理,模型无法分辨哪里是人类信息的结束,哪里是助手回应的开始。模型会把上述例子看作是一长串连续的文本,然后进行分词,并放入一个长序列中来预测下一个词元。我们需要一些额外的东西来让模型理解这里发生了问答交换。

这个额外的"东西"就是对话协议。听起来很高级,但其内在原理非常简单:创建代表特定动作的新词元。OpenAI使用像 `