数据准备与样本拼接
概述
数据准备是大模型训练中最耗时也最关键的环节。高质量的数据是高性能模型的基础,包括数据收集、清洗、预处理、样本构建等多个步骤。样本拼接(Packing)是预训练阶段提高训练效率的重要技术。
数据清洗与预处理
基础数据清洗
最基础的数据清洗包括:
- 去除广告:网页爬取数据中常见的广告、导航栏、页脚等无用内容
- 去除重复:重复文本会导致模型过拟合,浪费计算资源
- 过滤低质量:去除格式混乱、语义不通、含有大量特殊字符的文本
- 敏感内容过滤:去除违规、侵权等不合适内容
Falcon论文推荐的数据清洗手段
- 去重:基于语义相似度对数据去重,避免重复数据影响模型泛化
- 质量过滤:基于规则和模型过滤低质量内容
- 多样性保留:保证不同领域、不同风格的数据分布合理
数据质量评估方法
- PPL(困惑度)过滤:选择模型PPL较高的样本(即模型比较"不确定"的样本),这些样本信息含量更大
- 二分类质量模型:用已标注的高质量和低质量数据训练分类模型,对新数据打分过滤
- 拒绝采样:选择"模型不确定"且"数据质量达标"的样本
- 人工抽查:对最终数据集进行抽样检查,确保质量
数据选择与构建原则
最优数据的特征
- 多样性:数据需要覆盖不同类别、不同风格,避免长尾分布问题
- 实际场景中,数据分布通常是长尾的:少数类别占据大部分数据
- 需要人工平衡数据分布,避免模型偏向常见类别
- 标注质量:标注质量直接影响模型效果,高质量少量数据比低质量大量数据更好
- 不确定性:选择模型现有知识难以处理的样本,提高数据效率
构建高质量微调数据的方法
方法一:Self-Instruct
通过预训练语言模型自我引导生成指令数据:
- 从种子任务中随机抽取少量示例
- 提示大模型生成更多任务指令
- 根据指令生成相应的输入和输出
- 后处理过滤相似指令、去重,得到最终数据集
优势:快速生成大量数据,成本低
劣势:可能存在重复和模式化,质量依赖于生成模型
方法二:主动学习
主动学习核心原则:寻找多样性和不确定性的数据。
多样性实现:
- 去重:基于相似度度量去除重复数据
- 聚类:使用One-pass聚类或K-Center-Greedy算法,在保证多样性前提下最小化数据集
- 半监督筛选:已有种子数据训练二分类模型,筛选与现有数据不同的新样本
不确定性实现:
- PPL筛选:选择PPL较高(模型不确定)的样本
- Reward模型过滤:训练质量二分类模型,选出质量达标且模型不确定的样本
- 核心:选择"模型不确定"+"数据质量达标"的数据,训练效率最高
SFT数据构建方法
数据集格式
SFT(Supervised Fine-Tuning)通常采用一问一答格式:
1{
2 "instruction": "问题描述",
3 "input": "额外输入信息(可选)",
4 "output": "模型期望输出"
5}
数据来源
- 人工标注:适合垂直领域,质量高,成本高,减少偏差
- LLM生成:如GPT-4生成,快速大量生成,成本较低,适合通用领域
- 开源数据集:Alpaca、Alpaca-CoT等,可直接使用或二次处理
常用开源数据集
- Alpaca-CoT:包含多种数据集,支持CoT,有中文数据,整理全面
- 中文Alpaca-51k:从ChatGPT爬取的中文指令数据,常用
- RedPajama-1T:大规模预训练数据集,包含七个子集,质量高
Backtranslation(回译)方法
回译是生成SFT数据的一种技巧:
- 从中文翻译到英文,再从英文翻译回中文
- 保持语义一致,但文本表达方式不同,实现数据增强
- 变种:通过输出来生成指令,扩大指令覆盖范围
数据量经验法则
- 分布一致:如果微调数据分布与预训练一致,100条足够
- 分布差异大:需要千条甚至万条以上
- 复杂冷门任务:需要更多数据,并且需要多轮训练才能稳定拟合
- 一般情况:小样本任务,数百到数千条即可达到不错效果
样本拼接(Packing)策略
为什么需要样本拼接?
- 提高训练效率:通过拼接短文本打满max_len,减少padding占比
- 拓展最大长度:让模型在训练中接触更长上下文,提升长文本处理能力
- 充分利用计算资源:避免GPU计算资源浪费在padding上
常见拼接方式
方式一:Random Concatenate
原理:随机将多条短文本拼接,打满最大长度,不够就padding。
优势:简单易实现,有效减少padding
劣势:多个样本之间互不相关,可能引入噪音共现,模型可能学到错误特征;使用特殊token隔离但无正则化,难以解决问题。
方式二:Random Concatenate + NoiseMask
原理:添加自定义attention mask,让模型只关注当前样本,不关注其他样本。
代码示例:
1def segment_causal_mask(input_ids, device, val=float("-inf")):
2 bsz, tgt_len = input_ids.shape
3 cum_lens = torch.arange(1, tgt_len+1, device=device).unsqueeze(0) * \
4 torch.eq(input_ids, EosTokenId).int().to(device)
5 mask = torch.zeros([bsz, tgt_len, tgt_len]).to(device)
6 for i, _cum_lens in enumerate(cum_lens):
7 for v in _cum_lens:
8 mask[i,v:,:v] = val
9 return mask
优势:相比纯随机拼接,在ICL few-shot任务上有约1.6%提升
劣势:相对位置编码(ALiBi、ROPE)的信息会被attention mask掩盖,无法获得跨样本相对位置反馈,本质还是在短窗口内训练,没有真正实现长文本训练。
方式三:Random Concatenate + Cluster
原理:按实体、语义聚类,将相关样本拼在一起,使拼接的样本存在真实信息共现。
优势:模型不易学偏,能适应更广泛的attention,提升长文本能力
劣势:容易出现信息重复和泄露,实验中往往难以获得显著提升。
方式四:IN-CONTEXT PRETRAINING (ICLM)
原理:基于语义相似度优先拼接最相关样本,构成更连贯的上下文。
流程:
- 将所有样本embedding化(使用contriever等编码器)
- 基于余弦距离去重
- 基于旅行商思想,不断串联最相关样本(每个样本只用一次)
- 用拼接后的样本进行预训练
关键点:
- 强调数据去重的重要性,消融实验验证去重有正向增益
- 语义聚合分布更平缓,信息泄露风险更低
- 数据分布越广泛,去重越彻底,效果越好
数据质量关键要点
- 数据治理是大模型效果的关键,高质量数据比大量低质量数据更好
- 去重非常重要,重复数据不仅浪费计算,还会损害泛化性能
- 多样性比数量更重要,覆盖不同分布才能让模型鲁棒
- 主动学习可以用较少数据达到更好效果,提高训练效率
面试常见问题
-
**如何构建高质量的微调数据?
- 需要保证数据多样性,避免长尾分布问题;保证标注质量;使用主动学习方法选择多样性和模型不确定的数据;可结合Self-Instruct快速生成数据;最后需要清洗去重和质量过滤。
-
**Self-Instruct的原理是什么?
- Self-Instruct是通过大模型自我引导生成指令数据的框架,从少量种子任务开始,让大模型生成更多指令和对应的输入输出,经过后处理去重得到大规模数据集,能快速低成本生成大量指令数据。
-
**预训练阶段为什么需要样本拼接?
- 主要是为了提高训练效率,减少padding占比,充分利用GPU计算资源;同时也能拓展模型最大长度,让模型在训练中接触更长上下文,提升长文本处理能力。
-
**说说几种样本拼接方法的优缺点?
- 随机拼接:简单但引入噪音,可能让模型学偏;随机拼接+attention mask:解决噪音问题但破坏相对位置编码,无法真正训练长文本;聚类拼接:相关样本拼接更合理但容易信息重复泄露;ICLM:基于语义相似度串联相关样本,去重处理,效果更好但计算量更大。
-
**SFT需要多少数据?
- 取决于任务与预训练数据分布的差异,如果分布一致100条就够;如果差异大或者任务复杂,需要千条甚至万条以上;冷门领域需要更多数据。
-
**主动学习在数据构建中怎么用?
- 核心是选择多样性和模型不确定性的数据。多样性通过去重、聚类实现;不确定性通过PPL、质量模型筛选,最终选择模型不确定且质量达标的样本,提高训练效率。