NLP 教程

NLP 工具库

NLP 神经网络

NLP 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/nlp-transformers.html

Hugging Face 的 transformers 强大自然语言处理工具库


transformers 库是知名的 NLP 社区 Hugging-Face 提供的自然语言处理工具库,它提供了数以千计针对于各种任务的预训练模型,开发者可以根据自身的需要,选择模型并进行训练或微调,也可阅读 api 文档和源码,快速开发新模型。

安装

安装命令:

pip install transformers

然后,

import transformers

基础组件

transformers 由如下几大组件构成:

  • pipeline: pipeline() 函数是最基本的对象,它将模型与其必要的预处理和后处理步骤连接起来,使我们能够直接输入任何文本并获得答案。
  • Tokenizer:与其他神经网络一样,Transformer 模型不能直接处理原始文本,故使用分词器进行预处理。
  • Model:顾名思义,它包含了各种现成的开源预训练库。
  • Trainer:Trainer 中配置具体的训练用到的内容,包括模型、训练参数、训练集、验证集、分词器、评估函数等内容。

Tokenizer

BertTokenizer.from_pretrained 是 Hugging Face 的 Transformers 库中的一个方法,用于从预训练模型中加载一个 BERT tokenizer。这个方法可以让你使用预先训练好的 BERT 模型的 tokenizer 来对文本进行编码,以便用于后续的自然语言处理任务。

示例如下:

from transformers import BertTokenizer
from transformers.utils import PaddingStrategy

tokenizer = BertTokenizer.from_pretrained('chinese_roberta_L-2_H-128')
query = 'bert'
text = '神经网络算法 - 一文搞懂BERT(基于Transformer的双向编码器)'
ids_inputs = tokenizer(query, text, padding=PaddingStrategy.LONGEST, truncation=True, return_tensors="pt")
print('ids_inputs', ids_inputs)

如上示例,tokenizer 直接调用了 __call__ 函数,底层其实是调用 encode_plus 函数,该函数参数详细如下:

def encode_plus(
        self,
        text: Union[TextInput, PreTokenizedInput, EncodedInput],
        text_pair: Optional[Union[TextInput, PreTokenizedInput, EncodedInput]] = None,
        add_special_tokens: bool = True,
        padding: Union[bool, str, PaddingStrategy] = False,
        truncation: Union[bool, str, TruncationStrategy] = None,
        max_length: Optional[int] = None,
        stride: int = 0,
        is_split_into_words: bool = False,
        pad_to_multiple_of: Optional[int] = None,
        return_tensors: Optional[Union[str, TensorType]] = None,
        return_token_type_ids: Optional[bool] = None,
        return_attention_mask: Optional[bool] = None,
        return_overflowing_tokens: bool = False,
        return_special_tokens_mask: bool = False,
        return_offsets_mapping: bool = False,
        return_length: bool = False,
        verbose: bool = True,
        **kwargs,
    ) -> BatchEncoding:

参数详解如下:

  • text
    • 这是要编码的文本字符串。你可以传入单个句子或者一段文本。
  • text_pair
    • 默认为 None,这是可选的参数,用于传入第二个句子,通常用于处理包含两个句子的任务,例如文本对分类或问答任务。
  • add_special_tokens
    • 默认为 True,这是一个布尔值参数,指示是否在编码后的 tokens 前后添加特殊 token。通常情况下,这些特殊 token 是 [CLS] (用于句子分类任务的起始 token)和 [SEP] (用于句子间分隔的 token)。如果设置为 True,那么编码的结果中将包含这些特殊 token。
  • padding
    • (默认为 'longest'),这是一个字符串参数,用于指定填充的策略。它有以下几种选择:
      • 'longest': 将所有句子填充到 batch 中最长的句子的长度。
      • 'max_length': 将所有句子填充到指定的 max_length 参数指定的最大长度。
      • 'do_not_pad': 不填充任何句子。
    • 该参数主要用于将输入的句子批量化,以便用于模型训练。
  • truncation
    • (默认为 False),这是一个布尔值参数,用于指示是否对超过最大长度限制的句子进行截断。如果设置为 True,那么超过指定长度的部分将被截断掉。
  • max_length
    • (默认为 None),这是一个整数参数,用于指定编码后的 tokens 序列的最大长度。如果设置了 padding='max_length',那么文本将被填充到该长度。
  • return_tensors
    • (默认为 None),这是一个字符串参数,用于指定返回的张量类型。可以设置为 'pt' 以返回 PyTorch 张量,或者 'tf' 以返回 TensorFlow 张量。
  • return_attention_mask
    • (默认为 True),这是一个布尔值参数,用于指示是否返回 attention mask。如果设置为 True,则返回的编码结果中将包含一个 attention mask,用于指示模型在处理输入时应该忽略填充的部分。
  • return_token_type_ids
    • (默认为 None),这是一个布尔值参数,用于指示是否返回 token type IDs。在处理包含两个句子的任务时,通常会用到 token type IDs 来区分不同句子的 tokens。如果设置为 True,则返回的编码结果中将包含 token type IDs。
  • return_overflowing_tokens
    • (默认为 False),这是一个布尔值参数,用于指示是否返回溢出的 tokens。当输入文本太长,被截断成多个子句时,设置为 True 则会返回截断掉的 tokens。
  • return_special_tokens_mask
    • (默认为 False),这是一个布尔值参数,用于指示是否返回特殊 tokens 的 mask。特殊 tokens 是添加的 [CLS][SEP] 等 tokens,该参数可以用于指示哪些 token 是特殊 token。
  • return_offsets_mapping
    • (默认为 False),这是一个布尔值参数,用于指示是否返回 token 在原始文本中的偏移量。如果设置为 True,则返回的结果中将包含每个 token 在原始文本中的起始和结束偏移量。

Model

PreTrainedModel 是 Hugging Face Transformers 库中的一个基础类,用于所有预训练模型的基础模型类。它提供了加载、保存和使用预训练模型的通用接口。

下面解释一下它的主要功能和作用:

  • 加载预训练模型

    • PreTrainedModel.from_pretrained() 方法可以用于从 Hugging Face 模型存储库中加载预训练的模型。你可以传入模型的名称(如 "bert-base-uncased" )或模型文件的路径。
  • 模型架构

    • PreTrainedModel 类定义了通用的预训练模型的基础架构。它提供了一种抽象的方式来定义预训练模型的基本组件,包括输入处理、模型体系结构和输出。
  • 模型参数

    • PreTrainedModel 类包含了所有预训练模型共享的参数和方法。这些参数和方法包括模型的配置(如词汇表大小、隐藏层大小等)、模型的权重和偏置参数等。
  • 通用接口

    • PreTrainedModel 类定义了一系列通用的方法,用于模型的加载、保存、序列化、反序列化等操作。这些方法包括 save_pretrained()from_pretrained()to()from_dict() 等。
  • 适用范围

    • PreTrainedModel 类是所有预训练模型类的基类,包括 BERT、GPT、RoBERTa、DistilBERT 等。每个具体的预训练模型都是基于 PreTrainedModel 类的子类,继承了其通用接口和功能。

通过继承 PreTrainedModel 类,具体的预训练模型类可以重写和扩展其方法,以适应特定的模型结构和任务需求。例如,BERT 模型通过继承 PreTrainedModel 类,重写了其中的部分方法,并添加了额外的输入处理逻辑和任务特定的输出层,从而定义了 BertModelBertForSequenceClassificationBertForQuestionAnswering 等具体的模型类。

BertModel 类是 Hugging Face Transformers 库中的一个类,用于加载预训练的 BERT 模型并对文本进行编码、特征提取或下游任务 fine-tuning。

下面解释一下它的主要组成部分和功能:

  • 加载预训练模型

    • BertModel.from_pretrained() 方法可以用于从 Hugging Face 模型存储库中加载预训练的 BERT 模型。你可以传入模型的名称(如 "bert-base-uncased" )或模型文件的路径。
  • 模型架构

    • BERT 模型采用 Transformer 架构,包含多个 Transformer 层。每个 Transformer 层包含多头自注意力机制和前馈神经网络。BERT 在预训练时包含了大量的参数,通过大规模语料库上的无监督学习来学习文本的表示。
  • 文本编码

    • BertModel 可以用来对文本进行编码。给定输入的 token IDs,它会返回每个 token 的隐藏状态表示。这些表示可以用于下游任务,如文本分类、命名实体识别等。
  • 特征提取

    • 除了文本编码外,你还可以使用 BertModel 来提取文本中的特征。通过调用 BertModel 实例的 forward() 方法,你可以得到每个 token 的隐藏状态表示,从而进行特征提取、语义相似度计算等任务。
  • Fine-tuning

    • 除了在预训练模型上进行特征提取外,你还可以在预训练模型上进行 fine-tuning,以适应特定的下游任务。你可以通过加载预训练模型,添加适当的输出层,并在特定任务上进行训练。
  • 适用范围

    • BertModel 是用于处理单个句子的文本的,如果你需要处理包含两个句子的任务,如文本对分类或问答任务,你可以使用 BertForSequenceClassificationBertForQuestionAnswering 等其他模型类型。

以 Bert 举例,结合如上示例中的 BertTokenizer 定义对象,具体如下:

from transformers import BertForSequenceClassification

model = BertForSequenceClassification.from_pretrained('chinese_roberta_L-2_H-128', num_labels=2,
                                                      classifier_dropout=0.2)
print(model)
with torch.no_grad():  # 如果没有进行训练,可以关闭梯度计算以节省内存和计算资源
    outputs = model(**ids_inputs)
    print(outputs)

NLP,英文全称 Natural Language Processing,中文叫自然语言处理,它是人工智能和语言学领域的分支学科。该领域探讨 ...
Guava 是一个 Google 开发的基于 Java 的类库集合的扩展项目,包括集合、缓存、原生类型支持、并发库、通用注解、字符串处理、I ...
我们知道 jdk 的 bin 目录之中有很多命令行工具,这些命令主要包括用于监视虚拟机和故障处理的工具。Sun JDK 监控和故障处理工具主 ...
Redis 有很多图形化的管理工具,常见的 Redis GUI 工具有 Redis Desktop Manager(又名 RDM)、Anot ...
Matplotlib 是 Python 的绘图库。它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。它也可以和图形 ...