项目介绍:gpt2-small-portuguese
简介
GPorTuguese-2(葡萄牙语GPT-2 small)是一个用于葡萄牙语文本生成及其他自然语言处理(NLP)任务的尖端语言模型。它基于GPT-2 small模型,主要针对葡萄牙语维基百科进行训练。通过迁移学习和微调技术,在不到一天的时间内完成了训练,使用的是一块NVIDIA V100 32GB显卡和略高于1GB的训练数据。这一项目证明了即使在低资源的情况下,也能够实现高水平的语言模型。
模型的微调基于英语预训练的GPT-2 small,利用了Hugging Face的Transformers和Tokenizers库,并结合了fastai v2的深度学习框架。详细信息和请求请访问"Faster than training from scratch — Fine-tuning the English GPT-2 in any language with Hugging Face and fastai v2"。
模型信息
模型名 | 参数量 | 模型文件(pt/tf) | 架构 | 训练/验证数据(文本) |
---|---|---|---|---|
gpt2-small-portuguese | 124M | 487M / 475M | GPT-2 small | 葡萄牙语维基百科(1.28 GB / 0.32 GB) |
评价结果
在超过一天的时间(我们只使用了一块NVIDIA V100 32GB显卡;通过分布式数据并行训练模式,可将时间缩短至10小时,仅需两块显卡),我们得到了3.17的损失,37.99%的准确率和23.76的困惑度。
经过 ... 轮次 | 损失 | 准确率 (%) | 困惑度 | 每轮次时间 | 累积时间 |
---|---|---|---|---|---|
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 基本信息
GPT-2是一个基于Transformer架构的模型,在一个非常大的英语数据集上进行自监督训练。这意味着,模型在没有人工标记的数据集上进行训练,主要任务是预测句子中的下一个词。这种训练方式利用了广泛的公开数据,通过自动化过程生成输入和标签。
GPT-2内部使用了一种掩码机制,确保每个词元的预测仅依赖于它之前的输入而不是以后。通过这种方式,模型学到了英语语言的内部表示法,这对后续的任务提取有益。
如何使用 GPorTuguese-2(PyTorch)
以下代码段展示了如何使用PyTorch:
from transformers import AutoTokenizer, AutoModelWithLMHead
import torch
tokenizer = AutoTokenizer.from_pretrained("pierreguillou/gpt2-small-portuguese")
model = AutoModelWithLMHead.from_pretrained("pierreguillou/gpt2-small-portuguese")
# 获取最大序列长度为1024
tokenizer.model_max_length=1024
model.eval() # 禁用dropout(或保留在训练模式以进行微调)
生成一个词
# 输入序列
text = "Quem era Jim Henson? Jim Henson era um"
inputs = tokenizer(text, return_tensors="pt")
# 模型输出
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])
# 结果
print('输入文本:', text)
print('预测文本:', predicted_text)
# 输入文本: Quem era Jim Henson? Jim Henson era um
# 预测文本: homem
完整生成一个序列
# 输入序列
text = "Quem era Jim Henson? Jim Henson era um"
inputs = tokenizer(text, return_tensors="pt")
# 使用Top-k采样文本生成方法的模型输出
sample_outputs = model.generate(inputs.input_ids,
pad_token_id=50256,
do_sample=True,
max_length=50, # 可设置所需的词元数
top_k=40,
num_return_sequences=1)
# 生成的序列
for i, sample_output in enumerate(sample_outputs):
print(">> 生成的文本 {}\n\n{}".format(i+1, tokenizer.decode(sample_output.tolist())))
# >> 生成的文本
# 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。
使用 GPorTuguese-2(TensorFlow)
以下代码段展示了如何使用TensorFlow:
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")
# 获取最大序列长度为1024
tokenizer.model_max_length=1024
model.eval() # 禁用dropout(或保留在训练模式以进行微调)
完整生成一个序列
# 输入序列
text = "Quem era Jim Henson? Jim Henson era um"
inputs = tokenizer.encode(text, return_tensors="tf")
# 使用Top-k采样文本生成方法的模型输出
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]))
# >> 生成的文本
# 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,在敏感偏见的应用场合中应采取警惕态度。
作者
葡萄牙语GPT-2 small由Pierre GUILLOU训练与评估,感谢其所属的巴西利亚大学AI实验室提供的GPU计算能力,以及教授Fabricio Ataides Braz和Nilton Correia da Silva在NLP策略定义方面的参与。
引用
如使用我们的工作,请引用:
@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}
}