趋近智
将合成文本与现有数据结合是预训练大型语言模型的一种常见且通常更有效的策略。这种混合方法结合了两种数据类型的优点:真实数据的广度和真实性,以及合成数据有针对性、可控的特点。此方法以提高最终模型能力的方式,丰富了预训练语料库 V数据。在各种场景中,它通常比单独依赖纯合成数据更具优势,尤其是在数据稀缺时。
将合成数据和真实数据结合用于预训练不仅仅是为了增加文本的总量。这是一种提高数据集质量和实用性的策略。以下是几个主要动因:
然而,混合并非没有需要考虑的地方。合成数据的质量非常重要。添加大量低质量或不匹配的合成数据可能会通过引入噪音或冲突信号来降低模型性能。
你将面临的第一个实际问题之一是:应该添加多少合成数据?没有通用公式,合成数据与真实数据的最佳比例,我们称之为 R合成:真实,取决于几个因素:
常见起始点: 许多实践者开始时会用相对较小的比例来补充其语料库,大约占最终总容量的5%到20%。例如,如果你有1太字节(TB)的文本,并目标是补充10%的合成数据,你将大约添加100吉字节(GB)的合成数据。
试验通常是明智的。你可以训练更小的模型或减少训练步数,使用不同的 R合成:真实 比例,并在相关验证集或一系列探查任务上评估其性能,以找到最佳点。
一旦你确定了大致比例,你实际如何混合数据?以下是几种常见方法:
简单拼接: 最直接的方法是简单地将合成数据集附加到你的数据集中。如果你的数据集存储为文件集合,这可能涉及将合成文件添加到数据加载器使用的相同目录或列表中。
交错或分层混合: 一种更具控制性的方法是交错来自两个来源的数据。这可以在不同粒度上完成:
下图说明了简单拼接和交错策略之间的差异。
```
> 拼接(数据集简单地组合)与交错(在训练流创建过程中,来自不同来源的数据混合得更细致)的对比。
批次级交错通常是很好的折衷方案,提供比简单拼接更好的混合效果,而没有在海量数据集上进行全局打乱的全部开销。以下是一个Python代码片段,说明如何按目标合成比例创建批次:
```python
import random
# 假设这些是实际数据的大型列表或迭代器
real_data_pool = ["真实样例 1", "真实样例 2", ...]
synthetic_data_pool = ["合成样例 A", "合成样例 B", ...]
# 每个批次中合成数据的目标比例
synthetic_target_proportion = 0.2 # 20% 合成数据
def create_blended_batch(batch_size):
batch = []
for _ in range(batch_size):
# 决定是从合成池还是真实池中选取
if random.random() < synthetic_target_proportion:
# 如果 synthetic_data_pool 不为空,则优先选择
if synthetic_data_pool:
batch.append(random.choice(synthetic_data_pool))
elif real_data_pool: # 如果合成数据用尽(或不符合期望比例),则回退到真实数据
batch.append(random.choice(real_data_pool))
else:
# 如果 real_data_pool 不为空,则优先选择
if real_data_pool:
batch.append(random.choice(real_data_pool))
elif synthetic_data_pool: # 如果真实数据用尽,则回退到合成数据
batch.append(random.choice(synthetic_data_pool))
# 在实际场景中,请确保池不为空或处理 StopIteration
# 此外,真正的抽样应该避免不重复地选取相同的项目
# 或使用适当的数据加载器。
return batch
# 示例用法:
# my_batch = create_blended_batch(32)
# print(my_batch)
```
这个片段仅作示例。数据加载管道(例如,使用Hugging Face `datasets`、PyTorch `DataLoader`或TensorFlow `tf.data`)提供更高效的方式来处理大型数据集、打乱和批处理。你通常会根据所选策略配置这些加载器,以从组合或单独的数据集中采样。
3. **上采样和下采样考量:**
混合也可以是解决不平衡的机会。
* **使用合成数据进行上采样:** 如果你的数据有代表性不足的类别(例如,特定文本类型、技术文档),你可以为这些类别生成合成数据并添加,有效地对其进行上采样。
* **策略性下采样:** 虽然通常你想要更多数据,但如果你的数据中某个特定部分压倒性地占主导且实用性较低,如果高质量合成数据可以提供更好的多样性或覆盖更重要的方面,你可以考虑略微下采样。这在预训练中不太常见,因为大体量数据通常是有益的,但这可以作为一种考量。
### 混合数据集的质量和一致性
混合数据集时,特别是来自通用网络文本和高度具体的合成指令等不同来源的数据,保持整体质量和一致性很重要:
* **一致性:** 确保你的合成数据不会引入与真实数据直接矛盾或以有害方式破坏真实数据的风格元素或事实信息。某些受控矛盾可能有助于提升模型的鲁棒性,但普遍的不一致性会使模型感到困惑。
* **内容方向对齐:** 如果你将特定内容的合成数据(例如,医学文本)添加到通用语料库(例如,网络爬取数据)中,请留意这可能如何影响模型的通用知识。混合比例在此处起作用。
* **预处理一致性:** 在混合之前,对真实数据和合成数据应用一致的文本清理、分词和格式化步骤。预处理中的差异可能会成为模型意想不到的信号。
* **合成数据的迭代过滤:** 在混合之前,严格过滤你的合成数据。相关方法在第5章(“高级方法与数据优化”)和第6章(“评估合成数据与应对操作难题”)中介绍。一个常见错误是混合未经处理、未过滤的合成输出,这会引入大量噪音。
### 评估混合的影响
你的混合策略的真正检验在于它对预训练过程和所得模型性能的影响。需要关注的几个重要方面包括:
* **预训练损失曲线:** 观察训练和验证损失。混合数据集是否导致更平滑的收敛?是否存在意外的峰值或停滞?
* **在保留集上的困惑度:** 衡量在多样化保留集上的困惑度,包括代表数据分布的集合以及特定于合成数据覆盖的方面的集合。
* **下游任务性能:** 这通常是最具决定性的衡量标准。在与你的目标相关的一系列下游任务上评估预训练模型。使用混合语料库预训练的模型是否比仅使用真实数据预训练的模型(如果存在这样的基线)表现更好、更差,还是不同?
* **探查特定知识/技能:** 如果你的合成数据旨在教授特定内容(例如,一个新的API,某种推理模式),开发探查方法或针对性评估,以查看模型是否习得了这些能力。
“合成数据和真实数据的混合既是一门艺术,也是一门科学。它需要仔细考量你的目标、可用数据的性质以及迭代实验。通过有策略地结合这些资源,你可以创建更丰富、更有效的预训练语料库,从而提升你的LLM所能达到的效果。后续章节将更详细地介绍生成特定类型的合成数据,包括指令格式内容,然后你可以使用这些策略进行混合。”
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造