编码器-解码器模型

注意

Adapter implementation notes:
  • 与其他模型不同,尚未为EncoderDecoderModel实现显式的EncoderDecoderAdapterModel。做出这一决定是因为Hugging Face Transformers的AutoModel类不支持EncoderDecoderModel。因此,我们的AutoAdapterModel类也不会支持EncoderDecoderAdapterModel。因此,要在EncoderDecoderModel中使用Adapters,请按照以下步骤操作:

    1. 首先,创建一个EncoderDecoderModel实例,例如使用model = EncoderDecoderModel.from_encoder_decoder_pretrained("bert-base-uncased", "bert-base-uncased")

    2. 接下来,使用adapters.init(model)函数将此模型转换为适配器模型。

  • 适配器可以同时添加到编码器和解码器中。与往常一样,leave_out参数可用于指定要添加适配器的层。对于EncoderDecoderModel,层ID分别在编码器和解码器上从0开始计数。因此,指定leave_out=[0,1]将跳过编码器的第一层和第二层以及解码器的第一层和第二层。

EncoderDecoderModel 可用于初始化一个序列到序列模型,其中编码器可以是任何预训练的自编码模型,解码器可以是任何预训练的自回归模型。

在序列生成任务中使用预训练检查点初始化序列到序列模型的有效性已在Sascha Rothe、Shashi Narayan和Aliaksei Severyn的论文Leveraging Pre-trained Checkpoints for Sequence Generation Tasks中得到验证。

在训练/微调完这样的EncoderDecoderModel后,它可以像其他模型一样被保存/加载(更多信息请参阅示例)。

这种架构的一个应用可以是利用两个预训练的BertModel分别作为摘要模型的编码器和解码器,如杨刘和Mirella Lapata在Text Summarization with Pretrained Encoders中所示。

编码器解码器模型

class transformers.EncoderDecoderModel(config: Optional[PretrainedConfig] = None, encoder: Optional[PreTrainedModel] = None, decoder: Optional[PreTrainedModel] = None)

该类可用于初始化一个序列到序列模型,其中编码器可以是任何预训练的自编码模型,解码器可以是任何预训练的自回归模型。编码器通过[~AutoModel.from_pretrained]函数加载,解码器通过[~AutoModelForCausalLM.from_pretrained]函数加载。交叉注意力层会自动添加到解码器中,应在下游生成任务(如摘要生成)上进行微调。

在序列生成任务中使用预训练检查点初始化序列到序列模型的有效性已在Sascha Rothe、Shashi Narayan、Aliaksei Severyn、Michael Matena、Yanqi Zhou、Wei Li和Peter J. Liu的论文[利用预训练检查点进行序列生成任务](https://arxiv.org/abs/1907.12461)中得到验证。

在训练/微调完这样的编码器-解码器模型后,它可以像其他模型一样被保存/加载(更多信息请参阅示例)。

该模型继承自[PreTrainedModel]。请查看超类文档了解该库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入大小、修剪头部等)。

This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage and behavior.

Parameters

config ([EncoderDecoderConfig]) – 包含模型所有参数的模型配置类。使用配置文件初始化时不会加载与模型关联的权重,仅加载配置。请查看[~PreTrainedModel.from_pretrained]方法来加载模型权重。

[EncoderDecoderModel] 是一个通用模型类,当使用编码器的 :meth*~transformers.AutoModel.from_pretrained* 类方法和解码器的 :meth*~transformers.AutoModelForCausalLM.from_pretrained* 类方法创建时,它将实例化为一个包含库中某个基础模型类作为编码器、另一个基础模型类作为解码器的Transformer架构。

forward(input_ids: Optional[LongTensor] = None, attention_mask: Optional[FloatTensor] = None, decoder_input_ids: Optional[LongTensor] = None, decoder_attention_mask: Optional[BoolTensor] = None, encoder_outputs: Optional[Tuple[FloatTensor]] = None, past_key_values: Optional[Tuple[Tuple[FloatTensor]]] = None, inputs_embeds: Optional[FloatTensor] = None, decoder_inputs_embeds: Optional[FloatTensor] = None, labels: Optional[LongTensor] = None, use_cache: Optional[bool] = None, output_attentions: Optional[bool] = None, output_hidden_states: Optional[bool] = None, return_dict: Optional[bool] = None, **kwargs) Union[Tuple, Seq2SeqLMOutput]

[EncoderDecoderModel] 的前向方法重写了 __call__ 特殊方法。

<提示>

尽管前向传播的步骤需要在此函数内定义,但之后应该调用[Module]实例而非此函数,因为前者会负责运行预处理和后处理步骤,而后者会静默忽略这些步骤。

Parameters
  • input_ids (torch.LongTensor of shape (batch_size, sequence_length)) –

    词汇表中输入序列标记的索引。

    可以使用[PreTrainedTokenizer]获取索引。详情请参阅[PreTrainedTokenizer.encode]和 [PreTrainedTokenizer.__call__]。

    [什么是输入ID?](../glossary#input-ids)

  • attention_mask (torch.FloatTensor,形状为(batch_size, sequence_length)可选) –

    用于避免对填充标记索引执行注意力计算的掩码。掩码值选自[0, 1]

    • 1 表示该标记未被掩码

    • 0 表示该标记被掩码

    [什么是注意力掩码?](../glossary#attention-mask)

  • decoder_input_ids (torch.LongTensor of shape (batch_size, target_sequence_length), optional) –

    解码器输入序列标记在词汇表中的索引。

    可以使用[PreTrainedTokenizer]获取这些索引。详情请参阅[PreTrainedTokenizer.encode]和 [PreTrainedTokenizer.__call__]。

    [什么是输入ID?](../glossary#input-ids)

    如果使用了past_key_values,则可以选择性地仅输入最后一个decoder_input_ids(参见 past_key_values)。

    在训练过程中,decoder_input_ids会由模型自动生成,方法是将labels向右移动, 用pad_token_id替换-100,并在前面添加decoder_start_token_id

  • decoder_attention_mask (torch.BoolTensor of shape (batch_size, target_sequence_length), 可选) – 默认行为:生成一个忽略decoder_input_ids中填充标记的张量。默认情况下也会使用因果掩码。

  • encoder_outputs (tuple(torch.FloatTensor), 可选) – 该元组必须包含 (last_hidden_state, 可选: hidden_states, 可选: attentions) last_hidden_state (torch.FloatTensor 形状为 (batch_size, sequence_length, hidden_size)) 是编码器最后一层输出的隐藏状态张量。用于解码器的交叉注意力机制。

  • past_key_values (tuple(tuple(torch.FloatTensor)) 长度为 config.n_layers,每个元组包含4个形状为 (batch_size, num_heads, sequence_length - 1, embed_size_per_head) 的张量) –

    包含注意力块预先计算好的键和值隐藏状态。可用于加速解码过程。

    如果使用了 past_key_values,用户可以选择性地仅输入形状为 (batch_size, 1) 的最后 decoder_input_ids(那些未将其过去键值状态提供给此模型的输入),而不是形状为 (batch_size, sequence_length) 的所有 decoder_input_ids

  • inputs_embeds (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size), optional) – 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids。如果您希望对如何将input_ids索引转换为关联向量有更多控制,而不是使用模型的内部嵌入查找矩阵,这将非常有用。

  • decoder_inputs_embeds (torch.FloatTensor,形状为(batch_size, target_sequence_length, hidden_size)可选) – 作为替代方案,您可以选择直接传入嵌入表示而非传递decoder_input_ids。当您希望对如何将decoder_input_ids索引转换为关联向量有比模型内部嵌入查找矩阵更强的控制时,这个选项非常有用。

  • labels (torch.LongTensor of shape (batch_size, sequence_length), optional) – 用于计算解码器掩码语言建模损失的标签。索引值应在[-100, 0, ..., config.vocab_size]范围内(参见input_ids文档说明)。设置为-100的索引会被忽略(掩码处理),损失仅针对标签值在[0, ..., config.vocab_size]范围内的token进行计算

  • use_cache (bool, 可选) - 如果设置为True,将返回past_key_values键值状态,可用于加速解码过程(参见past_key_values)。

  • output_attentions (bool, 可选) – 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量中的attentions

  • output_hidden_states (bool, 可选) – 是否返回所有层的隐藏状态。有关返回张量中hidden_states的更多详情,请参阅相关说明。

  • return_dict (bool, 可选) – 如果设为True,模型将返回一个[~utils.Seq2SeqLMOutput]而不是普通元组。

  • kwargs (可选参数) –

    剩余的关键字参数字典。关键字参数分为两种类型:

    • 不带前缀的参数将作为**encoder_kwargs输入到编码器前向函数中。

    • 带有decoder_前缀的参数将作为**decoder_kwargs输入到解码器前向函数中。

  • 返回值

    [transformers.modeling_outputs.Seq2SeqLMOutput] 或 tuple(torch.FloatTensor): 一个 [transformers.modeling_outputs.Seq2SeqLMOutput] 或由多个元素组成的 torch.FloatTensor 元组(当传入 return_dict=Falseconfig.return_dict=False 时),具体元素取决于配置 ([EncoderDecoderConfig]) 和输入。

    • 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=Trueconfig.use_cache=True 时返回) – 长度为 config.n_layerstuple(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=Trueconfig.output_hidden_states=True 时返回) – torch.FloatTensor 元组(一个用于嵌入层输出,如果模型有嵌入层,加上每层的输出)形状为 (batch_size, sequence_length, hidden_size)

      解码器每层输出后的隐藏状态加上初始嵌入输出。

    • decoder_attentions (tuple(torch.FloatTensor), 可选, 当传入 output_attentions=Trueconfig.output_attentions=True 时返回) – torch.FloatTensor 元组(每层一个)形状为 (batch_size, num_heads, sequence_length, sequence_length)

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

    • cross_attentions (tuple(torch.FloatTensor), 可选, 当传入 output_attentions=Trueconfig.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=Trueconfig.output_hidden_states=True 时返回) – torch.FloatTensor 元组(一个用于嵌入层输出,如果模型有嵌入层,加上每层的输出)形状为 (batch_size, sequence_length, hidden_size)

      编码器每层输出后的隐藏状态加上初始嵌入输出。

    • encoder_attentions (tuple(torch.FloatTensor), 可选, 当传入 output_attentions=Trueconfig.output_attentions=True 时返回) – torch.FloatTensor 元组(每层一个)形状为 (batch_size, num_heads, sequence_length, sequence_length)

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

  • 示例

  • ```python

  • EncoderDecoderModel (>>> from transformers import) –

  • BertTokenizer

  • torch (>>> import) –

  • BertTokenizer.from_pretrained (>>> tokenizer =) –

  • EncoderDecoderModel.from_encoder_decoder_pretrained( (>>> model =) –

  • "google-bert/bert-base-uncased" (...) –

  • "google-bert/bert-base-uncased"

  • 检查点 (... ) # 从预训练模型初始化Bert2Bert) –

  • 训练 (>>> #) –

  • tokenizer.cls_token_id (>>> model.config.decoder_start_token_id =) –

  • tokenizer.pad_token_id (>>> model.config.pad_token_id =) –

  • model.config.decoder.vocab_size (>>> model.config.vocab_size =) –

  • tokenizer (>>> labels =) –

  • tokenizer

  • model (>>> outputs =) –

  • loss (>>>) –

  • outputs.loss (logits =) –

  • outputs.logits

  • pretrained (>>> # 保存和加载自) –

  • model.save_pretrained (>>>) –

  • EncoderDecoderModel.from_pretrained (>>> model =) –

  • 生成 (>>> #) –

  • model.generate (>>> generated =) –

  • ```

classmethod from_encoder_decoder_pretrained(encoder_pretrained_model_name_or_path: Optional[str] = None, decoder_pretrained_model_name_or_path: Optional[str] = None, *model_args, **kwargs) PreTrainedModel

从预训练模型检查点实例化库的一个或两个基类中的编码器和解码器。

模型默认使用model.eval()设置为评估模式(Dropout模块被停用)。要训练模型,您需要先用model.train()将其重新设置为训练模式。

Params:
encoder_pretrained_model_name_or_path (str, optional):

初始化编码器所需的信息。可以是以下之一:

  • 一个字符串,表示托管在huggingface.co模型仓库中的预训练模型的模型ID

  • 指向包含使用[~PreTrainedModel.save_pretrained]保存的模型权重的目录路径,例如./my_model_directory/

  • 指向TensorFlow索引检查点文件的路径或URL(例如./tf_model/model.ckpt.index)。在这种情况下,应将from_tf设置为True,并提供一个配置对象作为config参数。这种加载方式比使用提供的转换脚本将TensorFlow检查点转换为PyTorch模型后再加载PyTorch模型要慢。

decoder_pretrained_model_name_or_path (str, optional, defaults to None):

启动解码器所需的信息。可以是以下任意一种:

  • 一个字符串,表示托管在huggingface.co模型仓库中的预训练模型的模型ID

  • 指向包含使用[~PreTrainedModel.save_pretrained]保存的模型权重的目录路径,例如./my_model_directory/

  • 指向TensorFlow索引检查点文件的路径或URL(例如./tf_model/model.ckpt.index)。在这种情况下,应将from_tf设置为True,并提供一个配置对象作为config参数。这种加载方式比使用提供的转换脚本将TensorFlow检查点转换为PyTorch模型后再加载PyTorch模型要慢。

model_args (remaining positional arguments, optional):

所有剩余的位置参数将被传递给底层模型的__init__方法。

kwargs (remaining dictionary of keyword arguments, optional):

可用于更新配置对象(加载后)并初始化模型(例如,output_attentions=True)。

  • 要更新编码器配置,请为每个配置参数使用前缀encoder_

  • 要更新解码器配置,请为每个配置参数使用前缀decoder_

  • 要更新父模型配置,请勿为每个配置参数使用前缀。

根据是否提供config或自动加载,行为会有所不同。

示例:

```python >>> from transformers import EncoderDecoderModel

>>> # initialize a bert2bert from two pretrained BERT models. Note that the cross-attention layers will be randomly initialized
>>> model = EncoderDecoderModel.from_encoder_decoder_pretrained("google-bert/bert-base-uncased", "google-bert/bert-base-uncased")
>>> # saving model after fine-tuning
>>> model.save_pretrained("./bert2bert")
>>> # load fine-tuned model
>>> model = EncoderDecoderModel.from_pretrained("./bert2bert")
```