huggingface笔记:gpt2

news/2024/10/5 7:26:59/

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,则只有未计算 pastinput_ids 需要传递为 input_ids

past_key_values

Tuple[Tuple[torch.Tensor]],长度为 config.n_layers

包含模型计算的预计算隐藏状态(注意力块中的键和值)。

可以用来加速顺序解码。输入的 input_ids 不应包含已传递 pastinput_ids

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),可选)

可以选择直接传递嵌入表示而不是 input_ids

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,则仅输出形状为 (batch_size, 1, hidden_size) 的序列的最后一个隐藏状态。

past_key_values

tuple(tuple(torch.FloatTensor)),可选,当传递 use_cache=True 时返回或 config.use_cache=True 时返回)

长度为 config.n_layers 的元组,每个元组包含形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的 2 个张量

用来加速顺序解码

hidden_states

(tuple(torch.FloatTensor),可选,当传递 output_hidden_states=True 时返回或 config.output_hidden_states=True 时返回) 

包含 torch.FloatTensor 的元组(如果模型具有嵌入层,则为嵌入输出的一个 + 每层输出的一个),形状为 (batch_size, sequence_length, hidden_size)。

模型在每层输出的隐藏状态加上可选的初始嵌入输出的隐藏状态。

attentions

(tuple(torch.FloatTensor),可选,当传递 output_attentions=True 时返回或 config.output_attentions=True 时返回)

包含 torch.FloatTensor 的元组(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)。

注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。

cross_attentions

(tuple(torch.FloatTensor),可选,当传递 output_attentions=Trueconfig.add_cross_attention=True 时返回或 config.output_attentions=True 时返回)

包含 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>)
'''


http://www.ppmy.cn/news/1473667.html

相关文章

VitePress美化

参考资料&#xff1a; https://blog.csdn.net/weixin_44803753/article/details/130903396 https://blog.csdn.net/qq_30678861/category_12467776.html 站点信息修改 首页部分的修改基本都在.vitepress/config.mts,这个文件内修改。 title 站点名称 description 描述 top…

【Git 学习笔记】第二章 Git 的配置(下)

2.5 几个配置示例 2.5.1 变基&#xff08;rebase&#xff09;与合并&#xff08;merge&#xff09;设置 默认情况下&#xff0c;在执行 git pull 时&#xff0c;如果本地分支的历史记录与远程分支的历史不同&#xff0c;则会进行合并提交。修改默认方式可使用&#xff1a; #…

Pytorch中方法对象和属性,例如size()和shape

文章目录 方法对象和属性的基本概念方法对象属性示例说明总结 常见的方法对象和属性常见的方法对象常见的属性总结示例 方法对象和属性的基本概念 方法对象&#xff08;method object&#xff09;和属性&#xff08;attribute&#xff09;是面向对象编程中的两个重要概念。让我…

使用Python绘制堆积柱形图

使用Python绘制堆积柱形图 堆积柱形图效果代码 堆积柱形图 堆积柱形图&#xff08;Stacked Bar Chart&#xff09;是一种数据可视化图表&#xff0c;用于显示不同类别的数值在某一变量上的累积情况。每一个柱状条显示多个子类别的数值&#xff0c;子类别的数值在柱状条上堆积在…

【IT领域新生必看】 Java编程中的重载(Overloading):初学者轻松掌握的全方位指南

文章目录 引言什么是方法重载&#xff08;Overloading&#xff09;&#xff1f;方法重载的基本示例 方法重载的规则1. 参数列表必须不同示例&#xff1a; 2. 返回类型可以相同也可以不同示例&#xff1a; 3. 访问修饰符可以相同也可以不同示例&#xff1a; 4. 可以抛出不同的异…

cs224n作业4

NMT结构图&#xff1a;&#xff08;具体结构图&#xff09; LSTM基础知识 nmt_model.py&#xff1a; 参考文章&#xff1a;LSTM输出结构描述 #!/usr/bin/env python3 # -*- coding: utf-8 -*-""" CS224N 2020-21: Homework 4 nmt_model.py: NMT Model Penchen…

SQL Server时间转换

第一种&#xff1a;format --转化成年月日 select format( GETDATE(),yyyy-MM-dd) --转化年月日&#xff0c;时分秒&#xff0c;这里的HH指24小时的&#xff0c;hh是12小时的 select format( GETDATE(),yyyy-MM-dd HH:mm:ss) --转化成时分秒的&#xff0c;这里就不一样的&…