PyTorch-Transformers初识

文章出处: https://baijiahao.baidu.com/s?id=1640539349483912777&wfr=spider&for=pc

Transformers 理解: https://www.analyticsvidhya.com/blog/2019/06/understanding-transformers-nlp-state-of-the-art-models/?utm_source=blog&utm_medium=pytorch-transformers-nlp-python

PyTorch-Transformers是一个最先进的自然语言处理预训练模型库

这个库目前包含PyTorch实现、预训练的模型权重、使用脚本和用于以下模型的转换工具:

BERT(来自谷歌) 与论文BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 一起发布GPT(来自OpenAI) 与论文 Improving Language Understanding by Generative Pre-Training 一起发布GPT-2(来自OpenAI) 与论文 Language Models are Unsupervised Multitask Learners 一起发布Transformer-XL(来自谷歌/CMU) 与论文 Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context 一起发布XLNet (来自谷歌/CMU) 与论文 XLNet: Generalized Autoregressive Pretraining for Language Understanding 一起发布XLM (来自Facebook) 与论文 Cross-lingual Language Model Pretraining一起发布上述所有模型都是适用于各种NLP任务的最佳模型。

GPT-2

2019年2月,OpenAI发布了一种新的基于transformer语言模型GPT-2,引起了不小的轰动。GPT-2是一种于基于transformer的生成语言模型,它基于来自互联网上的40GB的精选文本进行训练。

在无监督的方式下进行训练,它只学会根据通过训练学会识别的模式预测最可能遵循给定句子的序列(即单词)。

XLNet

XLNet将来自Transformer-XL(最先进的自回归模型)的思想运用到预训练中。从经验上看,XLNet在20个任务上的表现都比BERT好,而且通常是占据很大的优势。XLNet在18项任务上取得了最先进的结果,包括问答、自然语言推理、情感分析和文档排序。

你可以用下面的代码来做实现同样的功能:

!python pytorch-transformers/examples/run_generation.py \ --model_type=xlnet \ --length=50 \ --model_name_or_path=xlnet-base-cased \这是XLNet生成的输出

Transformer-XL

Transformer网络受到固定长度上下文的限制,因此可以通过学习长期依赖(longer-term dependency)来改进。这就是为什么谷歌提出了一种称为Transformer-XL(意为超长)的语言建模新方法,它使Transformer体系结构能够学习长期依赖。

Transformer-XL比标准Transformer快1800倍。

你可以使用以下代码运行Transformer-XL:

!python pytorch-transformers/examples/run_generation.py \ --model_type=transfo-xl \ --length=100 \ --model_name_or_path=transfo-xl-wt103 \以下是生成的文本

 

BERT框架是来自谷歌AI的一种新的语言表征模型,它使用预训练和微调来为各种任务创建最先进的NLP模型。这些任务包括问答系统、情感分析和语言推理。

BERT使用以下两个无监督预测任务进行预训练:

Masked Language Modeling (MLM)Next Sentence Prediction你可以使用PyTorch-Transformers实现这两个任务。实际上,你可以从头构建自己的BERT模型,也可以对预训练版本进行微调。那么,让我们看看如何为BERT实现遮蔽语言模型。

问题定义

让我们正式定义我们的问题:

给定一个输入序列,我们将随机屏蔽一些单词。然后,模型应该根据上下文中提供的其他非屏蔽词预测屏蔽词的原始值。

那么我们为什么要这么做呢?因为模型在训练过程中学习语言规则。我们很快就会看到这个过程有多有效。

首先,让我们使用BertTokenizer从一个文本字符串准备一个标记化的输入:

import torchfrom pytorch_transformers import BertTokenizer, BertModel, BertForMaskedLM# 加载预训练模型 tokenizer (vocabulary)tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')# 标记化输出text = "[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]"tokenized_text = tokenizer.tokenize(text)这是我们的文本在标记化之后的样子:

PyTorch-Transformers初识_第1张图片

 

下一步将把它转换成一个整数序列,并创建它们的PyTorch张量,以便我们可以直接使用它们进行计算:

# 掩码一个标记,我们将尝试用' BertForMaskedLM '预测回来masked_index = 8tokenized_text[masked_index] = '[MASK]'assert tokenized_text == ['[CLS]', 'who', 'was', 'jim', 'henson', '?', '[SEP]', 'jim', '[MASK]', 'was', 'a', 'puppet', '##eer', '[SEP]']# 将标记转换为词汇表索引indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)segments_ids = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]# 将输入转换为PyTorch张量tokens_tensor = torch.tensor([indexed_tokens])segments_tensors = torch.tensor([segments_ids])注意,我们将[MASK]设置在句子的第8个索引处,即单词' Hensen '。这就是我们的模型要预测的。

现在我们的数据已经正确地为BERT进行了预处理,我们将创建一个遮蔽语言模型。现在让我们使用BertForMaskedLM来预测一个屏蔽标记:

# 加载预训练模型 (weights)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')# 预测所有的tokenswith 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([predicted_index])[0]assert predicted_token == 'henson'print('Predicted token is:',predicted_token)让我们看看我们的模型输出是什么:

Predicted token is: henson这是一个在单个输入序列上训练遮蔽语言模型的小演示。然而,对于许多基于Transformer的架构来说,它是训练过程中非常重要的一部分。这是因为它允许模型中的双向训练——这在以前是不可能的。

恭喜你,因为你刚刚实现了你的第一个遮蔽语言模型! 如果你想训练BERT,你只完成了一半的工作。这个例子将使你对如何使用PyTorch-Transformers来处理BERT模型有一个很好的了解。

总结

在本文中,我们使用PyTorch-Transformers实现并探索了各种最先进的NLP模型,如BERT、GPT-2、Transformer-XL和XLNet。我这样做是为了让你们对如何使用这个神奇的库有一个很好的直观感受。

下是我认为你会喜欢这个库的6个理由:

预训练模型:为6种最先进的NLP架构提供了预训练模型,并为27种模型的变化提供了预训练的权重预处理和微调API:PyTorch-Transformers不会在预训练权重停止。它还提供了一个简单的API,用于执行这些模型所需的所有预处理和微调步骤。现在,如果你读过最近的研究论文,你就会知道许多最先进的模型都有独特的预处理数据的方法,而且很多时候为整个预处理管道编写代码会很麻烦使用脚本:它还附带了一些脚本,用于在基准NLP数据集上运行这些模型,比如SQUAD2.0(Stanford Question Answering Dataset)和GLUE(General Language Understanding Evaluation)。通过使用yTorch-Transformers,你可以直接针对这些数据集运行模型,并相应地评估性能多语言:PyTorch-Transformers支持多种语言。这是因为有些模型已经可以很好地用于多种语言TensorFlow兼容性:你可以将ensorFlow checkpoints作为PyTorch中的模型导入BERTology:越来越多的研究领域关注于研究像BERT这样的大型transformers的内部工作(有人称之为“BERT学”)

你可能感兴趣的:(Python,自然语言处理)