BERT
Visão geral
BERT (Bidirectional Encoder Representations from Transformers) é um modelo de codificador Transformer (Transformer encoder) introduzido pelo Google (Devlin et al., 2018) que popularizou uma receita simples, porém poderosa:
- Pré-treinar (pretrain) uma representação de linguagem bidirecional profunda em grandes volumes de texto não rotulado usando modelagem de linguagem mascarada (masked language modeling, MLM) (e previsão da próxima frase (next-sentence prediction, NSP) no artigo original).
- Ajustar finamente (fine-tune) o modelo pré-treinado em uma tarefa específica de PLN a jusante (downstream) (classificação, NER, QA etc.) com relativamente pouca arquitetura específica da tarefa.
O impacto do BERT veio de mostrar que um único codificador pré-treinado pode ser adaptado a muitas tarefas, superando modelos especializados treinados do zero.
O BERT é construído sobre a metade do codificador da Arquitetura Transformer (Transformer Architecture) e usa Autoatenção (Self-Attention) para produzir representações de tokens contextuais (contextual) — cada incorporação de token depende de toda a sentença ao redor (tanto contexto à esquerda quanto à direita).
Por que “bidirecional” importou
Antes do BERT, muitos modelos de linguagem pré-treinados amplamente usados eram da esquerda para a direita (ou da direita para a esquerda) porque eram treinados com previsão do próximo token (next-token prediction). Esse objetivo combina naturalmente com geração, mas restringe as representações: na posição t, um modelo da esquerda para a direita não pode usar palavras futuras.
O objetivo de MLM do BERT muda isso. Como alguns tokens são mascarados e o modelo deve reconstruí-los, o codificador pode usar tanto o contexto à esquerda quanto à direita:
- Frase: “The patient was diagnosed with [MASK].”
- Para prever a máscara, o modelo pode atender a “patient”, “diagnosed” e também a qualquer contexto posterior.
Isso produz representações contextuais bidirecionais (bidirectional contextual representations) que são particularmente eficazes para tarefas em que entender a sentença inteira importa, como:
- classificação de sentimento/intenção
- reconhecimento de entidades nomeadas
- inferência de linguagem natural
- perguntas e respostas extrativas
- reordenação e correspondência semântica (quando usado de forma apropriada)
Arquitetura em resumo
O BERT usa a pilha de codificadores Transformer (Transformer encoder stack):
- Autoatenção multi-cabeças + blocos feed-forward
- Conexões residuais e normalização de camada
- Incorporações posicionais aprendidas (na implementação original)
Configurações comuns:
- BERT-base: 12 camadas, 768 de dimensão oculta, 12 cabeças de atenção (~110M parâmetros)
- BERT-large: 24 camadas, 1024 de dimensão oculta, 16 cabeças de atenção (~340M parâmetros)
Entradas: tokens WordPiece + tokens especiais
O BERT normalmente usa tokenização de subpalavras WordPiece (ver Tokenização (Tokenization)) e adiciona tokens especiais:
[CLS]no início: frequentemente usado como uma “representação de sentença” agregada[SEP]como separador entre sentenças (e para encerrar uma sequência)[PAD]para preenchimento em lotes[MASK]para o pré-treinamento com MLM
O BERT também introduziu incorporações de segmento (segment embeddings) (IDs de tipo de token) para distinguir sentença A vs. sentença B em entradas pareadas (útil para implicação e QA).
Objetivos de pré-treinamento
Modelagem de Linguagem Mascarada (MLM)
No MLM, um subconjunto de tokens é selecionado (15% no artigo original), e o modelo é treinado para prever os tokens originais a partir da entrada corrompida.
Na receita original do BERT, os tokens selecionados são substituídos assim:
- 80%: substituídos por
[MASK] - 10%: substituídos por um token aleatório
- 10%: mantidos inalterados
Esse “ruído” impede que o modelo superajuste ao token literal [MASK] e incentiva um raciocínio contextual robusto.
Ressalva importante: MLM não é o mesmo que modelagem de linguagem padrão (previsão do próximo token). O BERT não é inerentemente um modelo gerativo da mesma forma que os modelos no estilo GPT; ele aprende fortes representações para compreensão.
Previsão da Próxima Frase (NSP) (BERT original)
O NSP treina o modelo para classificar se a sentença B segue a sentença A no texto original.
Trabalhos posteriores descobriram que o NSP muitas vezes é desnecessário ou pode ser substituído por objetivos melhores. Por exemplo:
- RoBERTa remove o NSP e treina por mais tempo com lotes maiores e mais dados.
- Outros modelos usam alternativas como previsão da ordem de sentenças.
O NSP é historicamente importante porque moldou como as pessoas usavam o BERT para tarefas com pares de sentenças, mas hoje não é essencial para desempenho no estilo BERT.
Ajuste fino: adaptando o BERT a tarefas
Ajuste fino normalmente significa:
- Começar a partir dos pesos pré-treinados do BERT
- Adicionar uma pequena cabeça específica da tarefa (por exemplo, uma camada classificadora)
- Treinar com dados rotulados da tarefa usando uma pequena taxa de aprendizado
Isso funciona porque o BERT pré-treinado já codifica características sintáticas e semânticas ricas; a tarefa supervisionada, em grande parte, ensina o modelo como usá-las.
O ajuste fino é uma forma de Aprendizado por Transferência (Transfer Learning). Na prática moderna, isso costuma ser feito usando bibliotecas como Hugging Face Transformers.
Usos típicos a jusante
1) Classificação de texto (sentimento, tópico, intenção)
Uma abordagem comum é pegar o vetor oculto do token [CLS] e alimentá-lo em um classificador linear.
Exemplo prático (PyTorch + Hugging Face):
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)
texts = ["This movie was surprisingly good!", "I wouldn't recommend it."]
batch = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
logits = model(**batch).logits
probs = torch.softmax(logits, dim=-1)
print(probs)
Notas práticas
- Use
truncation=Truecom cuidado: para documentos longos, considere segmentação (chunking) ou variantes com contexto longo. - Para conjuntos de dados pequenos, overfitting é comum; considere congelar camadas inferiores ou usar regularização.
2) Reconhecimento de Entidades Nomeadas (NER)
NER é um problema de classificação em nível de token. O BERT se destaca aqui porque cada representação de token incorpora tanto o contexto à esquerda quanto à direita, o que ajuda a desambiguar entidades.
Exemplo:
from transformers import AutoTokenizer, AutoModelForTokenClassification
from transformers import pipeline
model_name = "dslim/bert-base-NER"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(model_name)
ner = pipeline("ner", model=model, tokenizer=tokenizer, aggregation_strategy="simple")
print(ner("Apple hired John Smith in New York on Monday."))
Armadilhas comuns
- A tokenização por subpalavras divide palavras; bibliotecas normalmente lidam com o alinhamento, mas se você construir pipelines personalizados, precisa reconciliar as previsões de subpalavras de volta para trechos (spans) no nível de palavra.
- Mudança de domínio é real: NER médico ou jurídico frequentemente precisa de pré-treinamento ou ajuste fino específicos do domínio.
3) Tarefas com pares de sentenças (NLI, paráfrase, implicação)
O BERT pode receber dois textos separados por [SEP]:
[CLS] sentence_A [SEP] sentence_B [SEP]
O modelo usa atenção através das duas sequências e incorporações de segmento para aprender interações. Isso é eficaz para tarefas de codificação cruzada (cross-encoding) em que uma interação profunda token-a-token importa.
4) Recuperação e reordenação
O BERT é amplamente usado em pipelines de recuperação de informação (information retrieval) (ver Recuperação de Informação (Information Retrieval)) de duas maneiras principais:
Reordenação com codificador cruzado (alta acurácia, mais lento)
Um codificador cruzado (cross-encoder) concatena consulta e documento e executa atenção completa entre eles, produzindo uma pontuação de relevância. Isso é frequentemente usado para reordenar os top-K resultados de um recuperador de primeira etapa mais rápido (BM25 ou recuperação baseada em incorporações).
Pseudo-configuração:
- Etapa 1: recuperar rapidamente os 100 principais documentos
- Etapa 2: codificador cruzado BERT reordena os 100 documentos com maior precisão
Esboço de exemplo:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tokenizer = AutoTokenizer.from_pretrained("cross-encoder/ms-marco-MiniLM-L-6-v2")
model = AutoModelForSequenceClassification.from_pretrained("cross-encoder/ms-marco-MiniLM-L-6-v2")
query = "how to replace a bike chain"
doc = "To replace a bicycle chain, first remove the old chain using a chain tool..."
inputs = tokenizer(query, doc, return_tensors="pt", truncation=True)
with torch.no_grad():
score = model(**inputs).logits.squeeze().item()
print("relevance score:", score)
Bi-codificador / codificador duplo (rápido, escalável)
Um bi-codificador (bi-encoder) codifica consultas e documentos de forma independente em vetores, permitindo busca aproximada por vizinhos mais próximos. O BERT “vanilla” não é automaticamente um bom modelo de incorporação de sentenças; em geral você precisa de treinamento especial (por exemplo, aprendizado contrastivo) como Sentence-BERT (ver Incorporações de Sentenças (Sentence Embeddings)).
Regra prática:
- Precisa de qualidade máxima na reordenação top-K → modelo no estilo BERT com codificador cruzado
- Precisa de recuperação rápida sobre milhões de documentos → codificador duplo treinado para incorporações
Por que o BERT funcionou tão bem (intuição + teoria)
O sucesso do BERT costuma ser atribuído a uma combinação de:
- Contexto bidirecional profundo via MLM: cada representação de token é condicionada em toda a entrada.
- Atenção do Transformer (Transformer attention): modelagem flexível de dependências de longo alcance em comparação com RNNs/CNNs.
- Pré-treinamento em larga escala: aprendizado de padrões linguísticos de uso geral a partir de corpora massivos.
- Estabilidade no ajuste fino: uma única arquitetura se adapta a muitas tarefas com mudanças mínimas.
Da perspectiva de aprendizado de representações, o MLM incentiva o modelo a construir características internas que predizem informações faltantes a partir do contexto — capturando sintaxe (concordância, dependências) e semântica (tipos de entidades, relações, sentidos de palavras). Essas características se transferem bem.
Principais variantes e descendentes
O BERT inspirou uma família de modelos que ajustam objetivos, escala ou eficiência.
RoBERTa
RoBERTa (“Robustly optimized BERT approach”) é uma variante do BERT que mostrou que o BERT estava subtreinado. Mudanças principais:
- Remove o NSP
- Treina por mais tempo, com mais dados, com lotes maiores
- Usa mascaramento dinâmico (dynamic masking) (o padrão de máscara muda entre épocas)
Em muitos cenários, o RoBERTa é uma melhoria “de substituição direta” para tarefas de compreensão baseadas em codificador.
DistilBERT
DistilBERT comprime o BERT usando destilação de conhecimento (knowledge distillation) (ver Destilação de Conhecimento (Knowledge Distillation)):
- Menos camadas (por exemplo, 6 em vez de 12)
- Inferência mais rápida e menor uso de memória
- Mantém grande parte da acurácia do BERT
Boa escolha quando latência/custo computacional importa (mobile, serviços de alto throughput).
ALBERT (compartilhamento de parâmetros)
ALBERT reduz parâmetros via compartilhamento por camada e incorporações fatoradas. Pode ser mais eficiente em memória, embora acelerações práticas dependam da implementação.
BERTs específicos de domínio
Muitos “BERTs” bem-sucedidos são simplesmente a continuação do pré-treinamento no estilo BERT com texto de domínio:
- BioBERT / PubMedBERT para texto biomédico
- LegalBERT para texto jurídico
- SciBERT para artigos científicos
Isso frequentemente melhora o desempenho em vocabulários e estilos de escrita especializados.
Orientação prática: usando BERT de forma eficaz
Escolha o tamanho de modelo adequado
- Comece com modelos de tamanho base para a maioria das aplicações.
- Use modelos destilados para restrições de latência em produção.
- Use modelos large quando você tiver dados/compute suficientes e a tarefa for sensível à acurácia.
Preste atenção ao comprimento máximo de sequência
O BERT comumente usa comprimentos máximos como 128, 256 ou 512 tokens. Se suas entradas forem maiores:
- truncar (pode perder informação-chave)
- segmentar (chunk) + agregar previsões
- usar variantes de Transformer com contexto longo (fora do BERT clássico)
Dicas de ajuste fino (padrões comuns)
- Taxa de aprendizado: tipicamente
1e-5a5e-5 - Épocas: 2–5 para muitos conjuntos de dados
- Cronogramas de aquecimento (warmup) + decaimento linear frequentemente ajudam
- Clipping de gradiente pode melhorar a estabilidade
Considere também abordagens de ajuste fino eficiente em parâmetros (parameter-efficient fine-tuning) (adapters, LoRA), embora isso seja mais comumente discutido no contexto de modelos maiores.
Calibração e viés
Como muitos modelos pré-treinados, o BERT pode herdar vieses dos dados de treinamento e pode ser mal calibrado. Para tarefas de alto risco:
- execute avaliações de viés e robustez
- considere técnicas de calibração (escalonamento de temperatura)
- monitore mudança de domínio e deriva pós-implantação
Limitações e equívocos
“BERT entende linguagem”
O BERT aprende fortes representações estatísticas, mas ainda pode falhar em raciocínio, consistência factual ou perturbações adversariais. Trate-o como um poderoso aprendiz de padrões, não como um raciocinador simbólico.
Não é um modelo gerativo por padrão
O objetivo de MLM do BERT não foi projetado para geração fluente de texto longo. Para geração, tipicamente se usam modelos apenas-decodificador (decoder-only) treinados com previsão do próximo token (ver Modelos de Linguagem Autorregressivos (Autoregressive Language Models)).
Incorporações de sentenças não vêm “de graça”
Usar o vetor [CLS] do BERT vanilla como incorporação de sentença frequentemente tem desempenho pior do que modelos especializados de incorporações. Se você precisa de busca por similaridade semântica, prefira modelos treinados explicitamente para isso.
Relação com modelagem de linguagem
Dentro do tema mais amplo de Modelagem de Linguagem (Language Modeling), o BERT é melhor visto como uma abordagem de pré-treinamento com remoção de ruído (denoising pretraining) para aprender representações de linguagem, em vez de um modelo de linguagem clássico de próximo token otimizado para perplexidade (perplexity). Ele troca capacidade gerativa por forte contexto bidirecional, o que é extremamente eficaz para tarefas de PLN focadas em compreensão.
Resumo
- BERT é um codificador Transformer pré-treinado principalmente com modelagem de linguagem mascarada, originalmente também com previsão da próxima frase.
- O principal ganho são as representações contextuais bidirecionais, que melhoraram muitas tarefas de compreensão em PLN.
- O fluxo de trabalho padrão é pré-treinar → ajustar finamente com mudanças mínimas específicas da tarefa.
- Variantes comuns incluem RoBERTa (treinamento melhor otimizado) e DistilBERT (mais rápido, menor via destilação).
- O BERT é amplamente usado para classificação, NER e recuperação/reordenação — especialmente como um reordenador com codificador cruzado para resultados top-K.
Se você está construindo um sistema de PLN hoje, o BERT e seus descendentes continuam sendo uma linha de base forte para tarefas de compreensão, enquanto codificadores especializados para recuperação ou modelos gerativos podem ser melhores dependendo se seu requisito central é correspondência, ranqueamento ou geração de texto.