Aprendizado Contrastivo
Visão geral
O aprendizado contrastivo (contrastive learning) é uma família de métodos de aprendizado de representações auto-supervisionado (self-supervised representation learning) que aprendem um espaço de incorporações (embedding space) no qual:
- Pares positivos (duas “visões (views)” do mesmo exemplo subjacente, ou itens de outra forma relacionados) são puxados para mais perto.
- Pares negativos (exemplos não relacionados) são empurrados para mais longe.
O objetivo é aprender atributos que capturem estrutura semântica sem exigir rótulos humanos. Após o pré-treinamento (pretraining), o codificador (encoder) pode ser adaptado a tarefas a jusante (downstream tasks) via sondagem linear (linear probing) (treinar um classificador simples sobre incorporações congeladas) ou ajuste fino (fine-tuning) (atualizar o codificador para a tarefa-alvo).
O aprendizado contrastivo é um ramo importante do Aprendizado Auto-Supervisionado ao lado de abordagens como Modelagem de Linguagem Mascarada e outros objetivos baseados em reconstrução.
Por que o aprendizado contrastivo funciona (intuição)
Uma boa representação deve ser:
- Invariante a transformações de incômodo (por exemplo, recortes aleatórios, jitter de cor) que não mudam a semântica.
- Discriminativa o suficiente para separar diferentes imagens/frases/nós.
O aprendizado contrastivo operacionaliza isso construindo uma tarefa semelhante à de classificação: dada uma visão “âncora (anchor)”, identificar seu positivo correspondente entre muitos candidatos. Isso implicitamente incentiva o modelo a capturar atributos que permanecem estáveis sob aumentos de dados (augmentations), ao mesmo tempo em que ainda distingue instâncias diferentes.
Uma interpretação comum conecta objetivos contrastivos à maximização de informação mútua (mutual information) entre visões pareadas (com ressalvas na prática). Veja também Informação Mútua para contexto.
Ingredientes centrais
A maioria dos pipelines contrastivos inclui:
- Aumentos de dados / geração de visões
- Criar duas (ou mais) visões correlacionadas da mesma entrada.
- Rede codificadora
- Uma rede neural (neural network) (f_\theta(x)) que produz representações (h).
- Cabeça de projeção (projection head)
- Um pequeno perceptron multicamadas (MLP) (g_\phi(h)) que mapeia representações para um espaço contrastivo (z).
- Frequentemente melhora o desempenho a jusante ao permitir que (h) permaneça de uso geral enquanto (z) é otimizado para o objetivo contrastivo.
- Função de similaridade
- Frequentemente similaridade cosseno (cosine similarity): (\text{sim}(z_i, z_j) = \frac{z_i^\top z_j}{|z_i||z_j|})
- Perda contrastiva (contrastive loss)
- Mais comumente InfoNCE (uma entropia cruzada com softmax (softmax cross-entropy) sobre similaridades).
O objetivo InfoNCE
Configuração
Dado um minilote (minibatch) de (N) exemplos originais, normalmente criamos duas visões aumentadas para cada um, totalizando (2N) visões. Para cada visão (i), sua visão correspondente (j) é o positivo, e as outras (2N-2) visões servem como negativos.
Seja (z_i) a incorporação projetada da visão (i). Defina a similaridade (s_{ik} = \text{sim}(z_i, z_k)). O InfoNCE para a âncora (i) e seu positivo (j) é:
[ \mathcal{L}{i} = -\log \frac{\exp(s{ij}/\tau)}{\sum_{k \neq i} \exp(s_{ik}/\tau)} ]
onde (\tau) é um hiperparâmetro de temperatura (temperature) que controla o quão “pontuda” é a distribuição do softmax.
A perda total faz a média sobre todas as âncoras (muitas vezes simetrizada em ambas as direções (i \to j) e (j \to i)).
Como interpretar o InfoNCE
- O numerador aumenta quando a âncora é similar ao seu positivo.
- O denominador aumenta quando a âncora é similar a qualquer outro exemplo; então, minimizar a perda empurra os negativos para longe.
- Com lotes maiores ou mais negativos armazenados, a tarefa fica mais difícil e frequentemente produz melhores representações (até o limite de custo computacional e problemas de falsos negativos).
Pseudocódigo prático (estilo PyTorch)
import torch
import torch.nn.functional as F
def info_nce_loss(z1, z2, temperature=0.1):
# z1, z2: [N, D], assumed normalized or will normalize
z1 = F.normalize(z1, dim=1)
z2 = F.normalize(z2, dim=1)
N = z1.size(0)
# 2N x D
z = torch.cat([z1, z2], dim=0)
# similarity: 2N x 2N
sim = (z @ z.t()) / temperature
# mask out self-similarity
mask = torch.eye(2*N, dtype=torch.bool, device=z.device)
sim.masked_fill_(mask, float("-inf"))
# positives: i matches i+N (and vice versa)
targets = torch.arange(N, device=z.device)
pos_idx = torch.cat([targets + N, targets], dim=0)
# cross-entropy over rows
return F.cross_entropy(sim, pos_idx)
Isso é essencialmente a perda do SimCLR (descrita abaixo).
Design de pares positivos/negativos
Pares positivos: como definir “o mesmo”
No aprendizado contrastivo auto-supervisionado, positivos geralmente são gerados por aumentos de dados do mesmo exemplo bruto:
- Visão: dois recortes aleatórios da mesma imagem
- PLN (NLP): duas versões corrompidas da mesma frase (ou dois trechos do mesmo documento)
- Grafos: duas “visões” estocásticas do mesmo grafo ou da vizinhança de um nó
Em variantes supervisionadas ou semi-supervisionadas, positivos podem ser aumentados usando rótulos (por exemplo, imagens diferentes da mesma classe). Isso se torna aprendizado contrastivo supervisionado (supervised contrastive learning), que pode ser visto como uma ponte para a classificação padrão.
Pares negativos: por que importam e quando atrapalham
Supõe-se que negativos representem “semânticas diferentes”, mas isso pode falhar:
- Falsos negativos (false negatives): duas amostras diferentes no lote podem, na verdade, compartilhar semântica (por exemplo, duas imagens de cachorros). Tratá-las como negativas pode prejudicar.
- Tamanhos de lote pequenos limitam o número/diversidade de negativos, frequentemente reduzindo o desempenho.
- Negativos enviesados: se os negativos vêm de uma distribuição estreita, as representações podem não generalizar.
Esses problemas motivam técnicas como lotes grandes (SimCLR), filas de memória (MoCo), mineração de negativos difíceis, perdas desenviesadas, ou abordagens que evitam negativos explícitos (BYOL/SimSiam).
Geração de visões e escolhas de aumento de dados
A política de aumento de dados frequentemente determina o sucesso mais do que variantes sutis de perda — especialmente em visão.
Aumentos de dados em visão (comuns em pipelines estilo SimCLR)
Aumentos fortes típicos incluem:
- Recorte aleatório com redimensionamento (frequentemente o mais importante)
- Jitter de cor
- Tons de cinza aleatórios
- Desfoque gaussiano
- Espelhamento horizontal
- Solarização (em alguns métodos)
A ideia é impor invariâncias que correspondam às tarefas a jusante (por exemplo, a identidade do objeto deve ser estável sob mudanças de recorte/cor).
Veja também Aumento de Dados.
Aumentos de dados em PLN (mais delicados)
Aumentos de dados em texto devem preservar o significado para definir positivos válidos, o que é mais difícil do que em visão. Estratégias comuns:
- Ruído baseado em dropout: diferentes máscaras de dropout criam duas “visões” da mesma incorporação de frase
- Mascaramento/remoção de trechos (span masking)
- Retrotradução (back-translation) ou paráfrase (paraphrasing) (mais caro)
- Positivos em nível de frase: frases adjacentes, mesmo documento, ou pares do tipo implicação, dependendo do objetivo
Na prática, muitos sistemas modernos de PLN dependem mais de modelagem mascarada e de pares contrastivos cuidadosamente construídos do que de “aumentos de dados” pesados.
Aumentos de dados em grafos
O aprendizado contrastivo em grafos frequentemente constrói positivos perturbando estrutura/atributos:
- Remoção de arestas / amostragem de subgrafos
- Mascaramento de atributos
- Visões baseadas em difusão (caminhadas aleatórias)
- Duas amostragens de vizinhança do mesmo nó
O desafio é preservar a identidade semântica enquanto se perturbam fatores de incômodo como arestas específicas.
Métodos populares contrastivos e próximos do contrastivo
SimCLR (framework simples, lotes grandes)
SimCLR é uma linha de base canônica para aprendizado contrastivo de imagens:
- Duas visões aumentadas por imagem
- Codificador (por exemplo, ResNet) + cabeça de projeção MLP
- Perda InfoNCE com negativos no lote (in-batch negatives) (outras imagens no mesmo lote)
- Tipicamente precisa de tamanhos de lote grandes para fornecer muitos negativos
Observações práticas importantes:
- Aumento de dados forte é crucial.
- A temperatura (\tau) importa (valores comuns em torno de 0,1–0,5 dependendo da configuração).
- A cabeça de projeção frequentemente melhora a acurácia a jusante; tipicamente você a descarta e usa a saída do codificador para avaliação.
Relacionado: Redes Neurais Convolucionais, Normalização em Lote.
MoCo (Momentum Contrast: fila + codificador por momento)
MoCo resolve a dependência do SimCLR de lotes enormes mantendo uma fila de memória (memory queue) de incorporações negativas:
- Um codificador de consulta (query encoder) é treinado por descida de gradiente.
- Um codificador de chave (key encoder) é atualizado como uma média móvel exponencial (exponential moving average) (atualização por momento) do codificador de consulta.
- Uma fila armazena muitas chaves anteriores, fornecendo milhares de negativos sem lotes grandes.
Isso estabiliza o treinamento porque as incorporações enfileiradas são produzidas por um codificador de chave que muda lentamente.
MoCo é especialmente útil quando o hardware limita o tamanho de lote.
Relacionado conceitualmente: Média Móvel Exponencial (se estiver presente no seu wiki) e Otimização.
BYOL e SimSiam (sem negativos explícitos)
BYOL (Bootstrap Your Own Latent) e SimSiam são frequentemente discutidos junto com o aprendizado contrastivo porque aprendem a partir de visões pareadas, mas não usam negativos explícitos.
Eles dependem de assimetria e truques arquiteturais para evitar colapso (collapse) (mapear tudo para o mesmo vetor):
- Duas redes: uma rede online (online network) e uma rede alvo (target network)
- BYOL atualiza a rede-alvo por EMA de momento; SimSiam usa uma operação de parada de gradiente (stop-gradient) sem EMA
- Uma cabeça preditor (predictor) na rede online ajuda a evitar colapso
Mesmo sem negativos, esses métodos aprendem representações fortes, especialmente em visão. Às vezes eles são agrupados como “aprendizado auto-supervisionado não contrastivo”, mas compartilham a ideia central de fazer corresponder representações entre visões.
Relacionado: Aprendizado de Representações, Retropropagação.
Aprendizado contrastivo no estilo CLIP (visão-linguagem)
Um uso moderno muito influente do aprendizado contrastivo é o pré-treinamento contrastivo imagem–texto (image–text contrastive pretraining), popularizado por sistemas do tipo CLIP:
- Positivos: pares (imagem, legenda)
- Negativos: outras legendas no lote para uma imagem, e outras imagens no lote para uma legenda
- Objetivo: InfoNCE simétrico sobre a matriz de similaridade imagem–texto
Isso gera incorporações multimodais (multi-modal embeddings) úteis para classificação zero-shot (zero-shot classification) (casar uma imagem com prompts de texto) e recuperação.
Relacionado: Arquitetura Transformer.
Treinamento e avaliação na prática
Padrões de arquitetura
Um pipeline típico:
- Codificador (f_\theta): ResNet / ViT / Transformer / GNN
- Cabeça de projeção (g_\phi): MLP de 2 camadas com não linearidade
- Normalizar incorporações (norma L2 (L2 norm)) antes da similaridade
Para transformers de visão (vision transformers), métodos auto-supervisionados frequentemente combinam bem com backbones (backbones) ViT, mas podem exigir aumento de dados cuidadoso e ajuste fino de otimização.
Hiperparâmetros comuns e armadilhas
- Tamanho de lote / número de negativos
- Muito pequeno pode reduzir desempenho (para métodos com negativos no lote).
- Filas de memória podem ajudar.
- Temperatura (\tau)
- Muito baixa: excessivamente difícil, gradientes instáveis.
- Muito alta: separação fraca.
- Intensidade de aumento de dados
- Muito fraca: aprendizado de atalhos triviais (o modelo casa pistas de baixo nível).
- Muito forte: positivos deixam de compartilhar semântica; o treinamento degrada.
- Falsos negativos
- Especialmente problemáticos em datasets de granulação fina ou distribuições de cauda longa (long-tailed distributions).
- Colapso de representações
- Geralmente evitado em métodos baseados em InfoNCE devido aos negativos.
- Uma preocupação-chave em métodos sem negativos, mitigada por parada de gradiente/EMA/preditores.
Como as representações são avaliadas
Protocolos comuns de avaliação:
- Sondagem linear: congelar o codificador, treinar um classificador linear sobre as incorporações.
- Classificação k-NN (k-NN classification): classificar com base nos vizinhos mais próximos no espaço de incorporações.
- Ajuste fino: inicializar a partir de pesos pré-treinados e treinar ponta a ponta (end-to-end) com dados rotulados.
A sondagem linear é uma boa medida da qualidade da representação, independente do ajuste fino específico da tarefa.
Aplicações
Pré-treinamento contrastivo em visão computacional
O pré-treinamento contrastivo é amplamente usado para:
- Classificação de imagens com poucos rótulos
- Inicialização para detecção e segmentação de objetos
- Recuperação e clusterização
- Adaptação de domínio (pré-treinar em grandes dados não rotulados, adaptar para um novo domínio)
Exemplo prático: pré-treinar uma ResNet em imagens não rotuladas com SimCLR e depois fazer ajuste fino em um pequeno conjunto rotulado frequentemente melhora significativamente a acurácia e a eficiência de rótulos (label efficiency).
O aprendizado contrastivo também sustenta muitos produtos baseados em incorporações:
- Busca visual (“encontrar produtos similares”)
- Deduplicação / detecção de quase-duplicatas
- Reidentificação de face ou pessoa (tipicamente com aprendizado de métricas supervisionado, mas a geometria é semelhante)
Relacionado: Aprendizado de Métricas.
Aprendizado contrastivo em PLN
Em PLN, o aprendizado contrastivo aparece em várias formas:
- Aprendizado de incorporações de sentenças (sentence embedding learning): criar duas visões da mesma frase via ruído de dropout; treinar incorporações para que casem (positivos) e difiram de outras frases (negativos).
- Recuperação e ranqueamento: treinamento contrastivo consulta–documento (positivos são documentos clicados/relevantes).
- Alinhamento multilíngue: alinhar frases paralelas entre idiomas.
Uma configuração típica de incorporação de sentenças:
- Codificador: Transformer (por exemplo, do tipo BERT)
- Duas passagens forward com diferentes máscaras de dropout produzem duas incorporações para a mesma frase
- InfoNCE as aproxima, com outras frases no lote como negativos
Isso pode produzir incorporações mais adequadas para similaridade semântica do que o pré-treinamento por modelagem de linguagem mascarada sozinho, dependendo da tarefa.
Relacionado: Incorporações de Palavras, Transformers, BERT (se estiver presente).
Aprendizado contrastivo para grafos (GNNs)
O aprendizado contrastivo em grafos é usado para pré-treinar Redes Neurais em Grafos quando rótulos são escassos:
- Em nível de nó: duas amostragens de vizinhança do mesmo nó são positivas.
- Em nível de grafo: duas versões aumentadas do mesmo grafo são positivas (útil em predição de propriedades moleculares).
- Visões cruzadas: contrastar representações locais (nó) e globais (resumo do grafo).
Usos práticos incluem:
- Aprendizado de representações moleculares (melhorando a predição de propriedades com poucas moléculas rotuladas)
- Incorporações de redes sociais/relacionais para clusterização ou detecção de anomalias
- Pré-treinamento para classificação de nós e predição de links (link prediction) a jusante
Desafio-chave: projetar aumentos de dados que respeitem a semântica da estrutura do grafo.
Variantes e extensões
Aprendizado contrastivo supervisionado
Se rótulos estiverem disponíveis, você pode definir positivos como todos os exemplos da mesma classe. Isso frequentemente supera a classificação padrão com entropia cruzada porque otimiza diretamente a geometria do espaço de incorporações.
Mineração de negativos difíceis
Em vez de tratar todos os negativos igualmente, foque em negativos “difíceis” (alta similaridade com a âncora). Isso pode melhorar a eficiência amostral, mas pode desestabilizar o treinamento se negativos difíceis forem, na verdade, falsos negativos.
Objetivos desenviesados e conscientes de falsos negativos
Alguns métodos ajustam o denominador ou reponderam negativos para reduzir o dano de falsos negativos, especialmente em espaços semânticos densos.
Objetivos multi-positivo ou multi-visão
Usar mais de duas visões por exemplo (multicorte (multi-crop), multi-aumento de dados) pode melhorar robustez e desempenho, com maior custo computacional.
Quando usar aprendizado contrastivo (e quando não)
Bons cenários
- Você tem muitos dados não rotulados
- Você quer incorporações de uso geral para recuperação, clusterização ou aprendizado por transferência (transfer learning)
- Rótulos são escassos ou caros
- Você consegue definir “visões” significativas via aumentos de dados ou modalidades pareadas
Cenários potencialmente ruins
- Aumentos de dados que preservem semântica são difíceis de projetar (alguns cenários de PLN ou domínios científicos especializados)
- Tarefas a jusante exigem invariâncias que entram em conflito com seus aumentos de dados
- Você não pode arcar com lotes/filas grandes e o desempenho é sensível aos negativos (embora abordagens tipo MoCo ajudem)
Em PLN, a modelagem mascarada frequentemente continua sendo um padrão forte; o aprendizado contrastivo é usado com frequência como uma etapa adicional de alinhamento ou para qualidade de incorporações em nível de sentença.
Resumo
O aprendizado contrastivo treina representações aproximando pares positivos e afastando pares negativos, tipicamente usando InfoNCE. O desempenho depende fortemente de:
- Como você define visões/aumentos de dados
- Como você obtém e gerencia negativos (no lote, filas, mineração)
- Escolhas arquiteturais como cabeças de projeção e normalização
Métodos canônicos incluem:
- SimCLR: simples, eficaz, mas frequentemente precisa de lotes grandes
- MoCo: usa codificador por momento + fila para escalar negativos de forma eficiente
- BYOL/SimSiam: métodos próximos do contrastivo que removem negativos explícitos, apoiando-se em assimetria para evitar colapso
O pré-treinamento contrastivo agora é uma ferramenta padrão em visão, PLN e grafos, permitindo aprendizado por transferência forte e treinamento eficiente em rótulos em muitos sistemas do mundo real.