模型:

pierreguillou/gpt2-small-portuguese

英文

GPorTuguese-2:一种用于葡萄牙文文本生成(以及更多NLP任务)的语言模型

引言

GPorTuguese-2(葡萄牙语GPT-2小型)是一种基于GPT-2小型模型的葡萄牙语最先进的语言模型。

它是使用在一个GPU NVIDIA V100 32GB上并使用超过1GB的训练数据进行的迁移学习和微调技术在一天多的时间内对葡萄牙语维基百科进行训练的。

这是一个概念验证,证明只使用有限资源就可以获得最先进的语言模型。

它是使用 fastai v2 的深度学习框架将Hugging Face库(Transformers和Tokenizers)进行封装对 English pre-trained GPT-2 small 进行微调的。使用了所有微调fastai v2的技术。

它现在可以在Hugging Face上使用。如需更多信息或请求,请访问“ Faster than training from scratch — Fine-tuning the English GPT-2 in any language with Hugging Face and fastai v2 (practical case with Portuguese) ”。

模型

Model #params Model file (pt/tf) Arch. Training /Validation data (text)
gpt2-small-portuguese 124M 487M / 475M GPT-2 small Portuguese Wikipedia (1.28 GB / 0.32 GB)

评估结果

在一天多的时间内(我们只使用了一个GPU NVIDIA V100 32GB;通过分布式数据并行(DDP)训练模式,如果使用2个GPU,我们可以将时间缩短三分之一到10小时),我们得到了3.17的损失,37.99%的准确率和23.76的困惑度(请参见下面的验证结果表格)。

after ... epochs loss accuracy (%) perplexity time by epoch cumulative time
0 9.95 9.90 20950.94 00:00:00 00:00:00
1 3.64 32.52 38.12 5:48:31 5:48:31
2 3.30 36.29 27.16 5:38:18 11:26:49
3 3.21 37.46 24.71 6:20:51 17:47:40
4 3.19 37.74 24.21 6:06:29 23:54:09
5 3.17 37.99 23.76 6:16:22 30:10:31

GPT-2

注意: 从 Model: gpt2 >> GPT-2 复制/粘贴的信息

预训练模型用于英语,使用原因语言建模(CLM)目标。它在此 paper 中被介绍,并在此 page (2019年2月14日)首次发布。

声明:发布GPT-2的团队还为他们的模型书写了 model card 。本模型使用Hugging Face团队编写的内容完成了他们提供的信息,并给出了特定的偏见示例。

模型描述

注意:从 Model: gpt2 >> Model description 复制/粘贴的信息

GPT-2是在一个非常大的英语语料库上以自监督的方式预训练的变换器模型。这意味着它仅根据原始文本进行预训练,没有以任何方式对其进行人工标注(这就是为什么它可以使用大量公开可用的数据),它使用自动生成输入和标签的自动过程从这些文本中。更准确地说,它被训练来猜测句子中的下一个单词。

更准确地说,输入是一些连续文本的序列,目标是相同序列向右偏移一个令牌(单词或词片段)。模型在内部使用掩码机制,以确保令牌i的预测仅使用从1到i的输入,而不使用未来的令牌。

这样,模型学习了一种内在的英语语言表示,可以用来提取对下游任务有用的特征。然而,模型最擅长它预训练的任务,即从提示生成文本。

如何使用HuggingFace(PyTorch)的GPorTuguese-2

以下代码使用PyTorch。要使用TensorFlow,请查看相应的段落。

加载GPorTuguese-2及其子词分词器(字节级BPE)

from transformers import AutoTokenizer, AutoModelWithLMHead
import torch

tokenizer = AutoTokenizer.from_pretrained("pierreguillou/gpt2-small-portuguese")
model = AutoModelWithLMHead.from_pretrained("pierreguillou/gpt2-small-portuguese")

# Get sequence length max of 1024
tokenizer.model_max_length=1024 

model.eval()  # disable dropout (or leave in train mode to finetune)

生成一个单词

# input sequence
text = "Quem era Jim Henson? Jim Henson era um"
inputs = tokenizer(text, return_tensors="pt")

# model output
outputs = model(**inputs, labels=inputs["input_ids"])
loss, logits = outputs[:2]
predicted_index = torch.argmax(logits[0, -1, :]).item()
predicted_text = tokenizer.decode([predicted_index])

# results
print('input text:', text)
print('predicted text:', predicted_text)

# input text: Quem era Jim Henson? Jim Henson era um
# predicted text:  homem

生成一个完整序列

# input sequence
text = "Quem era Jim Henson? Jim Henson era um"
inputs = tokenizer(text, return_tensors="pt")

# model output using Top-k sampling text generation method
sample_outputs = model.generate(inputs.input_ids,
                                pad_token_id=50256,
                                do_sample=True, 
                                max_length=50, # put the token number you want
                                top_k=40,
                                num_return_sequences=1)

# generated sequence
for i, sample_output in enumerate(sample_outputs):
    print(">> Generated text {}\n\n{}".format(i+1, tokenizer.decode(sample_output.tolist())))

# >> Generated text
# Quem era Jim Henson? Jim Henson era um executivo de televisão e diretor de um grande estúdio de cinema mudo chamado Selig,
# depois que o diretor de cinema mudo Georges Seuray dirigiu vários filmes para a Columbia e o estúdio.    

如何使用HuggingFace(TensorFlow)的GPorTuguese-2

以下代码使用TensorFlow。要使用PyTorch,请查看上面的相应段落。

加载GPorTuguese-2及其子词分词器(字节级BPE)

from transformers import AutoTokenizer, TFAutoModelWithLMHead
import tensorflow as tf

tokenizer = AutoTokenizer.from_pretrained("pierreguillou/gpt2-small-portuguese")
model = TFAutoModelWithLMHead.from_pretrained("pierreguillou/gpt2-small-portuguese")

# Get sequence length max of 1024
tokenizer.model_max_length=1024 

model.eval()  # disable dropout (or leave in train mode to finetune)

生成一个完整序列

# input sequence
text = "Quem era Jim Henson? Jim Henson era um"
inputs = tokenizer.encode(text, return_tensors="tf")

# model output using Top-k sampling text generation method
outputs = model.generate(inputs, eos_token_id=50256, pad_token_id=50256, 
                         do_sample=True,
                         max_length=40,
                         top_k=40)
print(tokenizer.decode(outputs[0]))

# >> Generated text
# Quem era Jim Henson? Jim Henson era um amigo familiar da família. Ele foi contratado pelo seu pai 
# para trabalhar como aprendiz no escritório de um escritório de impressão, e então começou a ganhar dinheiro

限制和偏见

用于此模型的训练数据来自葡萄牙维基百科。我们知道它包含了大量来自互联网的未经筛选的内容,这与中立相去甚远。如openAI团队在其模型卡中指出的那样:

由于GPT-2等大规模语言模型无法区分事实和虚构,因此我们不支持需要生成的文本为真实内容的用例。此外,GPT-2等语言模型反映了训练它们的系统固有的偏见,因此我们不建议将其部署到与人类进行交互的系统中,除非部署者首先对与拟部署用例相关的偏见进行研究。我们在男女、种族和宗教偏见探测方面没有发现774M和1.5B之间的统计学显着差异,这意味着GPT-2的所有版本在处理与人类属性相关的偏见敏感用例时应以类似的注意水平对待。

作者

葡萄牙语GPT-2 small是由 Pierre GUILLOU 进行了训练和评估,感谢GPU(GPU NVIDIA V100 32GB)和 AI Lab (巴西利亚大学)的计算能力,我作为NLP的副研究员隶属于该大学,并参与其葡萄牙语开发战略的制定,教授Fabricio Ataides Braz和Nilton Correia da Silva。

引用

如果您使用了我们的作品,请引用:

@inproceedings{pierre2020gpt2smallportuguese,
  title={GPorTuguese-2 (Portuguese GPT-2 small): a Language Model for Portuguese text generation (and more NLP tasks...)},
  author={Pierre Guillou},
  year={2020}
}