数据工程
1 如何获取大规模预训练数据?
Common Crawl、GitHub、书籍、论文、代码等多源数据。
目前也有很多开源的pretrain数据可以使用:
FineWeb
英文网页
15T tokens
HuggingFace 高质量清洗,2013-2024 CC 数据
RedPajama-V1
综合
1.2T tokens
Together 出品,模仿 LLaMA 配方(CC+GitHub+书+论文)
RedPajama-V2
网页
30T tokens(清洗后)
100T 原始,提供 40+ 质量注释信号
SlimPajama
综合
627B tokens
Cerebras 深度清洗版,基于 RedPajama-V1
RefinedWeb
网页
5T tokens
TII/Falcon 出品,90% 淘汰率高质量纯网页
The Pile
综合
825GB / 1.4B 文档
EleutherAI 经典数据集,22 个子集(学术/代码/书)
The Stack v2
代码+
30TB+
含 GitHub Issues/PRs/Kaggle notebooks
StarCoderData
代码
783GB,86 语言
含 Issues、Jupyter notebooks、Commits
Fineweb-Code
代码网页
55B tokens
从 FineWeb 召回的高质量代码相关网页
Fineweb-Math
数学
数学相关
从 FineWeb 召回的数学内容
TigerBot-pretrain
中文
2TB(开源 100GB)
TigerBot 中文预训练集(书+百科+网页)
选多少数据量比较合适?
根据 DeepMind 在2022年的Chinchilla模型实验,在给定的计算预算(FLOPs)下,模型参数量(N)与训练数据量(D)应以相同比例缩放,具体比例为1:20,即每 1B 参数需匹配 20B 的训练数据。
不同文本的知识密度是有差异的
在 RedPajama-V2 等数据集中,知识密度通过 Wikipedia 训练的 n-gram 语言模型困惑度 来衡量,
Head(头部):低困惑度(perplexity 低),语言规范、信息密集(如 Wikipedia、教科书)
Middle(中部):中等困惑度,一般网页内容
Tail(尾部):高困惑度(perplexity 高),低质量文本(广告、垃圾信息、随机字符串)
2 数据过滤
2.1 启发式过滤
典型过滤条件有:
语言
长度:太短文本(如导航栏、页脚),过长文本(可能是抓取错误)
符号与格式:符号占比过高(如乱码、表情符号堆叠、大量停用词、HTML格式残留)
2.2 基于模型过滤
基于模型的过滤分为标签过滤和分数过滤,标签过滤就是去掉你不想要的文本类别(比如代码类),分数过滤就是去掉低质量数据,或按分数加权采样。
标签过滤的方式:
使用 FastText 模型分类:FastText 是微软开源的模型,将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。
自己训练分类器:通常使用 BERT 之类的 encoder-decoder 模型,训练一个分类器
标签体系设计建议
粗粒度(5-10类):如
academic,code,news,forum,novel,ads,spam细粒度(20+类):如
arxiv_cs,arxiv_math,github_python,github_js,wikipedia,textbook,patent,law,medical
分数过滤的方式
Perplexity 过滤:计算文档困惑度作为质量指标。困惑度越低,说明文本越符合自然语言分布规律(通常为高质量书写文本)
自己训练一个打分器,训练方法同上文的标签过滤
LLM-as-Judge:最简单也是最烧钱的方法,用更好的LLM作为打分器
2.3 隐私脱敏
PII = Personally Identifiable Information(个人身份信息),指任何可用于识别、定位或联系特定个人的数据。
常见的需要脱敏的数据如下:
基础标识
姓名、身份证号、手机号、邮箱、地址
正则表达式 + 字典匹配
金融信息
银行卡号、信用卡CVV、交易记录
校验位算法(Luhn算法)+ 模式匹配
网络标识
IP地址、MAC地址、Cookie、设备ID
正则 + 网络协议解析
生物特征
指纹、面部识别数据、DNA序列
文件头检测(通常以二进制存储)
上下文PII
"我住在朝阳区"(需结合说话人身份)
NER模型 + 依存句法分析
3 数据去重
训练语料中的重复数据会导致训练效率下降、模型过拟合重复文本,降低泛化能力。
预训练中数据去重的级别一版分为:
文档级:整篇文档的完全或近似重复
段落级:文档内或跨文档的段落重复
子串级:连续字符串有重复
除了硬匹配和一些常见的相似度检测算法,去重常用的算法是 MinHash-LSH:
MinHash 算法原理
数学基础:Jaccard 相似度估计
对于两个集合 A 和 B,Jaccard 相似度为: J(A,B)=∣A∪B∣∣A∩B∣
直接计算 Jaccard 需要 O(∣A∣+∣B∣) 的存储和计算,MinHash 通过概率 sketch 将复杂度降至 O(1)。
算法步骤:
Shingling(分片):将文档切分为连续的 k-gram 集合
Hash 签名生成: 使用 n 个独立的哈希函数 h1,h2,...,hn,对每个 shingle 计算哈希值。
MinHash 签名 sig(A) 的第 i 个分量是: sigi(A)=minx∈Ahi(x)
即:对每个哈希函数,取集合 A 中所有元素哈希值的最小值。
相似度估计: Jest(A,B)=nmatches 其中 matches 是 sig(A) 和 sig(B) 中相等位置的数量。
概率保证:估计误差为 O(1/n),通常 n=128 或 256 可提供足够精度。
LSH(局部敏感哈希)加速
问题:当文档数量达到十亿级时,两两比较 MinHash 签名(O(N2))不可行。
LSH 策略:将签名分桶,仅比较同一桶内的文档。
4 数据配比
前面我们训练的分类器,再这里也能够派上用场。
大部分中文模型的数据配比为:中:英:code = 4:4:2。
也可以使用一些方法来优化数据配比,例如DoReMi。
4.1 DoReMi
DoReMi 是 Google DeepMind 开源的一套自动调整数据配比的方法,简单来说就是多采样模型相对学得不好的数据。
DoReMi 通过比较参考模型(Reference Model)与生产模型(Proxy Model)的性能差距(Excess Loss)来动态调整权重:
Excess Lossd=Ex∼Pd[−logQα(x)]−Ex∼Pd[−logQref(x)]
其中:
Qref:在均匀分布数据上训练的小模型(捕捉基线能力)
Qα:在当前权重 $\alpha$ 下训练的小模型(验证者)
核心洞察:若某领域的 Excess Loss > 0(生产模型比参考模型差),说明该领域训练不足,需增加采样权重
算法流程
Step 1 - 训练参考模型:在均匀采样(各领域等概率)的数据上训练一个小规模参考模型(通常为主模型 1/10 规模,如 280M 参数),记录各领域验证集上的基线损失 Lref(d)。
Step 2 - 迭代优化权重(通常 3-5 轮):
按当前权重 α 采样数据,训练同等规模的代理模型(Proxy Model)
计算各领域 Excess Loss(代理模型损失 - 参考模型损失)
权重更新:对 Excess Loss 大的领域增加权重(Multiplicative Weights Update): αdt+1∝αdt⋅exp(η⋅Excess Lossd)
归一化权重并迭代,直至权重收敛(最大变化 < 1%)或 Max Excess Loss 不再降低
Step 3 - 应用最优权重:将收敛后的权重应用于大规模模型(如 7B/70B)的实际训练。
参考
Last updated