Self-attention helps a model focus on important parts of the input when making decisions. It looks at all parts of the input and decides which parts matter most for each piece.
Self-attention mechanism in PyTorch
import torch import torch.nn.functional as F def self_attention(query, key, value): scores = torch.matmul(query, key.transpose(-2, -1)) / (query.size(-1) ** 0.5) weights = F.softmax(scores, dim=-1) output = torch.matmul(weights, value) return output, weights
query, key, and value are tensors representing the input in different ways.
The scores measure how much each part should pay attention to others.
query = torch.tensor([[1., 0., 1.]]) key = torch.tensor([[1., 0., 1.]]) value = torch.tensor([[0., 1., 0.]]) output, weights = self_attention(query, key, value)
query = torch.randn(2, 3, 4) # batch=2, seq_len=3, features=4 key = torch.randn(2, 3, 4) value = torch.randn(2, 3, 4) output, weights = self_attention(query, key, value)
This program computes self-attention on a small example with 3 items in a sequence. It prints the attention weights and the output vectors.
import torch import torch.nn.functional as F def self_attention(query, key, value): scores = torch.matmul(query, key.transpose(-2, -1)) / (query.size(-1) ** 0.5) weights = F.softmax(scores, dim=-1) output = torch.matmul(weights, value) return output, weights # Example input: batch size 1, sequence length 3, feature size 4 query = torch.tensor([[[1., 0., 1., 0.], [0., 2., 0., 2.], [1., 1., 1., 1.]]]) key = query.clone() value = torch.tensor([[[0., 1., 0., 1.], [1., 0., 1., 0.], [0., 0., 1., 1.]]]) output, weights = self_attention(query, key, value) print("Attention weights:", weights) print("Output:", output)
Self-attention uses the same input for query, key, and value to find relationships within the input.
Dividing by the square root of the feature size helps keep the scores stable.
Softmax turns scores into probabilities that sum to 1, showing importance.
Self-attention helps models focus on important parts of input data.
It compares each part to every other part using query, key, and value.
Outputs are weighted sums showing combined important information.
Practice
Solution
Step 1: Understand self-attention's role
Self-attention helps the model decide which parts of the input are important by comparing each part to others.Step 2: Identify the main goal
The main goal is to focus on important parts, not to change input size or model layers.Final Answer:
To help the model focus on important parts of the input data -> Option DQuick Check:
Self-attention = focus on important parts [OK]
- Thinking self-attention changes input size
- Confusing self-attention with model depth
- Assuming it converts data formats
Q and key K tensors?Solution
Step 1: Recall scaled dot-product attention formula
Attention scores = (Q x K^T) / sqrt(d_k), where d_k is the dimension of keys.Step 2: Match formula with code
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(Q.size(-1)) correctly transposes K, multiplies Q and K^T, and divides by sqrt of last dimension size.Final Answer:
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(Q.size(-1)) -> Option AQuick Check:
Scaled dot-product = QxK^T / sqrt(d_k) [OK]
- Multiplying K by Q instead of Q by K^T
- Forgetting to transpose keys
- Using multiplication instead of division by sqrt
attn_output?
import torch Q = torch.randn(2, 4, 8) # batch=2, seq_len=4, dim=8 K = torch.randn(2, 4, 8) V = torch.randn(2, 4, 8) scores = torch.matmul(Q, K.transpose(-2, -1)) / (8 ** 0.5) weights = torch.nn.functional.softmax(scores, dim=-1) attn_output = torch.matmul(weights, V)
Solution
Step 1: Analyze input tensor shapes
Q, K, V have shape (batch=2, seq_len=4, dim=8).Step 2: Understand matrix multiplications
Scores shape: (2,4,4), weights shape: (2,4,4), multiplying weights (2,4,4) by V (2,4,8) results in (2,4,8).Final Answer:
(2, 4, 8) -> Option BQuick Check:
Output shape = (batch, seq_len, dim) = (2,4,8) [OK]
- Confusing batch and sequence dimensions
- Mixing up transpose effects on shape
- Assuming output shape changes dimension size
import torch Q = torch.randn(1, 3, 5) K = torch.randn(1, 3, 5) V = torch.randn(1, 3, 5) scores = torch.matmul(Q, K) / (5 ** 0.5) weights = torch.nn.functional.softmax(scores, dim=-1) output = torch.matmul(weights, V)
Solution
Step 1: Check matrix multiplication for scores
Q shape is (1,3,5), K shape is (1,3,5). To multiply Q by K^T, K must be transposed on last two dims.Step 2: Identify missing transpose
Code multiplies Q by K directly, causing shape mismatch or wrong attention scores.Final Answer:
K should be transposed before multiplication with Q -> Option CQuick Check:
QxK^T needed, missing transpose causes error [OK]
- Skipping transpose of K
- Applying softmax on wrong dimension
- Confusing shapes of Q and V
Solution
Step 1: Understand multi-head attention dimension split
Total dimension 32 is split evenly across 4 heads, so each head gets 32 / 4 = 8 dimensions.Step 2: Confirm dimension per head
Each head's query, key, and value vectors have dimension 8 to keep total dimension consistent.Final Answer:
8 -> Option AQuick Check:
32 total dim / 4 heads = 8 per head [OK]
- Using total dimension for each head
- Dividing by wrong number of heads
- Confusing batch size with dimension
Ready to prove it?
Pass the test and this pattern moves unknown
