KerasHub:预训练模型 / API 文档 / 建模层 / TransformerDecoder 层

TransformerDecoder layer

[源代码]

TransformerDecoder

keras_hub.layers.TransformerDecoder(
    intermediate_dim,
    num_heads,
    dropout=0,
    activation="relu",
    layer_norm_epsilon=1e-05,
    kernel_initializer="glorot_uniform",
    bias_initializer="zeros",
    normalize_first=False,
    **kwargs
)

Transformer 解码器。

该类遵循论文 Attention is All You Need 中 Transformer 解码器层的架构。用户可以实例化该类的多个实例来堆叠解码器。

默认情况下,该层将对解码器注意力层应用因果掩码。您也可以在调用时直接将填充掩码或注意力掩码传递给该层,例如使用 decoder_padding_maskdecoder_attention_mask

该层可以用一个或两个输入进行调用。输入的数量在所有调用中必须保持一致。选项如下:layer(decoder_sequence):解码器块中不会构建交叉注意力。这在使用 GPT-2 等“仅解码器”Transformer 时很有用。layer(decoder_sequence, encoder_sequence):解码器块中会构建交叉注意力。这在使用“编码器-解码器”Transformer(例如 Attention is All You Need 中描述的原始 Transformer 模型)时很有用。

参数

  • intermediate_dim: int,前馈网络的隐藏大小。
  • num_heads:int,MultiHeadAttention 中的头数。
  • dropout:float。Dropout 值,由 MultiHeadAttention 和前馈网络共享。默认为 0.
  • activation:string 或 keras.activations。前馈网络的激活函数。默认为 "relu"
  • layer_norm_epsilon:float。层归一化组件中的 epsilon 值。默认为 1e-5
  • kernel_initializer: string 或 keras.initializers 初始化器。全连接层和多头注意力层的核初始化器。默认为 "glorot_uniform"
  • bias_initializer: string 或 keras.initializers 初始化器。全连接层和多头注意力层的偏置初始化器。默认为 "zeros"
  • normalize_first:bool。如果为 True,则注意力层和中间密集层的输入会被归一化(类似于 GPT-2)。如果设置为 False,则注意力层和中间密集层的输出会被归一化(类似于 BERT)。默认为 False
  • **kwargs: 传递给 keras.layers.Layer 的其他关键字参数,包括 nametrainabledtype 等。

示例

# Create a single transformer decoder layer.
decoder = keras_hub.layers.TransformerDecoder(
    intermediate_dim=64, num_heads=8)

# Create a simple model containing the decoder.
decoder_input = keras.Input(shape=(10, 64))
encoder_input = keras.Input(shape=(10, 64))
output = decoder(decoder_input, encoder_input)
model = keras.Model(
    inputs=(decoder_input, encoder_input),
    outputs=output,
)

# Call decoder on the inputs.
decoder_input_data = np.random.uniform(size=(2, 10, 64))
encoder_input_data = np.random.uniform(size=(2, 10, 64))
decoder_output = model((decoder_input_data, encoder_input_data))

参考文献


[源代码]

call 方法

TransformerDecoder.call(
    decoder_sequence,
    encoder_sequence=None,
    decoder_padding_mask=None,
    decoder_attention_mask=None,
    encoder_padding_mask=None,
    encoder_attention_mask=None,
    self_attention_cache=None,
    self_attention_cache_update_index=None,
    cross_attention_cache=None,
    cross_attention_cache_update_index=None,
    use_causal_mask=True,
    training=None,
)

TransformerDecoder 的前向传播。

参数

  • decoder_sequence:一个 Tensor。解码器输入序列。
  • encoder_sequence:一个 Tensor。编码器输入序列。对于仅解码器模型(如 GPT2),应将其保留为 None。一旦模型在没有 encoder_sequence 的情况下被调用一次,您就不能再次使用 encoder_sequence 调用它。
  • decoder_padding_mask:一个布尔 Tensor,解码器序列的填充掩码,形状必须为 [batch_size, decoder_sequence_length]
  • decoder_attention_mask:一个布尔 Tensor。自定义解码器序列掩码,形状必须为 [batch_size, decoder_sequence_length, decoder_sequence_length]
  • encoder_padding_mask:一个布尔 Tensor,编码器序列的填充掩码,形状必须为 [batch_size, encoder_sequence_length]
  • encoder_attention_mask:一个布尔 Tensor。自定义编码器序列掩码,形状必须为 [batch_size, encoder_sequence_length, encoder_sequence_length]
  • self_attention_cache:一个密集 float Tensor。自注意力层中键/值对的缓存。形状为 [batch_size, 2, max_seq_len, num_heads, key_dims]
  • self_attention_cache_update_index:一个 int 或 int Tensor,用于更新 self_attention_cache 的索引。通常,这是解码过程中正在处理的当前 token 的索引。
  • cross_attention_cache:一个密集 float Tensor。交叉注意力层中键/值对的缓存。形状为 [batch_size, 2, S, num_heads, key_dims]
  • cross_attention_cache_update_index:一个 int 或 int Tensor,用于更新 cross_attention_cache 的索引。通常,这是 0(计算完整的 cross_attention_cache)或 None(重用先前计算的 cross_attention_cache)。
  • use_causal_mask:bool,默认为 True。如果为 True,则在解码器序列上应用因果掩码(掩盖未来的输入)。
  • training: 一个布尔值,指示该层是应在训练模式还是推理模式下运行。

返回

  • 根据调用参数,返回以下三者之一:
  • outputs,如果 self_attention_cache 为 `None`。
  • (outputs, self_attention_cache),如果设置了 self_attention_cache 且该层没有交叉注意力。
  • (outputs, self_attention_cache, cross_attention_cache),如果设置了 self_attention_cachecross_attention_cache 且该层具有交叉注意力。