AI技术干货|利用开源Transformer模型实现主要的NLP文本相关应用(上篇)
金博士| 流媒体网| 2023-11-07
【流媒体网】摘要:探索如何使用pipeline()函数解决各种NLP任务,了解Transformer架构的基础。

  专题推荐:金博士AI技术干货分享

  1 引言

  基于开源大模型库快速实现AI应用系列教程将指导您如何利用开源大模型及其生态系统工具进行AI 应用的快速实现。我们将利用托管在诸如Hugging Face 等网站上的各种开源模型及其相关工具进行应用开发,这些工具包括Transformers、 Datasets、 Tokenizers及Accelerate等。

  教程内容分为三大部分。首先,第一部分将深入探讨 Transformers库的核心概念。学习完这部分后,您不仅会对Transformer模型的运作有深入的了解,还能够熟练地使用各种开源模型,进行微调,实现AI 相关任务并分享您的成果。

  接下来,我们将转向 Datasets和 Tokenizers的基础内容,并深入探讨各种NLP的经典任务。完成这部分学习后,您将能够独立处理各种常见的NLP问题。

  最后一部分,我们将拓展到NLP之外,探索如何在语音处理和计算机视觉中应用Transformer模型。您将学习到如何为生产环境优化模型,构建并分享模型演示。当您完成这部分内容后,您将能够将 Transformers应用于几乎所有的机器学习问题。

  为了更好地掌握本课程内容,您需要具备一些Python基础。如果您学习过实用深度学习编程或相关开发课程,那么学习本教程会更加得心应手。尽管要求您事先了解PyTorch或TensorFlow,但对它们有一定的了解会对您的学习大有裨益。

  现在,让我们开始吧!在接下来的学习中,我们将探索如何使用pipeline()函数解决各种NLP任务,了解Transformer架构的基础,并区分编码器、解码器和编码器-解码器架构及其应用场景。由于篇幅的关系,本教程将采用连载的方式。

  2 自然语言处理(NLP)

  在深入探讨Transformer模型之前,让我们先简要了解一下什么是自然语言处理以及为什么我们关心它。

  2.1 什么是NLP?

  NLP,即自然语言处理,是计算机科学、人工智能和语言学交叉的一个领域。它的核心目标是使计算机能够理解、解释和生成人类语言的方式,从而为人机交互创造更自然、更直观的方式。NLP的应用广泛,涵盖了从简单的单词拼写检查到复杂的情感分析和机器翻译等各种任务。

  NLP任务的目标不仅仅是单独理解每个单词,更重要的是能够理解这些单词的上下文含义。这意味着计算机不仅要知道单词的字面意思,还要理解它们在句子中的角色和与其他单词的关系。

  以下是一些常见的NLP任务及其示例:

  · 对整句进行分类:这涉及到对整个句子或段落的内容进行分析和分类。例如,判断一段评论是正面的还是负面的,或者检测电子邮件是否为垃圾邮件。此外,还可以确定句子是否语法正确,或者两句话是否有逻辑关系。

  · 对句子中的每个单词进行分类:这主要涉及到词性标注和命名实体识别。词性标注是确定句子中每个单词的语法角色,如名词、动词或形容词。而命名实体识别则是识别句子中的特定类别,如人名、地点或组织名称。

  · 生成文本内容:这包括文本自动生成、自动摘要和机器翻译。例如,根据用户的提示自动生成文本,或者对长篇文章进行摘要。

  · 从文本中提取答案:这是问答系统的核心,它需要给定一个问题和一段上下文,然后从上下文中提取问题的答案。

  · 根据输入文本生成新句子:这包括机器翻译和文本摘要。机器翻译是将文本从一种语言翻译成另一种语言,而文本摘要则是创建文本的简短版本。

  除了书面文本,NLP还涉及到语音识别和计算机视觉。例如,语音识别系统可以将音频样本转录成文本,而计算机视觉可以用来描述图像内容。这些技术的结合使得NLP成为一个充满挑战和机会的领域,为未来的技术进步创造了无限可能性。

  2.2 为什么NLP具有挑战性?

  自然语言处理(NLP)的挑战性主要源于语言的复杂性和多样性。与人类直观地理解和使用语言不同,计算机需要依赖明确的指令和规则来处理语言信息。以下是NLP面临的一些主要挑战及其具体例子:

  1. 歧义性:许多单词和短语在不同的上下文中有不同的含义。例如,“模型”可以指代数学或计算中的算法模型,也可以指代小型的物体模型,如飞机或汽车的缩小模型。在句子“这个模型非常复杂”中,如果上下文是关于机器学习,那么“模型”可能指的是算法模型;但如果上下文是关于玩具制造,那么“模型”可能指的是物体模型。计算机需要根据上下文准确地解析“模型”的真正含义。

  2. 语言的多样性:同一种语言中存在多种方言和俚语。例如,英文中的“elevator”在美国和“lift”在英国都指代电梯。这使得处理不同的文本来源和风格变得复杂。

  3. 隐含的信息:人们在交流时经常省略一些信息。例如,“你去过巴黎吗?”和回答“去过。”中的“去过”隐含了对巴黎的引用。

  4. 长距离依赖:在复杂的句子结构中,例如“尽管他很累,但他还是完成了工作。”中,“尽管”和“但”之间存在依赖关系,这对于NLP模型来说是困难的。

  5. 文化和情境背景:语言经常包含与文化、历史和社会情境相关的隐含信息。例如,“中秋节我们吃月饼”中的“中秋节”和“月饼”需要对中国文化有一定了解。

  6. 处理非结构化数据:与结构化的数据库数据不同,文本如社交媒体帖子、新闻报道通常是非结构化的,这意味着提取有用的信息需要更复杂的处理方法。

  7. 资源限制:虽然一些语言(如英语)有大量的NLP资源和研究,但许多其他语言如乌尔都语或缅甸语则缺乏足够的数据和工具。

  8. 模型的偏见和公正性:由于训练数据可能包含偏见,NLP模型可能会无意中放大这些偏见。例如,某些模型可能会对某些性别或种族的名字产生负面的情感分析结果。

  总之,NLP的目标是使计算机能够与人类一样有效和准确地处理和理解语言。尽管近年来已经取得了很大的进展,但仍然存在许多挑战需要克服。

  3 变换器(Transformer)

  3.1 Transformer 的定义和组成

  Transformer是一种深度学习模型架构,主要用于处理序列数据,如文本或语音。它于2017年由Vaswani等人在论文“Attention Is All You Need”中首次提出。Transformer的核心思想是利用自注意力机制(Self-Attention Mechanism)来捕获输入数据中的全局依赖关系,而不依赖于传统的递归或卷积结构。

  其核心组件与工作原理如下:

  1. 自注意力机制:这是Transformer的核心组件,允许模型在不同的位置之间加权平均输入序列,从而捕获长距离的依赖关系。通过这种方式,每个词元可以根据其与其他词元的关系来调整其表示。

  2. 位置编码:由于Transformer本身不具有固有的顺序感知能力,所以需要向输入添加位置信息。位置编码提供了这种信息,确保模型可以考虑序列中的词元顺序。

  3. 多头注意力:Transformer模型使用多个并行的自注意力层,称为“多头”,以捕获不同级别的信息和依赖关系。

  4. 前馈神经网络:在自注意力层之后,Transformer包含前馈神经网络,用于进一步处理每个位置的表示。

  5. 规范化和残差连接:为了稳定训练和增强模型的能力,Transformer使用层规范化和残差连接。

  自从其提出以来,Transformer已经成为了许多NLP任务的基石,包括机器翻译、文本生成、文本分类等。其变体和扩展,如BERT、GPT和T5,已经设置了多个任务的性能基准。Transformer模型通过其独特的自注意力机制,为处理序列数据提供了一种高效且强大的方法。其能够捕获长距离依赖关系和复杂的模式,使其在NLP领域中取得了显著的成功。

  3.2 Transformers无处不在!

  自从Transformer模型在2017年被提出以来,它已经彻底改变了自然语言处理(NLP)领域的面貌。其强大的性能和灵活的架构使其在各种NLP任务中都取得了显著的成功,从而确立了其在该领域的主导地位。

  3.2.1 Transformer和 LLM 之间的关系

  Transformer架构与OpenAI的GPT系列和Google的BERT系列等大型语言模型(LLMs)在自然语言处理领域紧密相连。这些LLMs的基础是Transformer架构,它利用其自注意力机制有效地捕获文本中的长距离依赖关系。这彻底改变了模型感知和处理文本信息的方式。

  LLMs的一个鲜明特点是它们的训练方法。通常,它们经历一个两步过程:首先在大量的文本数据上进行预训练,然后根据特定任务进行微调。Transformer架构特别适合这种预训练和微调范式,因为它擅长从其训练的数据中捕获复杂的语义表示。

  此外,Transformer和LLMs的通用性不仅限于文本。它们在多模态任务中也取得了很大的进展,这些任务涉及不同类型的数据(如图像和文本)的联合处理。例如,像OpenAI的CLIP和Google的ViT这样的模型,它们基于Transformer架构,旨在处理图像数据,展示了Transformer框架在文本数据之外的灵活性和潜力。

  3.2.2 Transformer 和相关公司及组织的关系

  Transformer架构在自然语言处理领域已经成为了一个里程碑,与此同时,多家知名公司和组织在其背后做出了巨大的贡献。

  OpenAI是其中的佼佼者,它推出了基于Transformer架构的GPT系列模型。特别是GPT-3,这款模型在发布后迅速引起了全球的关注。它令人惊叹的是,只需给予适当的提示,就能在各种任务上展现出强大的性能。

  而Google则以其BERT模型闻名。BERT是一个基于Transformer的双向语言模型,它在NLP领域产生了深远的影响,并已经成为了许多下游任务的基准。

  Hugging Face是另一个与Transformer紧密相关的名字。它为公众提供了一个非常受欢迎的开源库,大大简化了使用和微调Transformer模型的过程。更值得一提的是,Hugging Face的模型Hub,这是一个包含了成千上万个预训练Transformer模型的宝库,为全球的研究者和开发者提供了宝贵的资源。

  当然,除了上述的几家外,还有如Facebook AI、Microsoft和DeepMind这样的全球知名公司和研究机构。它们也在Transformer的研究和应用上做出了不可或缺的贡献,推动了整个领域的进步。

  Transformer模型不仅在学术界,而且在工业界都取得了巨大的成功。从基本的文本处理到复杂的多模态任务,Transformer都已经成为了首选的模型架构。随着更多的研究和应用的出现,我们可以预期Transformer和LLM将继续引领NLP领域的未来发展。

  在深入了解Transformer模型的内部工作原理之前,我们会先看一些示例,了解它们如何被用于解决一些有趣的NLP问题。

  3.3 Transformer pipeline工具函数

  下面我们介绍 Hugging Face pipeline 工具函数,本文主要通过该工具函数来快速实现我们需要的各种 NLP 应用示例。

  3.3.1 目的

  Hugging Face的pipeline是Transformers库中的一个高级工具,它为多种常见的NLP任务提供了一个简单、统一的接口。这个功能的设计初衷是为了使NLP的应用变得更加直观和无缝,从而降低了为特定任务构建模型的复杂性。它为用户提供了一个高级的接口,使得在不深入了解模型内部工作原理的情况下,也能轻松地使用预训练模型。之所以选择 pipeline 函数进行 NLP 任务处理,是因为它具备如下优点:

  1. 简化的接口:pipeline()提供了一个简洁的API,用户只需指定任务类型和模型名称,即可轻松完成任务。例如,情感分析、文本分类、命名实体识别等。

  2. 自动化的模型和分词器加载:基于用户指定的任务和模型,pipeline()会自动从Hugging Face Hub下载并加载相应的预训练模型和分词器。

  3. 灵活性:尽管pipeline()为用户提供了一个简化的接口,但它仍然允许用户自定义模型、分词器和其他配置,以满足特定的需求。

  4. 支持多种NLP任务:pipeline()支持多种NLP任务,包括文本分类、命名实体识别、文本生成、问答等,这意味着用户不需要为每个任务单独学习和配置。

  5. 中文NLP任务的简化:对于中文NLP任务,pipeline()同样表现出色。由于中文是一种没有明确单词边界的语言,因此分词尤为重要。pipeline()自动处理中文的分词,使得处理中文文本变得简单。用户只需提供中文输入,pipeline()会负责后续的所有处理步骤。

  3.3.2 Pipeline功能及其用法示例

  Pipeline的主要功能是将模型与其必要的预处理和后处理步骤连接起来,允许我们直接输入任何文本并获得可理解的答案。下面我们给出几个例子帮助大家理解 pipeline 的用法和功能。

  3.3.2.1 示例一、单任务处理

  下面我们针对一句话“I love transformer based AIGC.”进行情感分析。

  3.3.2.1.1 代码解读

  可以看到,短短几行代码就实现了一个情感分析的示例。这段代码使用了Hugging Face的transformers库来进行情感分析。下面是对代码的逐步解释:

  1. “from transformers import pipeline”:

   这行代码从transformers库中导入了pipeline函数。pipeline是一个高级工具,它可以自动为您处理模型的下载、加载、预处理和后处理。

  2. classifier = pipeline("sentiment-analysis"):

  这里,我们创建了一个名为classifier的对象,它是一个情感分析的pipeline。当我们指定"sentiment-analysis"作为pipeline的类型时,它会自动选择一个预训练的模型,该模型已经被微调用于情感分析任务。

  3. classifier("I love transformer based AIGC."):

  这行代码将一个字符串传递给classifier对象进行情感分析。这个字符串是"I love transformer based AIGC."。

  4. 输出中的警告信息:

  No model was supplied, defaulted to distilbert-base-uncased-finetuned-sst-2-english and revision af0f99b (https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english).

  这告诉我们,因为我们没有明确指定要使用的模型,所以pipeline默认选择了distilbert-base-uncased-finetuned-sst-2-english这个模型。这个模型是一个DistilBERT模型,已经被微调用于情感分析任务。

  Using a pipeline without specifying a model name and revision in production is not recommended.:

  这是一个建议,告诉我们在生产环境中使用pipeline时,最好明确指定模型名称和版本,以确保结果的一致性和可靠性。

  5. 输出结果[{'label': 'POSITIVE', 'score': 0.9996548891067505}]:

  这是模型对输入文本的情感分析结果。它返回了一个字典列表,其中每个字典包含两个键:label和score。

  label: 这是模型预测的情感标签。在这个例子中,它是POSITIVE,表示模型认为这句话传达了正面情感。

  score: 这是模型对其预测的置信度。在这个例子中,得分接近1(0.9996548891067505),这意味着模型非常确信这句话是正面的。

  3.3.2.2 示例二、中文处理

  如上可以看到,缺省的模型是英文模型,不能识别中文。如果我们想要处理中文,就需要加载中文模型,这里我们选用一个支持中文的模型“distilbert-base-multilingual-cased-sentiments-student”, 对句子“我爱喝溧阳白茶”进行情感分析。

  3.3.2.2.1 代码解释

  创建情感分析对象

  pipeline("sentiment-analysis"):这表示我们正在创建一个用于情感分析的pipeline对象。

  model="lxyuan/distilbert-base-multilingual-cased-sentiments-student":这指定了我们要使用的预训练模型。这个模型是一个多语言模型,可以处理多种语言,包括中文。它是由用户lxyuan在Hugging Face模型库中分享的。

  top_k = None:这表示我们想要获取所有可能的情感标签及其对应的分数,而不仅仅是得分最高的k个标签。

  对中文文本进行情感分析

  这行代码将一个中文字符串传递给MyClassifier对象进行情感分析。

  输出结果解释

  输出结果是一个列表,其中包含了三个字典,每个字典代表一个情感标签及其对应的分数:

   'label': 'positive':这表示文本的情感被判断为正面。

   'score': 0.8396058678627014:这表示模型对其判断为正面情感的置信度为83.96%。

  同样地,其他两个标签neutral和negative分别表示中性和负面情感,以及模型对这两种情感的置信度。

  从结果中,我们可以看到模型非常确信这句话是正面的,因为正面情感的得分最高。

  3.3.2.3 示例三、多任务处理

  Pipeline还可以一次处理多个任务,即一次对多个句子进行情感判断。例如,给定两个句子:"我爱喝溧阳白茶" 和"夏天,我很讨厌蚊子咬我", 我们看一下如何通过 Pipeline 进行处理。

  3.3.2.3.1代码解释

  1. pipeline创建:我们使用pipeline函数创建了一个情感分析对象MyClassifier。这个对象被配置为使用lxyuan/distilbert-base-multilingual-cased-sentiments-student模型,这是一个多语言模型,专门用于情感分析。

  2. 情感分析:我们传递了一个包含两个句子的列表给MyClassifier对象。这意味着我们一次性对两个句子进行情感分析。

  3.3.2.3.2 结果解读

  输出结果是一个列表,其中每个元素对应于输入句子的情感分析结果。

  对于句子"我爱喝溧阳白茶":

  正面情感得分为83.96%

  中性情感得分为11.74%

  负面情感得分为4.30%

  对于句子"夏天,我很讨厌蚊子咬我":

  负面情感得分为77.64%

  中性情感得分为13.76%

  正面情感得分为8.60%

  从结果中,我们可以看到第一个句子被判断为正面情感,而第二个句子被判断为负面情感。这与我们的直觉相符,因为第一个句子表达了对白茶的喜爱,而第二个句子表达了对蚊子的厌恶。

  3.3.3 Pipeline 使用注意事项

  默认情况下,pipeline选择了一个特定的、语言为英语的微调过的预训练模型。当你创建classifier对象时,模型会被下载并缓存。如果你重新运行命令,将使用缓存的模型,无需再次下载。

  当你将一些文本传递给一个pipeline时,涉及到三个主要步骤:

  1. 文本被预处理成模型可以理解的格式。

  2. 预处理后的输入传递给模型。

  3. 模型的预测结果进行后处理,以便你可以理解它们。

  在使用 pipeline 的过程中,我们需要注意:

  选择合适的任务:确保为pipeline()指定正确的任务名称,例如'sentiment-analysis'、'question-answering'等。

  输入格式:根据所选任务,确保提供正确格式的输入。例如,问答任务通常需要一个包含'context'和'question'的字典作为输入。

  模型选择:虽然pipeline()可以自动选择适当的模型,但为了获得最佳性能,建议用户根据具体需求选择特定的预训练模型。

  计算资源:某些大型模型可能需要大量的计算资源。确保您的设备有足够的内存来加载和运行所选的模型。

  输出解析:pipeline()的输出通常是一个字典或字典列表。确保正确解析这些输出以获取所需的信息。

  总之,Hugging Face的pipeline()为NLP任务提供了一个简单而强大的工具,特别是对于那些希望快速获得结果,而不想深入了解模型内部工作原理的用户。对于中文NLP任务,pipeline()通过自动化的分词和模型加载,极大地简化了处理流程,使得中文NLP变得更加容易和直观。不过,为了充分利用其潜力,用户应该熟悉其功能,并注意在使用过程中可能遇到的问题。

 

 

 

责任编辑:李楠

分享到:
版权声明:凡注明来源“流媒体网”的文章,版权均属流媒体网所有,转载需注明出处。非本站出处的文章为转载,观点供业内参考,不代表本站观点。文中图片均来源于网络收集整理,仅供学习交流,版权归原作者所有。如涉及侵权,请及时联系我们删除!