🚀 Master Prompt Engineering and building AI Agents in our NEW courses! Use PROMPTING20 for 20% off ➜ Enroll now
处理合成数据集的多样性

应对合成数据集的多样性挑战

前一章节 (opens in a new tab) 中,我们探讨了利用大语言模型(LLM)生成合成数据集来对本地信息检索(Retriever)模型进行微调的潜力。该方法的实现得益于大量未标注文档语料的可用性。每一份文档可被用于生成一个或多个合成查询,从而形成查询-文档对。

然而,若目标任务并非信息检索(如法律文书分类),且调用外部API受限,则需要训练本地模型。在此情境下,数据采集成为显著的障碍,或将延误产品的开发进程。

为了简化讨论,这一节中我们设置目标为生成儿童故事文本。此任务构成了 Eldan 等人(2023) (opens in a new tab) 研究的起点。每个故事由 2-3 段组成,内容围绕简单情节和主题展开,整个数据集覆盖儿童词汇及基本常识。

语言不仅是符号与规则的组合,它还承载着意义的传达与诠释。利用大型语言模型生成训练数据所面临的主要挑战之一是保持数据集的多样性。即便在较高的 生成温度 (opens in a new tab) 下,模型仍可能生成重复性较强、缺乏多样性的样本。此外,语言生成过程中的上下文连贯性与相关性亦需考虑。

为应对多样性不足问题,研究者构建了包含约 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岁儿童可能理解的简单词汇。故事需包含动词"装饰"、名词"雷声"和形容词"古老的",并具备以下特征: 包含至少一段对话、具有负面结局。请注意仅使用基础词汇!

输出:

从前,有座古老的房子,里面住着名叫莉莉的小女孩。她喜欢用漂亮的东西装饰房间。一天,她在阁楼发现了一个大箱子,打开后看到许多闪亮的装饰品。莉莉开心地决定把它们用在房间里。当她在装饰时,外面天空突然变暗,响起了巨大的雷声。莉莉害怕地跑向妈妈喊道: "妈妈,雷声好响啊!"妈妈抱着她说: "别担心,很快就会过去的。"但雷声持续不断,越来越响,古老的房子开始震动。突然,屋顶塌陷压坏了漂亮的装饰。莉莉伤心地看着不再美丽的房间。故事结束。

本方法依托 GPT-3.5 和 GPT-4 等最新文本生成模型,通过参数化指令实现大规模合成内容生成。由于每次提示词均采用随机组合,模型也严格遵循指令执行,故而产生高度多样化叙事。即使保持一至两个词汇不变,生成结果仍呈现出显著的差异。本质上,我们通过这种参数随机化技巧构建了多样性数据集。

参数随机化的实施流程如下:

  1. 识别合成数据集中可能变化的参数/实体;
  2. 构建实体集合(自动生成或人工整理);
  3. 通过随机抽样实体生成数据集,建议设置生成温度高于默认值但低于最大值;
  4. 使用 ChatGPT/GPT-4 生成结果训练本地模型。

请务必注意,生成种子中可包含类别标签实体。例如在情感分析任务中,可在提示词中直接指定"正面"或"负面"标签,据此生成带标注的文本训练集,进而训练本地分类器。

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

通过引入更多实体(其中部分实体由 LLM 预先生成),可进一步构建更为复杂的格式化生成体系。例如,可先请求模型生成故事摘要和必须包含的特定语句,然后将这些中间结果整合到最终提示词中。

提示词:

摘要: {LLM根据上述方法生成的简短摘要}
特征: {复制于初始提示词中的特征参数}
语句: {LLM生成的需包含在故事中的特定语句}
词汇: {复制于初始提示词中的词汇参数}
故事: 

完整提示词示例:

提示词:

摘要: 莉莉与蒂米共同建造沙堡并学会妥协,但一阵强风吹倒了它。他们在破碎的沙堡中发现美感,并与蝴蝶快乐玩耍。
特征: 对话、铺垫、转折
语句: 一天,她去公园时看到了一只美丽的蝴蝶。
词汇: 不同意,网络,美丽
故事: 

输出:

从前有个小女孩叫莉莉,她喜欢玩玩具和交朋友。一天,她去公园时看到了一只美丽的蝴蝶。她试图捕捉它,但蝴蝶飞走了。莉莉的朋友蒂米来陪她玩耍,他们决定一起建沙堡,但对建造方式产生了分歧。莉莉想建得高些,蒂米却想建得宽些。争论后他们达成共识:把沙堡既建高又建宽。当他们建造时,注意到一群蚂蚁正在协作构筑网络状隧道。突然一阵强风袭来,沙堡轰然倒塌。他们很伤心,但这时蝴蝶再次出现,停在沙堡残骸上。他们意识到即使破碎后的沙堡依然美丽,于是相视而笑继续开心玩耍。

通过这种多阶段生成机制,可规模化构建高度多样化的训练样本。假设需要训练一个判断文本是否包含对话或情节转折的分类器,由于初始提示词已包含明确标签(如"对话"和"转折"),每个生成样本对应的预测目标值也已经得以确定。这种分层生成框架特别适用于需要结构化标注的监督学习任务,同时通过参数组合保证了数据分布的丰富性。

教材即所需

该方法引发的核心问题是: 在实际应用中训练神经网络时,合成数据集是否真能带来显著收益?值得庆幸的是,研究者通过实证研究验证了基于先进LLM生成的合成数据训练小型语言模型的有效性。

Gunasekar等 (2023) (opens in a new tab) 的研究中,强调了高质量训练数据对模型性能的关键作用。他们提出语言模型若接受具有优质教材特征的材料,训练将更为有效——即具备清晰性、系统性、信息性和无偏性。这些原则指导了半合成数据集的构建,用于训练语言模型 Phi-1 。

模型的主要评估任务是根据给定文本描述或文档字符串生成 Python 函数,其生成质量通过 HumanEval 基准测试 (Chen等,2021 ) (opens in a new tab) 进行评估。

研究者特别指出了数据多样性在此框架中的多重价值: 扩展模型对编程表达和解题策略的认知范畴,降低过拟合风险,提升模型应对新奇任务的泛化能力。

为应对代码生成挑战,研究团队构建了教材风格的文档集,聚焦逻辑推理与基础算法技能培养。通过以下维度控制实现数据多样性:

  • 内容主题
  • 目标受众

尽管研究者未披露具体提示模板内容,但他们还是展示了典型输出示例。值得注意的是,即使他们选用 ChatGPT(GPT-3.5) 而非 GPT-4 生成数据,微调后的模型仍取得优异表现。

生成的教材式样本

图像来源: Gunasekar等 (2023) (opens in a new tab)

目标受众约束条件的设计尤为关键。由于不同教育背景的群体(如高中生、计算机本科生、博士生)在表述方式和信息处理模式上存在差异,因而这种方式能够显著提升数据多样性。让我们尝试重新构建提示词:

提示词:

编写面向大学一年级学生的计算机科学教材节选,使用的编程语言为 Python 3.6 。

摘自以下主题的中间部分: 奇异矩阵

此摘录需要首先对主题进行了高层次的概述。然后,介绍一个示例,并用自然语言描述解决方案。然后,按照示例提供 1-2 个代码片段。每个代码片段不超过 10 行。代码片段后不得有文字。

需保持内容简洁,每次仅解释单一概念。代码应包含 Python 函数及其调用,允许使用常见机器学习/数据科学外部库。

语言风格应简明扼要,总长度不超过两段。

输出:

**奇异矩阵**

在线性代数中,不可逆的矩阵被称为"奇异矩阵"。"奇异矩阵"另一个等价的定义是其行列式值为零。这类矩阵的重要性体现在它们代表的线性方程组不存在唯一解。

考虑2x2矩阵 `[[a, b], [c, d]]` ,当 `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))  # returns True

与目标效果非常接近了!

研究团队最终生成了 10 亿 token 的数据量用于模型训练,使仅含 15 亿参数的小型模型(Phi-1)达到了与十倍规模模型相当的性能 (详见论文 Gunasekar等,2023 (opens in a new tab))。

Phi-1模型的性能指标,与更大规模模型的对比

图像来源: Gunasekar et al. (2023) (opens in a new tab)

对于实际应用场景而言,通常无需如此庞大的数据量(因研究聚焦于预训练阶段)。以ChatGPT标准计费(每1千token收费 0.002 美元)估算,仅数据生成成本就达 2000 美元,加上提示词费用总计约 4000 美元。

需要特别注意的是,当目标领域具有专业性或非英语特征时,合成数据微调的价值尤为显著。该方法与思维链 CoT (opens in a new tab) 技术结合使用效果更佳,能有效提升本地模型的推理能力。开源模型如 Alpaca (Taori等,2023 (opens in a new tab)) 和 Vicuna (Zheng等,2023 (opens in a new tab)) 已证明通过合成数据微调可实现性能突破。