Transformers help computers understand and generate language by focusing on important words in a sentence.
Transformer basics in TensorFlow
import tensorflow as tf from tensorflow.keras.layers import LayerNormalization, Dense, Dropout, MultiHeadAttention class TransformerBlock(tf.keras.layers.Layer): def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1): super(TransformerBlock, self).__init__() self.att = MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim) self.ffn = tf.keras.Sequential([ Dense(ff_dim, activation="relu"), Dense(embed_dim), ]) self.layernorm1 = LayerNormalization(epsilon=1e-6) self.layernorm2 = LayerNormalization(epsilon=1e-6) self.dropout1 = Dropout(rate) self.dropout2 = Dropout(rate) def call(self, inputs, training): attn_output = self.att(inputs, inputs, training=training) attn_output = self.dropout1(attn_output, training=training) out1 = self.layernorm1(inputs + attn_output) ffn_output = self.ffn(out1) ffn_output = self.dropout2(ffn_output, training=training) return self.layernorm2(out1 + ffn_output)
This code defines a Transformer block with attention and feed-forward parts.
LayerNormalization helps keep the data stable during training.
transformer_block = TransformerBlock(embed_dim=32, num_heads=2, ff_dim=64) output = transformer_block(tf.random.uniform((1, 10, 32)), training=False)
class SimpleTransformer(tf.keras.Model): def __init__(self): super(SimpleTransformer, self).__init__() self.transformer = TransformerBlock(embed_dim=64, num_heads=4, ff_dim=128) def call(self, x): return self.transformer(x, training=True)
This program creates a Transformer block and runs it on random data. It prints the shapes to show input and output sizes match.
import tensorflow as tf from tensorflow.keras.layers import LayerNormalization, Dense, Dropout, MultiHeadAttention class TransformerBlock(tf.keras.layers.Layer): def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1): super(TransformerBlock, self).__init__() self.att = MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim) self.ffn = tf.keras.Sequential([ Dense(ff_dim, activation="relu"), Dense(embed_dim), ]) self.layernorm1 = LayerNormalization(epsilon=1e-6) self.layernorm2 = LayerNormalization(epsilon=1e-6) self.dropout1 = Dropout(rate) self.dropout2 = Dropout(rate) def call(self, inputs, training): attn_output = self.att(inputs, inputs, training=training) attn_output = self.dropout1(attn_output, training=training) out1 = self.layernorm1(inputs + attn_output) ffn_output = self.ffn(out1) ffn_output = self.dropout2(ffn_output, training=training) return self.layernorm2(out1 + ffn_output) # Create dummy input: batch size 2, sequence length 5, embedding size 16 input_data = tf.random.uniform((2, 5, 16)) # Create Transformer block transformer_block = TransformerBlock(embed_dim=16, num_heads=2, ff_dim=32) # Run the block output = transformer_block(input_data, training=False) print("Input shape:", input_data.shape) print("Output shape:", output.shape)
Transformers use attention to focus on important parts of the input.
Embedding size must stay the same before and after the Transformer block.
Multi-head attention splits attention into parts to learn different relationships.
Transformers help models understand sequences by focusing on important words.
A Transformer block has attention and a small neural network inside.
TensorFlow makes it easy to build Transformer blocks with built-in layers.
Practice
Solution
Step 1: Understand attention in Transformers
The attention mechanism helps the model look at important words or parts in the input sequence.Step 2: Identify the main goal of attention
Its goal is to give more weight to relevant parts, improving understanding of context.Final Answer:
To focus on important parts of the input sequence -> Option CQuick Check:
Attention = Focus on important parts [OK]
- Thinking attention increases model size
- Confusing attention with layer count
- Believing attention creates random outputs
Solution
Step 1: Recall TensorFlow Keras layer imports
TensorFlow's Keras layers are imported from tensorflow.keras.layers module.Step 2: Check correct import syntax
The correct syntax is: from tensorflow.keras.layers import MultiHeadAttention.Final Answer:
from tensorflow.keras.layers import MultiHeadAttention -> Option AQuick Check:
Correct import = from tensorflow.keras.layers import MultiHeadAttention [OK]
- Using incorrect import paths
- Confusing tensorflow and keras imports
- Using wrong import syntax
import tensorflow as tf mha = tf.keras.layers.MultiHeadAttention(num_heads=2, key_dim=4) query = tf.random.uniform((1, 3, 8)) value = tf.random.uniform((1, 4, 8)) output = mha(query=query, value=value)
Solution
Step 1: Understand MultiHeadAttention input shapes
Query shape is (batch=1, query_len=3, features=8), value shape is (1, 4, 8).Step 2: Determine output shape
Output shape matches query length and feature dimension: (1, 3, 8).Final Answer:
(1, 3, 8) -> Option DQuick Check:
Output shape = query shape except last dim [OK]
- Confusing value length with output length
- Mixing batch and sequence dimensions
- Assuming output feature dims change
import tensorflow as tf
class SimpleTransformer(tf.keras.layers.Layer):
def __init__(self):
super().__init__()
self.mha = tf.keras.layers.MultiHeadAttention(num_heads=2, key_dim=4)
def call(self, x):
attn_output = self.mha(query=x)
return attn_output + xSolution
Step 1: Check MultiHeadAttention required arguments
MultiHeadAttention needs query and value arguments; value is missing here.Step 2: Understand why value is needed
Without value, the layer cannot compute attention properly, causing an error.Final Answer:
MultiHeadAttention requires 'value' argument -> Option AQuick Check:
Missing value argument = MultiHeadAttention requires 'value' argument [OK]
- Assuming value defaults when only query is provided
- Ignoring required arguments in call
- Thinking positional encoding is mandatory here
Solution
Step 1: Check MultiHeadAttention parameters
num_heads=4, key_dim=8 produces output_dim=32, valid for Transformer blocks.Step 2: Verify feed-forward network structure
FFN uses Dense(32, activation='relu') to expand, then Dense(8) to match input dim.Step 3: Confirm call method logic
Applies self-attention, FFN on output, residual connection (shapes match: 8).Final Answer:
Code with num_heads=4, key_dim=8, FFN Dense(32, ReLU) then Dense(8) -> Option BQuick Check:
MHA(4 heads, key_dim=8) + FFN expand(32 ReLU)-contract(8) + residual [OK]
- Swapping Dense layer sizes in feed-forward network
- Using wrong num_heads or key_dim values
- Omitting key argument in MultiHeadAttention
Ready to prove it?
Pass the test and this pattern moves unknown
