The Transformer decoder helps a model understand and generate sequences, like sentences, by looking at what it has generated so far and what it should pay attention to.
Transformer decoder in PyTorch
torch.nn.TransformerDecoder(decoder_layer, num_layers, norm=None)decoder_layer is a single layer that defines how the decoder works.
num_layers is how many decoder layers you stack to make the full decoder.
decoder_layer = torch.nn.TransformerDecoderLayer(d_model=512, nhead=8) decoder = torch.nn.TransformerDecoder(decoder_layer, num_layers=6)
tgt is the target sequence input, and memory is the encoded source sequence from the encoder.output = decoder(tgt, memory)
This code builds a Transformer decoder with 2 layers. It creates random input sequences and passes them through the decoder. The output shape shows the sequence length, batch size, and feature size. The first output vector is printed rounded to 4 decimals.
import torch from torch import nn # Set seed for reproducibility torch.manual_seed(0) # Define parameters d_model = 32 nhead = 4 num_layers = 2 seq_len = 5 batch_size = 1 # Create a single decoder layer decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) # Stack decoder layers decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) # Create dummy target sequence (tgt) and memory from encoder # Shape: (sequence length, batch size, feature size) tgt = torch.rand(seq_len, batch_size, d_model) memory = torch.rand(seq_len, batch_size, d_model) # Pass through decoder output = decoder(tgt, memory) # Print output shape and first vector print(f"Output shape: {output.shape}") print(f"First output vector:\n{output[0,0,:].round(4)}")
The decoder expects inputs shaped as (sequence length, batch size, feature size).
The memory input comes from the encoder output and helps the decoder focus on the source sequence.
Masking is often used in real tasks to prevent the decoder from seeing future tokens, but is omitted here for simplicity.
The Transformer decoder generates output sequences by looking at previous outputs and encoder information.
It is built by stacking decoder layers, each with attention mechanisms.
Use it when you want to create models that generate or predict sequences step-by-step.
Practice
Solution
Step 1: Understand the Transformer decoder purpose
The Transformer decoder generates output sequences by attending to previous outputs and encoder outputs.Step 2: Compare options with decoder role
Only To generate output tokens step-by-step using previous outputs and encoder info describes generating output tokens step-by-step using previous outputs and encoder info, which matches the decoder's role.Final Answer:
To generate output tokens step-by-step using previous outputs and encoder info -> Option DQuick Check:
Decoder generates outputs stepwise = D [OK]
- Confusing encoder and decoder roles
- Thinking decoder encodes inputs
- Assuming decoder reduces data size
Solution
Step 1: Identify the correct PyTorch class for a decoder layer
PyTorch provides torch.nn.TransformerDecoderLayer to create a single decoder layer.Step 2: Check options for correct class and parameters
torch.nn.TransformerDecoderLayer(d_model=512, nhead=8) uses torch.nn.TransformerDecoderLayer with correct parameters. Others are either encoder layers or invalid classes.Final Answer:
torch.nn.TransformerDecoderLayer(d_model=512, nhead=8) -> Option AQuick Check:
Decoder layer class is TransformerDecoderLayer = A [OK]
- Using EncoderLayer instead of DecoderLayer
- Trying to instantiate TransformerDecoder directly
- Using non-existent class names
import torch from torch.nn import TransformerDecoder, TransformerDecoderLayer layer = TransformerDecoderLayer(d_model=256, nhead=8) decoder = TransformerDecoder(layer, num_layers=3) memory = torch.rand(10, 32, 256) # (source_seq_len, batch_size, d_model) tgt = torch.rand(20, 32, 256) # (target_seq_len, batch_size, d_model) output = decoder(tgt, memory)
Solution
Step 1: Understand input and output shapes for TransformerDecoder
The decoder input shape is (target_seq_len, batch_size, d_model). The output shape matches the target input shape.Step 2: Check given shapes and output
Target input 'tgt' has shape (20, 32, 256), so output will have the same shape.Final Answer:
(20, 32, 256) -> Option CQuick Check:
Output shape matches target input shape = C [OK]
- Confusing source and target sequence lengths
- Mixing batch size and feature dimensions
- Assuming output shape changes after decoding
import torch from torch.nn import TransformerDecoder, TransformerDecoderLayer layer = TransformerDecoderLayer(d_model=128, nhead=4) decoder = TransformerDecoder(layer, num_layers=2) memory = torch.rand(15, 16, 128) tgt = torch.rand(15, 16, 64) # Incorrect feature size output = decoder(tgt, memory)
Solution
Step 1: Check feature dimensions of inputs
The decoder expects target and memory tensors to have the same feature dimension (d_model=128).Step 2: Identify mismatch in target tensor
Target tensor 'tgt' has feature size 64, which does not match d_model=128, causing an error.Final Answer:
The target tensor 'tgt' has wrong feature dimension -> Option BQuick Check:
Feature size mismatch in target tensor = A [OK]
- Ignoring feature dimension mismatch
- Assuming batch size must match nhead
- Thinking number of layers causes this error
Solution
Step 1: Understand the need for masking in decoding
During generation, the decoder must not look at future tokens to avoid cheating, so masking is required.Step 2: Identify correct usage in PyTorch
Using TransformerDecoder with a mask on target input prevents attending to future tokens, enabling step-by-step generation.Final Answer:
Use a TransformerDecoder with masked target input to prevent attending to future tokens -> Option AQuick Check:
Mask future tokens in decoder input = B [OK]
- Not using masks and allowing future token attention
- Using encoder only for generation
- Feeding full output sequence without masking
Ready to prove it?
Pass the test and this pattern moves unknown
