Skip to content

Commit

Permalink
update llm doc
Browse files Browse the repository at this point in the history
  • Loading branch information
wj-Mcat committed Sep 4, 2024
1 parent 5649e3f commit a076c00
Showing 1 changed file with 42 additions and 45 deletions.
87 changes: 42 additions & 45 deletions docs/01-llm-intro/05-training/01-dataset.mdx
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 @@ -118,21 +102,32 @@ title: "数据准备"

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

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

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

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

### 安全隐私保护

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

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

### 文本分词(Tokenization)

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

:::tip 文本分词

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

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

:::

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

Expand All @@ -144,6 +139,8 @@ title: "数据准备"

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,在现阶段而言这类数据还是比较好准备。

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

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 方法

* 数据增强

Expand All @@ -176,11 +173,11 @@ TODO(wj-Mcat): 阅读 [How to Improve Data Quality in a Modern Data Ecosystem](h

* 数据混合比例

在大模型预训练中,通常会使用来自不同数据源的数据进行训练。这些数据源可能包括网页文本、书籍、学术论文、代码等。为了平衡不同数据源对模型的影响,需要设置合适的数据混合比例。例如,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 算出来的)上面进行预训练,如果有比较好的正收益,此时大概率在大模型上面也会存在有一定的正收益。
此外,不同领域的数据配比也至关重要,通常的做法是使用一个小型代码模型在固定配比的数据集(此数据集的数量也是有 scaling law 算出来的)上面进行预训练,如果有比较好的正收益,此时大概率在大模型上面也会存在有一定的正收益。

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

Expand Down

0 comments on commit a076c00

Please sign in to comment.