Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update datasets docs #8

Merged
merged 2 commits into from
Sep 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,44 +1,28 @@
---
title: "数据准备"
title: "预训练数据准备"
---

## 介绍

在大模型预训练阶段,数据准备是一个至关重要的环节,它涵盖了多个方面的内容,以确保模型能够学习到高质量、多样化的数据特征。具体来说,数据准备包含以下几个关键步骤和内容:

* 数据收集

* **通用数据收集**:从各种公开资源如网页、书籍、科学论文、代码等中收集数据。这些数据来源广泛,有助于模型学习到丰富的知识和语言模式。
* **专用数据收集**:针对特定领域或任务,收集该领域内的专业数据。例如,对于医疗领域的大模型,需要收集医疗相关的文献、病例报告等数据。

* 数据预处理

数据预处理是一个脏活累活,也至关重要,不过通常是有一个固定的规则流水线来对齐进行处理。方法如下所示:

* **质量过滤**:通过启发式规则、分类器规则等方法去除低质量及有害数据。例如,过滤掉点赞数过少的用户评论、去除含有有毒或隐私内容的文本。
* **去重**:使用精确匹配或近似匹配(如哈希算法)等方法去除重复数据,确保训练数据的唯一性。
* **敏感内容过滤**:进一步过滤掉包含有毒内容、隐私信息等敏感数据,以保护用户隐私和避免模型学习到不良内容。
* **格式统一**:将收集到的数据统一转换为模型训练所需的格式,如jsonl、txt、csv等。

* 数据调度

旨在训练过程中如何通过调度数据进入到训练阶段来提升模型训练的效果。方法如下所示:

* **数据混合**:根据经验或代理小模型的测试结果,确定不同来源数据在训练集中的混合比例,以增加数据多样性。
* **数据课程**:按照一定的顺序安排预训练数据进行模型训练,如先使用通用数据进行预训练,再使用特定领域的数据进行微调。

* 有标注数据

可在训练阶段融入一些类似于文本分类、问答、槽位填充抽取等有标注相关数据,进而提升数据的多样性,同时对于上下文信息抽取的能力。

* 数据增强

在传统NLP任务当中,可以通过数据增强的方式来扩充数据、同时也能够增加模型对相似文本的理解能力,进而提升模型的泛化性。

数据扩充方法包括同义词替换、随机插入、随机删除、回译等,这些方法可以在不改变数据本质意义的前提下,生成更多的训练样本。
在大模型预训练阶段,数据准备是一个至关重要的环节,它涵盖了多个方面的内容,以确保模型能够学习到高质量、多样化的数据特征。具体来说,数据准备包含以下几个关键步骤和阶段:

| 步骤 | 阶段 | 描述 |
| --- | --- | --- |
| 数据收集 | 通用数据收集 | 从各种公开资源如网页、书籍、科学论文、代码等中收集数据,帮助模型学习到丰富的知识和语言模式。 |
| | 专用数据收集 | 针对特定领域或任务,收集该领域内的专业数据,如医疗相关的文献、病例报告等。 |
| 数据预处理 | 质量过滤 | 通过启发式规则、分类器规则等方法去除低质量及有害数据,如过滤掉点赞数过少的用户评论、去除含有有毒或隐私内容的文本。 |
| | 去重 | 使用精确匹配或近似匹配(如哈希算法)等方法去除重复数据,确保训练数据的唯一性。 |
| | 敏感内容过滤 | 进一步过滤掉包含有毒内容、隐私信息等敏感数据,以保护用户隐私和避免模型学习到不良内容。 |
| | 格式统一 | 将收集到的数据统一转换为模型训练所需的格式,如jsonl、txt、csv等。 |
| Data Scheduling | 数据混合 | 根据经验或代理小模型的测试结果,确定不同来源数据在训练集中的混合比例,以增加数据多样性。 |
| | Data Curriculum | 按照一定的顺序安排预训练数据进行模型训练,如先使用通用数据进行预训练,再使用特定领域的数据进行微调。 |
| 有标注数据 | | 在训练阶段融入一些有标注相关数据,如文本分类、问答、槽位填充抽取等,以提升数据的多样性,同时提升上下文信息抽取的能力。 |
| 数据增强 | | 通过同义词替换、随机插入、随机删除、回译等方法扩充数据,增加模型对相似文本的理解能力,进而提升模型的泛化性。 |

## 数据收集

数据准备的第一个阶段是:搜集相关数据。

在大模型预训练阶段的数据收集过程中,这是一个复杂且关键的任务,它涉及到多个方面以确保收集到高质量、多样化的数据。

### 数据集类型
Expand Down Expand Up @@ -114,63 +98,118 @@ title: "数据准备"

> 在海量的无监督文本上面筛选并提升目标领域的质量是一个非常浩瀚的工程,是距离大模型最近,也是最没有任何技术含量的工程。

* **去重**:使用精确匹配或近似匹配(如哈希算法)等方法去除重复数据,确保训练数据的唯一性。
* **敏感内容过滤**:进一步过滤掉包含有毒内容、隐私信息等敏感数据,以保护用户隐私和避免模型学习到不良内容。
* **格式统一**:将收集到的数据统一转换为模型训练所需的格式,如jsonl、txt、csv等。
### 文本去重

如果预训练文本中存在重复的文本,此时将会降低文本的多样性,可能会导致模型训练的不稳定性,影响模型的效果 [<sup>5</sup>](#scaling-laws-and-learning-from-repeated-data),所以文本中重复的内容是需要删除的。

可是现在预训练文本动辄几百G的文本,要对其进行去重也是一个大工程:如果用传统的pair-wise的方法来对比去重,此时时间复杂度太高,为不可取方案。

当然文本类型数据有长有段,有的仅仅是一两句话的聊天数据,有的是篇幅很长的小说文章,此时也有两种去重粒度:

1. 在句子级别:应该删除重复单词/短语内容,否则模型在生成的时候也很可能会出现重复文本,此类现象通常是不符合预期的。
2. 在文档级别:为了评估不同文档的相似度,此时通常使用 n-gram 的方式来计算和删除相似文本。当然还有其他的方式来判别不同文本的相似度,比如训练分类模型、构建 Embedding 模型,可是成本往往就比较高了。

### 安全隐私保护

数据集当中很可能会存在大量的私人信息,比如:电话号码、邮箱、家庭住址等信息,这些信息虽然是公开的,也是也不应该被训练到模型当中去,此外也可能会存在是基于用户query 生成的内容,其中更可能会出现用户隐私性问题。

很直观的方法就是:用regex将部分数据给替换掉或者直接删除相关文本。

### 文本分词(Tokenization)

文本分词是文本前处理过程中的关键一步,这个是为了将文本的字符拆分成 int 数据(每个单元 token 需要映射到词表某一个 ID ),这一步是所有模型预训练必经之路,其中也有很多方法。

:::tip 文本分词

想要将一段文本转化为模型可识别的输入,通常的过程:句子 -> Token -> ID。

* 句子:为原始自然语言文本,比如:我爱你中国。
* Token:将一段文本拆分成一个个的 token 片段,比如:[我, 爱, 你, 中国]。
* ID:将 token 映射到词表中的某一个 ID,比如:[1761, 2345, 1234, 3456]。

:::

* **Byte-Pair Encoding(BPE)Tokenization**

BPE算法通过迭代合并训练语料库中最常见的字符对(或子词对),来构建一个更紧凑、更有效的词表。这种方法旨在找到一个最优的字符组合方式,使得整个数据集中不同单词的字符组合数量尽可能少,同时保持词汇的语义意义。

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这种方法旨在找到一个最优的字符组合方式,使得整个数据集中不同单词的字符组合数量尽可能少 这个表述也比较抽象,感觉初学者很难理解 BPE 的目标是什么?

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里由于篇幅有限,后续可针对于 BPE 算法作详细描述。


这个方法算是目前最常用的,测试下来实践最有效的方法。

* **WordPiece tokenization**

WordPiece算法通过迭代合并高频字符对或子词对来构建子词词汇表,并使用该词汇表对文本进行分词。这种方法既保留了高频词汇的完整性,又能够将低频词汇拆分成有意义的子词单元,从而提高了模型对复杂语言现象的处理能力。在大语言模型中,WordPiece分词方法被广泛应用,如BERT、DistilBERT等模型均采用了这种分词技术。

> TODO(wj-Mcat): 此处由于篇幅有限,后续会添加更多关于不同分词方法的详细介绍。

其中为了提升模型的质量,可以训练一个[质量分类小模型](https://github.com/modelscope/data-juicer/blob/main/tools/quality_classifier/README_ZH.md#%E8%AF%84%E4%BC%B0%E8%B4%A8%E9%87%8F%E5%88%86%E7%B1%BB%E5%99%A8),输出仅仅是true、false,在现阶段而言这类数据还是比较好准备。

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

没理解这一段和 WordPiece 之间的关系是什么?

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的描述确实是很抽象:用大模型来总结的。

这里想要用几句话来描述清楚我感觉挺难的,至少得用一篇单独的文章来详细描述了,这部分的文章后续可继续新增。


其中阿里开源了一款数据预处理的工具:[data-juicer](https://github.com/modelscope/data-juicer),旨在加速训练大模型过程中数据预处理的过程。

## 数据调度
### 数据质量的重要性

数据质量重要性不言而喻,就看:llama2-3的结构没有什么变化,就仅仅只是调整了训练数据量和数据质量,在不同领域上面就有非常大的提升。这足以说明大模型中的数据质量很大程度上决定了模型的效果。[<sup>6</sup>](#investigating-info-quality-of-llm)

TODO(wj-Mcat): 阅读 [How to Improve Data Quality in a Modern Data Ecosystem](https://www.telm.ai/blog/the-dilemma-of-modern-data-stacks/) 来继续丰富此章节的内容

## Data Scheduling

在大模型预训练阶段,数据调度是一个至关重要的环节,它直接影响到模型的学习效果和训练效率 [<sup>2</sup>](#data-management)。
在大模型预训练阶段,Data Scheduling 是一个至关重要的环节,它直接影响到模型的学习效果和训练效率 [<sup>2</sup>](#data-management)。

数据调度是指在大模型预训练过程中,根据特定的策略和方法,合理安排和分配训练数据的过程。由于大模型预训练需要处理海量的数据,因此数据调度不仅关乎数据的选取和使用顺序,还涉及到数据的混合比例、数据增强等多个方面。通过合理的数据调度,可以使得模型在训练过程中更加高效地学习通用特征和知识,为后续的任务提供良好的基础。
Data Scheduling 是指在大模型预训练过程中,根据特定的策略和方法,合理安排和分配训练数据的过程。由于大模型预训练需要处理海量的数据,因此 Data Scheduling 不仅关乎数据的选取和使用顺序,还涉及到数据的混合比例、数据增强等多个方面。通过合理的 Data Scheduling ,可以使得模型在训练过程中更加高效地学习通用特征和知识,为后续的任务提供良好的基础。

现有大模型的预训练相关数据中的配比如下所示:

![ratio of dataset for llm](./imgs/ratio-of-dataset-for-llm.png)

<center> Ratios of various data sources in the pre-training data for existing LLMs. [<sup>4</sup>](#survey-of-llm) </center>

### 数据调度方法
### Data Scheduling 方法

* 数据增强

数据增强是一种**通过变换已有数据来生成新数据**的方法,可以增加训练数据的多样性和数量。在大模型预训练中,常用的数据增强方法包括同义词替换、回译、随机删除或替换单词等。
数据增强是一种**通过变换已有数据来生成新数据**的方法,可以增加训练数据的多样性和数量。在大模型预训练中,常用的数据增强方法包括同义词替换、回译、随机删除或替换单词等。

此类方法的数据增强通常可包含传统NLP方法,也可以使用LLM来生成相似文本,只不过成本会比较大。
此类方法的数据增强通常可包含传统NLP方法,也可以使用LLM来生成相似文本,只不过成本会比较大。

* 数据混合比例

在大模型预训练中,通常会使用来自不同数据源的数据进行训练。这些数据源可能包括网页文本、书籍、学术论文、代码等。为了平衡不同数据源对模型的影响,需要设置合适的数据混合比例。例如,LLaMA模型的预训练数据就包括了超过80%的网页数据、6.5%的代码密集型数据、4.5%的书籍数据以及2.5%的科学数据。
在大模型预训练中,通常会使用来自不同数据源的数据进行训练。这些数据源可能包括网页文本、书籍、学术论文、代码等。为了平衡不同数据源对模型的影响,需要设置合适的数据混合比例。例如,LLaMA-1 模型的预训练数据就包括了超过80%的网页数据、6.5%的代码密集型数据、4.5%的书籍数据以及2.5%的科学数据。

训练数据中应尽量增加数据的多样性,不应在同样领域的数据上构建过多的数据,进而在这个任务上过拟合,影响了其它领域上的能力。 [<sup>7</sup>](#pretrainer-guide-to-train-data)

此外,不同领域的数据配比也至关重要,通常的做法是使用一个小型代码模型在固定配比的数据集(此数据集的数量也是有 scaling law 算出来的)上面进行预训练,如果有比较好的正收益,此时大概率在大模型上面也会存在有一定的正收益。

最后,还想说一个话题:如何提升在特定领域上的能力,比如说 FunctionCall 的能力。结论就是特殊的功能就需要用特殊的数据来训练。大模型中绝大多数的能力都来源于预训练,当然也有一部分是涌现出来的,不过为了进一步提升涌现出来的能力,在训练数据中添加一部分相关数据可以有效提升目标垂类能力。

* 数据课程(Data Curriculum)[<sup>8</sup>](#data-curriculum-learning)

数据课程指的是在训练过程中,按照一定顺序使用不同难度或不同特性的数据。这种策略有助于模型从简单到复杂逐步学习,提高训练效果。例如,可以先使用较为通用的数据对模型进行初步训练,然后再使用特定领域或高难度的数据进行微调。

* 数据课程(Data Curriculum
Data Curriculum 这个方法主要应用在 Continue Pre-Training 阶段,也主要是一些垂类模型会使用此类训练方法,比如:Code 模型(CodeLLama)或者 长文本模型(LongLLama)。

数据课程指的是在训练过程中,按照一定顺序使用不同难度或不同特性的数据。这种策略有助于模型从简单到复杂逐步学习,提高训练效果。例如,可以先使用较为通用的数据对模型进行初步训练,然后再使用特定领域或高难度的数据进行微调。
大家想要详细了解 Data Curriculum 在大模型中的应用,可移步至:[阶梯化数据训练方法](../09-topics/data-curriculum.md)

## 数据标注

大模型在SFT(Supervised Fine-Tuning,监督微调)阶段的有标注数据主要通过以下几种方式获得:

1. 公开数据集
### 公开数据集

公开数据集是AI大模型训练数据的重要来源之一。这些数据集通常由学术机构、政府组织或企业公开发布,涵盖了各种类型的数据,如图像、文本、音频、视频等。对于自然语言处理(NLP)领域的大模型,如GPT系列,它们的SFT数据可能包含从公共文本数据集(如Common Crawl、BookCorpus等)中抽取并经过标注的样本。

2. 众包或专业标注服务
### 众包或专业标注服务

对于需要精细标注的数据集,如情感分析、文本分类、对象检测等任务,企业可能会采用众包平台或专业标注服务来获取高质量的标注数据。这些服务通常由大量的人工标注者参与,他们根据给定的指令和标准对原始数据进行标注,确保数据的准确性和一致性。

3. 企业内部数据
### 企业内部数据

许多企业拥有大量的内部数据,这些数据可以用来训练特定领域的AI大模型。在SFT阶段,企业可能会利用这些内部数据,并结合业务场景和需求进行标注,以生成符合模型训练要求的有标注数据集。

4. 合作伙伴共享数据
### 合作伙伴共享数据

为了获取更全面、更具代表性的数据,一些公司会与合作伙伴共享数据以共同训练AI大模型。这种合作可能涉及跨行业的数据交换,例如金融公司与电信公司共享客户行为数据以提高风险评估模型的准确性。在数据共享过程中,双方会协商确定数据的标注标准和要求,以确保数据的一致性和可用性。

5. 使用大模型生成数据
### 使用大模型生成数据

近年来,随着大模型技术的发展,一种新兴的数据生成方式是利用大模型自身来生成有标注数据。例如,通过引导式生成(Instruction Following)的方法,让大模型根据给定的指令生成相应的输入和输出对,并自动进行标注。这种方法可以在短时间内生成大量数据,但需要注意的是,生成的数据可能存在偏差和噪声,需要进行后续的处理和筛选。

Expand All @@ -182,3 +221,7 @@ title: "数据准备"
* [2] [Data Management For Training Large Language Models: A Survey](https://arxiv.org/abs/2312.01700) <div id="data-management" />
* [3] [Datasets for Large Language Models: A Comprehensive Survey](https://arxiv.org/pdf/2402.18041) <div id="dataset-for-llm" />
* [4] [A Survey of Large Language Models](https://arxiv.org/pdf/2303.18223) <div id="survey-of-llm" />
* [5] [Scaling Laws and Interpretability of Learning from Repeated Data](https://arxiv.org/abs/2205.10487) <div id="scaling-laws-and-learning-from-repeated-data" />
* [6] [Towards Trustable Language Models: Investigating Information Quality of Large Language Models](https://arxiv.org/pdf/2401.13086) <div id="investigating-info-quality-of-llm" />
* [7] [A Pretrainer's Guide to Training Data: Measuring the Effects of Data Age, Domain Coverage, Quality, & Toxicity](https://arxiv.org/abs/2305.13169) <div id="pretrainer-guide-to-train-data" />
* [8] [Curriculum Learning: A Survey](https://arxiv.org/abs/2101.10382) <div id="data-curriculum-learning" />
5 changes: 5 additions & 0 deletions docs/01-llm-intro/09-topics/data-curriculum.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "阶梯化数据训练方法"
---

TODO(wj-Mcat): 该内容待补充,敬请期待
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,16 @@
"@docusaurus/preset-classic": "3.4.0",
"@giscus/react": "^3.0.0",
"@mdx-js/react": "^3.0.0",
"antd": "^5.20.3",
"clsx": "^2.0.0",
"commentbox.io": "^2.1.0",
"katex": "^0.16.11",
"prism-react-renderer": "^2.3.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"rehype-katex": "7",
"remark-math": "6"
"remark-math": "6",
"starlight": "^0.3.9"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.4.0",
Expand Down
Loading