使用Hugging Face Transformers创建BERT嵌入

使用Hugging Face Transformers创建BERT嵌入

介绍

Transformer最初是为了将文本从一种语言转换为另一种语言而创建的。BERT对我们研究和处理人类语言的方式产生了很大的影响。它改进了原始Transformer模型中理解文本的部分。创建BERT嵌入特别擅长理解意义复杂的句子。它通过检查整个句子并理解单词之间的连接方式来实现这一点。Hugging Face transformers库在创建独特的句子编码和引入BERT方面起着关键作用。

学习目标

  • 深入了解BERT和预训练模型。了解它们在处理人类语言方面的重要性。
  • 学习如何有效使用Hugging Face Transformers库。使用它来创建文本的特殊表示。
  • 找到正确移除预训练BERT模型中这些表示的各种方法。这很重要,因为不同的语言任务需要不同的方法。
  • 通过实际操作来获得实际经验,完成创建这些表示所需的步骤。确保你能独立完成。
  • 学习如何使用你所创建的这些表示来改进其他语言任务,如排序文本或理解文本中的情感。
  • 探索调整预训练模型以在特定语言任务中更好地工作。这可以获得更好的结果。
  • 了解这些表示在哪些地方用于改进语言任务的工作方式。看看它们如何提高语言模型的准确性和性能。

本文作为Data Science Blogathon的一部分发布。

在Transformer的上下文中,管道包括哪些内容?

将管道视为一个用户友好的工具,它简化了transformers库中的复杂代码。它们使人们可以轻松使用模型来处理理解语言、分析情感、提取特征、回答问题等任务。它们为与这些强大模型交互提供了一个简洁的方式。

管道包括几个重要组件:分词器(将常规文本转换为模型可以处理的较小单元)、模型本身(根据输入进行预测)以及一些额外的准备步骤以确保模型运行良好。

为什么需要使用Hugging Face Transformers?

Transformer模型通常非常庞大,处理训练和在实际应用中使用它们可能非常复杂。Hugging Face transformers旨在简化整个过程。它们提供了一种加载、训练和保存任何Transformer模型的统一方式,无论其规模有多大。使用不同的软件工具来处理模型的不同部分更加方便。您可以使用一组工具对其进行训练,然后轻松地在不同的地方用于实际任务,而无需太多麻烦。

高级特性

  • 这些现代模型易于使用,并在理解和生成人类语言以及与计算机视觉和音频相关的任务中产生出色的结果。
  • 它们还有助于节省计算机处理能力,并且对环境更友好,因为研究人员可以共享他们已经训练好的模型,这样其他人就不必再次进行训练。
  • 只需几行代码,您就可以为模型的每个步骤选择最佳的软件工具,无论是训练、测试还是用于实际任务。
  • 此外,每种类型模型都有丰富的示例,使您可以根据原始创建者的做法轻松满足您的特定需求。

Hugging Face教程

本教程旨在帮助您了解与数据集一起工作的基础知识。HuggingFace transformers的主要目标是使加载不同格式或类型的数据集变得更加容易。

探索数据集

通常情况下,较大的数据集会产生更好的结果。Hugging Face的Dataset库具有一个功能,可以快速下载和准备许多公共数据集。您可以直接使用数据集中心的名称获取和存储数据集。结果类似于包含数据集所有部分的字典,您可以通过名称访问它们。

Hugging Face的Datasets库的一个很棒的功能是它如何管理计算机上的存储,并使用一种称为Apache Arrow的东西。这有助于处理甚至较大的数据集而不会使用太多内存。

通过查看数据集的特征,您可以了解更多关于数据集内部的内容。如果有不需要的部分,您可以轻松地将其删除。您还可以将标签的名称更改为“labels”(Hugging Face Transformers 模型所期望的名称),并将输出格式设置为不同的平台,如torch、TensorFlow 或 numpy。

语言翻译

翻译是将一个词组变成另一个词组的过程。从头开始创建一个新的翻译模型需要大量的两种或多种语言的文本。在本教程中,我们将让一个 Marian 模型更擅长将英语翻译成法语。它已经从大量的法语和英语文本中学到了很多知识,因此它已经有了一个良好的起点。完成后,我们将拥有一个更好的翻译模型。

from transformers import pipeline

translator = pipeline("translation_en_to_fr")
translation = translator("What's your name?")
## [{'translation_text': "Quel est ton nom ?"}]

零样本分类

这是一种特殊的文本排序方法,使用训练过的模型来理解自然语言。大多数文本排序器都有一个类别列表,但这个方法可以在阅读文本时决定使用哪些类别。这使得它非常适应性强,尽管可能会慢一些。它可以猜测一个文本大约属于15种不同的语言,即使它事先不知道可能的类别。您可以通过从中心获取该模型来轻松使用该模型。

情感分析

您可以使用 Hugging Face Transformers 中的“pipeline()”函数创建一个流水线,用于训练一个情感理解模型,然后使用该模型来分析情感。在这种情况下,您可以在中心找到一个特定模型,用于分类情感。

步骤1:获取您想要执行的任务的正确模型。例如,在这种情况下,我们正在获取用于分类情感的蒸馏 BERT 基础模型。

chosen_model = "distilbert-base-uncased-finetuned-sst-2-english"
distil_bert = pipeline(task="sentiment-analysis", model=chosen_model)

结果是,该模型已准备好执行所需的任务。

perform_sentiment_analysis(english_texts[1:])

该模型评估所提供的文本或句子中表达的情感。

问答

问答模型就像一个智能工具。您给它一些文本,它可以在其中找到答案。这对于从不同的文档中获取信息非常方便。这个模型的有趣之处在于,即使没有所有的背景信息,它也可以找到答案。

您可以使用问答模型和 Hugging Face Transformers 库中的“question-answering pipeline”轻松使用。

如果您不告诉它要使用哪个模型,该流水线将从一个名为“distilbert-base-cased-distilled-squad”的默认模型开始。该流水线接受一个问题和与问题相关的一些上下文,然后从该上下文中找出答案。

from transformers import pipeline

qa_pipeline = pipeline("question-answering")
query = "What is my place of residence?"
qa_result = qa_pipeline(question=query, context=context_text)
## {'answer': 'India', 'end': 39, 'score': 0.953, 'start': 31}

BERT 词嵌入

使用 BERT 分词器,使用 BERT 创建词嵌入的过程是将输入文本分解为其各个单词或部分。然后,该处理过的输入经过 BERT 模型,产生一系列隐藏状态。这些状态为输入文本中的每个单词创建了词嵌入。这是通过将隐藏状态与学习到的权重矩阵相乘来完成的。

BERT 词嵌入的特殊之处在于它们理解上下文。这意味着一个词的嵌入可能会根据它在句子中的用法而改变。其他词嵌入方法通常为一个词创建相同的嵌入,无论它在句子中出现在哪里。

为什么要使用BERT嵌入?

BERT是“双向编码器转换器表示”(Bidirectional Encoder Representations from Transformers)的缩写,是一种用于训练语言理解的智能系统。它为从事与语言相关任务的人们提供了一个无需付费的坚实基础。这些模型有两个主要用途:您可以使用它们从文本数据中获取更有用的信息,或者您可以使用您的数据对它们进行微调,以执行特定的任务,如排序、查找名称或回答问题。

一旦将一些信息(如句子、文档或图像)输入BERT,它就变得非常有用。BERT擅长从文本中提取重要的信息片段,如单词和句子的含义。这些信息片段对于查找关键词、搜索相似内容和获取信息等任务非常有帮助。BERT的特殊之处在于它不仅理解单词本身,还理解单词所在的上下文。这使得它比像Word2Vec这样不考虑周围单词的模型更加优秀。此外,BERT能够很好地处理单词的位置,这一点非常重要。

加载预训练BERT

Hugging Face Transformers允许您在PyTorch中使用BERT,您可以轻松安装它。该库还提供了与其他先进语言模型(如OpenAI的GPT和GPT-2)一起使用的工具。

!pip install transformers

您需要引入PyTorch、预训练的BERT模型以及一个BERT Tokenizer来开始使用。

import torch
from transformers import BertTokenizer, BertModel

Transformers为使用BERT进行许多任务提供了不同的类,例如理解令牌的类型和排序文本。但是,如果要获取单词表示,BertModel是最佳选择。

# OPTIONAL: 启用日志记录以跟踪信息
import logging

import matplotlib.pyplot as plt
%matplotlib inline

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# 加载预训练模型的分词器

输入格式化

当使用预训练的BERT模型处理人类语言时,确保输入数据格式正确非常重要。让我们来详细了解一下:

  1. 句子边界的特殊标记:BERT需要您的输入像一系列单词或子词片段一样,就像将句子分成更小的部分一样。您必须在每个句子的开头和结尾添加特殊的标记。
  2. 保持句子长度相同:为了有效处理大量输入数据,您必须确保所有句子的长度相同。您可以通过在较短的句子中添加额外的“填充”标记或缩短较长的句子来实现。
  3. 使用注意力掩码:当添加填充标记使句子长度相同时,您还会使用“注意力掩码”。这类似于一个帮助BERT知道哪些部分是实际单词(标记为1),哪些是填充(标记为0)的映射。当将输入数据提供给BERT模型时,该掩码与您的输入数据一起包含在内。

特殊标记

以下是这些标记在简单术语中的作用:

  1. [SEP]分隔句子:在句子的末尾添加[SEP]至关重要。当BERT看到两个句子并且需要理解它们之间的联系时,[SEP]帮助它知道一个句子的结束和下一个句子的开始。
  2. [CLS]显示主要观点:对于对文本进行分类或排序的任务,通常以[CLS]开头。它向BERT表明这是文本的主要观点或类别。

BERT有12个层,每个层都会为您提供一个与输入文本相同部分数量的摘要。但是,当这些摘要出来时,它们会有所不同。

分词

Hugging Face Transformers库中的“encode”函数可以准备和组织您的数据。在对文本使用此函数之前,您应该确定要使用的最长句子长度,以添加额外的单词或缩短较长的句子。

如何对文本进行分词?

tokenizer.encode_plus函数简化了几个过程:

  1. 将句子分割成标记
  2. 引入特殊的[SEP]和[CLS]标记
  3. 将标记映射到相应的ID
  4. 通过填充或截断确保统一的句子长度
  5. 创建区分实际标记和[PAD]标记的注意力掩码。
input_ids = []
attention_masks = []

# 对于每个句子...
for sentence in sentences:
    encoded_dict = tokenizer.encode_plus(
                        sentence,                  
                        add_special_tokens=True,   # 添加'[CLS]'和'[SEP]'
                        max_length=64,             # 调整句子长度
                        pad_to_max_length=True,    # 填充/截断句子
                        return_attention_mask=True,# 生成注意力掩码
                        return_tensors='pt',       # 返回PyTorch张量
                   )
    
   
    input_ids.append(encoded_dict['input_ids'])
    
    # 构造注意力掩码(识别填充/非填充)。
    attention_masks.append(encoded_dict['attention_mask'])

段落ID

在BERT中,我们看的是句子对。对于标记化的文本中的每个单词,我们确定它是否属于第一个句子(用0标记)还是第二个句子(用1标记)。

在这个上下文中处理句子时,您给第一个句子中的每个单词以0的值,同时给第二个句子中的所有单词以1的值。

现在,让我们谈谈如何使用BERT处理文本:

BERT模型学习了对英语的复杂理解,可以帮助您从文本中提取不同的文本方面以完成各种任务。

如果您有一组带有标签的句子,可以使用BERT模型生成的信息作为输入(即文本)训练一个普通的分类器。

使用TensorFlow使用此模型获取特定文本的特征:

from transformers import BertTokenizer, TFBertModel

tokenizer = BertTokenizer.from_pretrained('bert-base-cased')
model = TFBertModel.from_pretrained("bert-base-cased")

custom_text = "
欢迎使用您选择的任何文本。"
encoded_input = tokenizer(custom_text, return_tensors='tf')
output_embeddings = model(encoded_input)

结论

BERT是由Google开发的强大的计算机系统。它就像一个可以从文本中学习的聪明大脑。您可以通过教它特定的任务,比如理解一个句子的含义,使它变得更聪明。另一方面,HuggingFace是一个著名的开源库,用于处理语言。它提供了预训练的BERT模型,使得在特定语言任务中使用它们变得更加容易。

主要观点

  • 简单来说,使用预训练的BERT模型的词表示对于各种自然语言任务非常有用,比如对文本进行排序、理解文本中的情感以及识别事物的名称。
  • 这些模型已经从大数据集中学到了很多知识,并且在各种任务中表现良好。
  • 通过调整它们已经学到的知识,可以使它们在特定任务中表现得更好。
  • 此外,从模型中获取这些词表示有助于您在其他语言任务中使用它们所学到的知识,并且可以使其他模型工作得更好。总的来说,使用预训练的BERT模型进行词表示是一种有前途的语言处理方法。

常见问题

本文中显示的媒体不归Analytics Vidhya所有,仅根据作者的决定使用。