大模型预训练数据工程
大模型预训练数据工程分为如下几个步骤:
- 数据抽取
- 数据过滤
- 数据去重
- 数据配比
- 数据课程
- 数据格式
1、数据抽取
从数据源中提取有效数据并整理,可以从如下方式获取数据:
- 网络爬虫
- 网页
- 文档
在获取数据的同时尽可能的保留与数据相关的元信息,这些元信息在后续模型训练中会发挥作用。
2、 数据过滤
- 语言识别
- 针对特定要求的模型,仅需有指定的语言作为训练数据,需要多其他不需要的语言进行过滤
- 基于Unicode编码识别
- N-gram语言分类器
- fasText
- Langdetect
- 针对特定要求的模型,仅需有指定的语言作为训练数据,需要多其他不需要的语言进行过滤
以下是使用Langdetect库进行的语言识别示例:
from langdetect import detect
from langdetect import detect_langs
s1 = "汉语是世界上最优美的语言,正则表达式是一个很有用的工具"
s2 = "正規表現は非常に役に立つツールテキストを操作することです"
s3 = "あアいイうウえエおオ"
s4 = "정규 표현식은 매우 유용한 도구 텍스트를 조작하는 것입니다"
s5 = "Regular expression is a powerful tool for manipulating text."
s6 = "Regular expression 正则表达式 あアいイうウえエおオ 정규 표현식은"
print(detect(s1))
print(detect(s2))
print(detect(s3))
print(detect(s4))
print(detect(s5))
print(detect(s6)) # detect()输出探测出的语言类型
print(detect_langs(s6)) # detect_langs()输出探测出的所有语言类型及其所占的比例
# 结果
"""
zh-cn
ja
ja
ko
en
ja
[ca:0.714283074134662, ja:0.2857138453238958]
"""
- 质量过滤
- 基于规则
- URL
- 关键词
- 预定义的规则
- 基于模型
- 相似度(样本与高质量数据相似度)
- 分类(高质量与低质量)
- 模型打分
- 基于规则
3、数据去重
注意:
重复的数据在不同条件下具有的作用不同,不一定是好的,或者坏的作用。优质的重复数据某种程度上可以加强模型的相应能力。
重复数据存在的问题:
- 损害模型的泛化性,使得模型不是学习而是简单的记忆
- 会让loss在训练中期陡然上升
- 会让scaling law失效
- 会让模型失去复制能力(例如,通过few-shot让模型来完成相同形式的输出)
- 让模型的微调后性能变差
数据区中的策略:
三种级别:
- 句子级别
- 锻炼级别
- 文档级别
策略: - 完全匹配
- 模糊匹配
- 语义匹配
在大模型训练过程中,需要训练的数据量较大,为了加速数据去重,可以使用分桶的方式,先将所有的数据都划分进多个桶,对每个桶内进行数据去重。也可以通过检查数据来源URL的方式先进行一次数据去重
除了去重大模型训练数据中的重复数据,还需要注意污染数据,训练数据与测试数据的交叉数据被称为污染数据,可以通过N-gram或优质大模型的帮助来去除污染数据。
4、数据配比
大模型训练中,训练数据的配比会影响大模型的性能。
设计数据配比方法:
- 根据下游任务设计数据集
- 人工设计数据
- 自动学习(DoReMi)
5、数据课程
数据配比关注的是训练数据中的不同数据的类型数量,数据课程关注的是在训练大模型的过程中,不同类型数据训练的先后顺序。
不同的数据任务之间存在相互促进的作用,一个较好的数据训练顺序可以提升模型效果。
6、数据格式
为了提升模型最终的效果和学习速度,有两个方面需要注意:
- 在涉及推理、规划的困难任务上尽可能的提供详细的中间过程给模型
- 每次训练的数据尽可能的输入最大长度,不足最大长度将相关文本填充
工具
可以使用Deita工具自动筛选高质量的数据,GitHub地址如下
https://github.com/hkust-nlp/deita