英伟达最新技术分享:逐步指导你如何使用Llama 3.1合成数据来优化模型!并附带代码。
编辑日期:2024年07月29日
上个月,Epoch AI 刚刚发表文章预测“数据墙”即将到来,结果英伟达紧接着就发布了其开源巨作 Nemotron,参数量高达 340B。
真实数据的稀缺可能已不再是问题,因为在Nemotron 9T令牌的预训练数据中,有98%都是合成数据。
也许你还在对合成数据有所顾虑,或者不确定如何应用 LLM 驱动的数据生成方法。或许,NVIDIA的这篇博客能够为你提供解答。
原文链接:https://developer.nvidia.com/blog/创建合成数据使用-llama-3-1-405b/?linkId=100000275486093
请注意,链接中的文字部分可能需要根据实际情况进行调整以符合中文习惯。上述网址为模拟转换,实际网址可能有所不同。
首先,我们需要了解使用大型语言模型合成数据的基本概念是什么?
合成数据不是「从零开始」创造新的信息,而是通过转换现有的信息,生成各种不同的版本。
事实上,合成数据在AI领域的应用已经超过了十年,例如在物体检测或分类系统中的数据增强技术。
那么,LLM带来了哪些新的变化呢?
从「需求端」的角度来看,由于模型需要大量的训练数据,因此对合成数据的需求被显著增加。
在「供应端」,生成式语言模型为合成数据技术带来了实质性的变革。
通过使用合成数据对基础模型进行微调,可以让其更贴切地应用于真实场景中。例如,在金融领域可以改进风险评估;在零售业可以优化供应链管理;在电信行业可以提升客户服务质量;在医疗健康领域可以改善患者的照护质量等。
特别是最近开源巨兽Llama 3.1(405B)正式发布,它不仅可以用于批处理和在线推理,还可以作为基础模型进行特定领域的专业预训练或微调。
特别是考虑到Llama 3.1拥有如此庞大的参数规模,再加上丰富的15.6T tokens训练数据,这使其非常适用于数据生成任务。
本篇博客文章将介绍几个关于合成数据的生成及其应用案例,并对其中的一个案例进行深入的探讨。
合成数据的生成是推动 GenAI 在特定领域应用的关键工作流程。
或者
生成合成数据是推动 GenAI 在特定领域应用的一项关键工作流程。
将最新的Llama 3.1与英伟达的Nemotron-4 340B奖励模型结合使用,非常适合生成合成数据。
要使大型语言模型能生成基于最新信息的有根据的回应,构建可靠的RAG流程非常重要。而模型回应的准确性则取决于该流程的质量。
通过合成数据来微调模型主要有两种方法——知识蒸馏(knowledge distillation)和自我提升(self-improvement)。
知识蒸馏是指将大型模型的能力转移至较小模型的过程,但这并非简单地在同一数据集上对两个模型进行训练,因为小型模型往往难以精确学习底层数据的表示。
在这种情形下,我们可以先让大型模型完成任务,然后利用这些数据来指导小型模型进行训练。
自我改进是指让同一个模型评估自己的推理过程,这通常被用来进一步磨练和提升模型的能力。
让我们来看一下如何实现这个目标。训练语言模型通常包含三个步骤:预训练、微调以及对齐(alignment)。
预训练
预训练通常需要极其庞大的语料库来让模型学习语言的一般结构。
像Llama 3.1和GPT-4这样的通用大型语言模型(LLM)通常需要互联网规模的数据。而对于特定领域的语言模型(例如几何学、放射学或电信行业等),则需要引入相关领域的专业知识,这一过程被称为领域自适应预训练(Domain Adaptive Pre-training,简称DAPT)。
除了接近相关领域外,另一个在预训练阶段使用合成数据的例子是Phi-1.5模型,其目的是为了引入逻辑推理能力。
"微调"在不同的语境中有不同的意思,如果您能提供更多的上下文信息,我将能够更准确地帮助您重写这段文本。不过,基于目前的信息,“微调”可以被重写为“细微调整”、“轻微调整”或者“微小调整”。
在掌握了语言的一般结构之后,下一步就是进行微调,以便让模型更能遵守指令并完成特定的任务。
例如, 若要提升模型的逻辑推理能力、实现更优秀的代码生成和函数调用,或者增强在阅读理解类任务中的表现,这些都可以通过微调来达成。
Self-Instruct、WizardCoder、Alpaca等模型都是通过创建特定领域数据并进行微调,以定向提升模型的能力。
请使用中文重写下面的内容: 对齐
最后,我们希望确保模型的回答风格和语气能符合用户的期待,比如听起来自然流畅,有恰当的详细程度、复杂性、一致性等。
可以创建一个包含指令模型和奖励模型的管道来实现这一需求。这里的管道指的是一个流程,它包括指令模型(用于生成或理解指令的部分)和奖励模型(用于评估结果或行为的部分)。
首先,让模型对同一个问题生成多种回答,接着,利用奖励模型来评估这些回答的质量。这种方法属于通过人工智能反馈进行强化学习(Reinforcement Learning from AI Feedback, RLAIF)。
除了改进语言模型本身之外,合成数据还可以用于LLM邻近模型(LLM-adjacent model)以及由LLM驱动的管道。
最典型的例子就是检索增强生成(Retrieval Augmented Generation,RAG),首先利用嵌入模型查找相关的信息,然后通过语言模型生成最终的答案。
在这个过程中,我们可以运用大型语言模型来解析底层文档和合成数据,进而评估并微调嵌入模型。
类似于RAG,任何代理(Agentic)管道都可以被评估,其组成部分模型也可以被微调,这一过程可以通过构建由LLM驱动的代理来进行模拟实现。
这些模拟还可以用来研究行为模式。此外,在LLM中可以设定特定的角色,以便针对特定任务进行大规模的数据生成。
为了更好地理解以上的讨论,我们来考虑一个基本的流程,并将其应用在一个具体的实例上——为检索过程生成评估数据。
已将实现以下流程的代码上传到 GitHub。
或者
已将实现相关流程的代码上传至 GitHub。
项目地址:https://github.com/NVIDIA/NeMo-Curator/tree/main/tutorials/synthetic-retrieval-evaluation
(注意:这句话已经是中文了,如果需要重写的话,可以尝试这样:“项目所在地址:https://github.com/NVIDIA/NeMo-Curator/tree/main/tutorials/synthetic-retrieval-evaluation” 或 “该项目的地址为:https://github.com/NVIDIA/NeMo-Curator/tree/main/tutorials/synthetic-retrieval-evaluation”)
要创建用于评估检索流程的数据,主要面临以下两个挑战:
我们将特别注重多样性,但为了从复杂性的角度进行探讨——关键在于找出内容段落中具有重叠信息的部分。寻找重叠信息的方法包括计算句子层面语义的杰卡德相似度,以及利用长上下文模型来发现同一文件内不同部分之间的联系。
多样性来自于不同的观点,比如考虑以下这段文字:
对于同一份文档,金融分析师可能会关注两家公司在合并前后的财务状况,法律专家可能更关心公司面临的法律审查,如来自联邦贸易委员会(FTC)、欧盟及其他方面的审查,而记者则可能专注于报道事件的基本事实。
所有这些都是有效的视角和用户角色。因为他们从不同的角度审视相同的信息,所以评估流程也需要适应这些不同的视角。
因此,我们来设计一个评估流程,这个流程以文档和用户角色为输入,并以符合该角色口吻的问题作为输出。
图 1. 概述了生成合成数据的三步流程:用于评估检索过程的合成数据生成
如图 1 所示,该评估流程主要包括三个步骤。
步骤 1:创建所有可能的问题
这些问题都是用户角色可能感兴趣的主题。
或者
这些问题都是可能引起用户角色兴趣的。
步骤 2:筛选出相关的问题
(实际上,这段话已经是中文了,无需重写。如果你需要的是更加通顺或者简洁的版本,我可以提供如下选项:)
步骤 2:筛选相关问题
从生成的问题中筛选出最相关和最有价值的问题。
(实际上,您提供的句子已经是中文的了,我只是对它做了一点微调以使句子更通顺。)
步骤 3:采用用户角色的写作风格
将筛选出来的问题转化为符合用户角色的写作风格。
通过以下三个步骤,可以确保不同用户角色获取到他们所需的信息,并且以他们熟悉的方式展示出来。
在生成问题之前,我们需要先读取文档并将其分割成若干部分(chunk)。
然后,让LLM从给定的文本块中为每个用户角色提取出他们可能感兴趣的要点。
所谓的“用户角色”(persona),其实就是对潜在用户的一种描述,例如:
由于多个用户角色可能具有类似的兴趣点,因此我们需要使用嵌入模型来进行语义级别的去重,以便为每个角色映射出段落中不同的相关资讯。
多样性的另一个方面是问题的类型。
我们需要提出各种类型的问题,比如提取性、抽象性、以及比较性问题,而不仅仅是简单的「如何/什么」这类问题。因此,接下来的步骤是根据段落中的信息,确定适用于每个关注点的问题类型。
最后,通过运用由文本块、兴趣点及问题类型构成的三元组,生成所有可能的问题。开发者可以借助用户角色和问题类型,将生成的问题导向用户可能会提出的类型。
生成问题后,接下来的步骤是过滤并提取最有价值的子集。首先,我们需要去除所有生成问题中的重复部分,因为不同的关注点可能会使用相邻的信息点,从而导致问题重复。
接下来,我们利用LLM来评估问题与段落的相关性,确保这些问题完全可以通过段落中的信息得到解答。随后,我们将所有相关问题改写为对话形式。最后,我们会再进行一轮筛选,对问题进行分类并剔除那些可能过于宽泛的问题。
在前两个步骤里,我们创建并筛选出了多种问题。最后一步是将用户角色的写作风格融入这些问题中。
我们首先通过给定的用户角色描述来确定写作风格,使用大型语言模型(LLM)。接着,基于这些风格重新编写问题。
例如,可以这样来描述用户角色的写作风格:
完成这个三步流程后,我们得出了以下问题:
可以看出,前两个问题很像是帕德玛的说话风格,而第三个问题则更像是亚伦会问的。
这些问题各自包含了真实的标签,对应着特定的文本块,因此其用途不仅限于这一个用例,还可以用来评估各种检索过程。
参考资料:
本文出自微信公众号:微信公众号(ID:null),作者为新智元。