Transformers 文档
Reformer
并获得增强的文档体验
开始使用
该模型于 2020-01-13 发布,并于 2020-11-16 添加到 Hugging Face Transformers 中。
Reformer
概述
Reformer 模型是在 Nikita Kitaev, Łukasz Kaiser, Anselm Levskaya 的论文 Reformer: The Efficient Transformer 中提出的。
论文摘要如下:
大型 Transformer 模型在多项任务上通常能取得最先进的结果,但训练这些模型可能成本极高,尤其是在长序列上。我们引入了两种技术来提高 Transformer 的效率。其一,我们用局部敏感哈希(locality-sensitive hashing)注意力取代了点积注意力,将其复杂度从 O(L^2) 更改为 O(Llog(L)),其中 L 是序列长度。此外,我们使用可逆残差层代替标准残差层,这允许在训练过程中仅存储一次激活值,而不是 N 次(N 是层数)。由此产生的模型 Reformer 在性能上与 Transformer 模型相当,同时内存效率更高,在长序列上速度更快。
该模型由 patrickvonplaten 贡献。作者的代码可以在这里找到。
使用技巧
- 由于 PyTorch 中的一个错误,Reformer 不能与 torch.nn.DataParallel 一起工作,请参阅 issue #36035。
- 使用轴向位置编码(Axial position encoding,详情见下文)。这是一种通过将位置编码矩阵分解为较小矩阵来避免在序列长度非常大时产生巨大矩阵的机制。
- 使用 LSH(局部敏感哈希)注意力取代传统注意力(详情见下文)。这是一种避免在注意力层计算完整的查询-键(query-key)乘积的技术。
- 通过使用可逆 Transformer 层在反向传播期间获取中间结果(从下一层的输入中减去残差即可恢复),或重新计算给定层内的结果,从而避免存储每一层的中间结果(这比存储结果效率稍低,但可以节省内存)。
- 按块(chunk)计算前馈操作,而不是在整个批次上计算。
轴向位置编码 (Axial Positional Encodings)
轴向位置编码最早在 Google 的 trax 库中实现,并由该模型论文的作者开发。在处理极长输入序列的模型中,传统的位置 ID 编码会为每个位置 $i, \ldots, n_s$ 存储一个大小为的嵌入向量,其中 $d$ 即 config.hidden_size,而为 config.max_embedding_size。这意味着,如果序列长度为且 config.hidden_size 为那么位置编码矩阵
仅这一项就有超过 5 亿个参数需要存储。轴向位置编码将分解为两个矩阵:
和
,其中
因此,以下等式成立:
直观地说,这意味着位置嵌入向量现在是两个分解嵌入向量的组合:$x^1{k, l} + x^2{l, k}$,其中 config.max_embedding_size 维度被分解为 $k$ 和 $l$。这种设计确保了每个位置嵌入向量都是唯一的。
再次使用上述示例,采用轴向位置编码且满足:可以将参数数量从 500,000,000 大幅减少到个参数,这意味着减少了 85% 的内存占用。
在实践中,参数 config.axial_pos_embds_dim 被设置为一个元组其总和必须等于 config.hidden_size,而 config.axial_pos_shape 被设置为一个元组其乘积必须等于 config.max_embedding_size,在训练期间,该值必须等于 input_ids 的序列长度。
LSH 自注意力
在局部敏感哈希 (LSH) 自注意力中,键 (key) 和查询 (query) 的投影权重是绑定的。因此,键和查询的嵌入向量也是绑定的。LSH 自注意力使用 Practical and Optimal LSH for Angular Distance 中提出的局部敏感哈希机制,将每个绑定的键查询嵌入向量分配到 config.num_buckets 个可能的桶之一中。其前提是,键查询嵌入向量之间越“相似”(就余弦相似度而言),它们被分配到同一个桶的可能性就越大。
可以通过增加 config.num_hashes 或直接增加 forward 函数的参数 num_hashes 来提高 LSH 机制的准确性,从而使 LSH 自注意力的输出更好地逼近“普通”全自注意力的输出。然后对这些桶进行排序,并分块成长度为 config.lsh_chunk_length 的查询键嵌入向量块。对于每个分块,查询嵌入向量会关注其自身的键向量(与其自身绑定),以及 config.lsh_num_chunks_before 个前邻块和 config.lsh_num_chunks_after 个后邻块的键嵌入向量。
注意 config.num_buckets 也可以分解为一个列表 $(n{\text{buckets}}^1, n{\text{buckets}}^2)$。这样,查询键嵌入向量不再是被分配到 $(1,\ldots, n{\text{buckets}})$ 之一,而是被分配到 $(1-1,\ldots, n{\text{buckets}}^1-1, \ldots, 1-n{\text{buckets}}^2, \ldots, n{\text{buckets}}^1-n_{\text{buckets}}^2)$ 之一。这对于极长序列节省内存至关重要。
从头开始训练模型时,建议将 config.num_buckets 设置为 None,以便根据序列长度自动计算出一个合适的 num_buckets 值。该值随后会自动保存到配置中,并应在推理时重用。
使用 LSH 自注意力,查询-键矩阵乘法操作的内存和时间复杂度可以从降低到 $\mathcal{O}(n_s \times \log(n_s))$,其中 $n_s$是序列长度,这通常代表了 Transformer 模型中的内存和时间瓶颈。
局部自注意力
局部自注意力本质上是一个具有键、查询和值投影的“普通”自注意力层,但它进行了分块处理,使得在每个长度为 config.local_chunk_length 的块中,查询嵌入向量仅关注其所在块中的键嵌入向量,以及 config.local_num_chunks_before 个前邻块和 config.local_num_chunks_after 个后邻块的键嵌入向量。
使用局部自注意力,查询-键矩阵乘法操作的内存和时间复杂度也可以得到相应降低。降低到 $\mathcal{O}(n_s \times \log(n_s))$,其中 $n_s$是序列长度,这通常代表了 Transformer 模型中的内存和时间瓶颈。
训练
在训练期间,我们必须确保序列长度被设置为一个能被 config.lsh_chunk_length 和 config.local_chunk_length 的最小公倍数整除的值,并且如上所述正确设置轴向位置编码的参数。Reformer 的内存效率非常高,因此可以轻松地在长达 64,000 个标记的序列上训练模型。
对于训练,应按如下方式使用 ReformerModelWithLMHead
input_ids = tokenizer.encode("This is a sentence from the training data", return_tensors="pt")
loss = model(input_ids, labels=input_ids)[0]资源
ReformerConfig
class transformers.ReformerConfig
< 源码 >( attention_head_size = 64 attn_layers = ['local', 'lsh', 'local', 'lsh', 'local', 'lsh'] axial_norm_std = 1.0 axial_pos_embds = True axial_pos_shape = [64, 64] axial_pos_embds_dim = [64, 192] chunk_size_lm_head = 0 eos_token_id = 2 feed_forward_size = 512 hash_seed = None hidden_act = 'relu' hidden_dropout_prob = 0.05 hidden_size = 256 initializer_range = 0.02 is_decoder = False layer_norm_eps = 1e-12 local_num_chunks_before = 1 local_num_chunks_after = 0 local_attention_probs_dropout_prob = 0.05 local_attn_chunk_length = 64 lsh_attn_chunk_length = 64 lsh_attention_probs_dropout_prob = 0.0 lsh_num_chunks_before = 1 lsh_num_chunks_after = 0 max_position_embeddings = 4096 num_attention_heads = 12 num_buckets = None num_hashes = 1 pad_token_id = 0 vocab_size = 320 tie_word_embeddings = False use_cache = True classifier_dropout = None bos_token_id = None **kwargs )
参数
- attention_head_size (
int, 可选, 默认为 64) — 投影后的键、查询和值向量的维度。 - attn_layers (
list[str], 可选, 默认为["local", "lsh", "local", "lsh", "local", "lsh"]) — 按升序排列的注意力层类型列表。可以从 LSH 自注意力层 ("lsh") 和局部自注意力层 ("local") 中选择。 - axial_pos_embds (
bool, 可选, 默认为True) — 是否使用轴向位置嵌入。有关轴向位置嵌入工作原理的更多信息,请参阅 轴向位置编码。 - axial_norm_std (
float, 可选, 默认为 1.0) — 用于初始化轴向位置编码权重矩阵的 normal_initializer 的标准差。 - axial_pos_shape (
list[int], 可选, 默认为[64, 64]) — 轴向位置编码的位置维度。在训练期间,位置维度的乘积必须等于序列长度。有关轴向位置嵌入工作原理的更多信息,请参阅 轴向位置编码。
- axial_pos_embds_dim (
list[int], 可选, 默认为[64, 192]) — 轴向位置编码的嵌入维度。嵌入维度的总和必须等于隐藏层大小 (hidden size)。有关轴向位置嵌入工作原理的更多信息,请参阅 轴向位置编码。
- chunk_size_lm_head (
int, 可选, 默认为 0) — 最终语言模型前馈头层的分块大小。分块大小为 0 意味着前馈层不进行分块。分块大小为 n 意味着前馈层一次处理 n < sequence_length 个嵌入。有关前馈分块的更多信息,请参阅 前馈分块是如何工作的?。
- eos_token_id (
int, 可选, 默认为 2) — 句子结束标记的 ID。 - feed_forward_size (
int, 可选, 默认为 512) — 残差注意力块中前馈层的维度。 - hash_seed (
int, 可选) — 可用于使LSHSelfAttention中的局部敏感哈希具有确定性的种子。这仅应用于测试目的。对于评估和训练目的,应将hash_seed保持为None,以确保局部敏感哈希方案中完全随机的旋转。 - hidden_act (
str或Callable, 可选, 默认为"relu") — 残差注意力块中前馈层里的非线性激活函数(函数或字符串)。如果是字符串,支持"gelu"、"relu"、"silu"和"gelu_new"。 - hidden_dropout_prob (
float, 可选, 默认为 0.05) — 嵌入层、编码器和池化器中所有全连接层的丢弃 (dropout) 概率。 - hidden_size (
int, 可选, 默认为 256) — 残差注意力块输出的隐藏状态的维度。 - initializer_range (
float, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - is_decoder (
bool, 可选, 默认为False) — 是否在传递给 ReformerModel 的attention_mask之外再使用因果掩码 (causal mask)。当使用 Reformer 进行因果语言建模时,此参数应设置为True。 - layer_norm_eps (
float, 可选, 默认为 1e-12) — 层归一化层使用的 epsilon 值。 - local_chunk_length (
int, 可选, 默认为 64) —LocalSelfAttention中关注自身的块长度。分块处理将内存复杂度从 序列长度 x 序列长度(自注意力)降低到 块长度 x 块长度 x 序列长度 / 块长度(分块自注意力)。 - local_num_chunks_before (
int, 可选, 默认为 1) —LocalSelfAttention层除了关注自身块之外,还关注的前邻块数量。 - local_num_chunks_after (
int, 可选, 默认为 0) —LocalSelfAttention层除了关注自身块之外,还关注的后邻块数量。 - local_attention_probs_dropout_prob (
float, 可选, 默认为 0.1) —LocalSelfAttention中注意力概率的丢弃比率。 - lsh_attn_chunk_length (
int, 可选, 默认为 64) —LSHSelfAttention中关注自身的块长度。分块处理将内存复杂度从 序列长度 x 序列长度(自注意力)降低到 块长度 x 块长度 x 序列长度 / 块长度(分块自注意力)。 - lsh_num_chunks_before (
int, 可选, 默认为 1) —LSHSelfAttention层除了关注自身块之外,还关注的前邻块数量。 - lsh_num_chunks_after (
int, 可选, 默认为 0) —LSHSelfAttention层除了关注自身块之外,还关注的后邻块数量。 - lsh_attention_probs_dropout_prob (
float, 可选, 默认为 0.1) —LSHSelfAttention中注意力概率的丢弃比率。 - max_position_embeddings (
int, 可选, 默认为 4096) — 该模型可能使用的最大序列长度。通常将其设置为较大的值以防万一(例如 512、1024 或 2048)。 - num_attention_heads (
int, 可选, 默认为 12) — Transformer 编码器中每个注意力层的注意力头数量。 - num_buckets (
int或list[int], 可选) — 桶的数量,键查询向量可以使用局部敏感哈希方案“哈希”到其中。每个查询键向量都被哈希到1, ..., num_buckets中的一个哈希值。桶的数量也可以分解为一个列表,以优化内存复杂度。在这种情况下,如果num_buckets被分解为两个因子,每个查询键向量会被哈希到1-1, 1-2, ..., num_buckets[0]-1, ..., num_buckets[0]-num_buckets[1]中的一个哈希值。桶的数量(或因子的乘积)应近似等于 序列长度 / lsh_chunk_length。如果未设置num_buckets,则会自动计算出一个合适的值。 - num_hashes (
int, 可选, 默认为 1) — 局部敏感哈希方案中的哈希轮数(例如,随机旋转的数量)。num_hashes越高,LSHSelfAttention就越准确,但哈希过程也越耗费内存和时间。 - pad_token_id (
int, 可选, 默认为 0) — 填充标记的 ID。 - vocab_size (
int, 可选, 默认为 320) — Reformer 模型的词表大小。定义了调用 ReformerModel 时传递的inputs_ids所能表示的不同标记的数量。 - tie_word_embeddings (
bool, 可选, 默认为False) — 是否绑定输入和输出嵌入层。 - use_cache (
bool, 可选, 默认为True) — 模型是否应返回最后的 key/values 注意力权重(并非所有模型都使用)。 - classifier_dropout (
float, 可选) — 分类头的 dropout 比例。
这是用于存储 ReformerModel 配置的配置类。它用于根据指定的参数实例化 Reformer 模型,定义模型架构。使用默认值实例化配置将产生与 ReFormer google/reformer-crime-and-punishment 架构类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PreTrainedConfig 的文档。
示例
>>> from transformers import ReformerConfig, ReformerModel
>>> # Initializing a Reformer configuration
>>> configuration = ReformerConfig()
>>> # Initializing a Reformer model (with random weights)
>>> model = ReformerModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configReformerTokenizer
class transformers.ReformerTokenizer
< 源码 >( vocab: str | dict[str, int] | None = None merges: str | list[str] | None = None eos_token: str = '</s>' unk_token: str = '<unk>' additional_special_tokens: list | None = None **kwargs )
参数
- vocab_file (
str) — 包含实例化分词器所需词汇表的 SentencePiece 文件(通常具有 .spm 扩展名)。 - eos_token (
str, 可选, 默认为"</s>") — 序列结束标记。当使用特殊标记构建序列时,这并不是用于序列结束的标记。使用的标记是
sep_token。 - unk_token (
str, 可选, 默认为"<unk>") — 未知标记。不在词汇表中的标记无法转换为 ID,将被设置为此标记。 - pad_token (
str, 可选, 默认为"<pad>") — 用于填充的标记,例如在对不同长度的序列进行批处理时使用。 - additional_special_tokens (
list[str], 可选) — 分词器使用的额外特殊标记。 - vocab (
str或dict[str, int], 可选) — 自定义词汇表字典。如果未提供,则从vocab_file加载词汇表。 - merges (
str或list[str], 可选) — 自定义合并列表。如果未提供,则从vocab_file加载合并规则。
构建一个 Reformer 分词器(由 HuggingFace 的 tokenizers 库支持)。基于 BPE。
此分词器继承自 TokenizersBackend,其中包含大部分主要方法。用户应参考此父类了解有关这些方法的更多信息。
ReformerTokenizerFast
class transformers.ReformerTokenizer
< 源码 >( vocab: str | dict[str, int] | None = None merges: str | list[str] | None = None eos_token: str = '</s>' unk_token: str = '<unk>' additional_special_tokens: list | None = None **kwargs )
参数
- vocab_file (
str) — 包含实例化分词器所需词汇表的 SentencePiece 文件(通常具有 .spm 扩展名)。 - eos_token (
str, 可选, 默认为"</s>") — 序列结束标记。当使用特殊标记构建序列时,这并不是用于序列结束的标记。使用的标记是
sep_token。 - unk_token (
str, 可选, 默认为"<unk>") — 未知标记。不在词汇表中的标记无法转换为 ID,将被设置为此标记。 - pad_token (
str, 可选, 默认为"<pad>") — 用于填充的标记,例如在对不同长度的序列进行批处理时使用。 - additional_special_tokens (
list[str], 可选) — 分词器使用的额外特殊标记。 - vocab (
str或dict[str, int], 可选) — 自定义词汇表字典。如果未提供,则从vocab_file加载词汇表。 - merges (
str或list[str], 可选) — 自定义合并列表。如果未提供,则从vocab_file加载合并规则。
构建一个 Reformer 分词器(由 HuggingFace 的 tokenizers 库支持)。基于 BPE。
此分词器继承自 TokenizersBackend,其中包含大部分主要方法。用户应参考此父类了解有关这些方法的更多信息。
ReformerModel
class transformers.ReformerModel
< 源码 >( config model_args: ~utils.generic.ModelArgs | None = None adapter_args: ~utils.generic.AdapterArgs | None = None lora_args: ~utils.generic.LoRAArgs | None = None tokenizer_args: ~utils.generic.TokenizerArgs | None = None dataset_args: ~utils.generic.DatasetArgs | None = None data_args: ~utils.generic.DataArgs | None = None training_args: ~utils.generic.TrainingArgs | None = None generation_args: ~utils.generic.GenerationArgs | None = None vision_tower_args: ~utils.generic.VisionTowerArgs | None = None qlora_args: ~utils.generic.QLoRAArgs | None = None vision_tower_template_args: ~utils.generic.VisionTowerTemplateArgs | None = None video_tower_args: ~utils.generic.VideoTowerArgs | None = None vision_config: ~utils.generic.VisionConfig | None = None video_config: ~utils.generic.VideoConfig | None = None load_dataset: bool | None = None load_data_collator: bool | None = None load_processor: bool | None = None load_lora_adapter: bool | None = None load_adapter: bool | None = None load_qlora_adapter: bool | None = None **kwargs: typing_extensions.Unpack[transformers.modeling_utils.PreTrainedModelKwargs] )
参数
- config (ReformerModel) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型相关的权重,只加载配置。请查看 from_pretrained() 方法来加载模型权重。
基础 Reformer 模型,输出原始隐状态,顶层没有特定的头。
此模型继承自 PreTrainedModel。查看其父类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头等)。
此模型也是一个 PyTorch torch.nn.Module 子类。像普通的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解一般用法和行为的所有相关信息。
forward
< 源码 >( input_ids: torch.Tensor | None = None attention_mask: torch.Tensor | None = None position_ids: torch.Tensor | None = None inputs_embeds: torch.Tensor | None = None num_hashes: int | None = None past_buckets_states: transformers.models.reformer.modeling_reformer.ReformerDynamicCache | None = None use_cache: bool | None = None output_hidden_states: bool | None = None output_attentions: bool | None = None return_dict: bool | None = None **kwargs ) → transformers.models.reformer.modeling_reformer.ReformerModelOutput 或 tuple(torch.FloatTensor)
参数
- input_ids (形状为
(batch_size, sequence_length)的torch.LongTensor) — 词汇表中输入序列标记的索引。在训练期间,input_ids 的序列长度必须是相关模型分块长度(lsh、local 或两者)的倍数。在评估期间,索引会自动填充为分块长度的倍数。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (形状为
(batch_size, sequence_length)的torch.Tensor, 可选) — 遮罩,用于避免对填充标记索引执行注意力操作。遮罩值选自[0, 1]:- 1 表示未被遮罩的标记,
- 0 表示被遮罩的标记。
- position_ids (形状为
(batch_size, sequence_length)的torch.Tensor, 可选) — 每个输入序列标记在位置嵌入中的位置索引。选在范围[0, config.n_positions - 1]内。 - inputs_embeds (形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor, 可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids。如果您希望能够比模型内部嵌入查找矩阵更自主地控制如何将input_ids索引转换为关联向量,这将非常有用。 - num_hashes (
int, 可选) — 分桶过程中应执行的哈希轮数。设置此参数会覆盖config.num_hashes中定义的默认值。有关更多信息,请参阅 ReformerConfig 中的
num_hashes。 - past_buckets_states (
ReformerDynamicCache, 可选) — 长度为config.n_layers的tuple(torch.LongTensor, torch.FloatTensor)列表,第一个元素是形状为(batch_size, num_heads, num_hashes, sequence_length)的先前 buckets,第二个元素是形状为(batch_size, sequence_length, hidden_size)的先前 hidden_states。包含预先计算的隐状态和桶(仅与 LSH 自注意力相关)。可用于加速序列解码。
- use_cache (
bool, 可选) — 如果设置为True,将返回past_key_values键值状态,并可用于加速解码(参见past_key_values)。 - output_hidden_states (
bool, 可选) — 是否返回所有层的隐状态。有关更多详细信息,请参阅返回张量下的hidden_states。 - output_attentions (
bool, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions。 - return_dict (
bool, 可选) — 是否返回 ModelOutput 而不是普通元组。
返回
transformers.models.reformer.modeling_reformer.ReformerModelOutput 或 tuple(torch.FloatTensor)
一个 transformers.models.reformer.modeling_reformer.ReformerModelOutput 或 torch.FloatTensor 元组(如果传递了 return_dict=False 或 config.return_dict=False),包含取决于配置 (ReformerConfig) 和输入的各种元素。
-
last_hidden_state (形状为
(batch_size, num_predict, hidden_size)的torch.FloatTensor) — 模型最后一层的隐状态序列。num_predict对应于target_mapping.shape[1]。如果target_mapping为None,则num_predict对应于sequence_length。 -
past_buckets_states (
list[tuple(torch.LongTensor, torch.FloatTensor)], 可选, 当传递use_cache=True或config.use_cache=True时返回) — 长度为config.n_layers的tuple(torch.LongTensor, torch.FloatTensor)列表,第一个元素是形状为(batch_size, num_heads, num_hashes, sequence_length)的先前 buckets,第二个元素是形状为(batch_size, sequence_length, hidden_size)的先前 hidden_states。包含预先计算的桶和隐状态,可用于(参见
past_buckets_states输入)加速序列解码。 -
hidden_states (
tuple[torch.FloatTensor] | None.hidden_states, 当传递output_hidden_states=True或当config.output_hidden_states=True时返回) —torch.FloatTensor的元组(一个用于嵌入的输出,如果模型有嵌入层,+ 每个层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple[torch.FloatTensor] | None.attentions, 当传递output_attentions=True或当config.output_attentions=True时返回) —torch.FloatTensor的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
ReformerModel 的前向传播方法,覆盖了 __call__ 特殊方法。
虽然 forward pass 的实现需要在此函数中定义,但你应该在之后调用
Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
ReformerModelWithLMHead
class transformers.ReformerModelWithLMHead
< 源码 >( config model_args: ~utils.generic.ModelArgs | None = None adapter_args: ~utils.generic.AdapterArgs | None = None lora_args: ~utils.generic.LoRAArgs | None = None tokenizer_args: ~utils.generic.TokenizerArgs | None = None dataset_args: ~utils.generic.DatasetArgs | None = None data_args: ~utils.generic.DataArgs | None = None training_args: ~utils.generic.TrainingArgs | None = None generation_args: ~utils.generic.GenerationArgs | None = None vision_tower_args: ~utils.generic.VisionTowerArgs | None = None qlora_args: ~utils.generic.QLoRAArgs | None = None vision_tower_template_args: ~utils.generic.VisionTowerTemplateArgs | None = None video_tower_args: ~utils.generic.VideoTowerArgs | None = None vision_config: ~utils.generic.VisionConfig | None = None video_config: ~utils.generic.VideoConfig | None = None load_dataset: bool | None = None load_data_collator: bool | None = None load_processor: bool | None = None load_lora_adapter: bool | None = None load_adapter: bool | None = None load_qlora_adapter: bool | None = None **kwargs: typing_extensions.Unpack[transformers.modeling_utils.PreTrainedModelKwargs] )
参数
- config (ReformerModelWithLMHead) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型相关的权重,只加载配置。请查看 from_pretrained() 方法来加载模型权重。
顶层带有 语言建模 头的 Reformer 模型。
此模型继承自 PreTrainedModel。查看其父类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头等)。
此模型也是一个 PyTorch torch.nn.Module 子类。像普通的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解一般用法和行为的所有相关信息。
forward
< 源码 >( input_ids: torch.Tensor | None = None position_ids: torch.Tensor | None = None attention_mask: torch.Tensor | None = None inputs_embeds: torch.Tensor | None = None num_hashes: int | None = None past_buckets_states: list[tuple[torch.Tensor]] | None = None use_cache: bool | None = None output_hidden_states: bool | None = None output_attentions: bool | None = None return_dict: bool | None = None labels: torch.Tensor | None = None logits_to_keep: int | torch.Tensor = 0 **kwargs ) → transformers.modeling_outputs.CausalLMOutput 或 tuple(torch.FloatTensor)
参数
- input_ids (形状为
(batch_size, sequence_length)的torch.LongTensor) — 词汇表中输入序列标记的索引。在训练期间,input_ids 的序列长度必须是相关模型分块长度(lsh、local 或两者)的倍数。在评估期间,索引会自动填充为分块长度的倍数。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- position_ids (形状为
(batch_size, sequence_length)的torch.Tensor, 可选) — 每个输入序列标记在位置嵌入中的位置索引。选在范围[0, config.n_positions - 1]内。 - attention_mask (形状为
(batch_size, sequence_length)的torch.Tensor, 可选) — 遮罩,用于避免对填充标记索引执行注意力操作。遮罩值选自[0, 1]:- 1 表示未被遮罩的标记,
- 0 表示被遮罩的标记。
- inputs_embeds (形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor, 可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids。如果您希望能够比模型内部嵌入查找矩阵更自主地控制如何将input_ids索引转换为关联向量,这将非常有用。 - num_hashes (
int, 可选) — 分桶过程中应执行的哈希轮数。设置此参数会覆盖config.num_hashes中定义的默认值。有关更多信息,请参阅 ReformerConfig 中的
num_hashes。 - past_buckets_states (
list[tuple(torch.LongTensor, torch.FloatTensor)], 可选) — 长度为config.n_layers的tuple(torch.LongTensor, torch.FloatTensor)列表,第一个元素是形状为(batch_size, num_heads, num_hashes, sequence_length)的先前 buckets,第二个元素是形状为(batch_size, sequence_length, hidden_size)的先前 hidden_states。包含预先计算的隐状态和桶(仅与 LSH 自注意力相关)。可用于加速序列解码。
- use_cache (
bool, 可选) — 如果设置为True,将返回past_key_values键值状态,并可用于加速解码(参见past_key_values)。 - output_hidden_states (
bool, 可选) — 是否返回所有层的隐状态。有关更多详细信息,请参阅返回张量下的hidden_states。 - output_attentions (
bool, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions。 - return_dict (
bool, 可选) — 是否返回 ModelOutput 而不是普通元组。 - labels (形状为
(batch_size,)的torch.LongTensor, 可选) — 用于计算序列分类/回归损失的标签。索引应在[-100, 0, ..., config.vocab_size - 1]内。所有设置为-100的标签都将被忽略(遮罩),损失仅针对[0, ..., config.vocab_size]中的标签计算。 - logits_to_keep (
Union[int, torch.Tensor], 可选, 默认为0) — 如果是int,则计算最后logits_to_keep个标记的 logits。如果是0,则计算所有input_ids的 logits(特殊情况)。生成时只需要最后一个标记的 logits,仅计算该标记的 logits 可以节省内存,这对于长序列或大词汇量非常显著。如果是torch.Tensor,则必须是 1D,对应于序列长度维度中要保留的索引。这在使用打包张量格式(批次和序列长度共用单个维度)时非常有用。
返回
transformers.modeling_outputs.CausalLMOutput or tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.CausalLMOutput 或 torch.FloatTensor 元组(如果传递了 return_dict=False 或 config.return_dict=False),包含取决于配置 (ReformerConfig) 和输入的各种元素。
-
loss (
torch.FloatTensor形状为(1,),可选,当提供labels时返回) — 语言建模损失(用于下一个 token 预测)。 -
logits (形状为
(batch_size, sequence_length, config.vocab_size)的torch.FloatTensor) — 语言建模头部的预测分数(SoftMax 之前的每个词汇标记的分数)。 -
hidden_states (
tuple(torch.FloatTensor), optional, 当传递output_hidden_states=True或当config.output_hidden_states=True时返回) —torch.FloatTensor的元组(一个用于嵌入层的输出,如果模型有嵌入层;+一个用于每个层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor), optional, 当传递output_attentions=True或当config.output_attentions=True时返回) —torch.FloatTensor的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
ReformerModelWithLMHead 的前向传播方法,覆盖了 __call__ 特殊方法。
虽然 forward pass 的实现需要在此函数中定义,但你应该在之后调用
Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> import torch
>>> from transformers import AutoTokenizer, ReformerModelWithLMHead
>>> tokenizer = AutoTokenizer.from_pretrained("google/reformer-crime-and-punishment")
>>> model = ReformerModelWithLMHead.from_pretrained("google/reformer-crime-and-punishment")
>>> inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
>>> outputs = model(**inputs, labels=inputs["input_ids"])
>>> loss = outputs.loss
>>> logits = outputs.logitsReformerForMaskedLM
class transformers.ReformerForMaskedLM
< 源码 >( config model_args: ~utils.generic.ModelArgs | None = None adapter_args: ~utils.generic.AdapterArgs | None = None lora_args: ~utils.generic.LoRAArgs | None = None tokenizer_args: ~utils.generic.TokenizerArgs | None = None dataset_args: ~utils.generic.DatasetArgs | None = None data_args: ~utils.generic.DataArgs | None = None training_args: ~utils.generic.TrainingArgs | None = None generation_args: ~utils.generic.GenerationArgs | None = None vision_tower_args: ~utils.generic.VisionTowerArgs | None = None qlora_args: ~utils.generic.QLoRAArgs | None = None vision_tower_template_args: ~utils.generic.VisionTowerTemplateArgs | None = None video_tower_args: ~utils.generic.VideoTowerArgs | None = None vision_config: ~utils.generic.VisionConfig | None = None video_config: ~utils.generic.VideoConfig | None = None load_dataset: bool | None = None load_data_collator: bool | None = None load_processor: bool | None = None load_lora_adapter: bool | None = None load_adapter: bool | None = None load_qlora_adapter: bool | None = None **kwargs: typing_extensions.Unpack[transformers.modeling_utils.PreTrainedModelKwargs] )
参数
- config (ReformerForMaskedLM) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型相关的权重,只加载配置。请查看 from_pretrained() 方法来加载模型权重。
带有 语言建模 头的 Reformer 模型。
此模型继承自 PreTrainedModel。查看其父类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头等)。
此模型也是一个 PyTorch torch.nn.Module 子类。像普通的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解一般用法和行为的所有相关信息。
forward
< 源码 >( input_ids: torch.Tensor | None = None position_ids: torch.Tensor | None = None attention_mask: torch.Tensor | None = None inputs_embeds: torch.Tensor | None = None num_hashes: int | None = None labels: torch.Tensor | None = None output_hidden_states: bool | None = None output_attentions: bool | None = None return_dict: bool | None = None **kwargs ) → transformers.modeling_outputs.MaskedLMOutput 或 tuple(torch.FloatTensor)
参数
- input_ids (形状为
(batch_size, sequence_length)的torch.LongTensor) — 词汇表中输入序列标记的索引。在训练期间,input_ids 的序列长度必须是相关模型分块长度(lsh、local 或两者)的倍数。在评估期间,索引会自动填充为分块长度的倍数。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- position_ids (形状为
(batch_size, sequence_length)的torch.Tensor, 可选) — 每个输入序列标记在位置嵌入中的位置索引。选在范围[0, config.n_positions - 1]内。 - attention_mask (形状为
(batch_size, sequence_length)的torch.Tensor,可选) — 用于避免在填充标记索引上执行注意力的掩码。掩码值选在[0, 1]之间:- 1 表示未被掩盖的标记,
- 0 表示已被掩盖的标记。
- inputs_embeds (形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,你可以选择直接传递嵌入表示,而不是传递input_ids。如果你希望比模型内部的嵌入查找矩阵更自主地控制如何将input_ids索引转换为关联向量,这将非常有用。 - num_hashes (
int,可选) — 分桶过程中应执行的哈希轮数。设置此参数将覆盖config.num_hashes中定义的默认值。更多信息请参阅 ReformerConfig 中的
num_hashes。 - labels (形状为
(batch_size, sequence_length)的torch.LongTensor,可选) — 用于计算掩码语言建模损失的标签。索引应在[-100, 0, ..., config.vocab_size]之间(参见input_ids文档字符串)。索引设置为-100的标记将被忽略(掩盖),损失仅针对带有标签的标记计算。本示例使用了一个虚假的检查点,因为我们目前还没有可用于 Reformer 架构的掩码语言建模任务的预训练模型。
- output_hidden_states (
bool,可选) — 是否返回所有层的隐藏状态。更多详情请参阅返回张量下的hidden_states。 - output_attentions (
bool,可选) — 是否返回所有注意力层的注意力张量。更多详情请参阅返回张量下的attentions。 - return_dict (
bool,可选) — 是否返回 ModelOutput 而不是普通元组。
返回
transformers.modeling_outputs.MaskedLMOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.MaskedLMOutput 或 torch.FloatTensor 元组(如果传递了 return_dict=False 或 config.return_dict=False 时),包含根据配置 (ReformerConfig) 和输入而定的各种元素。
-
loss (形状为
(1,)的torch.FloatTensor,可选,当提供labels时返回) — 掩码语言建模 (MLM) 损失。 -
logits (形状为
(batch_size, sequence_length, config.vocab_size)的torch.FloatTensor) — 语言建模头部的预测分数(SoftMax 之前的每个词汇标记的分数)。 -
hidden_states (
tuple(torch.FloatTensor), optional, 当传递output_hidden_states=True或当config.output_hidden_states=True时返回) —torch.FloatTensor的元组(一个用于嵌入层的输出,如果模型有嵌入层;+一个用于每个层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor), optional, 当传递output_attentions=True或当config.output_attentions=True时返回) —torch.FloatTensor的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
ReformerForMaskedLM 的前向传播方法,覆盖了 __call__ 特殊方法。
虽然 forward pass 的实现需要在此函数中定义,但你应该在之后调用
Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> import torch
>>> from transformers import AutoTokenizer, ReformerForMaskedLM
>>> tokenizer = AutoTokenizer.from_pretrained("hf-internal-testing/tiny-random-reformer")
>>> model = ReformerForMaskedLM.from_pretrained("hf-internal-testing/tiny-random-reformer")
>>> # add mask_token
>>> tokenizer.add_special_tokens({"mask_token": "[MASK]"})
>>> inputs = tokenizer("The capital of France is [MASK].", return_tensors="pt")
>>> # resize model's embedding matrix
>>> model.resize_token_embeddings(new_num_tokens=model.config.vocab_size + 1)
>>> with torch.no_grad():
... logits = model(**inputs).logits
>>> # retrieve index of [MASK]
>>> mask_token_index = (inputs.input_ids == tokenizer.mask_token_id)[0].nonzero(as_tuple=True)[0]
>>> predicted_token_id = logits[0, mask_token_index].argmax(axis=-1)
>>> predicted_token = tokenizer.decode(predicted_token_id)>>> labels = tokenizer("The capital of France is Paris.", return_tensors="pt")["input_ids"]
>>> # mask labels of non-[MASK] tokens
>>> labels = torch.where(
... inputs.input_ids == tokenizer.mask_token_id, labels[:, : inputs["input_ids"].shape[-1]], -100
... )
>>> outputs = model(**inputs, labels=labels)
>>> loss = round(outputs.loss.item(), 2)ReformerForSequenceClassification
class transformers.ReformerForSequenceClassification
< 源码 >( config model_args: ~utils.generic.ModelArgs | None = None adapter_args: ~utils.generic.AdapterArgs | None = None lora_args: ~utils.generic.LoRAArgs | None = None tokenizer_args: ~utils.generic.TokenizerArgs | None = None dataset_args: ~utils.generic.DatasetArgs | None = None data_args: ~utils.generic.DataArgs | None = None training_args: ~utils.generic.TrainingArgs | None = None generation_args: ~utils.generic.GenerationArgs | None = None vision_tower_args: ~utils.generic.VisionTowerArgs | None = None qlora_args: ~utils.generic.QLoRAArgs | None = None vision_tower_template_args: ~utils.generic.VisionTowerTemplateArgs | None = None video_tower_args: ~utils.generic.VideoTowerArgs | None = None vision_config: ~utils.generic.VisionConfig | None = None video_config: ~utils.generic.VideoConfig | None = None load_dataset: bool | None = None load_data_collator: bool | None = None load_processor: bool | None = None load_lora_adapter: bool | None = None load_adapter: bool | None = None load_qlora_adapter: bool | None = None **kwargs: typing_extensions.Unpack[transformers.modeling_utils.PreTrainedModelKwargs] )
参数
- config (ReformerForSequenceClassification) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载模型相关的权重,只加载配置。请查看 from_pretrained() 方法来加载模型权重。
Reformer 模型 Transformer,顶部带有一个序列分类/回归头(池化输出之上的一个线性层),例如用于 GLUE 任务。
此模型继承自 PreTrainedModel。查看其父类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头等)。
此模型也是一个 PyTorch torch.nn.Module 子类。像普通的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解一般用法和行为的所有相关信息。
forward
< 源码 >( input_ids: torch.Tensor | None = None position_ids: torch.Tensor | None = None attention_mask: torch.Tensor | None = None inputs_embeds: torch.Tensor | None = None num_hashes: int | None = None labels: torch.Tensor | None = None output_hidden_states: bool | None = None output_attentions: bool | None = None return_dict: bool | None = None **kwargs ) → transformers.modeling_outputs.SequenceClassifierOutput 或 tuple(torch.FloatTensor)
参数
- input_ids (形状为
(batch_size, sequence_length)的torch.LongTensor) — 输入序列标记在词表中的索引。在训练期间,input_ids 的序列长度必须是相关模型块长度(lsh、local 或两者)的倍数。在评估期间,索引会自动填充为块长度的倍数。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.__call__()。
- position_ids (形状为
(batch_size, sequence_length)的torch.Tensor,可选) — 每个输入序列标记在位置嵌入中的位置索引。选在[0, config.n_positions - 1]范围内。 - attention_mask (形状为
(batch_size, sequence_length)的torch.Tensor,可选) — 用于避免在填充标记索引上执行注意力的掩码。掩码值选在[0, 1]之间:- 1 表示未被掩盖的标记,
- 0 表示已被掩盖的标记。
- inputs_embeds (形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,你可以选择直接传递嵌入表示,而不是传递input_ids。如果你希望比模型内部的嵌入查找矩阵更自主地控制如何将input_ids索引转换为关联向量,这将非常有用。 - num_hashes (
int,可选) — 分桶过程中应执行的哈希轮数。设置此参数将覆盖config.num_hashes中定义的默认值。更多信息请参阅 ReformerConfig 中的
num_hashes。 - labels (形状为
(batch_size,)的torch.LongTensor,可选) — 用于计算序列分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]之间。如果config.num_labels == 1,则计算回归损失(均方误差),如果config.num_labels > 1,则计算分类损失(交叉熵)。 - output_hidden_states (
bool,可选) — 是否返回所有层的隐藏状态。更多详情请参阅返回张量下的hidden_states。 - output_attentions (
bool,可选) — 是否返回所有注意力层的注意力张量。更多详情请参阅返回张量下的attentions。 - return_dict (
bool,可选) — 是否返回 ModelOutput 而不是普通元组。
返回
transformers.modeling_outputs.SequenceClassifierOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.SequenceClassifierOutput 或 torch.FloatTensor 元组(如果传递了 return_dict=False 或 config.return_dict=False 时),包含根据配置 (ReformerConfig) 和输入而定的各种元素。
-
loss (形状为
(1,)的torch.FloatTensor,可选,当提供labels时返回) — 分类损失(如果 config.num_labels==1,则为回归损失)。 -
logits (形状为
(batch_size, config.num_labels)的torch.FloatTensor) — 分类(如果 config.num_labels==1,则为回归)分数(SoftMax 之前)。 -
hidden_states (
tuple(torch.FloatTensor), optional, 当传递output_hidden_states=True或当config.output_hidden_states=True时返回) —torch.FloatTensor的元组(一个用于嵌入层的输出,如果模型有嵌入层;+一个用于每个层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor), optional, 当传递output_attentions=True或当config.output_attentions=True时返回) —torch.FloatTensor的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
ReformerForSequenceClassification 的前向传播方法,覆盖了 __call__ 特殊方法。
虽然 forward pass 的实现需要在此函数中定义,但你应该在之后调用
Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
单标签分类示例
>>> import torch
>>> from transformers import AutoTokenizer, ReformerForSequenceClassification
>>> tokenizer = AutoTokenizer.from_pretrained("google/reformer-crime-and-punishment")
>>> model = ReformerForSequenceClassification.from_pretrained("google/reformer-crime-and-punishment")
>>> inputs = tokenizer("Hello, my dog is cute", return_tensors="pt")
>>> with torch.no_grad():
... logits = model(**inputs).logits
>>> predicted_class_id = logits.argmax().item()
>>> label = model.config.id2label[predicted_class_id]>>> # To train a model on `num_labels` classes, you can pass `num_labels=num_labels` to `.from_pretrained(...)`
>>> num_labels = len(model.config.id2label)
>>> model = ReformerForSequenceClassification.from_pretrained(
... "google/reformer-crime-and-punishment", num_labels=num_labels
... )
>>> labels = torch.tensor(1)
>>> loss = model(**inputs, labels=labels).lossReformerForQuestionAnswering
class transformers.ReformerForQuestionAnswering
< 源码 >( config model_args: ~utils.generic.ModelArgs | None = None adapter_args: ~utils.generic.AdapterArgs | None = None lora_args: ~utils.generic.LoRAArgs | None = None tokenizer_args: ~utils.generic.TokenizerArgs | None = None dataset_args: ~utils.generic.DatasetArgs | None = None data_args: ~utils.generic.DataArgs | None = None training_args: ~utils.generic.TrainingArgs | None = None generation_args: ~utils.generic.GenerationArgs | None = None vision_tower_args: ~utils.generic.VisionTowerArgs | None = None qlora_args: ~utils.generic.QLoRAArgs | None = None vision_tower_template_args: ~utils.generic.VisionTowerTemplateArgs | None = None video_tower_args: ~utils.generic.VideoTowerArgs | None = None vision_config: ~utils.generic.VisionConfig | None = None video_config: ~utils.generic.VideoConfig | None = None load_dataset: bool | None = None load_data_collator: bool | None = None load_processor: bool | None = None load_lora_adapter: bool | None = None load_adapter: bool | None = None load_qlora_adapter: bool | None = None **kwargs: typing_extensions.Unpack[transformers.modeling_utils.PreTrainedModelKwargs] )
参数
- config (ReformerForQuestionAnswering) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载模型相关的权重,只加载配置。请查看 from_pretrained() 方法来加载模型权重。
Reformer Transformer,顶部带有一个跨度分类头,用于 SQuAD 等抽取式问答任务(隐藏状态输出之上的一个线性层,用于计算 跨度起始 logits 和 跨度结束 logits)。
此模型继承自 PreTrainedModel。查看其父类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头等)。
此模型也是一个 PyTorch torch.nn.Module 子类。像普通的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解一般用法和行为的所有相关信息。
forward
< 源码 >( input_ids: torch.Tensor | None = None position_ids: torch.Tensor | None = None attention_mask: torch.Tensor | None = None inputs_embeds: torch.Tensor | None = None num_hashes: int | None = None start_positions: torch.Tensor | None = None end_positions: torch.Tensor | None = None output_hidden_states: bool | None = None output_attentions: bool | None = None return_dict: bool | None = None **kwargs ) → transformers.modeling_outputs.QuestionAnsweringModelOutput 或 tuple(torch.FloatTensor)
参数
- input_ids (形状为
(batch_size, sequence_length)的torch.LongTensor) — 输入序列标记在词表中的索引。在训练期间,input_ids 的序列长度必须是相关模型块长度(lsh、local 或两者)的倍数。在评估期间,索引会自动填充为块长度的倍数。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.__call__()。
- position_ids (形状为
(batch_size, sequence_length)的torch.Tensor,可选) — 每个输入序列标记在位置嵌入中的位置索引。选在[0, config.n_positions - 1]范围内。 - attention_mask (形状为
(batch_size, sequence_length)的torch.Tensor,可选) — 用于避免在填充标记索引上执行注意力的掩码。掩码值选在[0, 1]之间:- 1 表示未被掩盖的标记,
- 0 表示已被掩盖的标记。
- inputs_embeds (形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,你可以选择直接传递嵌入表示,而不是传递input_ids。如果你希望比模型内部的嵌入查找矩阵更自主地控制如何将input_ids索引转换为关联向量,这将非常有用。 - num_hashes (
int,可选) — 分桶过程中应执行的哈希轮数。设置此参数将覆盖config.num_hashes中定义的默认值。更多信息请参阅 ReformerConfig 中的
num_hashes。 - start_positions (形状为
(batch_size,)的torch.Tensor,可选) — 标记跨度起始位置(索引)的标签,用于计算标记分类损失。位置被限制在序列长度 (sequence_length) 内。序列之外的位置不计入损失计算。 - end_positions (形状为
(batch_size,)的torch.Tensor,可选) — 标记跨度结束位置(索引)的标签,用于计算标记分类损失。位置被限制在序列长度 (sequence_length) 内。序列之外的位置不计入损失计算。 - output_hidden_states (
bool,可选) — 是否返回所有层的隐藏状态。更多详情请参阅返回张量下的hidden_states。 - output_attentions (
bool,可选) — 是否返回所有注意力层的注意力张量。更多详情请参阅返回张量下的attentions。 - return_dict (
bool,可选) — 是否返回 ModelOutput 而不是普通元组。
返回
transformers.modeling_outputs.QuestionAnsweringModelOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.QuestionAnsweringModelOutput 或 torch.FloatTensor 元组(如果传递了 return_dict=False 或 config.return_dict=False 时),包含根据配置 (ReformerConfig) 和输入而定的各种元素。
-
loss (
torch.FloatTensorof shape(1,), 可选, 当提供labels时返回) — 总范围提取损失是起始位置和结束位置的交叉熵之和。 -
start_logits (
torch.FloatTensorof shape(batch_size, sequence_length)) — 范围起始分数(SoftMax 之前)。 -
end_logits (
torch.FloatTensorof shape(batch_size, sequence_length)) — 范围结束分数(SoftMax 之前)。 -
hidden_states (
tuple(torch.FloatTensor), optional, 当传递output_hidden_states=True或当config.output_hidden_states=True时返回) —torch.FloatTensor的元组(一个用于嵌入层的输出,如果模型有嵌入层;+一个用于每个层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor), optional, 当传递output_attentions=True或当config.output_attentions=True时返回) —torch.FloatTensor的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
ReformerForQuestionAnswering 的前向传播方法,覆盖了 __call__ 特殊方法。
虽然 forward pass 的实现需要在此函数中定义,但你应该在之后调用
Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> from transformers import AutoTokenizer, ReformerForQuestionAnswering
>>> import torch
>>> tokenizer = AutoTokenizer.from_pretrained("google/reformer-crime-and-punishment")
>>> model = ReformerForQuestionAnswering.from_pretrained("google/reformer-crime-and-punishment")
>>> question, text = "Who was Jim Henson?", "Jim Henson was a nice puppet"
>>> inputs = tokenizer(question, text, return_tensors="pt")
>>> with torch.no_grad():
... outputs = model(**inputs)
>>> answer_start_index = outputs.start_logits.argmax()
>>> answer_end_index = outputs.end_logits.argmax()
>>> predict_answer_tokens = inputs.input_ids[0, answer_start_index : answer_end_index + 1]
>>> tokenizer.decode(predict_answer_tokens, skip_special_tokens=True)
...
>>> # target is "nice puppet"
>>> target_start_index = torch.tensor([14])
>>> target_end_index = torch.tensor([15])
>>> outputs = model(**inputs, start_positions=target_start_index, end_positions=target_end_index)
>>> loss = outputs.loss
>>> round(loss.item(), 2)
...