LLMsLoading progress…

Queries, keys and values

Calculate query-key scores, scaled softmax weights and the weighted value output for one attention head.

Three views of the same token

Attention lets each token gather information from other tokens. To do that it needs to decide who is relevant and what to take from them. The model learns three separate projections of every hidden vector:

  • a query Q: what this position is looking for,
  • a key K: what each position offers to be matched against a query,
  • a value V: the content that is passed along if that position is chosen.
hidden x[0]1hidden x[1]2
projectionmatrix (rows)result for x = [1, 2]role
query q = x·Wq[[1,0],[1,1]][3, 2]"what am I looking for?"
key k = x·Wk[[0,1],[1,0]][2, 1]"what do I offer to be matched?"
value v = x·Wv[[2,0],[0,2]][2, 4]"what do I pass along if chosen?"

The same hidden vector is projected three ways by three learned matrices. A query is compared with every key; the scores become weights; the output is the weighted average of the values.

One hidden vector, three learned matrices, three different results.

Predict first. Which vectors are averaged to produce the attention output?

Q, K, V = X @ Wq, X @ Wk, X @ Wv     # X is (tokens, d_model)
Chapter context

Attention computes a data-dependent mixture of value vectors. A query scores candidate keys, a normalization turns scores into weights, and those weights combine values. Keys decide how to look; values supply what is gathered.

Chapter reference: math, worked example & code

This section belongs to the whole chapter, so it is the same on every lesson in it and may cover a different lesson's topic. The code for the experiment you just ran is inside the experiment itself.

Math and notation

Q∈Rnq×dk, K∈Rnk×dk, V∈Rnk×dv.Q\in\mathbb R^{n_q\times d_k},\ K\in\mathbb R^{n_k\times d_k},\ V\in\mathbb R^{n_k\times d_v}. S=QKT/dk+M,A=softmax⁡rows(S),O=AV.S=QK^T/\sqrt{d_k}+M,\quad A=\operatorname{softmax}_{rows}(S),\quad O=AV.

M is zero at allowed positions and conceptually negative infinity at excluded positions. Every query needs a defined policy if all its keys are masked.

Worked example

Use q=[1,0], K=[[1,0],[0,1]], V=[[2,0],[0,2]], and d_k=2. Dot scores [1,0] become [1/sqrt(2),0]. Exponentiate and normalize to approximately [0.669762,0.330238]. The output is [2×0.669762,2×0.330238]≈[1.339523,0.660477]. If only the first key is causally allowed, the output becomes [2,0].

Reference code

The following example uses the Python standard library and does not call a remote service.

from math import sqrt,exp,isclose
q=[1,0]; keys=[[1,0],[0,1]]; values=[[2,0],[0,2]]
scores=[sum(a*b for a,b in zip(q,k))/sqrt(2) for k in keys]
weights=[exp(s-max(scores)) for s in scores]
weights=[w/sum(weights) for w in weights]
out=[sum(weights[i]*values[i][j] for i in range(2)) for j in range(2)]
assert isclose(sum(weights),1)
assert isclose(weights[0],.6697615493266569)
assert isclose(out[0],1.3395230986533138)
assert isclose(out[1],.6604769013466862)

Python examples are provided for study and local execution; this page does not execute Python.

Common mistakes

Attention scores are not weights before normalization. Causal masking happens before softmax. Attention weights alone are not a full causal explanation of a model decision.