All about synthetic data generation

关于合成数据生成的一切

标签
LLM
数据
发布日期
2024年11月19日
作者
Shahul Es

引言

合成数据是指通过算法创建的人工生成数据,它模仿了真实世界数据的特征和模式。合成数据生成是 LLM(大型语言模型)备受推崇的应用之一,而利用模型设计能够生成高质量数据样本的流程是一项热门技能,其应用范围从预训练 LLM 到评估 LLM 应用。
 
但在生成合成数据时会出现哪些挑战?哪些方法可以确保创建出针对特定应用量身定制的高质量数据集?本博客旨在为您提供一个结构化的思维框架,以有效解决您的数据需求。
 
 

挑战

合成数据生成的基本目标是自动化数据整理过程,从而节省手动数据标注和整理所涉及的时间和成本。但在大规模生成合成数据方面存在许多挑战,其中一些是:
  • 确保生成样本的多样性:多样性是任何机器学习数据集的重要方面之一,无论其用于训练还是评估。LLM 无法追踪其过去输入和输出的知识。LLM 也被训练成趋于收敛,这意味着在给定输入文本的情况下,它们的生成通常会遵循一个共同的路径。这两个因素使得使用 LLM 生产大量且本质上多样化的数据变得具有挑战性。
  • 与真实世界数据的分布偏移:使用模型生成的合成数据可能无法理想地代表真实世界场景中观察到的数据分布。例如,用户的查询或对话可能不完整或充满语法错误,而使用 LLM 生成的合成数据大多是完整且语法正确的。
  • 事实性和保真度:由于 LLM 的固有问题,如幻觉(Huang 等人),确保合成数据的事实性和保真度具有挑战性。
  • 偏见和公平性:LLM 已被证明存在某些偏见(Gallegos 等人),这些模型生成的合成数据也将反映这些偏见。还存在一个额外的风险,即未来使用此类数据训练的模型可能会放大这些偏见。
设计合成数据生成流程的目标是使用各种技术克服这些挑战。我们现在将讨论为从模型预训练到评估 LLM 应用等各种应用生成高质量合成数据集的各种方法。
 
生成合成数据的过程因任务而异。但总的来说,其思想是向 LLM 提供任务规范、一组确保多样性的条件,以及可选的一些示例来生成输出。在接下来的章节中,我们将更深入地探讨为不同任务合成生成数据集的方法。
 

用于模型预训练的合成数据

使用自监督学习预训练基础模型的任务需要数十亿或数万亿个标记的纯文本数据,具体取决于模型大小和预算。最近大多数关于预训练基础模型的开放研究都持续关注预训练数据集的质量。一些最近的模型,如 o1.AI(Young 等人),将其卓越的模型质量归因于复杂的数据预处理和过滤流程。
在使用合成数据生成进行 LLM 预训练方面,三项最重要的工作是来自微软研究院的 Tiny Stories(Eldan 等人)、phi 系列(Gunasekar 等人)和(Bubeck 等人),以及 cosmopedia(Allal 等人),后者是 ph1.5 的开放复制。
Tiny Stories 论文专注于准备一套多样化的故事数据集,用于预训练小型语言模型(参数低于1000万),以生成流畅连贯的文本。为确保生成故事的多样性,首先准备了1500个分为名词、形容词和动词的单词。然后,为每个故事生成,从每个类别中随机抽样3个单词,并提示LLM生成一个包含这些单词的故事。
虽然前一项工作使用种子词来确保多样性,但 phi 系列和 cosmopedia 通过限制生成的主题和受众风格来确保多样性。Phi 1 专注于生成教科书式的数据,以提高小型 LM 的代码能力,而 ph1.5 和 cosmopedia 则专注于从小型 LM 中引出更好的常识推理。为了增加生成的多样性,从 Wikihow、可汗学院等网站提取了一系列主题。为了生成更多的主题,对 refined web 等网络数据集进行聚类,并使用 LLM 从每个聚类中提取主题。通过使用受众风格,实现了更高层次的多样性。受众风格指的是每个主题目标受众的角色,范围可以从高中生到大学教授。同一主题可以通过改变不同的目标受众多次重复利用,以生成多样化的数据。
 
 
example of audience style can influence LLMs output
受众风格如何影响 LLM 输出的示例
 
预训练中的合成数据非常有用,并且可能在不久的将来会得到更多探索,我们甚至可以期待出现一个类似 Chinchilla 的定律,用于计算模型预训练中合成数据与真实数据的正确混合比例。
 

用于模型微调的合成数据

模型微调或指令微调是为了让模型更好地理解和遵循用户给出的指令。用于此监督学习过程的数据形式为(指令,响应)对。如果模型需要与用户进行多轮对话,每个数据点将包含多轮这样的指令和响应对。合成数据已成为模型微调中手动标注的有效替代方案,我们将讨论用于创建模型微调合成数据的多数顶级工作和方法。在详细介绍之前,先概述一下,有三种方法用于合成指令微调的数据。
  1. 关键词驱动:此方法利用从多个来源收集或生成的种子主题和/或子主题作为关键词,以生成指令和响应对。
  1. 角色驱动:角色描述被认为是世界知识的载体,给定一段纯文本,可以使用 LLM 推断出与之相关的不同角色。这些角色可以在为任何给定任务生成指令时使用。
我们现在将深入探讨并讨论提出这些方法不同变体的方法和工作。
Self-instruct(Wang 等人)是生成用于指令微调的合成数据的最早工作之一。这里使用了一组 175 个种子指令,通过在几个随机选择的种子指令上对模型进行条件化,使用 GPT3 生成新的指令来引导更多指令的生成。在这篇特定的论文中,对于分类任务,首先固定输出标签,然后基于它生成输入文本。为避免重复,计算与已生成指令的 rogue-l 分数,并过滤掉超过特定阈值的样本。在此过程结束时,获得了一个包含 52k 个(指令,响应)对的数据集。斯坦福大学的 alpaca(Taori 等人)后来使用了类似的流程和 GPT 3.5 模型来形成 alpaca 数据集。Vicuna(Peng 等人)后来使用了相同的数据集来查询 GPT-4 的响应,以形成 Vicuna 数据集。

诱导指令多样性

到2023年底,几项研究坚持认为指令多样性在微调数据集中非常重要。为实现这一目标,最受欢迎的想法之一是通过改变数据集中指令的复杂程度。WizardLM 论文(Xu 等人)提出的 evolve instruct 方法是这方面最有趣的工作之一,他们提出通过查询演化框架来提高 SFT 数据集的多样性,通过具体化、添加约束、增加推理等转换来演化种子指令的复杂性。虽然 WizardLM 使用预定义的转换来演化指令,但 CodecLM(Wang 等人)提出的框架认为,这种通用转换可能无法推广到来自不同领域的指令,并且也可能含糊不清。相反,他们提出了自评估标准(self-rubrics)。他们的工作使用元数据提取(用例和响应所需的技能)从每个指令中提取,然后用它来为复杂的指令生成评估标准。
 
Example of Evolution
演化示例
 
例如,对于一个用例为“商业计划制定”、技能为“市场研究和规划”的查询,像“添加推理步骤”这样的通用建议过于模糊和无用。相比之下,自评估标准可以生成具体的操作,如“添加 SWOT 分析”和“包含与市场竞争对手的比较”。
虽然上面讨论的工作侧重于修改指令的复杂性和多样性,但像 orca(Mukherjee 等人 & Mitra 等人)这样的工作使用现有 SFT 数据集中的指令来采样带有解释的响应,以使小型 LLM(7B 到 13B 参数)能够达到与大型 LLM(30B+ 参数)相同的推理水平。Orc1 引入了解释风格调整的概念,他们从 FLAN 数据集中的指令采样带有解释风格的响应,使用 gpt 3.5 和 gpt 4 来形成 orca 数据集(5M 样本)。这些响应是通过使用几个预定义的系统消息提示 LLM 来收集的,这些消息旨在引出推理步骤。
an example of orca style data
orca 风格数据的示例
 

多轮模型微调

上面讨论的所有工作都生成单次指令、响应对。这不能用于微调模型以进行有意义的多轮对话。为了填补这一空白,Ultrachat(Ding 等人)提出了创建高质量和多样化多轮对话的流程。创建数据集的方法是通过引导不同对话类型的主题、实体等,例如信息寻求(关于现有实体的问题)、信息转换(如摘要等任务)等。然后使用 LLM 同时扮演用户和助手,根据给定的主题和对话类型生成对话。该数据集中的每个对话可以包含约 3-7 轮对话。
 
 
 
an example of multi-turn conversation
多轮对话示例
 

工具使用的微调

LLM 的工具使用能力可以通过使用专门为让 LLM 在与用户对话时识别并传递所需参数给 API 而创建的数据集进行微调来提高。像 Toolformer(Schick 等人)和 ToolAlpaca(Tang 等人)都使用了通过向 LLM 提供 API 文档来合成的数据,以模拟工具使用实例。
 

领域特定的微调

合成数据生成在提高模型适应特定领域任务的能力方面非常有用。为了提高 LLM 的数学问题解决能力,Meta Math 论文(Yu 等人)使用从现有数据集(如 GM8k)中引导出的问题作为种子问题,通过自验证等特定于数学领域的多种转换来演化它们。这篇论文(Xu 等人)利用临床数据集中可用的知识图谱(KG)来生成合成的问答对。为了通过指令微调提高 LLM 的编码能力,magic coder(Wei 等人)提出了一个流程,他们通过从代码文档语料库中采样 1-15 个连续行来创建指令和响应对,并提示 LLM 使用它生成 IR 对。此外还进行了数据清洗和去污染。
 

微调文本嵌入

合成数据被广泛用于通过微调来改进各种应用的文本嵌入。使用对比损失微调嵌入模型需要包含查询、正向文档和负向文档的样本。
 
an example of query, positive document and hard negative document
查询、正向文档和困难负向文档的示例
在使用 LLMs 改进文本嵌入的研究中(Wang 等人),种子主题被用作关键词来生成查询。通过提示 LLM 来生成相应查询的正向文档和困难负向文档。像 M3 和 llama-index 这样的工作使用从各种来源抽样的文档块来生成针对给定文档的查询,以使用 MultipleNegativesRankingLoss 来微调模型。

用于模型对齐的合成数据

将语言模型的输出与共享的人类价值观对齐,意味着确保诚实、有益和无害(HHH)。有几种方法被提出来实现这一点,但其中最受欢迎的两种是带有人类反馈的强化学习(RLHF Ouyang 等人)和直接偏好优化(Rafailov 等人)。这两种方法都需要一个数据集,其中包含对每个指令的多个响应,这些响应根据人类偏好进行排名。例如:
 
an example of ranked responses used for RM/DPO training
用于 RM/DPO 训练的排名响应示例
 
获取这些数据的显而易见的方法是对不同指令的不同响应进行标注和排名。事实证明,为获取相同数据而提出的合成数据生成方法是一种有效的替代方案。有两种关键方法被提出来使用合成数据生成来整理这种格式的数据:
  1. 教师模型方法:此方法通常使用多个闭源和开源模型来为各种数据集中整理的指令采样响应,如微调部分所讨论的。然后,提示像 GPT-4 这样强大的模型充当教师模型,根据提供的评估标准对这些响应进行排名。
  1. 基于自我优化的方法:在这种方法中,首先使用一个 LLM 对数据集中的每个指令进行响应采样,然后使用同一个模型本身对先前生成的响应提供反馈。然后,通过将初始响应+反馈再次输入模型来改进响应。这个过程是迭代进行的,直到达到所需的质量。这个过程将产生一个可以用于使用 RLHF/DPO 训练模型的数据集。
像 Vicuna (Peng 等人), GRATH (Chen 等人) 和 UltraFeedback (Cui 等人) 等工作采用了教师模型方法。Vicuna 使用各种开源模型为 alpaca 52k 数据集中的指令采样多个响应。然后使用 GPT-4 对这些响应进行排名,以形成 RLHF 数据集。GRATH 专注于使用 DPO 提高 LLM 的真实性,为此他们从 hellswag、MMLU 等数据集中为每个指令生成一对正确和不正确的响应。在 (Castricato 等人) 中也使用了类似的方法。当 LLM 被指示避免讨论某个实体(“粉红大象”)而讨论一个偏好的实体(“灰色大象”)时,大多数 LLM 在一定数量的对话后倾向于忘记这个给定的约束。这项工作旨在对齐 LLM 以提高模型在这方面的能力。为此,种子主题和子主题被用作关键词,以合成带有期望和不期望响应的对话,这些对话后来用于 DPO 训练。
 
UltraFeedback 使用一个流程,其中从 Ultrachat 和 Sharegpt 等数据集中采样指令,并使用 GPT-4 对这些响应进行评分、批评和排名。排名的响应构成了训练奖励模型的数据集。自由形式的反馈也用于微调一个批评模型,该模型可以为模型响应提供反馈。
rDPO (Gallego 等人) 和可配置的 LLM 安全调整 (Gallego 等人) 使用自我优化方法来构建对齐数据集。rDPO 使用来自 Harmful Behavior (Zou 等人) 等数据集的指令,使用 Mixtral 模型采样响应。然后进行批评步骤和逐步修订,以提高响应的安全性。可配置的 LLM 安全调整旨在训练语言模型,其中安全偏好可以在运行时使用系统提示进行配置。为此,他们首先从模型中采样未经审查的响应,然后对其进行优化以形成安全的响应。DPO 训练是通过根据系统提示更改响应来完成的。
 
 
working of self-refine
自我优化的工作原理
 

用于评估LLM应用的合成数据

评估和测试 LLM 应用也是将 LLM 应用于生产的关键部分。虽然整理手动数据具有挑战性,但合成数据可以使此过程更快,并有助于在最少的人工监督下模拟测试数据点。
 

LLM的代理工作流

评估 AI 代理在这里指的是评估 LLM 的 API 调用能力。虽然像 Toolformer 这样的工作使用静态预定义的对话历史来评估 LLM 的 API 调用能力,但有一种趋势是通���合成生成测试用例来自动化评估 LLM 的 API 调用能力。AutoDE (Mu 等人) 使用合成数据生成对 AI 代理进行动态评估,这也将提高测试用例的覆盖率。这是通过首先使用 LLM 从 API 文档合成用户脚本来完成的。用户脚本为对话提供了必要的背景,如图所示。然后提示 LLM 充当用户代理,根据提供的用户脚本生成对话。这些带有地面实况(带有标签的 API 调用)的对话随后用于评估 LLM 的 API 调用能力。在他们的实验中,他们发现这种方法也与人类评估有很高的相关性。
 
 

检索增强生成 (RAG)

RAG 是 LLM 最受欢迎的应用之一,许多工作提出了不同的方法和指标来自动化 RAG 系统的评估。自动化 RAG 的评估也需要从给定的文档集中合成生成问题和答案对。最简单的方法之一是将文档块输入 LLM 并提示它从中创建 QA 对。另一种由(Guinet 等人)提出的方法是使用文档来创建多项选择问答对。
 
简单方法的陷阱
但是,从随机块或文档中生成 QA 对可能会导致测试数据集质量不佳,因为:
1. 这种方法无法从给定的文档集中创建任何多跳查询。
2. 从预定义块创建的 QA 会偏向于预定义的块大小,这在大多数情况下也用于构建 RAG。因此,与实际生产场景相比,您更有可能获得正确的块。
3. 通过对随机块进行条件化 LLM 生成的问题大多数时候过于具体,很少反映生产中看到的情况。
4. 这种方法可以创建的问题的性质和种类非常有限,因为 LLM 只暴露了您整个数据库中包含多个甚至可能相互关联的文档的一部分信息。
 
基于知识图谱的方法
ragas 提出的合成测试数据生成方法试图通过使用基于知识图谱的算法生成多样化的合成 QA 对来解决这些挑战。核心思想是探索文档并使用从每个文档中提取的信息将相互关联的文档连接起来。一旦形成知识图谱,就可以通过探索已形成的关系并为 LLM 提供适当的上下文来合成创建不同类型的问题,以构建问题和答案对。该算法在创建问题时还引入了不同的类型、风格和角色。
 
为了具体化这个想法,如果我们知道文档 A 和文档 B 有一些共同的实体,我们可以做出一个安全的假设,即这两个文档有一些共同点来合成一个多跳问题。
 
问题类型大致分为两类
 
  1. 单跳:单跳查询是一个直接的问题,需要从单个文档或来源检索信息以提供相关答案。它只需要一个步骤就能得出答案。
  1. 多跳:多跳查询涉及多个推理步骤,需要来自两个或更多个信息块的信息。系统必须从各种文档中检索信息并将这些点连接起来以生成准确的答案。
 
让我们看看如何使用 ragas 的高级 API 从给定的文档集创建查询。
 
  • 安装 ragas python 库
pip install ragas
  • 使用 langchain/llama-index 文档加载器加载文档并运行测试生成。请参阅入门指南此处
from ragas.testset import TestsetGenerator generator = TestsetGenerator(llm=generator_llm, embedding_model=generator_embeddings) dataset = generator.generate_with_langchain_docs(docs, testset_size=10)
这使用了默认设置来探索文档关系和查询类型等,所有这些都可以根据您的要求进行定制。在此处了解更多信息此处
 

结论

通过本文,我们讨论了为不同任务合成生成数据集的许多方法。从抽象层面来看,可以肯定地发现一些模式在每个方法中都被重复使用,无论任务如何,但也有一些方法非常特定于任务和领域。在未来,我们可以期待更多这样的方法,甚至将合成数据生成扩展到多模态。
这篇博客是我们一年多来在合成数据生成方面进行研究和实验的成果,应用范围从模型训练到LLM应用评估。请在 X 和 Linkedin 上关注我们以获取更多信息。