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。
- 默认为 True,这是一个布尔值参数,指示是否在编码后的 tokens 前后添加特殊 token。通常情况下,这些特殊 token 是
padding
:- (默认为 'longest'),这是一个字符串参数,用于指定填充的策略。它有以下几种选择:
- 'longest': 将所有句子填充到 batch 中最长的句子的长度。
- 'max_length': 将所有句子填充到指定的
max_length
参数指定的最大长度。 - 'do_not_pad': 不填充任何句子。
- 该参数主要用于将输入的句子批量化,以便用于模型训练。
- (默认为 'longest'),这是一个字符串参数,用于指定填充的策略。它有以下几种选择:
truncation
:- (默认为 False),这是一个布尔值参数,用于指示是否对超过最大长度限制的句子进行截断。如果设置为 True,那么超过指定长度的部分将被截断掉。
max_length
:- (默认为 None),这是一个整数参数,用于指定编码后的 tokens 序列的最大长度。如果设置了
padding='max_length'
,那么文本将被填充到该长度。
- (默认为 None),这是一个整数参数,用于指定编码后的 tokens 序列的最大长度。如果设置了
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。
- (默认为 False),这是一个布尔值参数,用于指示是否返回特殊 tokens 的 mask。特殊 tokens 是添加的
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
类,重写了其中的部分方法,并添加了额外的输入处理逻辑和任务特定的输出层,从而定义了 BertModel
、 BertForSequenceClassification
、 BertForQuestionAnswering
等具体的模型类。
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
是用于处理单个句子的文本的,如果你需要处理包含两个句子的任务,如文本对分类或问答任务,你可以使用BertForSequenceClassification
或BertForQuestionAnswering
等其他模型类型。
以 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)