跳到主要内容

应对生成数据集的多样性

在之前的章节中,我们讨论了利用LLM进行合成数据集生成的潜力,以进一步微调本地的Retriever模型。这种方法之所以可行,是因为有大量未标记文档的语料库可供使用。每个文档用于生成一个或多个合成查询,并形成一个查询-文档对。

但如果信息检索不是你的任务呢?假设你正在处理一个法律文件分类问题,但不允许将任何数据发送到外部API。在这种情况下,你需要训练一个本地模型。然而,收集数据可能成为一个重大障碍,导致产品开发延迟。

为简单起见,假设目标是生成儿童故事。这个任务是Eldan等人(2023)研究的起点。每个故事由2-3段组成,遵循简单的情节和主题,整个数据集涵盖了儿童的词汇和事实知识。

语言不仅是一套规则和符号系统;它传达和解释意义。利用大型语言模型生成训练数据的主要挑战是确保数据集的多样性。即使在高生成温度下,模型也可能生成缺乏必要多样性的重复数据集(即使对于儿童语言也是如此)。连贯性和相关性是自然语言生成的其他挑战。

为了解决多样性问题,作者准备了大约1500个基本词汇的词汇表,反映了典型儿童的词汇,分为名词、动词和形容词。在每次生成中,随机选择一个动词、一个名词和一个形容词。然后模型生成一个整合这些随机词的故事。

这种技术显著扩大了数据集的多样性,确保故事涵盖了儿童的整个词汇和多样的概念组合。此外,作者还整合了潜在的故事特征(如对话、情节转折、糟糕结局或道德教训)。每个故事随机选择了这些特征的子集,并提示模型将它们包含在内。

提示:

写一个短故事(3-5段),只使用3岁儿童可能理解的非常简单的词语。故事应使用动词“{random.choice(verbs_list)}”、名词“{random.choice(nouns_list)}”和形容词“{random.choice(adjectives_list)}”。故事应具有以下特征:{random.choice(features_list)},{random.choice(features_list)}。记得只使用简单词语!

假设填充了以下空白:

提示:

写一个短故事(3-5段),只使用3岁儿童可能理解的非常简单的词语。故事应使用动词“decorate”,名词“thunder”和形容词“ancient”。故事应具有以下特征:故事应至少包含一段对话,故事有一个糟糕的结局。记得只使用简单词语!

输出:

从前,有一个古老的房子,里面住着一个叫莉莉的女孩。她喜欢用漂亮的东西装饰她的房间。一天,她在阁楼里发现了一个大箱子。她打开它,看到许多闪亮的装饰品。莉莉非常开心,决定在她的房间里使用它们。当莉莉正在装饰她的房间时,外面的天空变得很暗。传来一声巨大的雷声,莉莉吓坏了。她跑到妈妈那里说:“妈妈,雷声好大!” 她妈妈拥抱着她说:“别担心,很快就会过去。” 但雷声没有停止。它变得越来越响,古老的房子开始摇晃。突然,屋顶倒塌在漂亮的装饰品上。莉莉很伤心,因为她的房间不再漂亮了。结局。

在这里,我们依赖最新的文本生成模型(GPT-3.5和GPT-4),它们可以根据指令生成大量合成内容。由于我们每次随机生成提示,并且模型严格遵循,故事变得非常多样化。即使有一两个词相同,叙述也会完全不同。本质上,我们应用这种技术将随机性注入提示,生成多样化的数据集。

你明白了:

  1. 确定在合成数据集的不同样本之间可能变化的参数/实体;
  2. 生成或手动编译这些实体的集合以填补空白;
  3. 通过随机选择实体进行插入来生成数据集。最好将生成温度设置为高于默认值但低于最大值;
  4. 在ChatGPT/GPT-4的生成结果上训练本地模型。 重要的是要注意,用于种子生成的实体之一可能是一个类标签。例如,在情感分类任务中,您可以直接在提示中提到“积极”或“消极”,以获得带有相应标签的生成文本。然后,对这些数据进行本地分类器的训练。

迭代(分层)合成数据生成

通过使用更多实体,其中一些是由LLM自身事先生成的,可以使格式变得更加复杂。例如,可以从要求生成一个故事摘要开始,并写下一个必须出现在故事中的句子。然后,只需在最终请求中使用生成的中间数据。

提示:

摘要:{由LLM使用上述方法生成的简短摘要}
特征:{从初始提示中复制特征}
句子:{由LLM生成的应出现在故事中的句子}
单词:{从初始提示中复制单词}
故事:

填写提示的示例:

提示:

摘要:莉莉和蒂米一起建造沙堡,并学会妥协,但被一阵风刮倒了。他们在残破的沙堡中发现美丽,并与一只蝴蝶快乐地玩耍。
特征:对话,铺垫,转折
句子:有一天,她去公园看到一只美丽的蝴蝶。
单词:不同意,网络,美丽
故事:

输出:

从前,有一个小女孩叫莉莉。她喜欢玩她的玩具和她的朋友。有一天,她去了公园,看到了一只美丽的蝴蝶。她试图抓住它,但它飞走了。莉莉的朋友蒂米来和她一起玩。他们决定建造一个沙堡,但他们在如何建造它上意见不合。莉莉想要把它建得高,而蒂米想要把它建得宽。他们争论了一会儿,但最终同意既高又宽地建造。当他们正在建造沙堡时,他们注意到一群蚂蚁正在一起工作。他们意识到蚂蚁正在建造一个隧道网络。突然,一阵风吹来,把他们的沙堡刮倒了。他们很伤心,但后来他们又看到了那只蝴蝶。它停在他们沙堡的残骸上,他们意识到即使在破碎的状态下,它仍然很美丽。他们微笑着快乐地玩耍在一起。

因此,可以生成成千上万个非常多样化的示例来对模型进行训练。假设您需要训练一个分类器,用于确定文本是否包含对话或情节转折。由于初始提示包含标签,因此已知每个生成样本需要预测的目标值。

只需教科书

这种方法引发的一个关键问题是,当训练网络进行真实应用时,数据集的合成是否真正能够提供好处。幸运的是,作者通过进行调查并验证使用来自最先进LLM的合成数据来训练较小语言模型的有效性来解决了这个问题。

在他们的研究中,Gunasekar等人(2023)强调了在他们的模型中高质量训练数据的重要性。他们认为,如果语言模型在类似于备受推崇的“教科书”的特征的材料上进行训练,它们将更加有效:清晰、全面、信息丰富且无偏见。

这些原则构成了用于训练LLM的半合成数据集Phi-1的基础。主要评估任务是生成一个遵循给定文本描述或文档字符串的Python函数。使用HumanEval基准评估模型的质量(Chen等,2021)。

作者强调了这种方法中多样性的重要性,原因有几个。它使语言模型接触到各种编码表达和解决问题的方法,减少了过度拟合或依赖特定模式的风险,并提高了模型处理陌生或创新任务的能力。

为了解决编写代码的挑战,作者创建了类似教科书的文档,重点放在促进推理和基本算法技能的主题上。他们通过对以下方面施加限制来实现多样性:

  • 主题
  • 目标受众

不幸的是,作者没有提供有关用于生成合成数据的提示模板的具体信息。但是,他们展示了生成的输出。他们选择使用ChatGPT(GPT-3.5)而不是GPT-4,即使这种策略也通过使用合成数据对模型进行微调取得了出色的结果。

生成的类似教科书的示例

图片来源:Gunasekar等人(2023)

必须关注目标受众的限制。指定目标受众是增强合成数据多样性的极好方法。一名高中生、一名计算机科学本科生和一名博士生的解释方式和信息处理方式肯定不同,这使生成的数据更加多样化。让我们尝试重新创建这个提示。

提示:

从一本针对一年级本科生的计算机科学教科书中写一段摘录。编码语言是Python 3.6。

这是以下主题中间部分的摘录:奇异矩阵。

摘录以该主题的高级概述开始。然后,它提供一个例子并用自然语言描述解决方案。之后,它提供1-2个代码片段,跟随例子。每个片段不超过10行。代码片段后不应有任何文本。

请记住,摘录应简明扼要,每次只解释一个概念。代码应表示一个Python函数及其调用。所有常见的ML/DS库都可用。

不要太冗长。摘录的预期长度最多为两段。

输出:

**奇异矩阵**

在线性代数中,如果一个矩阵没有逆矩阵,则被称为“奇异矩阵”。另一个等价的定义是矩阵的行列式为零。奇异矩阵至关重要,因为它们代表了没有唯一解的线性方程组。

考虑一个2x2矩阵`[[a, b], [c, d]]`。如果`ad`和`bc`的乘积相等(即`ad = bc`),那么这个矩阵是奇异的。让我们通过一个例子来探讨这个问题:给定矩阵`[[2, 4], [1, 2]]`,你会发现对角线乘积得到相同的结果(2 * 2 = 4 * 1),因此它是一个奇异矩阵。


import numpy as np

def is_singular(matrix):
determinant = np.linalg.det(matrix)
return abs(determinant) < 1e-9

matrix_example = np.array([[2, 4], [1, 2]])
print(is_singular(matrix_example)) # 返回 True

非常接近了!

总共,作者生成了10亿个标记来增加模型的训练集,使得一个较小的模型(仅有15亿个参数)能够与其大小的模型相媲美(详情请参阅文章Gunasekar等人(2023))。

Phi-1 metrics, compared to bigger models

图片来源:Gunasekar等人(2023)

对于您的任务,您可能不需要如此大量的合成数据(因为作者研究了需要大量资源的预训练)。然而,即使作为一个估计,以每千个标记0.002美元的价格(标准ChatGPT定价),生成标记将花费2000美元,提示大致需要相同金额。

请记住,在领域变得更加专业化时,尤其是当语言偏离英语时(以及其他因素),在合成数据上进行微调变得更有价值。此外,这种方法与Chain-of-Thought(CoT)非常配合,有助于本地模型提高其推理能力。其他提示技术也同样有效。不要忘记,像Alpaca(Taori等人,(2023))和Vicuna(Zheng等人,(2023))这样的开源模型通过在合成数据上进行微调而表现出色。