Laboratório GPT-2 · RoBERTa · Parte III — A família BERT
12

O detector:
fine-tuning e seus limites

Como se transforma um modelo de linguagem num classificador — e por que essa ferramenta específica não deve ser usada para decidir nada.

Apostila 12 de 15 Pré-requisito: apostilas 10 e 11

1 O que este modelo é

Quando a OpenAI lançou o GPT-2, em 2019, houve preocupação real com uso indevido — geração de desinformação em escala. A resposta foi lançar, junto, um detector: um RoBERTa fine-tunado para classificar texto como "escrito por humano" ou "gerado pelo GPT-2".

O gesto é elegante e vale apreciar: a OpenAI construiu o caçador com a arquitetura oposta à da caça. Um decoder gera; um encoder julga. É o fecho natural do curso.

A anatomia, medida

roberta-base-openai-detector

  parametros totais         124,647,170
  corpo RoBERTa             124,055,040   (99.53%)
  cabeca de classificacao       592,130   ( 0.47%)

  rotulos: {0: 'Fake', 1: 'Real'}

Olhe a proporção. 99,5% do modelo é o RoBERTa pré-treinado, reaproveitado inteiro. A parte específica da tarefa — a que sabe distinguir humano de máquina — é meio por cento.

2 Fine-tuning: como se faz

Este é o mecanismo que domina o uso prático de modelos pré-treinados, e ele tem três passos:

  1. Arranque a cabeça antiga. O RoBERTa foi pré-treinado com uma cabeça de MLM, que projeta 768 dimensões para 50 265 (uma pontuação por token do vocabulário). Para classificar, ela não serve. Descarte.
  2. Parafuse uma cabeça nova. Uma rede minúscula que projeta 768 → 768 → 2. Inicializada aleatoriamente.
  3. Treine tudo junto, com dados rotulados e uma taxa de aprendizado baixa (tipicamente 2×10⁻⁵, contra 10⁻⁴ do pré-treino). A taxa baixa é essencial: você quer ajustar o conhecimento existente, não destruí-lo.
Por que isto funciona tão bem

O corpo do RoBERTa já sabe o que é linguagem: gramática, semântica, estilo, registro. Essa foi a parte cara — 160 GB de texto e milhares de horas de GPU.

A tarefa "humano ou máquina?" não exige aprender linguagem de novo. Exige apenas aprender a ler um sinal específico numa representação que já é rica. Por isso bastam alguns milhares de exemplos rotulados e algumas horas de treino, em vez de meses.

É o mesmo princípio de contratar alguém que já sabe ler para treinar como revisor: você ensina o critério de revisão, não o alfabeto.

Onde a cabeça lê — e por que o <s>

A cabeça precisa de um vetor para representar o texto inteiro, mas o encoder devolve um vetor por token. Qual usar?

A convenção do BERT/RoBERTa: o vetor do primeiro token, o <s> (no BERT chamado [CLS]). E há um motivo, não é arbitrariedade:

Repare que isso só funciona num encoder. Num decoder causal, o primeiro token só vê a si mesmo — é o token mais ignorante da sequência, não o mais informado. Por isso classificadores baseados em decoder usam o último token, não o primeiro.

logits = W2 · tanh(W1 · h<s>)  ∈  ℝ² 768→768 com tanh, depois 768→2. Softmax nos dois logits dá P(Fake) e P(Real). São os 592 130 parâmetros da tabela acima.
Duas pegadinhas reais destes arquivos

1. O roberta-large-openai-detector não traz os rótulos. O config.json dele mostra LABEL_0/LABEL_1 em vez de Fake/Real. A ordem é a mesma da versão base (0 = Fake, 1 = Real), mas se você confiar cegamente no id2label vai reportar resultados invertidos sem perceber. O módulo lab/common.py corrige isso explicitamente.

2. Há um pooler órfão nos pesos. Ao carregar, o transformers avisa que roberta.pooler.dense.weight é "UNEXPECTED". É resíduo do pré-treino: a RobertaForSequenceClassification lê o <s> diretamente, sem passar pelo pooler. O aviso é inofensivo — mas vale saber ler avisos assim em vez de ignorá-los por reflexo.

3 Ele funciona? Sim — dentro do seu mundo

Texto gerado pelo gpt2-large, julgado pelo roberta-base-openai-detector. Medido nesta máquina.
Estratégia de geraçãoP(humano)Veredito
greedy0,0002MÁQUINA
T=0.7, top_p=0.90,0002MÁQUINA
T=1.0, top_p=0.950,1098MÁQUINA
T=1.40,0002MÁQUINA

Praticamente perfeito. O detector foi construído para esta tarefa exata e a executa muito bem.

Nota metodológica: a expectativa era encontrar aqui um padrão do tipo "quanto maior a temperature, mais difícil detectar". Ele não apareceu — o T=1.4 é pego tão facilmente quanto o greedy. Fica registrada a ausência do padrão, em vez de uma explicação para um efeito que os números não mostram.

4 Onde ele quebra — e os dois modos de falha

Falha 1: falsos positivos em texto humano formal

Todos escritos por humanos. As duas últimas linhas são erros.
Texto humanoP(humano)Veredito
Melville, Moby Dick (1851)0,952humano
Abstract científico0,975humano
Relato técnico informal (depuração de bug)0,186MÁQUINA ✗
Manual de instruções0,436máquina? ✗
Texto de regulamento0,034MÁQUINA ✗
Por que os falsos positivos são o dano real

Um falso negativo (texto de máquina passando por humano) é um incômodo. Um falso positivo — texto humano acusado de ser de máquina — é uma acusação contra uma pessoa.

Detectores desse tipo foram amplamente usados por professores para acusar alunos de trapaça. Nesse contexto, um falso positivo não é uma estatística: é um aluno reprovado injustamente, sem poder provar sua inocência.

E repare quem escreve de forma mais formal, padronizada e previsível: quem escreve num segundo idioma, quem aprendeu a escrever em contexto acadêmico rígido, quem usa corretor automático. Os falsos positivos não se distribuem uniformemente — eles caem desproporcionalmente sobre quem já está em desvantagem. Existe literatura documentando exatamente isso para escritores não-nativos de inglês.

Falha 2: modelos modernos passam despercebidos

Dei aos dois detectores um texto escrito por um LLM de 2026:

DetectorP(humano)Veredito
roberta-base-openai-detector0,9940HUMANO ✗
roberta-large-openai-detector0,9993HUMANO ✗

Falha completa, e com altíssima confiança — o que é pior do que falhar com incerteza. O modelo não tem como saber que está fora do seu domínio.

A lição de aprendizado de máquina embutida aqui

Um classificador aprende a fronteira entre as distribuições que viu. Este viu texto humano de 2019 e texto de GPT-2 de 2019. Texto de um modelo de 2026 não se parece com nenhum dos dois — é fora da distribuição, e o modelo não tem mecanismo algum para reconhecer isso.

Pior: modelos de classificação são tipicamente mal calibrados fora do domínio. Eles não ficam incertos — ficam confiantemente errados, como você vê nos 0,9993 acima. Essa é uma das armadilhas mais importantes de ML aplicado, e você acabou de vê-la ao vivo.

Falha 3: é uma corrida armamentista perdida por construção

Detectar texto de máquina é adversarial: cada modelo novo torna o detector mais obsoleto. E o alvo se move mais rápido do que o detector consegue ser retreinado.

A própria OpenAI reconheceu isso na prática. Ela lançou um detector próprio, mais moderno, em janeiro de 2023, e o desativou em julho do mesmo ano — seis meses depois — citando baixa taxa de acerto. Quando quem fabrica os geradores desiste de detectá-los, é um sinal forte.

5 A resposta ao Exercício 0

O Exercício 0 da apostila 00 pedia uma estimativa, sem pesquisar, de quanto este detector acertaria em 2026 — e avisava que a resposta era desconfortável. Aqui está:

Veredito

Não use este modelo para decidir nada sobre uma pessoa. Contra GPT-2 ele funciona muito bem. Contra qualquer coisa de 2023 em diante, ele é pior que inútil — ele é confiantemente errado, o que dá a falsa impressão de rigor.

Como objeto de estudo, porém, ele é excelente, e por isso está neste curso: ele demonstra fine-tuning, o uso do <s>, a economia de reaproveitar 99,5% de um modelo pré-treinado, e — talvez o mais valioso — a diferença entre funcionar no papel e funcionar no mundo.

6 No laboratório

.venv\Scripts\python.exe lab\09_detector.py

O script reproduz tudo acima na sua máquina: a anatomia do modelo, o ciclo completo (GPT-2 gera → RoBERTa julga), a comparação base vs large, e as duas falhas. Rode até o fim — a seção 5 é o ponto.

Exercício 12

  1. Escreva você mesmo um parágrafo, em português e em inglês, e passe pelos dois detectores. Os resultados batem? O que acontece se você escrever de forma deliberadamente formal?
  2. O detector base deu 0,186 e o large deu 0,976 para o mesmo texto técnico humano. Se você tivesse que construir um sistema, como usaria essa discordância a seu favor?
  3. A cabeça de classificação tem 592 130 parâmetros. Confira a conta: 768×768 + 768 (primeira camada) + 768×2 + 2 (segunda). Bate?
  4. Difícil: proponha um jeito de tornar um detector desse tipo mais robusto a modelos futuros. Depois argumente por que sua proposta também vai falhar. (Se você conseguir fazer as duas coisas, entendeu o problema.)
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. Solaiman, I. et al. (2019). Release Strategies and the Social Impacts of Language Models. Relatório técnico, OpenAI. arXiv:1908.09203
  2. Liu, Y. et al. (2019). RoBERTa: A Robustly Optimized BERT Pretraining Approach. Preprint. arXiv:1907.11692
  3. Howard, J. e Ruder, S. (2018). Universal Language Model Fine-tuning for Text Classification. ACL 2018. arXiv:1801.06146

Fim da Parte III. Você percorreu os dois galhos da árvore inteiros.
A Parte IV sai da teoria: o código original da OpenAI, e como servir esses modelos de verdade.