A montagem completa das peças — e uma medição honesta do que muda de 124 milhões para 1,5 bilhão de parâmetros.
Você já conhece todas as peças. Aqui está a montagem, sem nada omitido:
TEXTO "The capital of France is" | | tokenizador BPE (apostila 01) — nao e parte do modelo v IDs [464, 3139, 286, 4881, 318] (5,) | | wte[IDs] + wpe[0..4] (apostila 02) v h_0 (5, 768) | +-- BLOCO 1 ---+ . | x = x + attn(ln_1(x)) comunicacao (apostilas 03, 04) . | x = x + mlp (ln_2(x)) computacao (apostila 05) . +---------------+ . | . | ... 12 blocos identicos, forma sempre (5, 768) ... . | . +-- BLOCO 12 ---+ | v h_12 (5, 768) | | ln_f — LayerNorm final (so existe por causa do Pre-LN) v | @ wte.T — weight tying (apostila 02, secao 6) v LOGITS (5, 50257) | | pegamos SO a ultima linha: a previsao do proximo token v logits[-1] (50257,) | | softmax + estrategia de amostragem (apostila 07) v PROXIMO TOKEN -> volta para o topo, agora com 6 tokens
Para uma entrada de 5 tokens, o GPT-2 devolve 5 previsões, uma por posição: "o que vem depois de The", "o que vem depois de The capital", e assim por diante. Todas as 5 são calculadas, sempre.
No treino, todas as 5 são usadas — é isso que torna o pré-treino tão eficiente (apostila 08). Na geração, 4 são jogadas fora e só a última interessa. Esse "desperdício" é exatamente o que o cache KV recupera.
Os quatro GPT-2 são o mesmo modelo. Nenhuma peça nova, nenhum truque diferente. Só três números mudam.
| Modelo | Camadas | dmodel | Cabeças | dk | MLP | Parâmetros | fp32 |
|---|---|---|---|---|---|---|---|
gpt2 | 12 | 768 | 12 | 64 | 3072 | 124 M | 0,5 GB |
gpt2-medium | 24 | 1024 | 16 | 64 | 4096 | 355 M | 1,4 GB |
gpt2-large | 36 | 1280 | 20 | 64 | 5120 | 774 M | 3,0 GB |
gpt2-xl | 48 | 1600 | 25 | 64 | 6400 | 1558 M | 6,0 GB |
Todos compartilham: vocabulário de 50 257, contexto de 1024, BPE byte-level, Pre-LN, GELU, expansão 4× no MLP, weight tying. O treino também foi o mesmo — o mesmo WebText, os mesmos 40 GB de texto. A única variável experimental foi o tamanho.
Era essa, aliás, a tese do artigo do GPT-2 ("Language Models are Unsupervised Multitask Learners", 2019): manter tudo fixo e crescer, para mostrar que capacidades novas emergem da escala sozinha.
O termo que importa é
A resposta intuitiva ("modelos maiores escrevem melhor") não se sustenta no laboratório.
No teste inicial deste curso, pedi a mesma coisa aos quatro modelos, em modo greedy (sempre a palavra mais provável). O prompt foi "The capital of France is":
| Modelo | Parâmetros | Continuação gerada | Acertou? |
|---|---|---|---|
openai-gpt | 117 M | "a great city , and the city is a great city ." | não |
gpt2 | 124 M | "the capital of the French Republic, and the capital of the" | não |
gpt2-medium | 355 M | "Paris, and the capital of France is Paris." | sim |
gpt2-large | 774 M | "the capital of France.\n\nThe capital of France is" | não |
gpt2-xl | 1558 M | "the city of Paris. It is the capital of France and" | sim |
O large (774 M) errou uma pergunta que o medium (355 M) acertou. Isso contraria a intuição de que "mais parâmetros = melhor", e é um resultado real, reprodutível na sua máquina.
Duas coisas estão acontecendo. Primeiro, o greedy é uma medida frágil: ele pega a palavra mais provável e nunca mais volta atrás, então um empate quase-técnico no primeiro token decide tudo. Segundo — e mais importante — uma única amostra não mede capacidade. Para dizer algo sério sobre um modelo, é preciso medir uma distribuição sobre muitos exemplos. É exatamente isso que a perplexidade faz, e é o assunto da apostila 08.
Guarde isso como higiene mental: quando alguém te mostrar um print de um modelo acertando ou errando uma pergunta, você está vendo uma amostra de tamanho 1.
Quando você mede direito, sobre muitos exemplos, três coisas melhoram de forma consistente com a escala:
O mesmo prompt da tabela anterior, agora com três exemplos antes:
Portugal -> Lisbon Japan -> Tokyo Italy -> Rome France ->
| Modelo | Sem exemplos | Com 3 exemplos | Ganho | 2º e 3º colocados |
|---|---|---|---|---|
gpt2 | 0,032 | 0,385 | 12× | " Marse", " Nice" |
gpt2-medium | 0,174 | 0,871 | 5× | " Marse", " Lyon" |
gpt2-xl | 0,086 | 0,904 | 10× | " Lyon", " Nice" |
Olhe a última coluna. Os segundos colocados são Marselha, Lyon, Nice — outras cidades francesas. O modelo não apenas acertou: ele entendeu que a tarefa era "país → cidade daquele país" e passou a errar dentro da categoria certa. Isso é o padrão sendo capturado, não uma correspondência decorada.
E note: nenhum peso foi atualizado. A única diferença entre 3,2% e 38,5% foi o texto que veio antes da pergunta. Levada ao GPT-3 (175 bilhões de parâmetros), essa capacidade ficou tão forte que tornou o fine-tuning desnecessário para a maioria das tarefas — e é a razão pela qual "engenharia de prompt" virou uma disciplina.
wpe, não a capacidade.Numa CPU comum de desktop, de 8 núcleos, em fp32 e sem GPU, medido na prática:
| Modelo | RAM necessária | Carga do disco | Geração |
|---|---|---|---|
gpt2 | ~0,6 GB | ~1 s | ~40 tok/s |
gpt2-medium | ~1,6 GB | ~2 s | ~15 tok/s |
gpt2-large | ~3,3 GB | ~4 s | ~7 tok/s |
gpt2-xl | ~6,5 GB | ~8 s | ~3 tok/s |
A regra de bolso: fp32 custa 4 bytes por parâmetro. Um modelo de 1,5 B ocupa 6 GB só de pesos. É por isso que quantização existe — em 8 bits, o mesmo modelo cabe em 1,5 GB, e em 4 bits, em 800 MB. A qualidade cai pouco e o alcance prático muda completamente.
.venv\Scripts\python.exe lab\06_scale.py
config.json real, e verifica a fórmula da contagem de parâmetros contra o número verdadeiro.large "quase" acertou.gpt2-medium (gpt2-xl tem 12,5× os parâmetros do gpt2. Ele gera 12,5× mais devagar? Meça e explique a diferença.As fontes primárias dos conceitos deste capítulo. Os números do texto foram medidos no laboratório; as ideias vêm daqui.
Os termos técnicos têm aqui o sentido de aprendizado de máquina. O glossário do curso mostra esse sentido ao lado dos outros que as mesmas palavras têm na TI.
O modelo produz uma distribuição de probabilidade sobre 50 257 tokens. Transformar isso em texto é uma decisão sua, não dele.
A apostila 07 mostra que essa decisão muda o resultado mais do que trocar de modelo.