0 使用的tips
- GPT-2是一个具有绝对位置嵌入的模型,因此通常建议在输入的右侧而不是左侧填充
- GPT-2是通过因果语言建模(CLM)目标进行训练的,因此在预测序列中的下一个标记方面非常强大
- 利用这一特性,GPT-2可以生成语法连贯的文本
- GPT-2可以接受past_key_values(对于PyTorch)或past(对于TF)作为输入
- 这些是先前计算的键/值注意力对。‘
- 使用这个(past_key_values或past)值可以防止模型在文本生成过程中重新计算预计算的值
- 启用scale_attn_by_inverse_layer_idx和reorder_and_upcast_attn标志将应用Mistral的训练稳定性改进(仅适用于PyTorch)
1 基本实例
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
prompt = "GPT2 is a model developed by OpenAI."
input_ids = tokenizer(prompt, return_tensors="pt").input_ids
gen_tokens = model.generate(
input_ids,
do_sample=True,
temperature=0.9,
max_length=100,
)
gen_text = tokenizer.batch_decode(gen_tokens)[0]
print(gen_text)
'''
GPT2 is a model developed by OpenAI. It helps to define the neural network of a person with Autism. The researchers have previously identified the basic network of neurons in the brain responsible for processing emotional information. They also found that the person with Autism has similar information processing abilities as other people with similar intelligence.
The researchers say that it's important to look beyond the normal limitations of the human brain. "This type of neuroimaging has been really important," explains Michael A. Be
'''
2 GPT2Config
- 用于存储 GPT2Model配置的配置类。
- 根据指定的参数实例化一个 GPT-2 模型,定义模型架构
- 使用默认值实例化配置将产生类似于 GPT-2 openai-community/gpt2 架构的配置:
2.1 主要参数
vocab_size | (int, 可选,默认值为 50257) — GPT-2 模型的词汇表大小 |
n_positions | (int, 可选,默认值为 1024) — 该模型可能使用的最大序列长度。 |
n_embd | (int, 可选,默认值为 768) — 嵌入和隐藏状态的维度 |
n_layer | (int, 可选,默认值为 12) — Transformer 编码器中的隐藏层数量 |
n_head | (int, 可选,默认值为 12) — Transformer 编码器中每个注意力层的注意力头数量 |
n_inner | (int, 可选) — 内部前馈层的维度。设置为 None 将其设置为 4 * n_embd |
activation_function | (str, 可选,默认值为 "gelu_new") — 激活函数 可在以下列表中选择 ["relu", "silu", "gelu", "tanh", "gelu_new"] |
resid_pdrop | (float, 可选,默认值为 0.1) — 嵌入、编码器和池化器中所有全连接层的丢弃概率 |
embd_pdrop | (float, 可选,默认值为 0.1) — 嵌入的丢弃率 |
attn_pdrop | (float, 可选,默认值为 0.1) — 注意力的丢弃率 |
layer_norm_epsilon | (float, 可选,默认值为 1e-05) — 层归一化层中使用的epsilon值 |
initializer_range | (float, 可选,默认值为 0.02) — 初始化所有权重矩阵时截断正态初始化器的标准差 |
scale_attn_weights | (bool, 可选,默认值为 True) — 通过除以 sqrt(hidden_size) 来缩放注意力权重 |
bos_token_id | (int, 可选,默认值为 50256) — 词汇表中句子起始标记的 ID |
eos_token_id | (int, 可选,默认值为 50256) — 词汇表中句子结束标记的 ID |
scale_attn_by_inverse_layer_idx | (bool, 可选,默认值为 False) — 是否另外通过 1 / (layer_idx + 1) 缩放注意力权重 |
2.2 举例
from transformers import GPT2Config, GPT2Model
# 初始化 GPT2 配置
configuration = GPT2Config()
configuration
'''
GPT2Config {
"activation_function": "gelu_new",
"attn_pdrop": 0.1,
"bos_token_id": 50256,
"embd_pdrop": 0.1,
"eos_token_id": 50256,
"initializer_range": 0.02,
"layer_norm_epsilon": 1e-05,
"model_type": "gpt2",
"n_embd": 768,
"n_head": 12,
"n_inner": null,
"n_layer": 12,
"n_positions": 1024,
"reorder_and_upcast_attn": false,
"resid_pdrop": 0.1,
"scale_attn_by_inverse_layer_idx": false,
"scale_attn_weights": true,
"summary_activation": null,
"summary_first_dropout": 0.1,
"summary_proj_to_labels": true,
"summary_type": "cls_index",
"summary_use_proj": true,
"transformers_version": "4.41.2",
"use_cache": true,
"vocab_size": 50257
}
'''
# 根据配置初始化模型(具有随机权重)
model = GPT2Model(configuration)
3 GPT2Tokenizer
注:GPT2分词器经过训练将空格视为标记的一部分,因此一个单词在句子的开头(没有空格)或其他地方将被编码为不同的方式
3.1 主要参数
vocab_file | 词汇文件的路径 |
merges_file | 合并文件的路径 |
unk_token | (str, 可选,默认值为 "") — 未知标记。不在词汇表中的标记无法转换为 ID,将被设置为此标记 |
bos_token | (str, 可选,默认值为 "") — 序列开始标记 |
eos_token | (str, 可选,默认值为 "") — 序列结束标记 |
pad_token | (str, 可选) — 用于填充的标记,例如在批处理不同长度的序列时 |
add_prefix_space | (bool, 可选,默认值为 False) — 是否在输入的开头添加一个空格。这允许将前导词视为任何其他词一样处理。 |
add_bos_token | (bool, 可选,默认值为 False) — 是否在输入的开头添加一个序列开始标记。这允许将前导词视为任何其他词一样处理 |
3.2 举例
from transformers import GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("openai-community/gpt2")
tokenizer("Hello world"),tokenizer(" Hello world")
'''
({'input_ids': [15496, 995], 'attention_mask': [1, 1]},
{'input_ids': [18435, 995], 'attention_mask': [1, 1]})
'''
4 GPT2TokenizerFast
4.1 参数、
vocab_file | 词汇文件的路径 |
merges_file | 合并文件的路径 |
unk_token | (str, 可选,默认值为 "") — 未知标记。不在词汇表中的标记无法转换为 ID,将被设置为此标记 |
bos_token | (str, 可选,默认值为 "") — 序列开始标记 |
eos_token | (str, 可选,默认值为 "") — 序列结束标记 |
add_prefix_space | (bool, 可选,默认值为 False) — 是否在输入的开头添加一个空格。这允许将前导词视为任何其他词一样处理。 |
4.2 举例
和GPT2Tokenizer类似
from transformers import GPT2TokenizerFast
tokenizer = GPT2TokenizerFast.from_pretrained("openai-community/gpt2")
tokenizer("Hello world"),tokenizer(" Hello world")
'''
({'input_ids': [15496, 995], 'attention_mask': [1, 1]},
{'input_ids': [18435, 995], 'attention_mask': [1, 1]})
'''
4.3 和GPT2Tokenizer的区别
底层库
- GPT2TokenizerFast:基于 HuggingFace 的
tokenizers
库,这个库使用 Rust 实现了快速的分词算法,特别是字节对编码(Byte-Pair Encoding, BPE)。 - GPT2Tokenizer:基于 Python 实现,使用较慢的分词方法。
性能
- GPT2TokenizerFast:通常更快且更高效,特别是在处理大批量文本时。这是由于其使用了低级语言(Rust)的高效实现。
- GPT2Tokenizer:相对较慢,因为它是纯 Python 实现的,计算效率较低。
5 GPT2DoubleHeadsModelOutput
预测两个句子是否连续的模型输出的基类
6 GPT2Model
裸 GPT-2 模型,输出原始的隐藏状态,没有任何特定的头部
6.1 forward 方法
6.1.1 参数
input_ids | (torch.LongTensor,形状为 (batch_size, input_ids_length)) 输入序列标记在词汇表中的索引。 如果使用 |
past_key_values | Tuple[Tuple[torch.Tensor]],长度为 包含模型计算的预计算隐藏状态(注意力块中的键和值)。 可以用来加速顺序解码。输入的 |
attention_mask | torch.FloatTensor,形状为 (batch_size, sequence_length),可选 掩码,用于避免在填充标记索引上执行注意力。 掩码值选择为 [0, 1]:1 表示未被掩码的标记,0 表示被掩码的标记。 |
token_type_ids | (torch.LongTensor,形状为 (batch_size, input_ids_length),可选) — 段标记索引,用于指示输入的第一部分和第二部分。 索引选择为 [0, 1]:0 对应句子 A 标记,1 对应句子 B 标记。 |
position_ids | (torch.LongTensor,形状为 (batch_size, sequence_length),可选) 每个输入序列标记在位置嵌入中的位置索引。 选择范围为 [0, config.max_position_embeddings - 1] |
head_mask | (torch.FloatTensor,形状为 (num_heads,) 或 (num_layers, num_heads),可选) — 掩码,用于取消选择的自注意力模块头部。 掩码值选择为 [0, 1]:1 表示头部未被掩码,0 表示头部被掩码 |
inputs_embeds | (torch.FloatTensor,形状为 (batch_size, sequence_length, hidden_size),可选) 可以选择直接传递嵌入表示而不是 |
encoder_hidden_states | (torch.FloatTensor,形状为 (batch_size, sequence_length, hidden_size),可选) — 编码器隐藏状态。 |
encoder_attention_mask | (torch.FloatTensor,形状为 (batch_size, sequence_length),可选) — 编码器注意力掩码。 |
use_cache | (bool, 可选) — 如果设置为 True,则返回 past_key_values 键值状态,可用于加速解码 |
output_attentions | (bool, 可选) — 是否返回所有注意力层的注意力张量 |
output_hidden_states | (bool, 可选) — 是否返回所有层的隐藏状态 |
6.1.2 返回值
last_hidden_state | (torch.FloatTensor,形状为 (batch_size, sequence_length, hidden_size)) — 模型最后一层的隐藏状态序列。 如果使用 |
past_key_values | tuple(tuple(torch.FloatTensor)),可选,当传递 长度为 用来加速顺序解码 |
hidden_states | (tuple(torch.FloatTensor),可选,当传递 包含 torch.FloatTensor 的元组(如果模型具有嵌入层,则为嵌入输出的一个 + 每层输出的一个),形状为 (batch_size, sequence_length, hidden_size)。 模型在每层输出的隐藏状态加上可选的初始嵌入输出的隐藏状态。 |
attentions | (tuple(torch.FloatTensor),可选,当传递 包含 torch.FloatTensor 的元组(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)。 注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。 |
cross_attentions | (tuple(torch.FloatTensor),可选,当传递 包含 torch.FloatTensor 的元组(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)。 解码器交叉注意力层的注意力权重,在注意力 softmax 后,用于计算交叉注意力头中的加权平均值。 |
6.1.3 举例
from transformers import AutoTokenizer, GPT2Model
import torch
tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
model = GPT2Model.from_pretrained("openai-community/gpt2")
inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state
last_hidden_states
'''
tensor([[[-9.3295e-06, -1.4021e-01, -2.0845e-01, ..., -1.5329e-01,
-6.7826e-02, -1.9630e-01],
[ 4.1949e-01, 2.3525e-01, 3.4816e-01, ..., 4.5321e-02,
1.5447e-01, 1.9546e-02],
[-7.0056e-02, 2.6082e-01, -2.9146e-01, ..., 9.0979e-02,
4.9659e-01, -4.1824e-01],
[-1.9695e-01, -2.9247e-01, -1.4119e-01, ..., -8.9255e-02,
-2.2392e-01, 1.2212e-01],
[-6.4193e-01, -1.0236e-01, -4.2129e-01, ..., 6.8697e-02,
-5.1117e-01, 5.0044e-01],
[ 4.1290e-03, -3.1455e-02, -1.0823e+00, ..., -5.0159e-02,
-3.0878e-02, 4.3480e-01]]], grad_fn=<ViewBackward0>)
'''