Reference code openai/gpt-2 @ 9b63575, huggingface/transformers @ 71c6f69, configuration openai-community/gpt2 @ 607a30d · checkpoint tensors not independently counted · How to read

GPT-2 model overview

  1. UTF-8 text passes through byte-level BPE, which is configured by fixed vocabulary and merge assets.
  2. Token IDs cross the preprocessing boundary and select rows from the learned token embedding table WTE.
  3. The token sequence shape determines absolute position IDs, independently of token values, which select rows from WPE on a lower positional branch.
  4. Token and position embeddings are added, then training-only embedding dropout produces x zero. Evaluation leaves the sum unchanged.
  5. Exactly 12 transformer blocks transform x zero into x_12.
  6. Final LayerNorm acts across the 768-dimensional feature axis with epsilon equal to 10 to the minus 5.
  7. The transpose view of the shared WTE matrix projects the final states to logits without adding parameters.

Position embedding table

×

learnedtf.gather(wpe, positions_for(X, past_length))

One learned row per absolute position, 0 through 1,023.

Epos=Wposition[position_ids]{\htmlData{light=wpe}{E_{\mathrm{pos}}}}=W_{\mathrm{position}}[\mathrm{position\_ids}]
in
[B batch, T positions]
out
EposE_{\mathrm{pos}} [B batch, T positions, 768 d]
parameters
786,432
Parameters

786,432 parameters owned by this component

Exact per-instance accounting
ComponentCalculationParameters
table1,024×7681{,}024 \times 768786,432
Per-instance total786,432
Explanation

The table has one row per position, so a sequence, cached positions included, holds at most 1,024 tokens (model.py 152).

Codemodel.py 152, 157 · modeling_gpt2.py 493, 576
model.py 152
        wpe = tf.get_variable('wpe', [hparams.n_ctx, hparams.n_embd],
model.py 157
        h = tf.gather(wte, X) + tf.gather(wpe, positions_for(X, past_length))
modeling_gpt2.py 493
        self.wpe = nn.Embedding(config.max_position_embeddings, self.embed_dim)
modeling_gpt2.py 576
        position_embeds = self.wpe(position_ids)
Sources2

Direct evidence

wpe is created alongside wte and gathered by position index.

openai · openai/gpt-2 / src/model.py
Pinned revision 9b63575ef427 ↗ · lines 152–157

Read code excerpt
        wpe = tf.get_variable('wpe', [hparams.n_ctx, hparams.n_embd],

… lines 153–156 omitted …

        h = tf.gather(wte, X) + tf.gather(wpe, positions_for(X, past_length))

Direct evidence

The constructor sets the position-table row count from max_position_embeddings; the lookup selects rows by position ID. The model configuration supplies the numeric count.

transformers · huggingface/transformers / src/transformers/models/gpt2/modeling_gpt2.py
Pinned revision 71c6f699ac9b ↗ · lines 492–577

Read code excerpt
        self.wpe = nn.Embedding(config.max_position_embeddings, self.embed_dim)

… lines 494–575 omitted …

        position_embeds = self.wpe(position_ids)