token验证原理,tokenizer

  

  Concept Transformers是一个旨在为NLP研究人员使用/研究/扩展大型变压器模型的库。   

  

  图书馆的设计有两个强有力的目标:3360   

  

  尽可能简单快速地使用:我们限制面向对象抽象类的数量,以尽可能地学习。其实几乎没有什么抽象。每个模型只需要使用三个标准类,配置、模型和令牌化器。所有这些类都可以通过使用常见的from _ pre-trained()实例化方法,以简单统一的方式从_pretrained实例初始化,该方法将负责从库中下载、缓存和加载相关类提供的预训练模型或您自己保存的模型。因此,这个库不是构建神经网络模块的工具箱。如果要扩展/构建这个库,只需使用常规的Python/PyTorch模块,从这个库的基类继承,就可以重用模型加载/保存等功能。为最高级的模型提供性能尽可能接近的原模型3360我们为每个架构至少提供一个例子,再现了上述架构的官方作者提供的结果代码通常尽可能接近原代码,这意味着有些PyTorch代码可能不是pytorch类的,因为这是TensorFlow代码转换的结果。其他几个目标:   

  

  尽可能一致地暴露模型内部3360我们使用一个API来访问所有隐藏状态和注意力权重,并将tokenizer和基本模型的API标准化,以方便模型之间的切换。使用主观选择的有希望的工具3360来微调/调查这些模型,向词汇表和嵌入项添加新标签以进行微调的简单/一致的方法,屏蔽和修整变压器头部的简单方法。这个库的主要概念是为每个型号3360构建三种类型的类。   

  

  模型类是库中目前提供的八种模型架构的PyTorch模型(torch.nn.Modules),比如BertModelconfiguration类,它存储了构建模型所需的所有参数,比如BertConfig。您不必总是自己实例化这些配置,尤其是如果您正在使用一个没有任何修改的预训练模型。创建一个模型会自动负责实例化configuration(它是模型的一部分)tokenizer类,该类存储每个模型的词汇表,并提供对要交付给模型的词汇表嵌入索引列表中的字符串进行编码/解码的方法,比如BertTokenizer。所有这些类都可以从预训练的模型实例化,3360可以使用两种方法保存在本地。   

  

  From _ pre-training()允许你从_pretraining版本中实例化一个模型/配置/令牌化器,它可以由库本身提供(目前这里列出了27个模型)或者由用户存储在本地(或者服务器上)。Save _ pre-training()允许您在本地保存模型/配置/令牌化器,以便您可以使用from _ pre-training(我们将通过一些简单的快速入门示例来完成这个快速入门之旅,以了解如何实例化和使用这些类。其余的文件分为两部分:   

  

  主要的类详细介绍了三个主要类(配置、模型、令牌化器)的公共函数/方法/属性,以及一些作为训练工具提供的优化类。包引用详细描述了每个模型架构的每个类的所有变体,尤其是在调用它们时它们的预期输入和输出。快速入门:这里有两个例子来展示一些Bert和GPT2类和预培训模型。   

  

  有关每个模型类的示例,请参见完整的API参考。   

  

  Bert示例让我们首先使用BERTTokenizer从文本字符串准备一个标记的输入(要输入到BERT的标记嵌入在索引列表中)   

  

  从变压器导入火炬导入BertTokenizer、BertModel、BertForMaskedLM#可选:如果您想了解发生的信息,请按以下步骤记录器导入日志记录日志记录。基本配置(级别=日志记录.信息)#加载预训练的模型标记器(词汇表)tokenizer=bertokenizer。from _预训练(' Bert-base-un cased ')#标记输入谁是吉姆汉森?吉姆汉森是一个木偶师用" BertForMaskedLM "掩盖我们试图预测的标记` masked _ index=8 token ized _ text=' ' assert token ized _ text==' ',' who ',' was ',' jim ',' henson ','?'、''、'吉姆'、''、'曾是'、'一个'、'木偶、' ##eer '、' #将标记转换为词汇索引indexed _ tokens=tokenizer。convert _ tokens _ to _ ids(tokenized _ text)#定义与第一句和   

第二句相关的句子A和B索引(见论文)segments_ids = <0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1># 将输入转换为PyTorch张量tokens_tensor = torch.tensor()segments_tensors = torch.tensor()让我们看看如何使用BertModel在隐藏状态下对输入进行编码:

  

# 加载预训练模型(权重)model = BertModel.from_pretrained('bert-base-uncased')# 将模型设置为评估模式# 在评估期间有可再现的结果这是很重要的!model.eval()# 如果你有GPU,把所有东西都放在cuda上tokens_tensor = tokens_tensor.to('cuda')segments_tensors = segments_tensors.to('cuda')model.to('cuda')#预测每个层的隐藏状态特征with torch.no_grad(): # 有关输入的详细信息,请参见models文档字符串 outputs = model(tokens_tensor, token_type_ids=segments_tensors) # Transformer模型总是输出元组。 # 有关所有输出的详细信息,请参见模型文档字符串。在我们的例子中,第一个元素是Bert模型最后一层的隐藏状态 encoded_layers = outputs<0># 我们已将输入序列编码为形状(批量大小、序列长度、模型隐藏维度)的FloatTensorassert tuple(encoded_layers.shape) == (1, len(indexed_tokens), model.config.hidden_size)以及如何使用BertForMaskedLM预测屏蔽的标记:

  

# 加载预训练模型(权重)model = BertForMaskedLM.from_pretrained('bert-base-uncased')model.eval()# 如果你有GPU,把所有东西都放在cuda上tokens_tensor = tokens_tensor.to('cuda')segments_tensors = segments_tensors.to('cuda')model.to('cuda')# 预测所有标记with torch.no_grad(): outputs = model(tokens_tensor, token_type_ids=segments_tensors) predictions = outputs<0># 确认我们能预测“henson”predicted_index = torch.argmax(predictions<0, masked_index>).item()predicted_token = tokenizer.convert_ids_to_tokens()<0>assert predicted_token == 'henson'OpenAI GPT-2下面是一个快速开始的例子,使用GPT2Tokenizer和GPT2LMHeadModel类以及OpenAI的预训练模型来预测文本提示中的下一个标记。

  

首先,让我们使用GPT2Tokenizer

  

import torchfrom transformers import GPT2Tokenizer, GPT2LMHeadModel# 可选:如果您想了解发生的信息,请按以下步骤loggerimport logginglogging.basicConfig(level=logging.INFO)# 加载预训练模型(权重)tokenizer = GPT2Tokenizer.from_pretrained('gpt2')# 编码输入text = "Who was Jim Henson ? Jim Henson was a"indexed_tokens = tokenizer.encode(text)# 转换为PyTorch tensortokens_tensor = torch.tensor()让我们看看如何使用GPT2LMHeadModel生成下一个跟在我们的文本后面的token:

  

# 加载预训练模型(权重)model = GPT2LMHeadModel.from_pretrained('gpt2')# 将模型设置为评估模式# 在评估期间有可再现的结果这是很重要的!model.eval()# 如果你有GPU,把所有东西都放在cuda上tokens_tensor = tokens_tensor.to('cuda')model.to('cuda')# 预测所有标记with torch.no_grad(): outputs = model(tokens_tensor) predictions = outputs<0># 得到预测的下一个子词(在我们的例子中,是“man”这个词)predicted_index = torch.argmax(predictions<0, -1, :>).item()predicted_text = tokenizer.decode(indexed_tokens + )assert predicted_text == 'Who was Jim Henson? Jim Henson was a man'每个模型架构(Bert、GPT、GPT-2、Transformer XL、XLNet和XLM)的每个模型类的示例,可以在文档中找到。

  

使用过去的GPT-2以及其他一些模型(GPT、XLNet、Transfo XL、CTRL),使用past或mems属性,这些属性可用于防止在使用顺序解码时重新计算键/值对。它在生成序列时很有用,因为注意力机制的很大一部分得益于以前的计算。

  

下面是一个使用带past的GPT2LMHeadModel和argmax解码的完整工作示例(只能作为示例,因为argmax decoding引入了大量重复):

  

from transformers import GPT2LMHeadModel, GPT2Tokenizerimport torchtokenizer = GPT2Tokenizer.from_pretrained("gpt2")model = GPT2LMHeadModel.from_pretrained('gpt2')generated = tokenizer.encode("The Manhattan bridge")context = torch.tensor()past = Nonefor i in range(100): print(i) output, past = model(context, past=past) token = torch.argmax(output<..., -1, :>) generated += context = token.unsqueeze(0)sequence = tokenizer.decode(generated)print(sequence)由于以前所有标记的键/值对都包含在past,因此模型只需要一个标记作为输入。

  

Model2Model示例编码器-解码器架构需要两个标记化输入:一个用于编码器,另一个用于解码器。假设我们想使用Model2Model进行生成性问答,从标记将输入模型的问答开始。

  

import torchfrom transformers import BertTokenizer, Model2Model# 可选:如果您想了解发生的信息,请按以下步骤loggerimport logginglogging.basicConfig(level=logging.INFO)# 加载预训练模型(权重)tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# 编码输入(问题)question = "Who was Jim Henson?"encoded_question = tokenizer.encode(question)# 编码输入(答案)answer = "Jim Henson was a puppeteer"encoded_answer = tokenizer.encode(answer)# 将输入转换为PyTorch张量question_tensor = torch.tensor()answer_tensor = torch.tensor()让我们看看如何使用Model2Model获取与此(问题,答案)对相关联的loss值:

  

#为了计算损失,我们需要向解码器提供语言模型标签(模型生成的标记id)。lm_labels = encoded_answerlabels_tensor = torch.tensor()# 加载预训练模型(权重)model = Model2Model.from_pretrained('bert-base-uncased')# 将模型设置为评估模式# 在评估期间有可再现的结果这是很重要的!model.eval()# 如果你有GPU,把所有东西都放在cuda上question_tensor = question_tensor.to('cuda')answer_tensor = answer_tensor.to('cuda')labels_tensor = labels_tensor.to('cuda')model.to('cuda')# 预测每个层的隐藏状态特征with torch.no_grad(): # 有关输入的详细信息,请参见models文档字符串 outputs = model(question_tensor, answer_tensor, decoder_lm_labels=labels_tensor) # Transformers模型总是输出元组。 # 有关所有输出的详细信息,请参见models文档字符串 # 在我们的例子中,第一个元素是LM损失的值 lm_loss = outputs<0>此损失可用于对Model2Model的问答任务进行微调。假设我们对模型进行了微调,现在让我们看看如何生成答案:

  

# 让我们重复前面的问题question = "Who was Jim Henson?"encoded_question = tokenizer.encode(question)question_tensor = torch.tensor()# 这次我们试图生成答案,所以我们从一个空序列开始answer = ""encoded_answer = tokenizer.encode(answer, add_special_tokens=False)answer_tensor = torch.tensor()# 加载预训练模型(权重)model = Model2Model.from_pretrained('fine-tuned-weights')model.eval()# 如果你有GPU,把所有东西都放在cuda上question_tensor = question_tensor.to('cuda')answer_tensor = answer_tensor.to('cuda')model.to('cuda')# 预测所有标记with torch.no_grad(): outputs = model(question_tensor, answer_tensor) predictions = outputs<0># 确认我们能预测“jim”predicted_index = torch.argmax(predictions<0, -1>).item()predicted_token = tokenizer.convert_ids_to_tokens()<0>assert predicted_token == 'jim'

相关文章