Laboratório GPT-2 · RoBERTa · Parte II — A família GPT
09

GPT-1 → GPT-2:
o que exatamente mudou

Praticamente o mesmo tamanho, menos da metade da perplexidade. Quatro decisões explicam a diferença.

Apostila 09 de 15 Pré-requisito: apostilas 05, 06 e 08

1 O experimento controlado que a história nos deu

O openai-gpt (GPT-1, junho de 2018) tem 117 milhões de parâmetros. O gpt2 small (fevereiro de 2019) tem 124 milhões. Seis por cento de diferença — praticamente nada.

E no entanto, medido no lab 08 sobre o mesmo parágrafo:

GPT-1: PPL 46,07   →   GPT-2: PPL 21,70
menos da metade da perplexidade, com 6% mais parâmetros

Isso é raro e valioso. Muitos avanços em modelos de linguagem vieram junto com aumento de escala, o que dificulta separar o efeito de cada mudança. Aqui a escala está essencialmente controlada, e podemos atribuir o ganho a decisões de projeto específicas. São quatro.

2 Mudança 1 — o corpus (a maior de todas)

GPT-1GPT-2
CorpusBooksCorpusWebText
Conteúdo~7 000 livros de ficção não publicados~8 milhões de páginas web
Tamanho~1 GB~40 GB
Curadorialivros inteiroslinks do Reddit com ≥3 karma
Diversidadebaixa — quase só narrativa literáriaalta — notícias, fóruns, código, documentação, receitas

Quarenta vezes mais dados, e — mais importante — dados muito mais variados. O BooksCorpus ensina a escrever prosa de ficção. O WebText ensina a escrever prosa de ficção, notícia, tutorial, comentário de fórum, README e código.

Isso aparece de forma gritante no laboratório. Peça código ao GPT-1 e ele devolve narrativa. Ele nunca viu uma chave de bloco na vida.

A engenhosidade do filtro do Reddit

Como coletar 40 GB de texto de qualidade da internet sem contratar avaliadores? A OpenAI usou uma pista existente: se um humano achou o link bom o bastante para postar, e outros humanos votaram nele, provavelmente não é lixo. Três votos de karma como filtro de qualidade — barato, escalável e surpreendentemente eficaz.

Vale notar o viés que isso embute: o WebText é, por construção, o retrato dos interesses dos usuários do Reddit em 2017. Majoritariamente em inglês, majoritariamente americano, com temas e vocabulário daquela comunidade. Quando você observar o GPT-2 sendo ruim em português (lab 08: PPL 413), lembre que a causa começa aqui.

3 Mudança 2 — o tokenizador

GPT-1GPT-2
AlgoritmoBPE sobre caracteres, com pré-processamento por spaCy e ftfyBPE sobre bytes, sem pré-processamento
Vocabulário40 47850 257
Caixatudo em minúsculopreservada
Desconhecidostoken <unk>: informação perdidaimpossível — tudo é byte
Pontuaçãoseparada por espaçospreservada como estava

O GPT-1 lowercaseia tudo. Isso descarta informação real: em inglês, a maiúscula distingue nome próprio de substantivo comum (Bill vs bill, Apple vs apple). E, na saída, o modelo nunca consegue escrever um nome próprio corretamente.

Você vê isso de forma imediata no teste do laboratório. Mesmo prompt, o GPT-1 devolve:

gpt1:  "the capital of france is a great city , and the city
        is a great city . it is"

gpt2:  "The capital of France is the capital of the French
        Republic, and the capital of the"

Repare em três coisas na saída do GPT-1: france em minúscula, o espaço antes da vírgula (resíduo do pré-processamento que separava pontuação), e a estrutura de prosa vaga de romance — o eco do BooksCorpus.

4 Mudança 3 — Pre-LN (a mudança de engenharia)

Esta você já conhece da apostila 05. O GPT-1 usa Post-LN (LN(x + f(x))); o GPT-2 usa Pre-LN (x + f(LN(x))), e acrescenta o ln_f final.

No GPT-2 small, com 12 camadas, o ganho de qualidade é modesto. O ganho decisivo é de viabilidade: no lab 05 você mede que, numa pilha de 40 camadas, o Pre-LN entrega um gradiente um milhão e meio de vezes maior na primeira camada.

Sem essa mudança, o gpt2-xl com 48 camadas simplesmente não existiria — não em 2019, não sem uma batalha longa contra instabilidade numérica. Post-LN funciona bem até ~20 camadas e depois vira um problema.

5 Mudança 4 — o que não mudou, mas mudou de propósito

Esta é a mudança mais conceitual, e talvez a mais influente das quatro.

O GPT-1 foi apresentado como um método de duas etapas: pré-treinar num corpus grande, depois fine-tunar com dados rotulados para cada tarefa específica. O artigo se chama "Improving Language Understanding by Generative Pre-Training" — o pré-treino é o meio; o fine-tuning é o fim.

O GPT-2 propôs algo mais radical, já no título: "Language Models are Unsupervised Multitask Learners". A tese: se o corpus for grande e variado o bastante, o modelo aprende as tarefas sozinho, porque exemplos de tradução, sumarização e resposta a perguntas já estão naturalmente presentes no texto da internet. Nenhum fine-tuning necessário — basta pedir do jeito certo.

Onde nasceu a "engenharia de prompt"

Foi aqui. A ideia de que se especifica a tarefa dentro do texto de entrada, em vez de treinar um modelo separado para ela, nasce no artigo do GPT-2. Quando você escreve "Traduza para o francês:" no começo de um prompt, você está aplicando diretamente essa tese.

No GPT-2 a ideia funcionava mal (você mediu no lab 06: o few-shot ajuda, mas o modelo é pequeno demais para ser confiável). No GPT-3, com 175 bilhões de parâmetros, funcionou tão bem que tornou o fine-tuning dispensável para a maioria das tarefas — e mudou a indústria.

6 A tabela final

Tudo o que muda entre os dois. Note que a arquitetura do bloco é praticamente a mesma — a diferença está nos dados, no tokenizador e na disciplina de normalização.
GPT-1 (2018)GPT-2 (2019)
Parâmetros117 M124 M — 1 558 M
Camadas1212 — 48
dmodel768768 — 1600
Contexto5121024
Vocabulário40 47850 257
TokenizadorBPE de caractere, lowercaseBPE de byte, caixa preservada
CorpusBooksCorpus, 1 GBWebText, 40 GB
LayerNormPost-LNPre-LN + ln_f
AtivaçãoGELUGELU
Atençãocausal, multi-headcausal, multi-head
Weight tyingsimsim
Proposta de usopré-treino + fine-tuning por tarefazero-shot / few-shot no prompt
PPL (nosso teste)46,0721,70

7 No laboratório

.venv\Scripts\python.exe lab\09_gpt1_vs_gpt2.py
  1. Compara os tokenizadores no mesmo texto, mostrando o lowercase e a pontuação separada do GPT-1.
  2. Demonstra a perda de informação pedindo aos dois para completar frases onde a maiúscula importa ("Bill" vs "bill", "Apple" vs "apple").
  3. Pede código aos dois. O GPT-1 devolve prosa. É a evidência mais direta do efeito do corpus.
  4. Mede o token <unk> em ação: dá ao GPT-1 um emoji e uma palavra em japonês, e mostra a informação sendo perdida.
  5. Compara perplexidades em vários tipos de texto, separando onde o GPT-2 ganha mais.

Exercício 9 — preveja antes de rodar

  1. Das quatro mudanças (corpus, tokenizador, Pre-LN, propósito), qual você acha que contribuiu mais para a queda de PPL de 46 para 21,7? Justifique — e note que o experimento para isolar isso não existe publicado.
  2. O GPT-1 tem contexto de 512 e o GPT-2 de 1024. Quanto isso encarece a atenção? (Lembre da apostila 03: o custo é quadrático.)
  3. Se você retreinasse o GPT-1 com o corpus e o tokenizador do GPT-2, mas mantivesse Post-LN e 512 de contexto, que PPL você apostaria? Mais perto de 46 ou de 21,7?
  4. Difícil: o GPT-1 usa <unk> e o GPT-2 não. Para um corpus só em inglês bem comportado, isso importa muito? Onde a diferença realmente aparece?
Referências

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.

  1. Radford, A., Narasimhan, K., Salimans, T. e Sutskever, I. (2018). Improving Language Understanding by Generative Pre-Training. Relatório técnico, OpenAI. cdn.openai.com
  2. Radford, A., Wu, J., Child, R., Luan, D., Amodei, D. e Sutskever, I. (2019). Language Models are Unsupervised Multitask Learners. Relatório técnico, OpenAI. cdn.openai.com
  3. Hendrycks, D. e Gimpel, K. (2016). Gaussian Error Linear Units (GELUs). Preprint. arXiv:1606.08415

Fechamos o galho decoder: GPT-1 → GPT-2 small → medium → large → XL.
A apostila 10 atravessa para o outro galho da árvore, e tudo o que você aprendeu vai ser reusado — com uma linha invertida.