程序员狂喜!Self-Instruct 框架全解析:无限生成高质量指令集,从此告别标注噩梦!

程序员狂喜!Self-Instruct 框架全解析:无限生成高质量指令集,从此告别标注噩梦!

picture.image

在这里插入图片描述

Motivation

picture.image

High-level overview of InstructGPT with human annotated outputs and ranking for supervised learning and reward model training | Source: Training language models to follow instructions with human feedback.

随着大型语言模型(LLM)在我们生活中的广泛应用,针对指令调整型 LLM 的发展也面临着重大挑战:迫切需要大量、多样且高质量的数据集。传统的方法,比如利用人工标注员来生成数据集(如上图所示的 InstructGPT 所采用的方法)存在成本高昂、多样性有限、创造力不足以及一致性难题等问题。为了解决这些局限性,自指导框架²应运而生。其核心理念简单而强大:让语言模型(LM)生成训练数据,从而实现更具成本效益、多样性和创造性的数据集

因此,在本文中,我将逐步带领您了解整个框架的各个部分,详细展示所有细节,这样您在阅读完后就能自己重现这些结果了 🙂

❗ 本文从代码角度详细介绍了所有步骤,所以请随时访问原始的 GitHub 仓库。❗

Self-Instruct Framework

picture.image

A high-level overview of the Self-Instruct framework

这个配方相对简单明了:

  • • Step 0 – Define Instruction Data:
    • • 向任务池中添加来自不同领域的高质量且多样化的由人工编写的任务种子,以(instruction, instances)元组的形式;
  • • Step 1 – Instruction Generation:
    • • Sample 8 (6 human-written and 2 model-generated) instructions from the task pool;
    • • 以 few-shot 的方式将引导式指令插入提示中,并要求语言模型生成更多指令;
    • • 根据 ROUGE 指标(一种用于评估文本输出与参考文本相似度的方法)以及一些规则(稍后我会详细介绍这些规则)来筛选出生成的指令; - 重复执行 Step 1 直至达到一定数量的指令;
  • • Step 2 – Classification Task Identification:
    • • 对于任务池中生成的每一条指令,我们都需要通过 few-shot 的方式来确定其类型(是分类指令还是非分类指令);
  • • Step 3 – Instance Generation:
    • • 根据指令和任务类型生成实例(inputs and outputs),并依据启发式方法对其进行筛选;
  • • Step 4 – Finetuning the LM to Follow Instructions: — Utilize generated tasks to finetune a pre-trained model.

好了,这就是“Self-Instruct”的运作方式,但细节决定成败,所以让我们一步步来详细探讨吧!

Step 0 – Define Instruction Data

picture.image

Step 0

首先让我们来了解一下“Seed of tasks”内部的具体内容:它包含 175 个种子任务(25 个分类任务和 150 个非分类任务),每个任务都有一个指令一个实例,且这些实例分布在不同的领域中。每个任务都有一个id、name、instruction、instances(input and output)以及一个 is_classification 二进制标志,该标志用于确定该任务的输出标签空间是否有限

有一些关于分类和非分类任务的示例,其中输入字段有的是空的,有的则不是空的:

picture.image

Example of classification task with non-empty input

picture.image

Example of non-classification task with empty input

因此,从第一个例子中我们可以看出,输入字段能够清晰地阐明并为更笼统的指令提供背景信息;而在第二个例子中,只要指令本身已经完整自洽,就不需要输入字段了。此外,第一个例子属于分类任务——我们可以通过在有限的空间内分配一些标签来解决它,而对于第二个例子,我们则无法这样做。

只要我们通过数据集中的数据格式来鼓励任务的多样性,并展示解决各种任务的正确方法,那么这一步骤就至关重要

只要我们确定了指令格式,就会将它们添加到任务池中,以存储我们的最终数据集。

Step 1 – Instruction Generation

picture.image

Step 1

Sampling and prompting

通过在任务池中添加一组由人类编写的任务示例,我们可以从指令生成开始。为此,我们需要从任务池中抽取 8 条指令(其中 6 条由人类编写,2 条由机器生成),并将其编码为以下提示:

picture.image

Prompt to generate new instructions

然而,在一开始阶段,我们并没有任何由机器生成的指令。因此,我们在提示中只是将它们替换成了空字符串。

在生成之后,我们从语言模型的响应中提取指令(通过正则表达式),对其进行筛选,并将筛选后的指令添加到任务池中:

picture.image

Pseudo-code of instruction generation step

我们重复执行指令生成步骤,直至生成一定数量的机器生成指令(该数量在该步骤开始时已明确指定)。

Filtering

为了获得一个多样化的数据集,我们需要确定在任务池中哪些指令会被添加,哪些不会被添加,而最简单的方法是采用经过启发式选择的一组规则,例如:

  • • 过滤掉过短或过长的指令;
  • • 根据不适合语言模型的关键词(如“图像”、“图表”、“文件”、“plot”等)进行过滤;
  • • 过滤掉以标点符号开头的指令;
  • • 过滤掉以非英文字符开头的指令;
  • • 过滤那些与任何现有指令的 ROUGE-L 相似度高于 0.7 的指令;

Step 2— Classification Task Identification

picture.image

Step 2

Self-Instruct 的作者指出,基于特定的指令,语言模型可能会偏向于某一特定标签,尤其是在分类任务中。因此,为了消除这种偏差,我们需要通过 few-shot 提示来对每条指令进行分类:

picture.image

Prompt used to classify whether a task instruction is a classification or non-classification task (12 classification and 19 non-classification instructions are used in this template)

Step 3 – Instance Generation

picture.image

Step 3

在确定了指令类型之后,我们最终就能生成输入和输出了,因为我们的指令有两种类型(分类型或非分类型)。那要如何实现呢?Few-shot prompting!

对于非分类指令,我们要求模型先生成输入内容,然后再输出结果(即“输入优先”方法);但对于分类任务,我们要求模型先生成输出结果(类别标签),然后再根据该输出结果来生成输入内容(即“输出优先”方法)。与步骤 0 相比,我们不再对每条指令所生成的实例数量进行限制。

picture.image

Prompt used for the Input-First Approach of instance generation

picture.image

Prompt used for the Output-First Approach of instance generation

经过一轮处理后,我们提取实例并对其进行格式化(使用正则表达式);格式化完成后,我们依据某些规则对其进行筛选,例如:

  • • 是否输入和输出相同,
  • • 是否实例已存在于任务池中,
  • • 是否输出为空,
  • • 如果输入或输出以冒号结尾,那么这些通常属于不完整的生成结果;

还有一些其他的启发式方法。最终,我们得到了一个生成任务的示例,该任务包含 1 条指令和 1 个实例:

picture.image

Instance generation example

这就是“Self-Intsruct”背后的主旨所在。

Step 4— Finetuning the LM to Follow Instructions

在完成所有之前步骤之后,我们可以使用一个预先训练好的语言模型,并在生成的数据集上对其进行指令微调,以获得更优的指标。

Overcoming challenges

在文章开头,我曾提及“指令调优”的大型语言模型所面临的某些挑战;接下来让我们看看“Self-Instruct ”技术是如何帮助我们克服这些挑战的。

Quantity

仅借助 175 个初始的人工编写任务,就生成了 52000 条指令和 82000 个实例:

picture.image

Source: Self-Instruct: Aligning Language Models with Self-Generated Instructions

Diversity

为了探究生成的数据集的多样性程度,Self-Instruct 研究的作者们使用了伯克利神经解析器来解析指令,然后提取与核心词最接近的动词及其第一个直接名词宾语。在 52000 条指令中,有 26000 条指令采用了动词-名词的格式,而另外 26000 条指令则具有更复杂的结构(例如:“判断这条推文是否包含政治内容?”)或者是以疑问句的形式呈现(例如:“这些陈述中哪些是正确的?”)。

picture.image

The top 20 most common root verbs (inner circle) and their top 4 direct noun objects (outer circle) in the generated instructions | Source: Self-Instruct: Aligning Language Models with Self-Generated Instructions

Quality

为了证明 Self-Instruct 能够生成高质量的任务,研究人员随机选取了 200 条生成的指令,并对每条指令抽取了一个实例,然后该框架的作者对其进行了评估,得到了以下结果:

picture.image

Source: Self-Instruct: Aligning Language Models with Self-Generated Instructions

如我们所见,所有任务中有 92% 描述的是有效的任务,而 54% 的任务具备所有有效字段(鉴于我们生成了 52000 个任务,至少有 26000 个将代表高质量数据,这真是太棒了!)

Costs

“Self-Instruct”框架还带来了显著的成本优势。任务生成的初始阶段(步骤 1 至 3)仅需 600 美元,而使用 GPT-3 模型进行最后的微调步骤则需花费 338 美元。在查看结果时,这一点务必牢记!

Results

Self-Instruct 如何在 SuperNI(超级自然指令)数据集上提升 ROUGE-L 评估指标?为此,我们可以将以下三种结果进行比较:1)未进行任何指令微调的现成预训练语言模型(原始语言模型);2)仅针对指令进行微调的模型(未结合 SuperNI 的指令微调);3)在 SuperNI 数据集上进行指令微调的模型(结合 SuperNI 的指令微调)。

picture.image

Evaluation results on unseen tasks from SuperNI | Source: Self-Instruct: Aligning Language Models with Self-Generated Instructions

如我们所见,在该数据集(1)中,使用“Self-Instruct”方法相较于原始模型实现了 33% 的绝对性能提升;同时,这也表明使用该框架在对超级 NI 数据集(3)进行微调后,也能略微提升指标。

此外,如果我们创建一个包含 252 条指令以及每条指令一个实例的新(未见过的)数据集,并对一系列针对指令进行优化的变体进行评估,我们将会得到以下结果:

picture.image

Performance of GPT3 model and its instruction-tuned variants, evaluated by human experts on our 252 user-oriented instructions | Source: Self-Instruct: Aligning Language Models with Self-Generated Instructions

GPT3 + Self-Instruct 模式的表现相较于其他基于指令的变体要出色得多,但与 InstructGPT(此前由 OpenAI 提供的大型语言模型变体)相比,仍有改进的空间。

Enhancements

“Self-Instruct”这一理念的内涵很简单,但同时又极具吸引力,所以让我们来看看在不同情况下如何运用它吧。

Stanford Alpaca

2023 年,来自斯坦福大学的“Alpaca”语言模型因其价格亲民、易于使用以及开发成本低于 600 美元而引起了极大的关注,同时它还融合了 LLaMA 和 Self-Instruct 的理念。

picture.image

High-level overview of Alpaca | Source: Alpaca: A Strong, Replicable Instruction-Following Model

Alpaca公司对“Self-Instruct”这一功能的版本进行了些许修改:

  • • 步骤 1(指令生成):采用了更激进的批量解码方式,即一次性生成 20 条指令
  • • 步骤 2(分类任务):此步骤完全被排除
  • • 步骤 3(实例生成):每条指令仅生成一个实例

最终,斯坦福大学的研究人员与最初的“Self-Instruct”系统相比取得了显著的进步。并且基于所进行的text-davinci-003(InstructGPT-003)与 Alpaca 7B 之间的盲对齐比较,结果显示阿帕奇在 90 次对比中胜过text-davinci-003,而在 89 次对比中则落后于它。

Self-Rewarding Language Models

picture.image

Source: Self-Rewarding Language Models

在 2024 年,Self-Instruct 是一种用于更复杂设置的实用框架,例如 Meta 的 Self-Rewarding 语言模型中所使用的框架。与 Self-Instruct 类似,最初我们有一组人类编写的初始任务;然后我们生成新的指令 {xᵢ} 并提示模型 Mₜ 生成输出 {yᵢ¹, ..., yᵢᵏ},随后再生成奖励 {rᵢ¹, ..., rᵢᵏ}——这就是我们在 InstructGPT 中通过 self-instruction 过程“消除”人类标注员的方式。Self-Rewarding 模型的最后一部分是遵循指令的训练——在这一步,我们组合偏好对,并通过 DPO 训练 Mₜ₊₁——即下一次迭代的模型。因此,我们可以反复执行此过程以丰富数据集并改进初始预训练模型。

Exploring Limitations

尽管“Self-Instruct”提供了自主生成数据集的创新方法,但其对大型预训练模型的依赖可能会带来一些局限性。

Data quality

尽管其生成合成数据的能力令人印象深刻,但数据的质量(在“克服挑战”部分的验证率为 54%)仍是一个令人担忧的问题。这凸显了一个关键问题:预训练模型中的固有偏见可能会在生成的数据集中重现,甚至会加剧这种现象

Tail phenomena

指令的频率各不相同:有些指令经常被要求,而有些则较为少见。然而,有效管理这些不常见的指令至关重要,因为它们凸显了大型语言模型在处理罕见和创新任务时的脆弱性。

Conclusion

总之,Self-Instruct 框架在开发针对特定教学需求的语言模型方面取得了进步,为数据集生成的挑战提供了创新的解决方案。使语言模型能够自主生成多样且高质量的数据,大大减少了对人工标注员的依赖,从而降低了成本。

参考文献

 

点个「赞」+「在看」❤️让我们知道这份文字有温暖到你,也是我们持续创作的最大动力!推荐LLM generate 参数怎么用?语音合成(TTS)跳跃与重复问题的解析:成因、机制及解决方案大模型训练新思路:GEPA 靠 “反思” 赢过 RL,看完秒懂F5-TTS:用 Flow Matching 玩转语音,流畅度和真实感都 “拉满” 了E2 TTS:令人尴尬地简单、完全非自回归、零样本的语音合成技术Voicebox:大规模文本引导的多语言通用语音生成技术为什么都在聊 Kimi K2?Open Agentic Intelligence 藏着哪些新惊喜Step-Audio-AQAA 端到端音频模型DPO、PPO、GRPO的原理,区别与联系OPENCSG 中文语料库:一系列高质量的中文数据集,用于语言模型训练不要对 2+3=?想太多:关于类 o1 大语言模型的过度思考什么是 Classifier-Free Guidance?Conditional Flow Matching : 连续标准流 Continuous Normalizing FlowCFM 与 OT-CFM:条件流匹配与最优传输的碰撞DPO损失实现Conditional Flow Matching : 常微分方程ODE、欧拉方法和Neural ODE当 Normalizing flow 遇上语音生成:AI 说话变 “真人” 的秘密在这里!深度剖析:Kimi - Audio 中 BigVGAN 的神奇作用为什么说分布变换是 Normalizing flow 的「灵魂操作」?MATCHA-TTS 来了!条件流匹配让文本转语音效率飙升从知识增长的角度提升RAG上下文的质量MiniMax-Speech,零样本语音合成新突破,32 种语言轻松拿捏!手把手教你创建 evol-instruct 数据集!附完整流程~社交类聊天的 Query 分析与应答策略SFT 中指令选择和响应选择哪个更重要?角色扮演大模型技术分享2-超拟人模型的困境最新!SpeechLLM 综述:架构、能力、挑战与未来全揭秘如何低成本生成高质量指令微调数据?从数量到质量:通过自引导数据选择来提升语言模型性能以实现指令调优Kimi-Audio:开源音频基础模型全面解析Kimi-Audio 的 TTS 效果如何?Qwen 的训练数据是怎么做的?GeForce RTX 3090, 4090, A10, A40, A100, A800, L20, L40 显卡性能对比如何低成本生成高质量指令微调数据?掌握RAG:投入生产前要评估的8个场景掌握RAG:如何评估RAG的LLM掌握RAG:如何在部署后观察您的RAG掌握RAG:如何选择嵌入模型基础模型中的新范式:为什么o1是不同的,以及它将如何改变LLM应用Semantic token和连续特征在SLLM下的对比从数量到质量:通过自引导数据选择来提升语言模型性能以实现指令调优RLHF及其变体:进展和实际工程见解胖东来与京东联手了Freeze-Omni: 低延迟语音对话模型Fully Sharded Data Parallelism (FSDP)什么是置信度?置信度模型怎么做?晦涩难懂的 Flow matching!图形化理解中文指令微调数据,质量就是一切!基于 LLM 的文本泛化CosyVoice 2:基于大型语言模型的可扩展流式语音合成技术Mini-Omni2: with Vision, Speech and Duplex CapabilitiesFSQ的原理与VQ-VAE的区别和联系大模型并行训练的一些知识——极简版亲测有效!如何用 Address Sanitizer 精准定位内存漏洞?附保姆级操作指南要用 AI 裁员 50% 的千亿独角兽,公开认错,重启招聘!一些文档去重算法single codebook和dual codebook在LLM中向量量化上有什么区别?胖东来与京东联手了一些文档去重算法最佳的指令数据应当是什么样的?Prefill-Decode分离亲测有效!如何用 Address Sanitizer 精准定位内存漏洞?附保姆级操作指南Simhash-文档去重算法简介校园篇-北京信息科技大学2025RLHF 入门,高手勿进!最佳的指令数据应当是什么样的?CosyVoice:一种基于监督式语义标记的可扩展多语言 Zero-Shot 语音合成器Model Context Protocol (MCP)MCP(模型上下文协议)是什么以及它是如何运作的压力测试LLMs——大海捞针实现picture.image    近日还在想要不要建个群呢?感觉自己是个i人,又懒,打理不来呀。但这个想法不自主的就冒出来了,还是要思考下。天人交战良久,得,一位朋友私我要入群,那就建一个吧,感谢。欢迎入群,希望能有一个交流的地方。但群主是个i人,没事儿让他想静静,有事儿圈他。群主不是万能的,不是万能的,不是能的,能的。****

0
0
0
0
评论
未登录
暂无评论