Efficient Implementation of Multi-Head Attention
Multi-head attention extends causal attention across several heads, each operating independently with its own weights.
Why One Attention Mechanism Is Not Enough
So far, attention has been built as a single causal attention class that processes an input sequence with one set of weights. The final step in this line of work is to extend that class so it covers several heads at once. This extension is known as multi-head attention. The idea is less exotic than the name suggests: instead of asking one attention mechanism to do all of the work, we run several attention mechanisms side by side and gather what they produce.
What do you think happens?
If we move from one attention mechanism to several running side by side, what happens to the number of weight sets in the module?
Reveal answer
It multiplies. Each head has its own query, key, and value weight matrices, and the instances do not share weights.
The source states that building multi-head attention means creating several instances of the self-attention mechanism, each with its own weights. The instances do not share weights, which is what makes each head an independent view of the same input.
This article focuses on what the extension means and how its pieces fit together. It starts from the single-head case, then looks at how a multi-head module is organized, and finally explains why the approach is worth its added cost.
Recalling the Single-Head Flow
A single causal attention module can be regarded as single-head attention. In this arrangement there is exactly one set of attention weights, and that one set processes the input sequence. Every token passes through the same weights, and the module produces one set of context vectors as its result.
Read the flow from left to right. The input tokens enter, a single weight configuration transforms them as a sequence, and a single context vector matrix leaves. Keep this picture in mind. The multi-head version keeps the same overall flow and changes only how many weight sets sit in the middle.
What a Head Is
In practical terms, a head is one independent attention mechanism inside a multi-head module. It is a full self-attention instance with its own weights. A head does not borrow weights from another head. Each head therefore reads the same input sequence but does so through its own query, key, and value weight matrices, and it produces its own context vectors.
The contrast with a single causal attention module is the key idea. A single module has one value weight matrix, one query weight matrix, and one key weight matrix. A head is one of several such complete sets. Calling each set a head emphasizes that it is one view of the input, and that several views can be held at once.
The extension is approached in two stages. The first stage builds the idea intuitively by stacking multiple CausalAttention modules, each acting as a single head, and combining their results. The second stage implements the same multi-head module in a more complicated but more computationally efficient way. Stacking comes first because it makes the structure visible: each stacked module is a head you already understand. The later efficient version computes the same kind of result with a different organization.
Tracing a Two-Head Module
Consider the two-head case, the smallest version that shows the full structure. The embedded input tokens stay exactly as they are at the start. Where a single-head module had one value weight matrix, a two-head module has two, one per head. The same change applies to the query and key weight matrices. Each head then runs its own attention computation on the input and produces its own set of context vectors, labeled $Z_1$ and $Z_2$. Those two sets are combined into a single context vector matrix $Z$.
Read the diagram as a sequence of stages. First, the input enters the module once, and it reaches both heads. Second, Head 1 and Head 2 work on that input independently, each through its own weights. Third, each head emits its own context vectors, $Z_1$ from the first head and $Z_2$ from the second. Finally, the two outputs are combined into one matrix $Z$. The merge is the only point where the two paths meet, so the two heads are fully separate until that step.
Following one token through two heads
A two-head module receives an input sequence of embedded tokens. Trace what happens to the first token as it moves through the module, using only the stages described in the source.
- 1Entry
The first token enters the module in its embedded form. It is not changed by the module before the heads receive it.
- 2Head 1 pass
Head 1 processes the sequence with its own query, key, and value weight matrices and produces context vectors for the token, which belong to the $Z_1$ output.
- 3Head 2 pass
Head 2 processes the same sequence independently with its own weight matrices and produces its own context vectors, which belong to the $Z_2$ output.
- 4Merge
The $Z_1$ and $Z_2$ outputs are combined into the single context vector matrix $Z$. This is the point where the two head outputs return to one result.
The first token is represented in two separate head outputs, which are merged into one context matrix $Z$. The two heads never shared weights on the way.
The same pattern extends to more than two heads. Each additional head adds another set of weight matrices and another set of context vectors to be combined. The flow stays the same: one input, several independent paths, one merge.
Single-Head and Multi-Head Side by Side
The clearest way to see the difference is to compare the two arrangements on three dimensions: weights, outputs, and cost. The diagram places the single-head and two-head cases in parallel columns.
On weights, the single-head module has one set. The two-head module has two sets of query, key, and value weight matrices, and the instances do not share them. On outputs, the single-head module produces one set of context vectors. The two-head module produces two sets, $Z_1$ and $Z_2$, which are then combined into one matrix $Z$. On cost, the source describes multi-head attention as computationally intensive. Each added head brings another set of weight matrices and another set of context vectors, so the work grows with the number of heads.
Mistakes Learners Make About Heads
Common mistake Assuming that heads share one set of weights
What it looks likeThinking a two-head module has one query, key, and value weight matrices that both heads use.
Why it failsEach head is an instance of the self-attention mechanism with its own weights. The instances do not share weights, which is what makes each head an independent view of the input.
Do this insteadCount two complete sets of query, key, and value weight matrices for a two-head module.
Common mistake Expecting the module to still produce one output stream
What it looks likeThinking the two-head module yields a single set of context vectors, the same as a single-head module.
Why it failsEach head produces its own context vectors, labeled Z1 and Z2, and only then are they combined.
Do this insteadTrack both head outputs separately, then follow the merge into the combined matrix Z.
Common mistake Treating more heads as free
What it looks likeAdding heads to a module without considering the extra work.
Why it failsThe source describes multi-head attention as computationally intensive, and each head adds weight matrices and context vectors to be computed and combined.
Do this insteadWeigh the pattern recognition benefit against the added computation when choosing how many heads to use.
Common mistake Treating the efficient implementation as a different mechanism
What it looks likeBelieving the stacked-module version and the efficient version compute different kinds of results.
Why it failsThe efficient version implements the same multi-head module in a more complicated but more computationally efficient way. It computes the same kind of result with a different organization.
Do this insteadUnderstand the stacked version first, then treat the efficient version as a reorganization of the same idea.
Why Several Heads Recognize Richer Patterns
Multi-head attention is worth its cost because of the kind of pattern recognition it supports. Models based on transformers, which include many large language models, rely on this ability to handle complex patterns in data. Giving the model several independent heads means that different heads can, in principle, attend to the input in different ways, and the combined output carries those differences forward.
Checking Your Understanding of Heads
A module is built with three heads instead of one. Describe how many query, key, and value weight matrices it contains, how many sets of context vectors it produces before combining, and what happens to those sets at the end of the module.
Hints
- Each head is its own instance of the self-attention mechanism with its own weights.
- Count one complete set of query, key, and value weight matrices per head.
- The source says the head outputs are combined into a single result.
Key Takeaways
- Multi-head attention extends the single causal attention module by running several independent attention mechanisms side by side, and gathering their outputs.
- A head is an independent instance of self-attention with its own query, key, and value weight matrices and its own context vectors, and heads do not share weights.
- In a two-head module, the input enters once, each head produces its own context vectors, Z1 and Z2, and those are combined into one matrix Z.
- Multi-head attention is computationally intensive because each additional head adds weight matrices and context vectors, and it supports the complex pattern recognition associated with transformer-based models.