数据构造是构建大模型过程中的关键环节,涵盖数据的获取、清洗、标注、预处理和模型评估等多个步骤。公开数据集、企业数据库、社交媒体平台以及网络爬虫都是非常重要的数据来源,而面向行业的专业研究和实验则为特定领域模型提供了专业数据。与此同时,数据清洗也十分重要,结合Meta发布的LIMA(Less Is More for Alignment)模型,在LLaMA-65B的基础上,只用1000个精心准备的样本数据进行微调,不需要RLHF(Reinforcement Learning from Human Feedback,人类反馈强化学习)就达到了和GPT-4相媲美的程度。研究者从实验中得出结论:大型语言模型中几乎所有知识都是在预训练期间学习的,并且只需要有限的指令调整数据来教模型生成高质量的输出。因而,在整个过程中,对数据质量的不断监控和优化是保障大型语言模型高性能的不可或缺的环节。如何有效地从大量标注数据中通过合适的数据清洗方法获取“精选”数据也十分重要。
数据构造的方法有多种,我们将对基于Self-Instruct方法的数据构造及面向结构化知识的数据构造进行介绍。同时,我们也将介绍面向数据清洗任务的IFD指标法及MoDS方法。
大型的“指令微调”语言模型,即通过微调以响应指令的模型,已经展现出在将零样本泛化到新任务方面的卓越能力。然而,这些模型在很大程度上依赖于人类编写的指令数据,而这些数据通常在数量、多样性和创造力方面存在一定的限制,从而阻碍了模型的通用性。为了解决这一问题,研究者引入了Self-Instruct框架,利用指令微调技术可以提升大型语言模型应对信任的能力并提高模型泛化性,如图2-1所示。
图2-1 Self-Instruct数据构造框架
在Self-Instruct框架中,我们利用公开的大型语言模型API进行数据收集,以提高预训练语言模型的指令跟随能力。首先利用一个任务种子集作为任务池的起点,随机采样出多个任务指令,利用大型语言模型生成新的指令内容;再利用大型语言模型判断指令任务是否为分类任务(分类任务与生成任务的要求有所不同);然后利用大型语言模型对新的指令内容进行补全,生成输出结果,并且判断如果需要额外输入文本,也进行同步生成;其次进行数据过滤,将满足要求的数据加入任务池中;最后重复上面几步操作,直到数据达到数量要求。生成的数据不仅可用于语言模型本身的指令调整,还能让大型语言模型API更好地遵循指令,从而提高其泛化能力和适应新任务的灵活性。这一自我引导的数据收集方法为大型语言模型的性能提升提供了创新性的途径。
利用openai API进行指令扩充的相关示例代码如下:
结构化知识数据指的是在一个记录文件中以固定格式存在的数据。在日常工作中,我们有大量的数据存储在数据库、表格以及知识图谱中。这部分数据大多来源于数据专家的收集,精准度较高,但由于这部分数据在使用时需要数据专家进行支撑或定制程序才能面向自然语言进行相关知识查询,因此如何有效地收集结构化数据中的知识数据变得十分重要。
结合前文所提及的Self-Instruct方法进行结构化数据的收集,是一种非常有效的数据收集方式——Self-Instruct方法可以通过引导模型自行生成任务指导,从而实现数据的自动化收集和扩充。在处理结构化数据时,可以设计相应任务所需的提示语(prompt),要求模型根据已有的结构化数据生成类似的数据样本。例如,可以通过自动生成表格记录、数据库查询或图谱关系等方式,引导模型在结构化数据领域生成更多的样本。这样的自我引导方法有助于丰富数据集,提高模型的泛化能力,同时减少了人工标注的工作量。下面我们将介绍如何使用表格数据及图谱知识进行结构化数据收集。
在表格类数据的获取阶段,我们可以利用当前大型语言模型如GPT-3.5、GPT-4进行数据收集,我们可以设计如下prompt:
“我现在有一张表格,请根据表格中的内容生成用于训练的知识类型数据,每条数据包含一个问题和该问题所对应的答案,要求问题是针对表格内容进行的提问,答案要求来源于表格内容,以下是我的表格内容:【表格内容】请生成问题和答案:”。
相关示例代码实现如下:
例如。我们使用GPT-3.5,生成结果如下:
问题1:巴塞罗那的市区面积有多少?答案1:803平方公里。
问题2:巴塞罗那的人口超过100万了吗?答案2:是的,巴塞罗那的人口达到了160万。
问题3:巴塞罗那的英文名称叫什么?答案3:Barcelona。
问题4:巴塞罗那的气候类型怎么样?答案4:地中海式气候,非常舒适。
问题5:巴塞罗那有哪些著名景点?答案5:巴塞罗那著名景点众多,包括哥伦布塔、毕加索博物馆、圣家赎罪堂等。
上述问题可以有效地帮助我们进行模型训练,提升当前数据质量及数据使用效率。
在图谱类数据的获取阶段,我们可以利用当前大型语言模型如GPT-3.5、GPT-4进行数据收集,我们可以设计如下prompt:
“我现在有一些从知识图谱中获取的三元组信息,请根据三元组中的内容生成用于训练的知识类型数据,每条数据包含一个问题和该问题所对应的答案,要求问题是针对三元组内容进行的提问,答案要求来源于三元组内容,以下是我的三元组内容:【三元组内容】请生成问题和答案:”。
相关示例代码实现如下:
例如,我们使用GPT-3.5,生成结果如下:
问题1:埃俄罗斯的外文名是什么?答案1:Aeolus。
问题2:埃俄罗斯的父母是谁?答案2:弥玛斯,墨拉尼珀。
问题3:埃俄罗斯与哪位相关人物有关?答案3:奥德修斯。
问题4:俄琉斯的外文名是什么?答案4:Oileus。
问题5:恩底弥翁的职业是什么?答案5:厄利斯国王。
上述问题可以有效地帮助我们进行模型训练,提升当前数据质量及数据使用效率。
在论文“From Quantity to Quality:Boosting LLM Performance with Self-Guided Data Selection for Instruction Tuning”中,研究者提出了一种可以从大量可用数据集中自动识别高质量数据的方法,并提出了一个指令跟随难度(Instruction-Following Difficulty,IFD)指标。
利用IFD指标自动筛选“精选数据”(Cherry Data),再利用精选数据进行模型指令微调,获取更好的微调模型,主要涉及以下3个步骤。
步骤1:利用少量数据进行模型初学,所选用的数据采用K-Means算法对数据进行聚类,针对聚类结果,选取每个簇中的若干数据组成初学数据,并结合大型语言模型进行微调得到初学模型(Brief Model)。
步骤2:利用初学模型计算原始数据中的所有IFD指标,IFD指标包含两个部分,即条件答案分数(Conditioned Answer Score,CAS)与直接答案分数(Direct Answer Score,DAS),其中,条件答案分数采用初学模型再结合指令生成答案阶段预测每个指令时的概率值组成交叉熵,计算公式如下:
直接答案分数利用模型直接对答案进行续写,再根据答案真实内容获取直接的差异值,计算公式如下:
IFD指标计算的方式如下:
步骤3:利用IFD指标对原数据集进行排序,选择分数靠前的数据作为精选数据,对原始模型进行指令微调,获取最终的精选模型。
利用IFD指标对数据进行筛选,降低了大型语言模型对答案本身拟合能力的影响,可以直接衡量给定指令对模型生成答案的影响。较高的IFD分数表明模型无法将答案与给定的指令内容进行对齐,表明指令的难度更高,对模型调优更有利。
随着研究的不断深入,研究者在论文“MoDS:Model-oriented Data Selection for Instruction Tuning”中提出了一种面向模型的指令数据选择方法,即MoDS方法。MoDS方法主要通过数据质量、数据覆盖范围、数据必要性3个指标来进行数据的筛选。
1)数据质量。为确保数据质量,MoDS方法设计采用了一套奖励模型对数据进行质量打分。将原始数据的Instruction、Input、Output三个部分进行拼接,送入奖励模型,得到评分结果,当评分超过阈值时,则认为数据质量达标,从而构建并得到一份高质量数据集。
2)数据覆盖范围。为了避免所选数据高度相似,可通过K中心贪心(K-Center-Greedy)算法进行数据筛选,在最大化多样性的情况下,使指令数据集最小化,获取种子指令数据集(Seed Instruction Data,SID)。进一步地,确保所选数据中的指令足够多样、涉及知识范围更广。
3)数据必要性。不同的大型语言模型在预训练过程中所学到的知识和具有的能力都不同,因此在对不同的大型语言模型进行指令微调时,所需的指令数据也需要不同。利用初始模型对数据质量阶段获取的高质量数据集进行预测,利用奖励模型对预测结果分别进行打分,当得分较低时,说明当前模型无法处理好该条数据,对评分低于阈值的数据进一步收集得到必要性数据集。
在模型训练阶段,针对必要性数据集进行结合K中心贪心算法的数据多样性筛选,最终得到增强指令数据集(Augmented Instruction Data,AID),利用AID与SID进行最终模型的微调。