语言: 葡萄牙语
小部件:
- 文本: "吉姆·汉森是谁?吉姆·汉森是一个"
- 文本: "在一项令人震惊的发现中,科学家发现了一个"
- 文本: "巴拉克·侯赛因·奥巴马二世,出生于1961年8月4日,是"
- 文本: "新冠疫苗竞赛已有"
许可证: mit
数据集:
- 维基百科
GPorTuguese-2:一个用于葡萄牙语文本生成的语言模型(及其他NLP任务...)
简介
GPorTuguese-2(葡萄牙语GPT-2小型版)是基于GPT-2小型模型的最先进葡萄牙语语言模型。
它通过迁移学习和微调技术在葡萄牙语维基百科上训练,仅用一天多时间,在一块32GB显存的NVIDIA V100 GPU上完成,训练数据略超1GB。
这证明了在资源有限的情况下,为任何语言开发最先进的语言模型是可行的。
该模型从英文预训练的GPT-2小型版微调而来,使用了Hugging Face库(Transformers和Tokenizers)结合fastai v2深度学习框架。所有fastai v2的微调技术均被采用。
现已在Hugging Face平台发布。更多信息或请求,请参阅“比从头训练更快——使用Hugging Face和fastai v2微调英文GPT-2至任意语言(葡萄牙语实战案例)”。
模型
模型 |
参数量 |
模型文件(pt/tf) |
架构 |
训练/验证数据(文本) |
gpt2-small-portuguese |
124M |
487M / 475M |
GPT-2小型 |
葡萄牙语维基百科(1.28 GB/0.32 GB) |
评估结果
仅用一天多时间(仅使用一块32GB显存的NVIDIA V100 GPU;若采用分布式数据并行(DDP)训练模式,使用2块GPU可将时间缩短至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
注:信息复制自Model: gpt2 >> GPT-2
基于因果语言建模(CLM)目标在英语上预训练的模型。由此论文提出,并于此页面首次发布(2019年2月14日)。
免责声明:发布GPT-2的团队也为模型撰写了模型卡片。本卡片内容由Hugging Face团队补充,提供具体偏见示例。
模型描述
注:信息复制自Model: gpt2 >> 模型描述
GPT-2是基于海量英文语料以自监督方式预训练的transformers模型。这意味着它仅对原始文本进行预训练,无需人工标注(因此可利用大量公开数据),通过自动过程从文本生成输入和标签。具体而言,它被训练来预测句子中的下一个词。
更准确地说,输入是一定长度的连续文本序列,目标是相同的序列向右移动一个词(或子词)。模型内部使用掩码机制确保对第i
个词的预测仅使用1
到i
的输入,而不依赖后续词。
通过这种方式,模型学习英语的内部表示,可用于提取下游任务的有用特征。但模型最擅长其预训练目标——根据提示生成文本。
如何使用GPorTuguese-2(HuggingFace PyTorch版)
以下代码使用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")
tokenizer.model_max_length=1024
model.eval()
生成单个词
text = "吉姆·汉森是谁?吉姆·汉森是一个"
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)
生成完整序列
text = "吉姆·汉森是谁?吉姆·汉森是一个"
inputs = tokenizer(text, return_tensors="pt")
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())))
如何使用GPorTuguese-2(HuggingFace TensorFlow版)
以下代码使用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")
tokenizer.model_max_length=1024
model.eval()
生成完整序列
text = "吉姆·汉森是谁?吉姆·汉森是一个"
inputs = tokenizer.encode(text, return_tensors="tf")
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]))
局限性与偏见
本模型的训练数据来自葡萄牙语维基百科。我们知道其中包含大量未经过滤的互联网内容,远非中立。正如OpenAI团队在其模型卡片中指出:
由于像GPT-2这样的大规模语言模型无法区分事实与虚构,我们不支持需要生成文本绝对真实的使用场景。此外,此类模型反映了训练系统的固有偏见,除非部署者首先进行与预期用例相关偏见的深入研究,否则不建议将其部署到与人类交互的系统中。我们发现774M和1.5B版本在性别、种族和宗教偏见探针上无显著差异,意味着所有GPT-2版本在涉及人类属性敏感场景时都需同等谨慎。
作者
葡萄牙语GPT-2小型版由Pierre GUILLOU训练和评估,得益于AI Lab(巴西利亚大学)的GPU(32GB显存NVIDIA V100)计算资源。作为NLP领域的副研究员,作者参与了NLP战略制定,并感谢实验室主任Fabricio Ataides Braz教授和Nilton Correia da Silva教授的指导。
引用
若使用本作品,请引用:
@inproceedings{pierre2020gpt2smallportuguese,
title={GPorTuguese-2(葡萄牙语GPT-2小型版):用于葡萄牙语文本生成的语言模型(及其他NLP任务...)},
author={Pierre Guillou},
year={2020}
}