CLUSTERLLM: Large Language Models as a Guide for Text Clustering
聚类LLM:将大型语言模型作为文本聚类的指南
摘要:我们介绍了CLUSTERLLM,这是一种利用经过指令微调的大型语言模型(如ChatGPT)反馈的新型文本聚类框架。与建立在“小”嵌入器上的传统无监督方法相比,CLUSTERLLM具有两个有趣的优势:(1)即使其嵌入不可访问,它也享有LLM的突现能力;(2)它通过文本指令和/或少量标注数据理解用户对聚类的偏好。首先,我们通过构建困难的三重问题<是否A比C更对应B>来提示ChatGPT,以获取聚类视角的见解,其中A、B和C是根据小嵌入器属于不同簇的相似数据点。我们通过实验证明,这种策略对微调小嵌入器有效且成本效益高,可查询ChatGPT。其次,我们通过精心设计的成对问题<是否A和B属于同一类别>,提示ChatGPT帮助确定聚类的粒度,并从最符合ChatGPT答案的聚类层次结构中调整粒度。在14个数据集上的广泛实验表明,CLUSTERLLM始终提高了聚类质量,每个数据集的平均成本约为$0.61。代码将发布在:https://github.com/zhang-yu-wei/ClusterLLM。
1 引言
文本聚类作为自然语言处理(NLP)中的一项基础任务,具有广泛的应用,如从社交媒体中识别公众观点(Park等,2022),分析事故原因(Xu等,2022),以及检测新兴研究课题(Martínez等,2022)。一种常见的文本聚类实践是将聚类算法(MacQueen,1967;Zhang等,2021a)应用于预训练嵌入器之上(Muennighoff等,2022;Wang等,2022;Su等,2022),通过更好的预训练质量实现更高性能。最新的最先进的大型语言模型(LLMs),如近期的GPT系列(Brown等,2020;Ouyang等,2022;OpenAI,2023),在各种NLP应用中展示了非凡的语言能力。然而,这些GPT模型只能通过API使用,无法访问用于聚类的嵌入向量。因此,LLMs不能直接应用于文本聚类任务。
在本文中,我们探讨了一个问题:我们能否有效利用基于API的LLMs来指导文本聚类?我们从一个观察中汲取灵感来解决这个具有挑战性的问题,即人类通过与其他实例比较来表示一个实例(Nosofsky,2011)。例如,人们通常通过将新音乐片段与熟悉的音乐进行比较来将其分类为特定的流派。实际上,成对关系早已在谱聚类中被利用(Donath和Hoffman,1972;Cheeger,1970)。然而,天真地遍历数据集中所有成对关系显然是不可行的,而且查询LLMs的成本过高。
我们提出了CLUSTERLLM,一个利用LLM以低成本指导小嵌入器寻找文本簇的框架,如图1所示。它包括两个阶段,分别专注于聚类的两个方面:(1)视角,即分组标准,如主题、意图和情感;(2)粒度,即簇的范围。
图 1:由于嵌入不可访问,像 ChatGPT 这样的 LLM 不能直接用于文本聚类。CLUSTERLLM 通过利用 LLM 作为文本聚类的指南解决了这一难题。
在阶段1中,我们通过一个三重任务提示LLMs,预测两个候选选择中的哪个更接近锚实例,以了解用户偏好的视角。我们选择这个三重任务是因为(a)它与聚类粒度无关;(b)生成的三重关系可以微调小嵌入器以符合正确的视角。为了提高样本效率,我们进一步提出了基于熵的三重采样策略,以找到最有信息量的三重。具体来说,我们首先根据聚类分配概率计算每个实例的熵,然后识别出熵最高的实例。然后从其最近的簇中采样两个候选选择,以确保它们足够接近锚点。
在阶段2中,我们首先获得从实例级别簇开始的聚类层次结构,并迭代合并两个最近的簇直到整个数据集。然后我们通过少量标注的数据对提示LLMs以确定聚类粒度。我们通过从每一步层次聚类中合并的两个簇中采样数据对来构建提示,以涵盖广泛的粒度范围。最终决定是通过测量每个聚类级别与预测的一致性来做出的。
我们在包含多样任务(如意图发现、主题挖掘、类型发现、领域发现和情感检测)的14个数据集上对CLUSTERLLM进行了广泛评估。这些任务的簇数从10到150个不等。我们展示了CLUSTERLLM在提高聚类质量方面的整体有效性,其聚类性能优于深度聚类基线和自监督基线。此外,消融研究表明,与随机采样基线相比,我们的采样策略更有效。最后,CLUSTERLLM在确定聚类粒度方面也优于基于聚类错误的方法。
总之,我们的贡献有三点:(i)我们提出了一个框架CLUSTERLLM,该框架利用API-based LLMs预测的句子关系来指导聚类。此外,它允许用户提供文本指令和/或少量注释来指定聚类偏好。(ii)为了减少API查询,我们提出了一种新颖的基于熵的采样策略,以找到最有信息量的三重。此外,我们利用从层次聚类中采样的成对数据来确定聚类粒度。(iii)广泛的实验表明,我们提出的方法可以以每个数据集约$0.2的成本改善聚类视角,以约$0.4的成本改善粒度,使用GPT-3.5。
2 预备知识
文本聚类将一个未标注的语料库 D = {xi} (i=1,…,N) 作为输入,输出一个聚类分配 Y = {yi} (i=1,…,N),将输入文本映射到聚类索引。为了明确用户的需求,CLUSTERLLM 整合了额外的文本指令(例如,“选择与查询在实体类型上更对应的例子。”)以理解视角,以及少量注释(例如,“句子1和句子2具有相同的实体类型…”)来确定聚类粒度。
(注释:文本聚类的任务是将一组未标注的文本数据作为输入,然后输出每个文本对应的聚类标签。具体来说,就是把输入的每个文本分配到一个特定的聚类中。
为了更好地满足用户的需求,CLUSTERLLM在进行聚类时会使用额外的文本指令和少量示例注释:
1. 文本指令:这些指令帮助模型理解用户希望如何进行聚类。例如,用户可能会提供一个指令,说“选择在实体类型上更符合查询的例子”,以便模型了解聚类的视角。
2. 少量示例注释:这些是用户提供的少量标注数据,用来帮助模型确定聚类的具体粒度。例如,用户可能会提供两个句子,并说明它们属于相同的实体类型,这帮助模型理解如何对相似的文本进行分组。)
3 我们的CLUSTERLLM
CLUSTERLLM基于一个预训练的小型嵌入器(Wang等,2022;Su等,2022),通常用于单独表示句子。相反,受到人类认知能力的启发(Nosofsky,2011),CLUSTERLLM通过提示遵循人类指令训练的大型语言模型(LLMs)(Ouyang等,2022;OpenAI,2023)来考虑句子对或三重句子。具体来说,CLUSTERLLM是一个两阶段框架(见图2)。在第3.1节中,我们介绍了利用三重任务根据用户指定的视角提高聚类质量的阶段1,并提出了一种减少API查询数量的采样策略。在第3.2节中,我们介绍了利用成对任务根据LLMs预测确定聚类粒度的阶段2。
(注释:预训练的小型嵌入器是一种已经通过大规模数据集进行训练的模型,它的目的是将文本转换为固定长度的向量(嵌入表示),这些向量可以捕捉文本的语义信息。预训练的小型嵌入器通常是在大型语料库上训练的,可以在各种自然语言处理任务中提供通用的文本表示。这些嵌入器的“预训练”意味着它们已经在训练过程中学到了有用的语言模式和特征,可以用于下游任务,如文本分类、文本聚类等。
常见的预训练嵌入器包括BERT、GPT-2、FastText、Word2Vec等。尽管它们被称为“小型”嵌入器,是因为它们相对于一些最新的超大型语言模型(如GPT-3、ChatGPT)来说,规模更小,计算和存储需求也更低。尽管如此,它们依然在许多应用中表现出色,尤其是当需要高效处理大规模文本数据时。)
图 2:CLUSTERLLM概述。它利用LLM来指导嵌入器进行低成本的文本聚类。
3.1 视角的三重任务
在本节中,我们探讨如何利用三重任务根据用户指定的视角优化聚类结构。三重任务的输入是一个包含三个句子的元组t = (a, c1, c2),其中a是锚点,(c1, c2)是两个选择。然后,我们提示LLMs选择(c1, c2)中哪个更符合a,使用提示PT。此外,为了指定用户的视角,PT还需要任务指令IT作为输入。LLM应该做出选择
cj = PT (IT , t),
其中cj ∈ {c1, c2}表示LLM选择的一个正选,另一个为负选c\j。
(注释:### 什么是三重任务?
三重任务涉及三个句子:
1. **锚点句子(a)**:这是你用来比较的基准句子。
2. **两个候选句子(c1和c2)**:你需要从这两个句子中选一个更像锚点句子的。
### 三重任务是怎么做的?
1. 你给大型语言模型(LLM)提供这三个句子。
2. 你还需要提供一个任务指令,这个指令说明你想要模型根据什么标准来进行选择。例如,“选择与锚点句子在主题上更相似的句子”。
3. 模型根据这个指令(IT)和三重句子(t = (a, c1, c2))来做出选择。
### 模型的选择是什么样的?
模型会选择c1或c2中更符合锚点句子的一个。选中的句子叫做正选(positive),未选中的句子叫做负选(negative)。)
3.1.1 基于熵的三重采样
虽然可以随机采样三重来查询LLM(注释:随机采样的意思是从大量句子中随机选择三组句子,组成一个三重(a, c1, c2)。将这些随机采样的三重提供给LLM,询问LLM哪个候选句子(c1或c2)与锚点句子(a)更相似或更符合某个特定的标准(根据用户提供的指令)。),但我们在实验中证明这效率不高。在本节中,我们提出如何挖掘有信息量的三重以节省查询LLMs的成本并优化聚类。为实现这一目标,我们依赖于从提取的嵌入Z = {zi = f(xi)}(i=1…N)得到的当前聚类结果(注释:预训练嵌入器会把每个输入文本(xi)转换成一个固定长度的向量(zi)。公式中的f(xi)表示用嵌入器f处理文本xi,得到其向量表示zi。Z是所有文本的嵌入表示的集合。也就是说,如果你有N个文本,每个文本都有一个对应的嵌入表示,那么Z就是这些嵌入表示的集合:Z = {zi = f(xi)}(i=1…N)。使用这些嵌入表示(Z)进行聚类分析,可以得到当前的聚类结果。也就是说,我们利用这些向量表示来分组,看看哪些文本是相似的并将它们归为一类。)。总结来说,我们的算法包含两个步骤:
步骤1:根据熵找到最模糊的实例作为锚点。(注释:选择那些在聚类中具有最大不确定性的实例作为锚点。这些实例被认为是“最模糊”的,因为它们在不同簇之间的归属不确定性最高。)
步骤2:对于每个锚点实例,从其最近的两个簇中采样两个选择(注释:在选择了锚点实例之后,从锚点实例所属的聚类中挑选出最接近的两个簇,然后从这两个簇中各选择一个实例,作为与锚点实例进行比较的两个候选实例。)。参见算法1了解整个过程。
在步骤1中,由于当前阶段粒度未知,我们在Z上执行聚类,其中聚类超参数在数据集之间一致,仅针对嵌入器模型f。然后,通过平均分配到簇的嵌入计算每个簇的簇中心µk。按照(Xie等,2016;Van der Maaten和Hinton,2008),我们使用Student的t分布计算每个实例的软分配:
(注释:这个公式用来计算每个实例分配到每个簇的概率,这种方法被称为“软分配”,因为它允许一个实例同时属于多个簇,只是属于每个簇的概率不同。我们使用了Student’s t分布来计算这些概率。
Pik 是实例i被分配到簇 k 的概率,
zi是实例i的嵌入向量。
μk 是簇k的中心(质心)
α 是自由度参数,这里设置为1。
k 和 k’ 分别表示当前簇和所有可能的簇)
其中α=1为自由度。然后,我们将实例i的最近簇定义为具有最大软分配pik的Kclosest簇。这里,Kclosest与簇的总数K成比例。
(注释:如何为某个实例找到“最近的簇”,具体是指在软分配概率最大的簇中进行选择。对于每个实例 i,最近的簇是指那些实例被分配概率最高的簇。
K:总的簇的数量。
Kclosest:表示实例i的最近簇的数量。
公式表示最近的簇的数量 Kclosest 是总簇数的一定比例ϵK 和2之间的最大值。这样做是为了确保最近簇的数量不会太少(至少是2个),即使ϵK可能小于2。)
我们固定ϵ为一个小值,如2%。然后,我们基于这些最近簇用重新归一化的概率p’ik计算熵,
(注释:熵 hi 衡量了实例i在最近簇中的不确定性。如果一个实例均匀分布在这些簇中(即概率相等),那么熵会较高。如果一个实例主要集中在一个簇中(即概率分布很不均匀),那么熵会较低。)
其中。
(注释:pik’重新归一化概率 ,这是实例i在最近的 Kclosest个簇中的归一化概率。)
我们根据熵H={hi}(i=1…N)按降序排列整个数据集。我们引入了两个超参数γhigh和γlow,以控制从排序数据集中过滤出的比例区间。我们的假设是,较高熵(较小的γhigh和γlow)的锚点形成更有信息量的三重,在第4.6节中验证。在步骤2中,我们从Kclosest最近的簇中随机采样两个簇C1和C2,然后从每个簇中分别采样两个句子c1和c2作为选择(见第11行和第12行)。换句话说,这些选择要么是正选要么是锚点的负选。最后,我们还移除重复或选择和锚点相同的三重。我们继续采样三重,直到达到预算Q。
备注:(1) 由于Q由用户定义,与数据集大小无关,我们的采样是成本高效的。例如,在我们的实验中,使用1024次查询可以在约3000和约50000的数据集规模上提高性能。(2) 从真实情况来看,采样的三重可能包含“两个都是对的”或“以上皆非”。然而,我们认为即使这些三重也可能提供软对齐信息,即选择之间的亲近排名。(3) 我们的采样方法也可以用于主动学习,在没有类别先验知识时获取人类注释。
3.1.2 微调嵌入器
现在我们有了三重预测,但如何在聚类中利用它们仍不清楚。之前的研究依赖于深度约束聚类(Zhang等,2020;Manduchi等,2021),这些方法通常对噪声标签敏感(Basu等,2008)。在本文中,我们专注于微调基础嵌入器f,以产生更好地解释用户视角的嵌入空间。我们利用了难负和批内负样本。按照(Su等,2022;Ni等,2022b),对于具有正选cj和负选c\j的三重t = (a, cj , c\j),我们优化以下目标:
其中B结合了cj, c\j和其他批内负样本。τ是温度参数。按照原始实现,我们也计算了交换a和cj的损失。最终,微调后的嵌入器可以应用于我们的方法中找到更有信息量的三重,从而以迭代方式进一步提高性能。我们通过在提取的嵌入上运行聚类算法获得聚类分配。
3.2 粒度的成对任务
在本节中,我们基于第3.1节中优化的嵌入空间来确定聚类粒度。本文中,我们将确定粒度的问题转换为在聚类层次中找到最佳步骤的问题(见图2右),其中每个步骤表示一个唯一的粒度(或相同数量的簇)。这并不简单,因为相同的数据集可以应用不同的粒度(如领域或主题)。为了解决这个挑战,我们使用成对任务查询LLM,预测一对数据p是否属于同一簇,提示PP,
其中w ∈ {相同,不同}是二元决策,IP是任务指令,{p˜d}D=1是用于上下文学习的少量示例对(通常D=4)。我们假设这些示例对是由有特定簇粒度预期的用户标注的。我们还结合了每个示例对的简短理由(见表12底部示例)。
3.2.1 使用成对层次采样确定粒度
我们然后介绍如何从聚类层次中采样成对以查询LLMs并确定粒度。我们假设最大和最小簇数(分别为kmax和kmin),这取决于用户对粒度的期望。然后我们从每一步要合并的两个簇中随机采样λ(在我们的实验中为1或3)对数据以形成候选对{pi}(i=1…Np),其中Np =λ(kmax−kmin)。这些对覆盖了从kmax到kmin的整个粒度范围,将用于查询LLMs。之后,每个粒度级别可以根据LLM预测进行检验,以选择一致性最高的粒度,
其中Wp = {wip}(i=1…Np)表示从方程6得到的预测,Wk表示一组二元值,指示每对数据在粒度k时是否在同一簇中。经验上,我们发现以下方法在我们的框架中表现更好:使用F-beta分数(精确率和召回率的加权调和平均)作为测量M,并将Wp/Wk作为标签/预测。最后,对于大规模数据集,我们通过在小批量K均值基础上应用层次聚类解决高时间复杂度问题。详见附录A。
备注:与第3.1.1节类似,成对层次采样也可以用于获取人类注释。然而,算法的可靠性仍取决于簇的质量。在一个极端情况下,如果簇完全随机,即使所有成对预测都是正确的,也无法找到粒度。
6 结论
在本文中,我们研究了如何利用基于API的大型语言模型(LLMs)来指导小型嵌入器进行文本聚类,以从LLMs的高级语言能力和用户的聚类指令中受益。我们提出通过两种句子关系任务来提示LLMs:三重任务和成对任务。三重任务选择与锚点最相似的句子,并结合用户的视角指令。预测的三重用于微调小型嵌入器。成对任务判断一对句子是否属于少量示例提示的同一类别,然后使用预测结果通过一致性测量来确定聚类粒度。广泛的实验表明,我们提出的CLUSTERLLM框架可以提高聚类质量,并以极低的成本提出合理的聚类粒度。然而,CLUSTERLLM仍然依赖于嵌入模型本身,这在黑箱嵌入模型上效率低且不可行。我们鼓励未来的研究探索无模型训练的潜力,如约束聚类。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。