Pular para o conteúdo principal

Contrastive learning: como os modelos aprendem por comparação

Um panorama prático de contrastive learning — como os modelos aprendem comparando exemplos semelhantes e diferentes, as funções de perda e os métodos por trás disso, e como implementar em PyTorch.
Atualizado 12 de ago. de 2026  · 13 min lido

Explorar com IA

ChatGPTClaudePerplexity

Fazer um modelo aprender sem dados rotulados parece impossível, mas é exatamente essa a proposta do contrastive learning.

Como você sabe, rotular dados é lento e caro. Um único dataset de classificação de imagens costuma exigir milhares de horas de anotação humana — e isso antes mesmo de considerar erros e inconsistências.

O contrastive learning contorna esse problema de rotulagem ensinando os modelos a comparar. Em vez de dizer ao modelo o que algo é, você mostra o que é parecido e o que é diferente — e deixa que ele descubra o resto.

Neste artigo, vou explicar a intuição por trás do contrastive learning, como ele funciona nos bastidores, onde é aplicado na prática — de reconhecimento de imagens a embeddings em PLN — e como implementar em PyTorch.

O que é, afinal, visão computacional? Leia nosso guia para iniciantes em análise de imagens.

O que é contrastive learning?

Contrastive learning é uma abordagem de treinamento em que o modelo aprende por comparação, não por classificação.

Em vez de dizer ao modelo "isso é um gato" ou "isso é um cachorro", você mostra pares de exemplos e deixa que ele descubra o que combina e o que não combina. O modelo aprende determinando se duas coisas são semelhantes ou não.

Em outras palavras: você alimenta o modelo com dois pontos de dados por vez. Se forem relacionados — por exemplo, duas fotos do mesmo cachorro em ângulos diferentes — é um par positivo. Se forem não relacionados — uma foto de um cachorro e outra de um carro — é um par negativo.

A função do modelo é produzir representações (vetores numéricos) que respeitem essa estrutura. Pares positivos devem ficar próximos no espaço vetorial. Pares negativos devem ficar distantes.

Intuição por trás do contrastive learning

A maneira mais fácil de entender contrastive learning é com imagens.

Pegue a foto de um cachorro. Agora crie duas versões — uma recortada e outra com brilho ajustado. O conteúdo é o mesmo, mas os pixels mudam. Um modelo de contrastive learning vê essas duas versões como um par positivo e aprende a mapeá-las para posições próximas no espaço vetorial.

Se você mostrar ao modelo uma foto de um carro junto com a foto do cachorro, terá um par negativo. O modelo aprende a afastar suas representações.

Você não precisa intervir manualmente e especificar "isso é um cachorro" ou "isso é um carro". O modelo constrói seu entendimento a partir da estrutura de semelhanças e diferenças.

É isso que torna o contrastive learning tão poderoso.

O sinal vem da comparação. Com pares suficientes, o modelo desenvolve representações que entendem o que aproxima e o que diferencia as coisas.

Essas representações são realmente úteis. Um modelo treinado assim com imagens pode ser ajustado para tarefas de classificação, detecção ou busca com pouquíssimos rótulos, porque ele já aprendeu algo significativo sobre o mundo visual.

Aplicações de contrastive learning

O contrastive learning aparece em muitas áreas — estes são os casos mais comuns.

Visão computacional

Foi aqui que o contrastive learning mostrou do que é capaz.

Modelos treinados dessa forma em imagens aprendem a produzir representações que capturam similaridade visual sem ver um único rótulo. Duas fotos da mesma cena, feitas em ângulos ou iluminações diferentes, devem ser mapeadas para pontos próximos no espaço vetorial. Duas cenas não relacionadas devem ficar distantes.

Você pode pegar um modelo pré-treinado contrastivamente e fazer fine-tuning para classificação ou detecção de objetos com uma fração dos rótulos que precisaria de outra forma.

Processamento de linguagem natural

Em PLN, o contrastive learning é usado para treinar embeddings de sentenças — representações vetoriais que entendem o significado da frase como um todo.

Frases com significados semelhantes devem ficar próximas no espaço vetorial, e frases não relacionadas devem ficar afastadas. Modelos treinados assim conseguem fazer busca semântica e medir similaridade entre sentenças sem precisar de grandes quantidades de pares rotulados.

Sistemas de recomendação

Sistemas de recomendação usam contrastive learning para modelar a similaridade entre usuário e item.

Um usuário e um item com o qual ele interagiu formam um par positivo. Um usuário e um item aleatório que ele nunca viu formam um par negativo. Com exemplos suficientes, o modelo aprende um espaço compartilhado onde usuários e itens relevantes se agrupam.

Modelos multimodais

É aqui que o contrastive learning fica ainda mais interessante.

Modelos como o CLIP o utilizam para alinhar texto e imagens em um espaço vetorial comum. Uma foto de um cachorro e a frase "um cachorro brincando no parque" devem ficar próximas. Uma foto de um cachorro e a frase "um carro esportivo vermelho" não devem. Isso permite que modelos multimodais associem imagens a descrições de texto e gerem legendas.

Como o contrastive learning funciona

O contrastive learning segue quatro etapas, independentemente de você trabalhar com imagens, texto ou áudio.

Etapa 1: criar pares

Cada exemplo de treino começa como um par. Você amostra dois pontos de dados e rotula a relação como semelhante (positivo) ou diferente (negativo). Na prática, pares positivos costumam vir de duas aumentações do mesmo input, e pares negativos de exemplos não relacionados.

Etapa 2: codificar em embeddings

Ambos os pontos passam por um encoder que os transforma em vetores. Esses vetores, chamados de embeddings, são representações numéricas em um espaço vetorial compartilhado. O objetivo é que esse espaço reflita significado semântico, e não apenas valores brutos de pixels ou tokens.

Etapa 3: calcular similaridade

Com dois embeddings em mãos, você mede o quão próximos eles estão. A similaridade do cosseno é a escolha mais comum. Ela gera um score entre -1 e 1, onde 1 significa que os vetores apontam na mesma direção e -1 significa que são completamente opostos.

Etapa 4: atualizar o modelo

O modelo compara seus scores de similaridade com o que deveriam ser. Para pares positivos, o score deve ser alto. Para pares negativos, deve ser baixo. Uma função de perda mede o erro, e o backprop ajusta os pesos do encoder para melhorar na próxima iteração.

Repetindo essas etapas em pares suficientes, o encoder aprende a produzir embeddings que aproximam itens semelhantes e afastam os diferentes.

Amostras positivas e negativas

A qualidade do seu modelo contrastivo depende de como você cria os pares.

Pares positivos são dois pontos de dados que devem ser considerados semelhantes. Em visão computacional, geralmente são duas versões aumentadas da mesma imagem. Em PLN, podem ser duas paráfrases da mesma frase ou uma frase e sua tradução. O modelo aprende que o que varia entre elas não importa — o que importa é o que é compartilhado.

Pares negativos são dois pontos de dados que devem ser considerados diferentes. A maioria das implementações amostra negativos aleatoriamente do restante do dataset. Se você treina com imagens, qualquer duas imagens de objetos diferentes formam um par negativo válido.

É aqui que fica mais delicado.

Nem todo negativo é igualmente útil. Um negativo aleatório que é obviamente diferente da origem — por exemplo, uma foto de um cachorro pareada com a de um avião — não exige muito do modelo. Esses são os negativos fáceis e treinar demais com eles desacelera o aprendizado.

No outro extremo, os negativos difíceis são pontos de dados que parecem semelhantes à origem, mas pertencem a classes diferentes — duas raças de cachorro, por exemplo, ou duas frases com redações parecidas, porém significados distintos. O modelo precisa desenvolver representações mais refinadas para diferenciá-los, o que gera embeddings melhores no geral.

A mesma lógica vale para positivos. Se as aumentações forem sutis demais, o modelo aprende pouco. Se forem agressivas demais, o par deixa de ser realmente semelhante.

Funções de perda contrastiva

A função de perda transforma comparações entre pares em sinais de aprendizado.

Cada função de perda age de um jeito, mas todas têm o mesmo objetivo: recompensar o modelo quando itens semelhantes ficam próximos no espaço vetorial e penalizá-lo quando não ficam.

Contrastive loss

A contrastive loss foi apresentada junto com os primeiros trabalhos de contrastive learning.

Ela opera sobre pares. Dado um par positivo, penaliza o modelo se seus embeddings estiverem distantes. Dado um par negativo, penaliza se os embeddings estiverem próximos demais — especificamente, se caírem dentro de uma margem definida. Negativos que já estão suficientemente distantes não contribuem para a perda.

Fórmula da contrastive loss

Fórmula da contrastive loss

Onde d é a distância entre dois embeddings, y vale 1 para pares negativos e 0 para pares positivos, e m é a margem. A margem é um hiperparâmetro definido manualmente, o que torna essa perda sensível a ajustes.

Triplet loss

A triplet loss trabalha com três pontos de dados ao mesmo tempo: um âncora, um positivo e um negativo.

Fórmula da triplet loss

Fórmula da triplet loss

O modelo é penalizado sempre que a distância âncora-positivo d(a, p) não é menor do que a distância âncora-negativo d(a, n) por pelo menos a margem m. Se a condição já for satisfeita, a perda é zero.

Essa formulação dá mais contexto por atualização do que a contrastive loss, pois compara as duas relações ao mesmo tempo, não uma de cada vez.

InfoNCE loss

InfoNCE é a perda por trás da maioria dos métodos modernos de contrastive learning, incluindo SimCLR e CLIP.

Fórmula da InfoNCE loss

Fórmula da InfoNCE loss

Para cada âncora z_i, o modelo precisa identificar seu positivo z_j dentre todos os outros N exemplos no batch. O parâmetro de temperatura τ controla o quão aguda é a distribuição — valores menores deixam o modelo mais confiante; valores maiores suavizam o contraste entre pares.

Você obtém mais negativos por atualização, o que dá mais sinal de aprendizado ao modelo. Isso também significa que batches maiores expõem o modelo a negativos mais difíceis e, em geral, produzem representações melhores.

Contrastive learning no autoaprendizado

Contrastive learning e autoaprendizado se complementam bem — e entender o porquê ajuda a visualizar para onde o ML moderno está indo.

Autoaprendizado (self-supervised learning) é uma abordagem em que o próprio modelo gera seus rótulos a partir dos dados, sem anotação humana. Em vez de alguém rotular milhares de imagens como "gato" ou "cachorro", o próprio dado fornece o sinal de supervisão.

É exatamente isso que o contrastive learning faz. Quando você pega uma imagem, cria duas versões aumentadas dela e informa ao modelo que formam um par positivo, você acabou de criar um rótulo.

Isso importa porque dados rotulados são o gargalo na maioria dos pipelines de ML. Coletar é lento, anotar é caro e alguns domínios, como imagens médicas, não têm dados suficientes.

Os resultados têm sido promissores. Modelos pré-treinados com objetivos contrastivos de autoaprendizado em grandes datasets não rotulados igualaram ou chegaram perto de bases supervisionadas em diversas tarefas downstream, após fine-tuning com uma pequena quantidade de dados rotulados.

A tendência geral é sair de treinamentos supervisionados específicos de tarefa e caminhar para representações de propósito geral aprendidas a partir de dados brutos em escala. Métodos como SimCLR, MoCo e BYOL seguem essa linha — e eu falo deles a seguir.

Métodos populares de contrastive learning

Estes são os três frameworks mais influentes por trás do contrastive learning em 2026.

SimCLR

O SimCLR, apresentado pelo Google Research, é uma das implementações mais claras da ideia de contrastive learning.

Para cada imagem no batch, ele cria duas visões aumentadas e as trata como par positivo. Todas as outras imagens do batch viram negativas. O modelo — uma CNN seguida por uma pequena cabeça de projeção — aprende a aproximar pares positivos usando a InfoNCE loss.

O diferencial do SimCLR foi mostrar o quanto o tamanho do batch importa. Batches maiores significam mais negativos por atualização, o que gera representações melhores. O trade-off é memória. Como o SimCLR exige batches grandes para performar bem, você precisa de bom hardware para tirar o máximo proveito.

MoCo

O MoCo (Momentum Contrast), da Meta AI Research, foi criado para resolver exatamente esse problema.

Em vez de depender de um batch grande para gerar negativos, o MoCo mantém uma fila — um buffer contínuo de representações codificadas de batches anteriores. Isso desacopla a quantidade de negativos do tamanho do batch, permitindo treinar com muito menos memória e ainda expor o modelo a um grande conjunto de negativos.

Ele também usa um momentum encoder, uma cópia do encoder principal atualizada lentamente, para manter as representações da fila consistentes ao longo do tempo.

BYOL

O BYOL (Bootstrap Your Own Latent) merece menção aqui, embora não use pares negativos.

Em vez de afastar negativos, o BYOL treina uma rede para prever as representações de outra — uma rede-alvo atualizada lentamente. Não há negativos nem perda contrastiva. Funciona surpreendentemente bem e desafiou a suposição de que pares negativos são necessários para um aprendizado no estilo contrastivo.

O BYOL fica ali na fronteira do contrastive learning, mas é um ótimo próximo passo depois de entender os métodos centrais.

Contrastive learning vs. aprendizado supervisionado

As duas abordagens resolvem o mesmo problema, mas partem de suposições diferentes — e você precisa entendê-las.

O aprendizado supervisionado exige dados rotulados. Cada exemplo de treino precisa de um rótulo humano, e o modelo aprende mapeando entradas para esses rótulos. É uma abordagem direta e funciona bem quando há exemplos rotulados suficientes. O modelo sabe o que é a entrada e qual é a resposta correta.

O contrastive learning gera sua própria supervisão a partir da estrutura dos dados — similaridade e diferença — e aprende representações sem ver rótulos.

Aqui vai uma forma mais visual de comparar:

Contrastive learning comparado ao aprendizado supervisionado

Contrastive learning comparado ao aprendizado supervisionado

A maior diferença aparece em escala. O aprendizado supervisionado depende de dados rotulados — e rotular mais é caro. O contrastive learning pode continuar melhorando conforme você adiciona mais dados não rotulados, que normalmente são abundantes.

Mas é importante notar: as representações aprendidas pelo contrastive learning são gerais, não específicas de uma tarefa. Por isso, geralmente você precisa de uma etapa de fine-tuning para ter bom desempenho em um problema específico. Modelos supervisionados não precisam dessa etapa porque já são treinados diretamente no objetivo-alvo.

A escolha depende dos seus dados. Se você tem rótulos e uma tarefa específica, o aprendizado supervisionado costuma ser mais rápido. Se trabalha com muitos dados não rotulados ou precisa de representações transferíveis entre tarefas, o contrastive learning pode valer o esforço extra de configuração.

Contrastive learning na prática (exemplo em Python)

Agora, vamos a uma implementação mínima em PyTorch. O exemplo abaixo cobre as três ideias centrais que vimos: um modelo de embedding, similaridade do cosseno e a NT-Xent loss — a função de perda usada no SimCLR, construída sobre a InfoNCE.

O modelo de embedding

O encoder é uma rede feedforward simples que mapeia vetores de entrada para um espaço de embedding de menor dimensão.

import torch
import torch.nn as nn
import torch.nn.functional as F

class Encoder(nn.Module):
    def __init__(self, input_dim, embedding_dim):
        super().__init__()
        self.network = nn.Sequential(
            nn.Linear(input_dim, 128),
            nn.ReLU(),
            nn.Linear(128, embedding_dim)
        )

    def forward(self, x):
        return self.network(x)

Na prática, você substituiria por uma CNN para imagens ou um transformer para texto. A arquitetura importa menos do que o que vem depois.

Cálculo de similaridade

Com dois embeddings, você mede a proximidade usando similaridade do cosseno. Normalizar os vetores antes mantém os scores entre -1 e 1.

def cosine_similarity(z1, z2):
    z1 = F.normalize(z1, dim=-1)
    z2 = F.normalize(z2, dim=-1)
    return torch.matmul(z1, z2.T)

O resultado é uma matriz em que cada entrada [i, j] representa a similaridade entre o embedding i e o embedding j no batch.

NT-Xent loss

A NT-Xent (Normalized Temperature-scaled Cross Entropy) é a perda baseada em InfoNCE. Para cada âncora, ela trata sua visão pareada como positivo e todos os outros exemplos do batch como negativos.

def nt_xent_loss(z1, z2, temperature=0.5):
    batch_size = z1.shape[0]

    z = torch.cat([z1, z2], dim=0)
    z = F.normalize(z, dim=-1)
    sim_matrix = torch.matmul(z, z.T) / temperature

    mask = torch.eye(2 * batch_size, dtype=torch.bool)
    sim_matrix = sim_matrix.masked_fill(mask, float("-inf"))

    labels = torch.arange(batch_size)
    labels = torch.cat([labels + batch_size, labels])

    return F.cross_entropy(sim_matrix, labels)

O parâmetro temperature controla o quão aguda é a distribuição. Valores menores deixam o modelo mais confiante sobre qual par é o positivo; valores maiores suavizam o contraste.

Juntando tudo

encoder = Encoder(input_dim=64, embedding_dim=32)
optimizer = torch.optim.Adam(encoder.parameters(), lr=1e-3)

# Simula um batch de pares positivos
x1 = torch.randn(32, 64)
x2 = torch.randn(32, 64)

# Treinamento
optimizer.zero_grad()
z1, z2 = encoder(x1), encoder(x2)
loss = nt_xent_loss(z1, z2)
loss.backward()
optimizer.step()

print(f"Loss: {loss.item():.4f}")

Saída do loop contrastivo

Saída do loop contrastivo

Este é o loop contrastivo completo em sua forma mais simples. Em uma implementação real, x1 e x2 seriam duas visões aumentadas do mesmo input, e não ruído aleatório — mas a estrutura é exatamente a mesma.

Conclusão

Contrastive learning é uma ideia simples com um grande alcance.

Ele ensina modelos a entender estrutura por comparação, em vez de depender de rótulos. Aproximar o que é parecido, afastar o que é diferente — essa é a premissa. E ela é suficiente para aprender representações que transferem bem entre tarefas.

A área está se afastando de pipelines pesados em anotação, e o contrastive learning é um dos grandes motivos. Algoritmos como SimCLR, MoCo e CLIP chegaram a produtos reais — o que diz muito sobre a eficácia da abordagem.

Se quiser ir mais fundo, o próximo passo é colocar a mão na massa. O exemplo em PyTorch deste artigo é um começo, mas rodar o SimCLR em um dataset de imagens — mesmo pequeno — vai te ensinar mais do que qualquer explicação.

E, se você busca um recurso definitivo sobre tópicos avançados de machine learning, inscreva-se na nossa trilha Machine Learning Scientist in Python.


Dario Radečić's photo
Author
Dario Radečić
Cientista de dados sênior baseado na Croácia. Principal redator técnico com mais de 700 artigos publicados, gerando mais de 10 milhões de visualizações. Autor do livro Automação do aprendizado de máquina com TPOT.

Perguntas frequentes sobre contrastive learning

O que é contrastive learning em termos simples?

Contrastive learning é uma forma de treinar modelos mostrando pares de exemplos e ensinando o que é semelhante e o que é diferente. Em vez de usar dados rotulados, o modelo aprende a partir da própria estrutura dos dados. Com o tempo, ele constrói representações que agrupam o que é parecido e separam o que é distinto.

Como o contrastive learning é diferente do aprendizado supervisionado?

O aprendizado supervisionado exige dados rotulados — cada exemplo precisa de uma categoria ou valor atribuído por humanos. O contrastive learning não precisa de rótulos. Ele gera seu próprio sinal de treinamento a partir de pares semelhantes e diferentes, o que o torna muito mais barato de escalar quando faltam rótulos.

Para que serve o contrastive learning?

O contrastive learning é usado em visão computacional, PLN, sistemas de recomendação e modelos multimodais. Em visão computacional, ele pré-treina encoders de imagem sem rótulos. Em PLN, impulsiona modelos de embeddings de sentenças que entendem similaridade semântica. Modelos como o CLIP o utilizam para alinhar texto e imagens em um espaço vetorial compartilhado.

Qual a diferença entre contrastive loss, triplet loss e InfoNCE?

A contrastive loss trabalha com pares e penaliza o modelo quando pares semelhantes ficam muito distantes ou quando pares diferentes ficam próximos demais, usando uma margem fixa. A triplet loss adiciona uma âncora e compara simultaneamente sua distância para um positivo e para um negativo. A InfoNCE trata o problema como classificação dentro do batch — o modelo precisa identificar o positivo correto entre todos os exemplos — o que fornece um sinal de aprendizado mais rico e é a base de métodos modernos como SimCLR e CLIP.

Por que o tamanho do batch importa no contrastive learning?

Em métodos como o SimCLR que usam InfoNCE, os negativos vêm de outros exemplos no mesmo batch. Um batch maior significa mais negativos por atualização, expondo o modelo a comparações mais difíceis e, em geral, gerando representações melhores. Por isso o contrastive learning tende a consumir muita memória — você precisa de batches grandes para extrair o máximo do sinal de treinamento.

Tópicos

Aprenda com a DataCamp

Curso

Detecção de Fraudes em R

4 h
7.6K
Aprenda a detectar fraudes com análises no R.
Ver detalhes
Iniciar Curso
Ver mais
Relacionado

blog

Modelos generativos versus modelos discriminativos: Diferenças e casos de uso

Este artigo explica as principais diferenças entre os modelos generativos e discriminativos, abordando seus princípios, casos de uso e exemplos práticos para ajudar você a escolher a abordagem certa para suas tarefas de machine learning.
Arun Nanda's photo

Arun Nanda

15 min

blog

8 modelos de aprendizado de máquina explicados em 20 minutos

Descubra tudo o que você precisa saber sobre os tipos de modelos de aprendizado de máquina, inclusive para que eles são usados e exemplos de como implementá-los.
Natassha Selvaraj's photo

Natassha Selvaraj

15 min

blog

O que é um modelo generativo?

Os modelos generativos usam o aprendizado de máquina para descobrir padrões nos dados e gerar novos dados. Saiba mais sobre sua importância e aplicações em IA.
Abid Ali Awan's photo

Abid Ali Awan

11 min

Tutorial

Explicação das funções de perda no aprendizado de máquina

Explore o papel crucial das funções de perda no aprendizado de máquina com nosso guia abrangente. Entenda a diferença entre as funções de perda e de custo, aprofunde-se em vários tipos, como MSE e MAE, e aprenda suas aplicações em tarefas de ML.
Richmond Alake's photo

Richmond Alake

Tutorial

Introdução ao Q-learning: um tutorial para iniciantes

Aprenda o algoritmo de aprendizado por reforço sem modelo mais popular com um tutorial em Python.
Abid Ali Awan's photo

Abid Ali Awan

Tutorial

Como treinar um LLM com o PyTorch

Domine o processo de treinamento de grandes modelos de linguagem usando o PyTorch, desde a configuração inicial até a implementação final.
Zoumana Keita 's photo

Zoumana Keita

Ver MaisVer Mais