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, AutoTokenizermodel = 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_idsgen_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 GPT2Tokenizertokenizer = 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 GPT2TokenizerFasttokenizer = 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 torchtokenizer = 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>)
'''