Lecture 13 & 14: Data
我们知道,模型训练需要两个重要的因素:模型架构和数据。前面的几节课程我们主要关注了模型架构的设计和优化,而在这一节,我们将重点讨论数据的重要性。要想训练好一个LLM,除了有强大的模型架构和充足的计算资源,数据同样至关重要。Lecture 13 和 14 将深入探讨用于训练大型语言模型的数据收集、清洗和处理方法。
1 Why Data Matters?
在很多开源权重模型(例如 LLaMA)的论文中,我们经常看到模型架构的描述和训练细节,但很少有关于数据的详细介绍。其背后主要有两个原因:
- 数据隐私和商业机密:许多公司和研究机构在训练大型语言模型时使用了大量的网络文本、书籍、对话数据等,这些数据往往涉及版权和隐私问题,因此不便公开。
- 竞争壁垒:数据处理是最贵、最难复制的资产之一。
在Foundation Model之前,数据通常是heavy annotation(例如图像分类中的ImageNet),但对于LLM来说,数据主要来自于网络文本、书籍、对话数据等,这些数据的规模和质量直接影响模型的性能和泛化能力。并且,Data 是一个long-tail problem,数据的质量和多样性对于模型的表现有着深远的影响。
2 Different Types of Data
大模型的训练阶段简单来说,可以分成3个阶段(现实里阶段节的边界可能更模糊):
- Pre-Training:在这个阶段,模型会使用大规模的文本数据进行无监督的训练,学习语言的基本结构和语义。
- Mid-Training:定向补充能力,数据更小,但更高质量,通常是一些特定领域的数据。
- Post-Training:让模型可以了聊天,更安全,需要做RLHF等,在这一阶段,需要一些指令数据、对话数据、偏好数据等。
一个很实用的直觉是:
越往后,数据越小、越贵、越“人为设计”,但对最终体验影响越大。
2.1 Example
接下来我们来看一个具体的例子
了解了不同的LLM训练阶段,接下来,我们来看一下在不同的阶段中,数据是如何收集的,我们先来看一下Pre-Training阶段,之后我们再来介绍Mid-Training和Post-Training阶段的数据收集方法。
3 Pre-Training Data Collection
在Pre-Training阶段,模型需要大量的文本数据来学习语言的基本结构和语义。其实在GPT火之前,NLP领域已经有很多预训练语言模型了,例如BERT (Devlin et al. 2019),这些模型的训练数据主要来自于网络文本、书籍等公开可用的数据源。 以BERT为例,BERT的训练数据主要来自于以下几个来源:
- BooksCorpus:当年从 Smashwords 抓取的免费自出版书籍(后来因 ToS 被下架)
- Wikipedia:高质量、结构化、引用链清晰,但有明显“缺失面”(观点、生活细节、长尾知识很多不在里面)
Even high quality data source might contain bad content。
我们之所以要以BERT为例子,是因为BERT标志着在Training阶段,Sequence are Document而不是之前的一个短句子Sentence,
接下来我们来看一下GPT-2的训练数据,GPT-2的训练数据主要来自于WebText数据集,WebText是从Reddit上抓取的高质量文本数据,包含了大量的网络文本、新闻文章、博客等内容。其中包含了从 Reddit 高 karma 帖子的外链抓网页,相当于用群体行为做了一层过滤。
3.1 Common Crawl
Common Crawl 是一个非营利组织,致力于定期抓取和存档整个互联网的数据。它提供了一个庞大的、公开可用的网络文本数据集,涵盖了各种类型的网站和内容。Common Crawl 的数据集包含了数十亿个网页的文本内容,这些数据对于训练大型语言模型非常有价值,因为它们提供了丰富的语言表达和多样化的语料来源。Common Crawl(CC)更像:
- 每月一次大规模 crawl
- 输出 WARC(原始 HTTP 响应)和 WET(抽取后的文本)
- 覆盖不完整、重复极多、噪声很大、而且 HTML→text 的工具会显著影响质量
接下来讨论一下如何将HTML转化为Text。
3.1.1 Filter Common Crawl
原始的Common Crawl数据包含了大量的噪声和无关内容,因此需要进行过滤和清洗。常见的过滤方法包括:
- Rule-Based:基于规则的过滤方法,例如使用正则表达式来去除HTML标签、脚本、样式等无关内容。
- Model-Based:基于模型的过滤方法,例如使用预训练的语言模型来评估文本的质量,去除低质量或无意义的文本。