Multi-head attention helps a model look at information from different views at the same time. This makes it better at understanding complex data like sentences or images.
Multi-head attention in PyTorch
torch.nn.MultiheadAttention(embed_dim, num_heads, dropout=0.0, bias=True, add_bias_kv=False, add_zero_attn=False, kdim=None, vdim=None, batch_first=False, device=None, dtype=None)
embed_dim: Size of each input embedding vector.
num_heads: How many different attention views to use.
mha = torch.nn.MultiheadAttention(embed_dim=64, num_heads=8)
mha = torch.nn.MultiheadAttention(embed_dim=128, num_heads=4, dropout=0.1, batch_first=True)
This code creates a multi-head attention layer with 4 heads and 16-dimensional embeddings. It runs random data through it and prints the shapes and small samples of the output and attention weights.
import torch import torch.nn as nn # Set seed for reproducibility torch.manual_seed(0) # Parameters embed_dim = 16 num_heads = 4 seq_length = 5 batch_size = 2 # Create MultiheadAttention layer mha = nn.MultiheadAttention(embed_dim=embed_dim, num_heads=num_heads, batch_first=True) # Random input tensors (batch, seq, embed_dim) query = torch.rand(batch_size, seq_length, embed_dim) key = torch.rand(batch_size, seq_length, embed_dim) value = torch.rand(batch_size, seq_length, embed_dim) # Forward pass output, attn_weights = mha(query, key, value) # Print shapes and a small part of output and attention weights print(f"Output shape: {output.shape}") print(f"Attention weights shape: {attn_weights.shape}") print(f"Output sample:\n{output[0, :2, :4]}") print(f"Attention weights sample:\n{attn_weights[0, :2, :5]}")
Input shapes must match the expected format: (batch, sequence, embedding) if batch_first=True.
Multi-head attention splits embeddings into parts, applies attention separately, then combines results.
Attention weights show how much each position focuses on others.
Multi-head attention lets models focus on different parts of data at once.
It improves understanding of complex patterns in language and images.
PyTorch provides a simple MultiheadAttention layer to use this easily.
Practice
MultiheadAttention layer?Solution
Step 1: Understand the concept of multi-head attention
Multi-head attention splits the input into multiple parts (heads) to focus on different information simultaneously.Step 2: Relate to PyTorch's
This layer implements this idea to improve model understanding by attending to various input features at once.MultiheadAttentionlayerFinal Answer:
To allow the model to focus on different parts of the input simultaneously -> Option DQuick Check:
Multi-head attention = focus on multiple input parts [OK]
- Thinking it reduces input size
- Confusing it with adding layers
- Assuming it just adds vectors
Solution
Step 1: Check PyTorch MultiheadAttention parameter order
The constructor requiresembed_dimfirst, thennum_headsas keyword arguments.Step 2: Verify correct syntax
torch.nn.MultiheadAttention(embed_dim=64, num_heads=8) correctly usesembed_dim=64andnum_heads=8. torch.nn.MultiheadAttention(num_heads=64, embed_dim=8) swaps parameters incorrectly, A and D use positional arguments wrongly.Final Answer:
torch.nn.MultiheadAttention(embed_dim=64, num_heads=8) -> Option BQuick Check:
embed_dim first, num_heads second [OK]
- Swapping embed_dim and num_heads
- Using positional args incorrectly
- Missing one of the required parameters
attn_output?
import torch mha = torch.nn.MultiheadAttention(embed_dim=16, num_heads=4) query = torch.rand(5, 3, 16) # (sequence_length, batch_size, embed_dim) key = torch.rand(5, 3, 16) value = torch.rand(5, 3, 16) attn_output, attn_weights = mha(query, key, value)
Solution
Step 1: Understand input shapes for MultiheadAttention
Inputs are (sequence_length, batch_size, embed_dim). Here, query shape is (5, 3, 16).Step 2: Check output shape of
Output shape matches query shape: (5, 3, 16).attn_outputFinal Answer:
(5, 3, 16) -> Option AQuick Check:
Output shape = query shape = (5, 3, 16) [OK]
- Mixing batch and sequence dimensions
- Confusing embed_dim position
- Assuming output shape changes with heads
import torch mha = torch.nn.MultiheadAttention(embed_dim=32, num_heads=4) query = torch.rand(10, 2, 32) key = torch.rand(10, 2, 16) value = torch.rand(10, 2, 32) output, weights = mha(query, key, value)
Solution
Step 1: Check embed_dim consistency
MultiheadAttention requires query, key, and value to have the same embedding dimension. Here, key has embed_dim 16, while query and value have 32.Step 2: Identify the error cause
This mismatch causes a runtime error because the attention mechanism cannot align different embedding sizes.Final Answer:
The embed_dim of key does not match embed_dim of query and value -> Option AQuick Check:
Embed dims must match for query, key, value [OK]
- Ignoring embed_dim mismatch
- Assuming batch size causes error
- Thinking sequence length is the problem
Solution
Step 1: Understand padding in variable-length sequences
Sentences have different lengths, so padding tokens are added to make batch tensors uniform.Step 2: Use
PyTorch'skey_padding_maskto ignore paddingMultiheadAttentionacceptskey_padding_maskto mask out padded positions during attention, preventing them from affecting results.Final Answer:
Using thekey_padding_maskargument inMultiheadAttention-> Option CQuick Check:
Mask padding tokens with key_padding_mask [OK]
- Removing padding manually (inefficient)
- Confusing batch_first with padding handling
- Increasing heads does not fix padding
Ready to prove it?
Pass the test and this pattern moves unknown
