PEGASUS-X
概述
PEGASUS-X 模型在 Investigating Efficiently Extending Transformers for Long Input Summarization 中被提出,作者为 Jason Phang、Yao Zhao 和 Peter J. Liu。
PEGASUS-X (PEGASUS 扩展) 通过额外的长输入预训练扩展了 PEGASUS 模型以实现长输入摘要,并在编码器中使用交错的块局部注意力和全局令牌。
论文中的摘要如下
尽管大型预训练 Transformer 模型在处理自然语言任务方面表现出极高的能力,但处理长序列输入仍然是一个重大挑战。其中一项任务是长输入摘要,输入长度超过大多数预训练模型的最大输入上下文。通过一系列广泛的实验,我们研究了哪些模型架构变化和预训练范式可以最有效地适应预训练 Transformer 用于长输入摘要。我们发现,交错式、块局部 Transformer 结合全局编码器令牌在性能和效率之间取得了良好的平衡,并且在长序列上进行额外的预训练阶段可以显著提高下游摘要性能。根据我们的发现,我们引入了 PEGASUS-X,它是 PEGASUS 模型的扩展,通过额外的长输入预训练来处理最多 16K 个令牌的输入。PEGASUS-X 在长输入摘要任务上取得了与更大模型相当的优异性能,同时只增加了很少的额外参数,并且不需要模型并行训练。
文档资源
PEGASUS-X 使用与 PEGASUS 相同的标记器。
PegasusXConfig
class transformers.PegasusXConfig
< source >( vocab_size = 96103 max_position_embeddings = 16384 encoder_layers = 16 encoder_ffn_dim = 4096 encoder_attention_heads = 16 decoder_layers = 16 decoder_ffn_dim = 4096 decoder_attention_heads = 16 encoder_layerdrop = 0.0 decoder_layerdrop = 0.0 use_cache = True is_encoder_decoder = True activation_function = 'gelu' d_model = 1024 dropout = 0.1 attention_dropout = 0.0 activation_dropout = 0.0 init_std = 0.02 decoder_start_token_id = 0 scale_embedding = True pad_token_id = 0 eos_token_id = 1 forced_eos_token_id = 1 num_global_tokens = 32 block_size = 512 stagger_local_blocks = True **kwargs )
参数
- vocab_size (
int
, 可选,默认为 96103) — PEGASUS-X 模型的词汇量大小。定义了在调用 PegasusXModel 时,通过inputs_ids
传递的可以表示的不同令牌的数量。 - d_model (
int
, 可选,默认为 1024) — 层和池化层的维度。 - encoder_layers (
int
, 可选,默认为 16) — 编码器层的数量。 - decoder_layers (
int
, 可选,默认为 16) — 解码器层的数量。 - encoder_attention_heads (
int
, 可选, 默认为 16) — Transformer 编码器中每个注意力层的注意力头数。 - decoder_attention_heads (
int
, 可选, 默认为 16) — Transformer 解码器中每个注意力层的注意力头数。 - decoder_ffn_dim (
int
, 可选, 默认为 4096) — 解码器中“中间”层(通常称为前馈层)的维度。 - encoder_ffn_dim (
int
, 可选, 默认为 4096) — 解码器中“中间”层(通常称为前馈层)的维度。 - activation_function (
str
或function
, 可选, 默认为"gelu"
) — 编码器和池化器中的非线性激活函数(函数或字符串)。如果为字符串,则支持"gelu"
、"relu"
、"silu"
和"gelu_new"
。 - dropout (
float
, 可选, 默认为 0.1) — 嵌入、编码器和池化器中所有全连接层的 dropout 概率。 - attention_dropout (
float
, 可选, 默认为 0.0) — 注意力概率的 dropout 比例。 - activation_dropout (
float
, 可选, 默认为 0.0) — 全连接层内部激活值的 dropout 比例。 - max_position_embeddings (
int
, 可选, 默认为 16384) — 该模型可能使用的最大序列长度。通常将此值设置为一个较大的值,以防万一(例如,512 或 1024 或 2048)。 - init_std (
float
, 可选, 默认为 0.02) — 初始化所有权重矩阵的截断正态分布初始化器的标准差。 - use_cache (
bool
, 可选, 默认值为True
) — 模型是否应该返回最后一个键值注意力(并非所有模型都使用) - forced_eos_token_id (
int
, 可选, 默认值为 1) — 当达到max_length
时强制作为最后一个生成令牌的令牌 ID。通常设置为eos_token_id
。 - num_global_tokens (
int
, 可选, 默认值为 128) — 用于编码器的全局令牌数量 - block_size (
int
, 可选, 默认值为 512) — 编码器局部注意力的块大小。序列长度应为块大小的精确倍数。如果 stagger_local_block 为 True,则 block_size 必须是 2 的倍数 - stagger_local_block (
bool
, 可选, 默认值为True
) — 是否将每个其他局部注意力交错半个块
这是用于存储 PegasusXModel 配置的配置类。它用于根据指定的参数实例化 PEGASUS-X 模型,定义模型架构。使用默认值实例化配置将产生与 PEGASUS-X google/pegasus-x-large 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例
>>> from transformers import PegasusXConfig, PegasusXModel
>>> # Initializing a PEGASUS google/pegasus-x-large style configuration
>>> configuration = PegasusXConfig()
>>> # Initializing a model (with random weights) from the google/pegasus-x-large style configuration
>>> model = PegasusXModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
PegasusXModel
class transformers.PegasusXModel
< 源代码 >( config: PegasusXConfig )
参数
- config (PegasusXConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
不带任何特定头的 PEGASUS-X 模型,输出原始隐藏状态。该模型继承自 PreTrainedModel。查看超类文档以获取库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头等)。
该模型也是 PyTorch torch.nn.Module 子类。将其用作常规的 PyTorch 模块,并参考 PyTorch 文档了解有关一般用法和行为的所有事项。
The PegasusXModel 正向方法,覆盖了 __call__
特殊方法。
虽然正向传递的配方需要在此函数内定义,但之后应该调用 Module
实例,而不是调用此函数,因为前者负责运行预处理和后处理步骤,而后者会静默忽略它们。
示例
>>> from transformers import AutoTokenizer, PegasusModel
>>> tokenizer = AutoTokenizer.from_pretrained("google/pegasus-x-large")
>>> model = PegasusModel.from_pretrained("google/pegasus-x-large")
>>> inputs = tokenizer("Studies have been shown that owning a dog is good for you", return_tensors="pt")
>>> decoder_inputs = tokenizer("Studies show that", return_tensors="pt")
>>> outputs = model(input_ids=inputs.input_ids, decoder_input_ids=decoder_inputs.input_ids)
>>> last_hidden_states = outputs.last_hidden_state
>>> list(last_hidden_states.shape)
[1, 4, 1024]
PegasusXForConditionalGeneration
class transformers.PegasusXForConditionalGeneration
< 源代码 >( config: PegasusXConfig )
参数
- config (PegasusXConfig) — 模型配置类,包含模型的所有参数。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。 查看 from_pretrained() 方法以加载模型权重。
用于条件生成(例如,摘要)的 PEGASUS-X。 此模型继承自 PreTrainedModel。 查看超类文档,了解库为所有模型实现的通用方法(例如,下载或保存、调整输入嵌入大小、修剪头等)。
该模型也是 PyTorch torch.nn.Module 子类。将其用作常规的 PyTorch 模块,并参考 PyTorch 文档了解有关一般用法和行为的所有事项。
forward
< 源代码 > ( input_ids: Optional = None attention_mask: Optional = None decoder_input_ids: Optional = None decoder_attention_mask: Optional = None encoder_outputs: Optional = None past_key_values: Optional = None inputs_embeds: Optional = None decoder_inputs_embeds: Optional = None labels: Optional = None use_cache: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None ) → transformers.modeling_outputs.Seq2SeqLMOutput or tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
of shape(batch_size, sequence_length)
) — 输入序列词元的词汇表索引。 如果你提供填充,默认情况下会忽略填充。可以使用 AutoTokenizer 获取索引。 查看 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call() 获取详细信息。
- inputs_embeds (
torch.FloatTensor
of shape(batch_size, sequence_length, hidden_size)
, optional) — 可选地,你可以选择直接传递嵌入式表示,而不是传递input_ids
。 - attention_mask (
torch.Tensor
of shape(batch_size, sequence_length)
, optional) — 用于避免对填充词元索引执行注意的掩码。 在[0, 1]
中选择的掩码值:- 1 表示未掩码的词元,
- 0 表示掩码的词元。
- decoder_input_ids (
torch.LongTensor
形状为(batch_size, target_sequence_length)
,可选) — 解码器输入序列标记在词汇表中的索引。索引可使用 AutoTokenizer 获取。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
PEGASUS-X 使用
pad_token_id
作为decoder_input_ids
生成时的起始标记。如果使用past_key_values
,则可以选择仅输入最后一个decoder_input_ids
(请参阅past_key_values
)。 - decoder_attention_mask (
torch.LongTensor
形状为(batch_size, target_sequence_length)
,可选) — 默认行为:生成一个忽略decoder_input_ids
中填充标记的张量。因果掩码也将默认使用。 - encoder_outputs (
tuple(tuple(torch.FloatTensor)
,可选) — 元组包含 (last_hidden_state
,可选:hidden_states
,可选:attentions
)last_hidden_state
形状为(batch_size, sequence_length, hidden_size)
,可选) 是编码器最后一层输出处的隐藏状态序列。用于解码器的交叉注意力。 - past_key_values (
tuple(tuple(torch.FloatTensor))
,可选,当传递use_cache=True
或config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(tuple(torch.FloatTensor))
元组,每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量) 以及 2 个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的额外张量。包含预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于(请参阅
past_key_values
输入)加快顺序解码。如果使用
past_key_values
,则用户可以选择仅输入形状为(batch_size, 1)
的最后一个decoder_input_ids
(那些没有提供其过去键值状态的模型),而不是所有形状为(batch_size, sequence_length)
的decoder_input_ids
。 - inputs_embeds (
torch.FloatTensor
形状为(batch_size, sequence_length, hidden_size)
,可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids
。如果您希望对如何将input_ids
索引转换为关联向量进行比模型内部嵌入查找矩阵更精细的控制,这将很有用。 - decoder_inputs_embeds (
torch.FloatTensor
形状为(batch_size, target_sequence_length, hidden_size)
,可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递decoder_input_ids
。如果使用past_key_values
,则可以选择仅输入最后一个decoder_inputs_embeds
(请参阅past_key_values
)。如果您希望对如何将decoder_input_ids
索引转换为关联向量进行比模型内部嵌入查找矩阵更精细的控制,这将很有用。如果
decoder_input_ids
和decoder_inputs_embeds
都未设置,则decoder_inputs_embeds
将采用inputs_embeds
的值。 - use_cache (
bool
,可选) — 如果设置为True
,则会返回past_key_values
键值状态,并可用于加快解码速度(请参阅past_key_values
)。 - output_attentions (
bool
,可选) — 是否返回所有注意力层的注意力张量。有关详细信息,请参阅返回张量下的attentions
。 - output_hidden_states (
bool
,可选) — 是否返回所有层的隐藏状态。有关详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回一个 ModelOutput 而不是一个简单的元组。 - labels (
torch.LongTensor
形状为(batch_size, sequence_length)
, 可选) — 用于计算掩码语言建模损失的标签。索引应为[0, ..., config.vocab_size]
或 -100(参见input_ids
文档字符串)。索引设置为-100
的标记被忽略(掩码),损失仅针对标签位于[0, ..., config.vocab_size]
的标记进行计算。
返回
transformers.modeling_outputs.Seq2SeqLMOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.Seq2SeqLMOutput 或一个 torch.FloatTensor
元组(如果传递了 return_dict=False
或 config.return_dict=False
),包含根据配置(PegasusXConfig)和输入的不同元素。
-
loss (
torch.FloatTensor
形状为(1,)
, 可选, 在提供labels
时返回) — 语言建模损失。 -
logits (
torch.FloatTensor
形状为(batch_size, sequence_length, config.vocab_size)
) — 语言建模头的预测分数(SoftMax 之前的每个词汇标记的分数)。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
,可选,在传递use_cache=True
或config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(torch.FloatTensor)
元组,每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量,以及 2 个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的附加张量。包含预先计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于(参见
past_key_values
输入)加速顺序解码。 -
decoder_hidden_states (
tuple(torch.FloatTensor)
,可选,在传递output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(一个用于嵌入的输出,如果模型具有嵌入层,再加上每个层的输出),形状为(batch_size, sequence_length, hidden_size)
。解码器在每一层输出时的隐藏状态,加上初始嵌入输出。
-
decoder_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=True
或config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器交叉注意力层的注意力权重,在注意力 softmax 之后,用于计算交叉注意力头中的加权平均值。
-
encoder_last_hidden_state (
torch.FloatTensor
形状为(batch_size, sequence_length, hidden_size)
,可选) — 模型编码器最后一层输出处的隐藏状态序列。 -
encoder_hidden_states (
tuple(torch.FloatTensor)
,可选,在传递output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(一个用于嵌入的输出,如果模型具有嵌入层,再加上每个层的输出),形状为(batch_size, sequence_length, hidden_size)
。编码器在每一层输出时的隐藏状态,加上初始嵌入输出。
-
encoder_attentions (
tuple(torch.FloatTensor)
,可选,在传递output_attentions=True
或config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。编码器的注意力权重,在注意力 softmax 之后,用于计算自注意力头中的加权平均值。
The PegasusXForConditionalGeneration 正向方法,覆盖了 __call__
特殊方法。
虽然正向传递的配方需要在此函数内定义,但之后应该调用 Module
实例,而不是调用此函数,因为前者负责运行预处理和后处理步骤,而后者会静默忽略它们。
摘要示例
>>> from transformers import AutoTokenizer, PegasusXForConditionalGeneration
>>> model = PegasusXForConditionalGeneration.from_pretrained("google/pegasus-x-base")
>>> tokenizer = AutoTokenizer.from_pretrained("google/pegasus-x-large")
>>> ARTICLE_TO_SUMMARIZE = (
... "PG&E stated it scheduled the blackouts in response to forecasts for high winds "
... "amid dry conditions. The aim is to reduce the risk of wildfires. Nearly 800 thousand customers were "
... "scheduled to be affected by the shutoffs which were expected to last through at least midday tomorrow."
... )
>>> inputs = tokenizer(ARTICLE_TO_SUMMARIZE, max_length=1024, return_tensors="pt")
>>> # Generate Summary
>>> summary_ids = model.generate(inputs["input_ids"])
>>> tokenizer.batch_decode(summary_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
"California's largest electricity provider has turned off power to hundreds of thousands of customers."