简介
设想你需要为一项非常具体的任务构建一个文本分类器。比如,你需要筛选出既“紧急”又“与发货相关”的电子邮件,或者识别出“讽刺”与“真正愤怒”的社交媒体帖子。
传统上,你有两个艰难的选择。第一,收集成千上万个样本并手工进行标注来训练模型——这是一个缓慢且昂贵的过程。第二,尝试“零样本 (zero-shot) ”分类,使用原始文本挖掘技术在海量数据库中搜索关键词。然而,当概念变得复杂或微妙时,这种方法通常会失效。
最近,像 GPT-4 和 LLaMA 这样的大语言模型 (LLMs) 提供了第三条路: 直接让 LLM 对文本进行分类。虽然准确,但对于处理数百万份文档来说,这既计算昂贵又缓慢。一种更聪明的方法是使用 LLM 生成训练数据集,然后使用该数据来训练一个更小、更快的模型 (如 BERT 或 RoBERTa) 。
但这其中有一个陷阱。大多数现有的合成数据生成方法都是孤立地处理每个标签。它们难以处理“相互依赖”的标签——例如,定义“其他 (Other) ”类别完全取决于其他具体类别是什么。
在研究论文 “Incubating Text Classifiers Following User Instructions with Nothing but LLM” 中,来自加州大学圣地亚哥分校的研究人员提出了一个名为 Incubator (孵化器) 的新颖框架。该系统将分类器的创建视为一个“模型孵化”过程。通过对 LLM 进行指令微调 (instruction-tuning) 并使用巧妙的“自多样化 (self-diversification) ”技术,他们能够仅凭用户的指令就生成高质量、多样化且具有上下文感知能力的训练数据。
零样本分类的问题
要理解为什么 Incubator 是必要的,我们首先需要看看当前零样本方法的局限性。
零样本文本分类旨在无需查看任何标记样本的情况下构建分类器。早期的方法依赖于挖掘原始语料库 (如维基百科) 中包含类名的句子。这对像“体育”与“政治”这样的简单主题很有效,但在面对像“由教育家发表的 TED 演讲”这类复杂概念时就会失败。
随着 LLM 的出现,研究人员开始使用提示 (prompt) 来生成合成数据。像 ZeroGen 这样的方法会提示 LLM “生成一个关于体育的句子”。虽然比挖掘要好,但这些方法通常独立地为每个类别生成数据。
这种独立性造成了一个巨大的盲点: 标签相互依赖性 (Label Interdependency) 。
考虑一个带有三个标签的分类任务: *爱 (Love) *、*快乐 (Joy) * 和 *其他 (Other) *。
- 如果用户将标签更改为 *爱 (Love) *、*愤怒 (Anger) * 和 *其他 (Other) *,那么 其他 的定义就会发生根本性的变化。在第一种情况下,“愤怒”属于 其他。而在第二种情况下,它有自己的类别。

如 图 1 所示,传统方法难以捕捉这种动态变化。它们可能会生成与你关心的特定类别重叠的通用“其他”文本。Incubator 通过将指令的完整上下文提供给 LLM 来解决这个问题,使其能够理解标签之间的关系。
Incubator 框架
Incubator 的核心理念是创建一个擅长为“学生”模型生成训练数据的“教师”LLM。该过程包括两个主要阶段: 指令微调 (Instruction-Tuning) 和 自多样化 (Self-Diversification) 。

第一阶段: 大模型的指令微调
现成的 LLM (如 LLaMA-2) 虽然擅长聊天,但不一定针对生成完美平衡的分类数据集进行了优化。为了解决这个问题,研究人员对模型进行了“指令微调”。
他们从 HuggingFace 平台上收集了成对的描述和数据样本。他们将这些数据转换为一种特定的格式: 用户指令 (描述任务) 和一个包含每个标签示例的 Python 字典。
为了说明这一点,下面是一个训练样本的样子:

然而,手工收集这些配对提供的数据集非常有限。为了扩展它,研究人员使用 GPT-4 作为数据增强工具。他们采用了 上下文学习 (In-Context Learning, ICL) , 向 GPT-4 提供少量真实示例,并要求它构想出新的、富有想象力的任务及相应数据。

在这一阶段结束时,Incubator (基于 LLaMA-2) 已经学会了接受复杂的用户请求,并输出结构化的训练示例字典,同时遵循标签之间的关系。
第二阶段: 自多样化
LLM 的一个主要问题是它们具有重复性。如果你要求 LLM “写一个积极的电影评论”100 次,你会得到 100 个非常相似的变体,比如“我喜欢这部电影,演技很棒”。这种缺乏多样性的问题会损害最终分类器的性能。
为了解决这个问题,研究人员引入了 自多样化 (Self-Diversification) 。
- 批量生成: 他们查询 Incubator 为单个指令生成大量样本 (例如 1024 个) 。
- 嵌入 (Embedding) : 他们使用文本嵌入器 (一种将文本转换为数学向量的模型) 在语义空间中表示这些样本。由于数据结构是字典 (标签 A + 标签 B + …) ,他们连接所有值的嵌入来表示完整的“数据包”。 \[ E ( d ) = \bigoplus _ { i = 1 } ^ { n } E ( d [ l _ { i } ] ) \]
- 聚类 (Clustering) : 他们在这些嵌入上运行聚类算法 (K-Means) ,将相似的样本归为一组。
- 选择: 他们识别最接近每个聚类中心的样本。这些代表了不同语义变体中最独特、“典型”的例子。
通过在这些多样化的聚类中心上微调 Incubator,模型学会了在生成中优先考虑多样性和均匀性,防止出现“模式崩塌 (mode collapse) ”,即 LLM 只是简单地重复相同的简单示例。
实验与结果
研究人员将 Incubator 与几个强基线进行了对比,包括:
- 提示 (Prompting) : 要求 LLaMA-2 直接对文本进行分类 (无需训练) 。
- ZeroGen & ProGen: 之前的最先进方法,它们逐个标签地生成数据,不考虑依赖关系。
目标是使用合成数据“孵化”一个小的 RoBERTa-Large 模型,并查看它在真实基准测试中的表现。
传统基准测试的表现
在标准数据集 (如情感分析和新闻分类) 上的结果表明,Incubator 始终优于之前的方法。

数据表明,同时考虑所有标签——而不是逐个生成它们——使得模型能够创建更清晰的决策边界。自多样化步骤 (在表中移除时表示为“- Diversification”) 被证明是至关重要的;没有它,性能会显著下降。
处理“其他 (Other) ”类别
对 Incubator 理解标签依赖性的真正考验是“其他”类别。研究人员修改了几个数据集,将少数类别归为一个通用的“其他”类别。

在 NYT-LOC 数据集 (按地点对新闻进行分类) 中,Incubator 达到了 84.19% 的准确率,而基线约为 69% 。 这证明 Incubator 正确地推断出“其他”意味着“不是所列出的特定地点的地点”,而其他方法则难以定义这个负面空间。
复杂用户约束与逻辑
Incubator 最强大的应用之一是 逻辑文本挖掘 。 用户通常有复杂的具体要求,可以用逻辑门 (AND, OR, NOT) 来表达。
例如,用户可能想要找到“积极 且 关于食物”的短信。
Incubator 允许进行 联合孵化 (Conjunctive Incubation) 。 你可以将复杂的请求分解为简单的组件 (孵化一个“积极”的模型,孵化一个“关于食物”的模型) ,然后在数学上组合它们的概率。

上表中的生成数据展示了很高的语义质量。特别注意“其他”类别是如何具有上下文感知能力的。当为“关于食物”生成数据时,Incubator 创建了关于会议或电影的“其他”示例——这些与食物截然不同,确保分类器正确学习边界。
研究人员使用“Precision@100” (前 100 个检索到的项目中有多少是正确的) 量化了这种能力。

分析: 效率与鲁棒性
为了让这项技术真正实用,它必须是高效的。生成合成数据需要很长时间吗?

如 图 5 所示,该过程出奇地快。生成数据集只需一分多钟。大部分时间花在微调小型学生模型上,但这仍然非常快 (不到 4 分钟) 。这使得在喝杯咖啡的时间里在笔记本电脑上启动一个自定义分类器成为可能。
研究人员还分析了实际需要多少数据。

图 3 揭示了合成数据的“规模法则”相对较快地达到了收益递减点。每个类别仅生成 64 到 128 个高质量、多样化的样本通常足以训练一个鲁棒的分类器。这进一步强调了 Incubator 框架提供的质量和多样性比单纯的数量更重要。
结论
“Incubator”框架代表了我们在大语言模型时代思考 NLP 方式的重大转变。我们不再为每一个预测都使用庞大、昂贵的 LLM,而是可以将它们作为“教师”来创建专门的、轻量级的“学生”模型。
通过专注于 指令微调 和 自多样化 , Incubator 解决了标签依赖性这一关键问题。它允许用户自然地定义类别——包括像“其他”或“不紧急”这样棘手的概念——并生成尊重这些边界的训练数据。
这种方法让文本分类变得大众化。你不再需要数百万份文档的原始语料库或用于人工标注的预算。只需一个清晰的指令和一个 LLM,你就完全可以根据自己的需求孵化出一个自定义分类器。
该领域的未来工作旨在扩展到分类之外。想象一下,根据一个提示“孵化”出一个遵循你特定风格指南的自定义摘要器或问答系统。“模型孵化”的时代才刚刚开始。
](https://deep-paper.org/en/paper/2404.10877/images/cover.png)