learnedblock(h, 'h%d' % layer, past=past, hparams=hparams)
A pre-normalized residual update: read the stream, compute attention, add; read again, compute the feed-forward, add.
- in
- [B batch, T positions, 768 d]
- out
- [B batch, T positions, 768 d]
- parameters
- 7,087,872 · × 12 blocks = 85,054,464
Parameters
7,087,872 parameters per block, across its learned components
| Component | Calculation | Parameters |
|---|---|---|
| Pre-attention LayerNorm | 1,536 | |
| Masked multi-head self-attention | 2,362,368 across its components | 2,362,368 |
| Pre-MLP LayerNorm | 1,536 | |
| Position-wise feed-forward network | 4,722,432 across its components | 4,722,432 |
| Per-instance total | 7,087,872 | |
Across 12 independent blocks: parameters.
Each of the 12 block addresses owns independent weights. The implementation names the first and last addresses h.0 and h.11.
Codemodel.py 126–130 · modeling_gpt2.py 272–307
a, present = attn(norm(x, 'ln_1'), 'attn', nx, past=past, hparams=hparams)
x = x + a
m = mlp(norm(x, 'ln_2'), 'mlp', nx*4, hparams=hparams)
x = x + m
return x, present residual = hidden_states
hidden_states = self.ln_1(hidden_states)
attn_output, _ = self.attn(
hidden_states,
past_key_values=past_key_values,
attention_mask=attention_mask,
use_cache=use_cache,
**kwargs,
) hidden_states = attn_output + residual residual = hidden_states
hidden_states = self.ln_2(hidden_states)
feed_forward_hidden_states = self.mlp(hidden_states)
# residual connection
hidden_states = residual + feed_forward_hidden_statesSources2
Direct evidence
The released block performs both pre-normalized residual writes and returns the updated stream.
openai · openai/gpt-2 / src/model.py
Pinned revision 9b63575ef427 ↗ · lines 123–130
Read code excerpt
a, present = attn(norm(x, 'ln_1'), 'attn', nx, past=past, hparams=hparams)
x = x + a
m = mlp(norm(x, 'ln_2'), 'mlp', nx*4, hparams=hparams)
x = x + m
return x, presentDirect evidence
The maintained implementation preserves the same two residual branches.
transformers · huggingface/transformers / src/transformers/models/gpt2/modeling_gpt2.py
Pinned revision 71c6f699ac9b ↗ · lines 272–307
Read code excerpt
residual = hidden_states
hidden_states = self.ln_1(hidden_states)
attn_output, _ = self.attn(
hidden_states,
past_key_values=past_key_values,
attention_mask=attention_mask,
use_cache=use_cache,
**kwargs,
)… lines 281–281 omitted …
hidden_states = attn_output + residual… lines 283–302 omitted …
residual = hidden_states
hidden_states = self.ln_2(hidden_states)
feed_forward_hidden_states = self.mlp(hidden_states)
# residual connection
hidden_states = residual + feed_forward_hidden_states