原文:
towardsdatascience.com/fine-tune-smaller-transformer-models-text-classification-77cbbd3bf02b
与较小的语言模型合作
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ace7c4f7490d497573c8ff258735411d.png
从更大的模型构建一个较小的模型以用于特定用例 | 图片由作者提供
_ 如果您不是会员但想阅读这篇文章,请点击这里。_
文本分类模型并不新鲜,但它们可以多快被构建以及表现如何的标准已经提高了。
我在这里将要微调的基于 Transformer 的模型比 GPT-3.5 Turbo 小 1000 多倍。对于这个用例,它将表现得更一致,因为它将专门为此进行训练。
理念是优化 AI 工作流程,特别是在处理大型模型过于冗余的任务时,小型模型表现更佳。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0d0e2d07ff4dd80a28e2b17d2022eb75.png
简化的模型大小演示,仅供娱乐 | 图片由作者提供
我之前讨论过这个,其中我使用序列到序列的 Transformer 模型为专注于技术的内容构建了一个稍微大一点的关键词提取器。我还探讨了不同的模型以及它们擅长什么。
对于这篇文章,我将深入探讨使用 Transformer 进行文本分类,其中编码器模型表现良好。我将使用二进制类别训练一个预训练的编码器模型,以识别点击诱饵文章与事实文章。然而,您也可以为不同的用例进行训练。
您将在这里找到完成的模型这里。
大多数组织使用开源的 LLM,如 Mistral 和 Llama,来转换他们的数据集以进行训练,但在这里我将通过 Ollama 使用 Phi-3 创建全部的训练数据。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/876d2ff015027153af7be8f2636fc5a2.png
理想情况下,您希望训练数据更加平衡 | 图片由作者提供
使用大型语言模型的数据时,模型过拟合的风险总是存在的,但在这个案例中,表现良好,所以我开始使用人工数据进行训练。然而,一旦开始训练,您必须小心并查看指标。
对于构建一个用于识别点击诱饵标题的文本分类器,我认为我们可以同意,一些点击诱饵是有益的,因为它使事物保持有趣。我尝试在我的各种自创标题上使用完成的模型,发现只有事实性内容可能会有些单调。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7367162495486f32a4e0fabbbd739ad9.png
制作几个标题以测试模型 | 图片由作者提供
这些问题似乎总是很明确,但当你深入研究时,你会发现它们比你想象的要复杂。我脑海中突然浮现的问题是,“什么是好的点击诱饵内容,什么是坏的点击诱饵内容?”一个平台可能需要两者都有一点,以保持人们阅读。
我在我的所有内容上使用了这个新模型,我的所有标题都没有被识别为点击诱饵。我不确定这是好事还是坏事。
如果你刚开始接触 BERT 这样的变压器编码器模型,这将是一个很好的学习经历。如果你不熟悉使用变压器构建文本分类模型,你可能会对查看合成数据是否有效以及查看该模型的性能指标感兴趣。
如我们所知,使用假数据比获取真实数据要容易。
引言
我从 Fabian Ridder 那里得到了这个作品的灵感,因为他正在使用 ChatGPT 来识别点击诱饵和事实性文章,以使用FastText训练模型。我认为这个案例非常适合较小的变压器模型。
我们构建的模型将使用合成数据而不是真实数据。这个过程将很快,因为使用 Phi-3 生成数据只需要大约一个小时,训练它只需要几分钟。该模型将非常小,只有 1100 万个参数。
由于我们使用的是二进制类别,即点击诱饵或事实,我们将能够达到 99%的准确率。尽管如此,该模型将比 FastText 更好地解释细微的文本。
训练成本将为零,我已经准备好了我们将用于此的数据集。然而,你可以为另一个用例生成自己的数据。
如果你想要深入了解模型的训练,你可以跳过介绍部分,我在那里提供了一些关于编码器模型及其擅长任务的信息。
编码器模型及其擅长之处
虽然变压器在文本生成方面引入了惊人的能力,但它们也在其他 NLP 任务中提供了改进,例如文本分类和提取。
模型架构之间的区别有点模糊,但了解不同的变压器模型最初是为不同的任务而构建的是有用的。
解码器模型接收较小的输入并输出较长的文本。GPT,在之前引入令人印象深刻的文本生成时,是一个解码器模型。解码器主要关注生成下一句,而不是整体看待文本。
虽然更大的语言模型今天提供了更多细微的能力,但解码器并不是为涉及提取和标记的任务而构建的。对于这些任务,我们可以使用编码器模型,它们接受更多的输入并提供一个简化的输出。
编码器擅长通过一次查看整个输入来提取信息,创建表示,因此非常适合分析整体输入数据。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9078804b67004310de5344b7a54acb8b.png
较小的变压器模型 – 编码器与解码器 | 图像由作者提供
我不会说得更多,但你应该能找到很多关于这个主题的信息,尽管这可能有点技术性。我在这篇 文章 中对此有更深入的探讨。
那么,与编码器相关的常见任务有哪些?一些例子包括分类——如情感分析和分类——命名实体识别(NER),以及关键词提取等。
你可以尝试一个将文本分类为十二种不同情绪的模型 [这里](https://huggingface.co/SamLowe/roberta-base-go_emotions)。你还可以查看一个将仇恨言论分类为有毒的模型。这两个模型都是使用仅编码器模型构建的,在这种情况下,是 RoBERTa。
你可以与许多基础模型一起工作;RoBERTa 是一个较新的模型,它使用了更多的数据进行训练,并通过优化其训练技术改进了 BERT。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/51bfbc9570750e0721bbea390c7f96a8.png
更为人所知的编码器变压器模型——它们有不同的尺寸 | 图像由作者提供
BERT 是第一个仅编码器的变压器模型,它通过比以前模型更好地理解语言上下文而开启了这一切。DistillBERT 是 BERT 的压缩版本。
ALBERT 使用一些技巧来减少参数数量,使其更小,同时不会显著降低性能。这就是我将要使用的模型,因为我认为它将表现得很好。
DeBERTA 是一个改进的模型,它更好地理解了词关系和上下文。一般来说,更大的模型在复杂的 NLP 任务上表现更好。然而,如果训练数据不够多样化,它们更容易过拟合。
对于这篇文章,我专注于一个任务:文本分类。
至于构建文本分类模型有多难,这实际上取决于你要求它做什么。当处理二元类别时,在大多数情况下,你可以实现很高的准确率。然而,这也取决于用例的复杂程度。
你可以查看某些基准来了解 BERT 在不同的开源数据集上的表现。
我审阅了论文"如何微调 BERT 进行文本分类?",以查看这些基准,并在下图中用它们训练的标签数量来绘制它们的准确率分数。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e04ef05d8add2eca1277511abb3c0914.png
来自论文"如何微调 BERT 进行文本分类?"的基准数据集 | 作者提供的图片
我们看到只有两个标签的数据集表现相当好。这就是我们所说的二进制标签。可能引人注目的是DBpedia数据集,它有 14 个类别,但作为一个基准,达到了 98%的准确率,而Yelp Review Full数据集,只有 5 个类别,却只达到了 70%。
这就是复杂性的所在:Yelp 评论的标签非常困难,尤其是在 1 到 5 星之间进行评级时。想想看,对于一个人来说,将他人的文本分类到特定的星级评级是多么困难;这完全取决于个人如何分类自己的评论。
如果你使用 Yelp 评论数据集构建一个文本分类器,你会发现 1 星和 5 星评论大多数时候都被正确标记,但模型在 2 星、3 星和 4 星评论上会遇到困难。这是因为一个人可能将 2 星评论分类为 2 星,而 AI 模型可能会将其解释为 3 星评论。
另一方面,DBpedia **** 数据集上的文本对模型来说更容易解释。
当我们训练一个模型时,我们可以查看每个标签的指标,而不是整体来看,以了解哪些标签表现不佳。尽管如此,如果你正在处理一个复杂任务,如果你的指标并不完美,不要感到气馁。
总是在新数据上尝试之后,看看它是否足够适用于你的用例,并继续在数据集上工作,或者切换底层模型。
小模型的经济学
我总是在模型构建和运行的成本部分进行说明。在任何项目中,你都需要权衡资源和效率以获得结果。
如果你只是尝试新事物,那么即使它将计算效率低下,使用一个更大的模型并具有 API 端点也是有意义的。
我已经运行了 Claude Haiku 一个月,为项目进行自然语言处理,从文本中提取类别、主题和位置。这只是为了演示目的,但当你想要为组织原型化某物时,这很有意义。
然而,使用这些更大的模型进行零样本操作,会导致很多不一致性,有些文本甚至完全需要被忽略。有时,更大的模型会输出完全的胡言乱语,但与此同时,对于这样一个小的项目来说,运行它们成本更低。
使用你自己的模型时,你也必须托管它们,这就是我们花费大量时间试图使它们更小的原因。你当然可以在本地运行它们,但你可能希望能够在开发项目中使用它们,因此你需要考虑托管成本。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a6e0b470681e0f9fe508d563c6def50c.png
我们比较了每小时托管使用 API 调用可以处理的标题数量 | 作者图片
看看上面的图片,我计算了每个实例可以处理的标题数量,并比较了 GPT-3.5 的相同成本。我意识到这看起来可能有点混乱,但遗憾的是,可视化确实很难。
我们至少可以推断,如果我们整天断断续续地使用 GPT-3.5 来处理一个小项目,尽管托管较小模型的成本相当低,但使用它也是有意义的。
断点是你持续处理的数据量超过某个特定阈值时。对于这个案例,这将是每天要处理的标题超过 32,000 个时,因为全天候运行实例的成本将与相同的价格相等。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/aee35988c1c8676f9b7b5c14e48a6561.png
使用 1 vCPU 托管与 GPT-3.5 API 调用此案例的成本比较 | 作者图片
这相当于假设你整天都在运行实例,如果你只在一天中的某些时段处理数据,那么托管并在不使用时将其缩放到零是有意义的。由于它非常小,我们也可以将其容器化,然后在 ECS 或 Lambda 上进行无服务器推理。
当使用闭源 LLM 进行零样本推理时,我们还需要考虑到模型并未为此特定案例进行训练,所以我们可能会得到不一致的结果。因此,对于需要一致性的重复性任务,构建自己的模型是一个更好的选择。
值得注意的是,有时你需要执行更复杂任务的模型。在这里,对于较大的 LLM,成本差异可能更大,因为你需要一个更好的模型和一个更长的提示模板。
使用合成数据工作
使用大型语言模型 (LLM) 转换数据并不是什么新鲜事,如果你还没有这样做,你应该开始。这比手动转换数千个数据点要快得多。
我研究了电信巨头 Orange 通过他们的 AI/NLP 任务小组 NEPAL 所做的工作,他们从各个地方抓取数据,并使用 GPT-3.5 和 Mixtral 将原始文本转换为指令格式,以创建可用于训练的数据。
如果你渴望了解更多关于这方面的信息,你可以查看通过 Nvidia 的 GTC 提供的会议这里。
但人们正在做得更多,使用更大的语言模型来构建整个数据集;这被称为合成数据。这是一种聪明的构建较小、专业化的模型的方法,这些模型的数据来自更大的语言模型,但成本更低,更高效。
然而,这里有一些担忧,合成数据的质量可能会受到质疑。仅依赖于生成数据可能会导致模型错过真实世界数据中固有的细微差别或偏见,导致它在实际看到它时出现故障。
然而,生成合成数据比获取真实数据要容易得多。
构建模型
我将在这里开始创建一个非常简单的模型,这个模型的目的是简单地识别标题是点击诱饵还是事实性内容。你可以构建一个带有更多标签的不同文本分类器。
这个过程很简单,我会走完整个流程,我们将使用的食谱是这个。
这个教程将使用这个数据集,如果你想构建自己的数据集,请务必阅读第一部分。
数据集
要创建一个合成数据集,我们可以在本地启动Ollama并运行我们想要用于构建训练数据的模型。确保它是一个商业上可用的模型。我选择了 Phi-3,因为它体积小,性能非常好。
我非常喜欢 JavaScript,所以我使用了Ollama JS框架来构建一个可以在后台运行的脚本,生成 CSV 文件。