模型简介
模型特点
模型能力
使用案例
🚀 GPorTuguese-2:用于葡萄牙语文本生成(及更多NLP任务……)的语言模型
GPorTuguese-2(葡萄牙语版GPT - 2小型模型)是基于GPT - 2小型模型的最先进的葡萄牙语语言模型。它借助“迁移学习和微调技术”,在一块NVIDIA V100 32GB的GPU上,仅用一天多的时间,使用略超1GB的训练数据,在葡萄牙语维基百科上完成了训练。这一成果证明,利用有限的资源也能为任何语言打造出最先进的语言模型。
该模型是在英文预训练的GPT - 2小型模型基础上,通过Hugging Face库(Transformers和Tokenizers)并结合fastai v2深度学习框架进行微调得到的,运用了fastai v2的所有微调技术。目前,该模型已在Hugging Face上发布。如需了解更多信息或提出相关请求,请访问“比从头开始训练更快 — 使用Hugging Face和fastai v2对英文GPT - 2进行任意语言的微调(以葡萄牙语为例)”。
✨ 主要特性
- 资源高效:仅用一块NVIDIA V100 32GB的GPU和略超1GB的训练数据,在一天多时间内完成训练,证明了低资源条件下训练先进语言模型的可行性。
- 技术先进:基于GPT - 2小型模型,运用迁移学习和微调技术,结合Hugging Face库和fastai v2深度学习框架进行训练。
- 应用广泛:可用于葡萄牙语文本生成及其他自然语言处理任务。
📦 安装指南
文档未提及具体安装步骤,暂不提供相关内容。
📚 详细文档
模型
属性 | 详情 |
---|---|
模型类型 | gpt2-small-portuguese |
参数数量 | 1.24亿 |
模型文件(pt/tf) | 487M / 475M |
架构 | GPT - 2小型 |
训练/验证数据(文本) | 葡萄牙语维基百科(1.28 GB / 0.32 GB) |
评估结果
在略超一天的时间里(仅使用了一块NVIDIA V100 32GB的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
注意:此信息复制自[模型:gpt2 >> GPT - 2](https://huggingface.co/gpt2#gpt - 2)。
GPT - 2是使用因果语言建模(CLM)目标在英语语料上进行预训练的模型。该模型在[这篇论文](https://d4mucfpksywv.cloudfront.net/better - language - models/language_models_are_unsupervised_multitask_learners.pdf)中被提出,并于2019年2月14日在[此页面](https://openai.com/blog/better - language - models/)首次发布。
声明:发布GPT - 2的团队也为其模型撰写了[模型卡片](https://github.com/openai/gpt - 2/blob/master/model_card.md)。Hugging Face团队对该模型卡片的内容进行了补充,以完善信息并给出具体的偏差示例。
模型描述
注意:此信息复制自[模型:gpt2 >> 模型描述](https://huggingface.co/gpt2#model - description)。
GPT - 2是一个以自监督方式在大量英语数据语料上进行预训练的Transformer模型。这意味着它仅在原始文本上进行预训练,无需人工进行任何标注(因此可以使用大量公开可用的数据),并通过自动流程从这些文本中生成输入和标签。更确切地说,它的训练目标是预测句子中的下一个单词。
具体而言,输入是一定长度的连续文本序列,目标是相同的序列,但向右移动一个标记(单词或单词片段)。模型内部使用掩码机制,确保对标记i
的预测仅使用从1
到i
的输入,而不使用未来的标记。
通过这种方式,模型学习到英语语言的内部表示,可用于提取对下游任务有用的特征。不过,该模型在其预训练任务上表现最佳,即根据提示生成文本。
局限性和偏差
该模型的训练数据来自葡萄牙语维基百科。我们知道其中包含大量来自互联网的未经过滤的内容,远非中立。正如OpenAI团队在其模型卡片中所指出的:
由于像GPT - 2这样的大规模语言模型无法区分事实与虚构,因此我们不支持要求生成文本必须为真实内容的用例。此外,像GPT - 2这样的语言模型反映了其训练数据中固有的偏差,因此我们不建议将它们部署到与人类交互的系统中,除非部署者首先对与预期用例相关的偏差进行研究。我们发现7.74亿参数和15亿参数版本的GPT - 2在性别、种族和宗教偏差探测方面没有统计学上的显著差异,这意味着在处理对人类属性偏差敏感的用例时,所有版本的GPT - 2都应谨慎使用。
作者
葡萄牙语版GPT - 2小型模型由Pierre GUILLOU训练和评估。这得益于[AI Lab](https://www.linkedin.com/company/ailab - unb/)(巴西利亚大学)提供的GPU(NVIDIA V100 32GB)计算能力。作者作为该实验室的NLP副研究员参与其中,并且该实验室的主任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}
}
💻 使用示例
基础用法
使用HuggingFace(PyTorch)
# 加载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")
# 获取最大序列长度为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('input text:', text)
print('predicted text:', predicted_text)
# input text: Quem era Jim Henson? Jim Henson era um
# predicted text: 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(">> 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及其子词分词器(字节级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")
# 获取最大序列长度为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]))
# >> 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
📄 许可证
本项目采用MIT许可证。



