一个好的描述就是你需要的一切

完美描写的关键一切所需

如何使用少样本学习来提高文本分类性能

Photo by Patrick Tomasso on Unsplash.

我一直在使用大型语言模型(LLM),无论是个人项目还是日常工作的一部分。像许多人一样,我对这些模型的强大能力感到兴奋。然而,重要的是要知道,虽然这些模型非常强大,但人们总是可以通过各种任务来改进它们。

并且,不,我不会写关于细调整LLM的文章,这可能代价高昂,并且通常需要一台配备良好的GPU设备。事实上,我将向你展示一种非常简单的方法,通过少样本学习来改进你的模型。

少样本学习是一种机器学习技术,模型仅使用少量的示例(通常每类只有1-5个示例)来解决新任务。少样本学习有以下几个关键点:

  • 从少量数据中学会概括:少样本学习的方法旨在学习能够很好地从少量示例中概括的模型,与传统的深度学习方法相比,传统方法需要数千或数百万个示例。
  • 迁移学习:少样本学习方法利用从解决先前任务中获得的知识,并将该知识转移到帮助更快地学习新任务和更少数据的过程中。这种迁移学习能力是关键。
  • 学习相似度度量:一些少样本学习技术侧重于学习示例之间的相似度度量。这样可以将新示例与现有标记示例进行比较,以进行预测。

但是,如何在分类问题中使用少样本学习来提高模型性能呢?让我们通过一个例子来看看。

数据和准备

我从HuggingFace获取了数据进行分析。该数据集名为financial-reports-sec(此数据集具有Apache License 2.0并允许用于商业用途),根据数据集的作者所说,它包含了1993年至2020年间在美国公开上市的公司在SECEDGAR系统中提交的年度报告。每个年度报告(10-K提交)分为20个部分。

对于当前任务,该数据的两个相关属性非常有用:

  • Sentence:来自10-K提交报告的摘录
  • Section:标记表示句子所属的10-K提交报告的部分

我关注了三个部分:

  • 业务(第1项):描述公司的业务,包括子公司、市场、最近事件、竞争、法规和劳工等。数据中用0表示。
  • 风险因素(第1A项):讨论可能影响公司的风险,如外部因素、潜在故障和其他披露以警告投资者。数据中用1表示。
  • 资产(第2项):详细说明重要的实物资产,不包括知识产权或无形资产。数据中用3表示。

对于每个标签,我随机抽样了10个示例,且不重复。数据的结构如下所示:

现成的预测

准备好数据后,我只需要创建一个分类器函数,该函数接受来自数据框的句子并预测标签。

Role = '''您是SEC 10-K表单的专家。您将得到一段文本,并需要将其分类为“条款1”、“条款1A”或“条款2”。文本只属于所提及的类别之一,因此只返回一个类别。'''def sec_classifier(text):         response = openai.ChatCompletion.create(        model='gpt-4',        messages=[            {                "role": "system",                "content": Role},            {                "role": "user",                "content": text}],        temperature=0,        max_tokens=256,        top_p=1,        frequency_penalty=0,        presence_penalty=0)    return response['choices'][0]['message']['content']

我在这里使用GPT-4,因为它是OpenAI目前最强大的模型。我还将温度设置为0,以确保模型不会偏离轨道。真正有趣的部分是如何定义角色 – 这是我指导模型做我想要的事情的地方。角色告诉模型保持专注并提供我所寻求的输出类型。为模型定义一个清晰的角色有助于生成相关的高质量回答。在此函数中的提示是:

您是SEC 10-K表格方面的专家。您将获得一段文本,并需要将文本分类为“项目1”、“项目1A”或“项目2”。文本只属于上述类别之一,因此只返回一个类别。

在对所有数据行应用分类函数后,我生成了一个分类报告来评估模型的性能。宏平均F1得分为0.62,表明在这个多类别问题中具有相当强的预测能力。由于所有3个类别的示例数是平衡的,宏平均和加权平均收敛到相同的值。在任何额外的调整或优化之前,这个基准分数反映了预训练模型的开箱即用准确度。

               准确率       召回率    F1得分      支持        项目1       0.47        0.80        0.59          10        项目1A       0.80        0.80        0.80          10        项目2       1.00        0.30        0.46          10      准确性                            0.63          30     宏平均        0.76        0.63        0.62          30加权平均        0.76        0.63        0.62          30

描述就是你需要的(小样本预测)

如前所述,小样本学习是通过几个好的例子来泛化模型的。为此,我修改了我的类别,分别描述了项目1、项目1A和项目2(基于维基百科):

fewshot_role ='''您是SEC 10-K表格方面的专家。您将获得一段文本,并需要将文本分类为“项目1”、“项目1A”或“项目2”。文本只属于上述类别之一,因此只返回一个类别。在您的分类中,请考虑以下定义:项目1(即业务)描述了公司的业务:公司的业务范围、子公司以及公司所经营的市场。它还可能包括最近的事件、竞争、法规和劳工问题(某些行业受到严格管制,存在复杂的劳动力要求,对业务产生重大影响)。此部分的其他主题还可能包括特殊营运成本、季节性因素或保险事项。项目1A(即风险因素)是公司列出可能出错的事情、可能的外部影响、未来可能未能履行义务以及其他可能会被披露的风险,以充分警告投资者和潜在投资者。项目2(即财产)详细介绍了公司的重要财产和实物资产。这仅包括实物财产,不包括知识产权或无形财产。注意:只说明项目。'''def sec_classifier_fewshot(text):         response = openai.ChatCompletion.create(        model='gpt-4',        messages=[            {                "role": "system",                "content": fewshot_role},            {                "role": "user",                "content": text}],        temperature=0,        max_tokens=256,        top_p=1,        frequency_penalty=0,        presence_penalty=0)    return response['choices'][0]['message']['content']

现在提示如下:

您是SEC 10-K表格方面的专家。您将获得一段文本,并需要将文本分类为“项目1”、“项目1A”或“项目2”。文本只属于上述类别之一,因此只返回一个类别。在您的分类中,请考虑以下定义:

项目1(即业务)描述了公司的业务范围和公司所从事的业务内容,以及其所拥有的子公司和运营的市场。可能还包括最近的事件、竞争、法规和劳工问题(某些行业受到严格监管,有复杂的劳动力要求,这对业务产生重大影响)。此部分的其他主题可能还包括特殊的运营成本、季节性因素或保险事项。

项目1A(即风险因素)是公司列出可能出错的事情、可能的外部影响、未来可能未能履行义务以及其他风险,以充分警告投资者和潜在投资者。

项目2(即财产)是介绍公司重要财产和实物资产的部分。此部分仅包括实物财产,不包括知识产权或无形资产。

如果我们在这些文本上运行,我们得到以下性能:

                正确率    召回率  F1得分   支持数量     项目 1       0.70      0.70      0.70        10     项目 1A       0.78      0.70      0.74        10      项目 2       0.91      1.00      0.95        10    准确度                           0.80        30   平均数       0.80      0.80      0.80        30加权平均数       0.80      0.80      0.80        30

宏平均F1现在为0.80,相较之前提升了29%,这只是通过提供对每个类别的良好描述。

最后,您可以查看完整的数据集:

事实上,我提供的示例给了模型具体的实例来学习。通过观察多个示例,模型可以推断出模式和特征,从而开始注意到表征整体概念的共同点和差异。这有助于模型形成更强大的表示。此外,提供示例实际上是一种弱形式的监督,在缺少大量标记数据集的情况下,引导模型朝着所期望的行为方向发展。

在这个few-shot功能中,具体的示例有助于模型指导其关注的信息和模式类型。总结一下,具体的示例对于few-shot学习非常重要,因为它们为模型构建新概念的初始表示提供了锚点,然后可以利用所提供的少量示例对其进行改进。从具体实例中的归纳学习有助于模型发展抽象概念的细致表示。

如果您喜欢阅读本文并想保持联系,您可以在我的LinkedIn或通过我的网页iliateimouri.com上找到我。

注意:除非另有说明,所有图片均为作者所拍摄。