SimCLR: Aprender por Contraste e Pagar pelos Negativos
por Frank de Alcantara em 28/07/2026
Vamos mostrar à rede duas fotografias do mesmo cão: uma recortada, outra desfocada e com as cores alteradas. Depois vamos mostrar a fotografia de outro cão. Se a representação aproximar as duas primeiras e afastar a terceira, talvez tenha aprendido algo sobre identidade visual. Talvez tenha aprendido apenas nossa escolha de recortes e cores. O SimCLR é interessante justamente porque transforma essa ambiguidade em uma tarefa precisa.
Índice da Série: Representações e Modelos de Mundo
- 1. Representações e Modelos de Mundo: o Mapa da Série
- 2. Autoencoders: o Gargalo, a Reconstrução e o Latente
- 4. Difusão Latente: Comprimir Antes de Gerar
- 5. SimCLR: Aprender por Contraste e Pagar pelos Negativos (Você está aqui)
- 6. BYOL: Aprender sem Negativos sem Entregar Tudo ao Colapso
- 7. DINO: Autodestilação e Objetos que Emergem da Atenção
- 8. MAE: Mascarar 75% da Imagem e Reconstruir o que Falta
- 9. Prever, não gerar: o template JEPA e o problema do colapso
O autoencoder organiza um latente para reconstrução. A difusão latente organiza um espaço para geração. O SimCLR abandona ambos os contratos. Em vez de perguntar “consigo refazer a entrada?”, pergunta “duas transformações da mesma imagem chegam ao mesmo lugar, e imagens diferentes permanecem separadas?”. Não há decoder de pixels. Há geometria, temperatura e um lote cheio de adversários involuntários.
1. Duas views definem o positivo
Para cada imagem $x_k$, sorteamos duas transformações $t$ e $t’$ de uma família $\mathcal{T}$:
\[\tilde{x}_{2k}=t(x_k),\qquad \tilde{x}_{2k+1}=t'(x_k).\]Essas duas views formam um par positivo. As views de outras imagens no lote funcionam como negativos. Com $B$ imagens, o modelo processa $2B$ entradas.
O encoder $f$ produz uma representação $h_i=f(\tilde{x}_i)$. Um pequeno projection head $g$ produz
\[z_i=g(h_i).\]A perda atua sobre $z_i$, enquanto tarefas posteriores usam $h_i$. O SimCLR mostrou empiricamente que essa separação melhora a representação utilizada depois. O cabeçalho absorve parte da pressão específica da tarefa contrastiva e é descartado ao final.
1.1 A linhagem contrastiva
O SimCLR simplificou uma linhagem, não a inventou do zero. Redes siamesas já compartilhavam pesos para comparar pares na década de 1990. Hadsell, Chopra e LeCun formularam em 2006 uma perda contrastiva com margem, aproximando pares semelhantes e afastando pares diferentes. Gutmann e Hyvärinen transformaram estimação de densidades não normalizadas em classificação entre dados e ruído. O Contrastive Predictive Coding, de van den Oord, Li e Vinyals, introduziu em 2018 a InfoNCE para identificar uma continuação positiva entre amostras negativas. O SimCLR removeu memória externa e arquitetura especializada, preservou a classificação contrastiva e mostrou o peso decisivo dos aumentos, do projection head, do lote e da duração do treino.
O contrato de índices merece precisão. Com $B$ imagens originais, temos $2B$ views. Se elas são guardadas aos pares, $(0,1)$, $(2,3)$, e assim por diante, o positivo de um índice $i$ pode ser escrito como
\[\pi(i)= \begin{cases} i+1,& i\text{ par},\\ i-1,& i\text{ ímpar}. \end{cases}\]Cada âncora possui exatamente um positivo e $2B-2$ negativos. Como todas as $2B$ views servem de âncora, a perda média contém $2B$ classificações. “Um par positivo por imagem” não significa uma única direção de gradiente.
A Figura 1 transforma essa contagem na matriz que a implementação realmente compara. O par positivo aparece duas vezes, uma em cada direção, enquanto a diagonal é excluída e todas as demais views atuam como negativas.
Figura 1: Para $B=3$, cada linha da matriz possui um positivo, quatro negativos e a própria *view* excluída; os três pares positivos produzem seis comparações direcionais.
1.2 Exercícios de lápis e papel
1. Para $B=3$, numere as seis views em pares consecutivos e escreva $\pi(i)$ para cada índice.
Solução: Os pares são $(0,1)$, $(2,3)$ e $(4,5)$. Portanto,
\[\pi(0)=1,\quad \pi(1)=0,\] \[\pi(2)=3,\quad \pi(3)=2\]e
\[\pi(4)=5,\quad \pi(5)=4.\]2. Ainda com $B=3$, conte quantos negativos cada âncora possui e quantas perdas direcionais entram na média.
Solução: Cada âncora encontra $2B-1=5$ candidatas depois da exclusão da diagonal. Uma delas é positiva, portanto existem
\[2B-2=6-2=4\]negativas por âncora. Como cada uma das seis views atua como âncora, a média contém $2B=6$ perdas direcionais.
3. Se o encoder produz $h_i\in\mathbb{R}^{2048}$ e o projection head produz $z_i\in\mathbb{R}^{128}$, escreva os formatos de uma matriz linear que liga os dois espaços.
Solução: Escrevendo as representações como linhas de um lote e calculando $Z=HW_g$, a matriz deve transformar $2048$ coordenadas em $128$:
\[W_g\in\mathbb{R}^{2048\times128}.\]Um viés opcional teria $128$ coordenadas.
4. Explique por que descartar $g$ depois do pré-treino não impede o gradiente da perda contrastiva de ter treinado $f$.
Solução: Durante o pré-treinamento, $z_i=g(f(\tilde{x}_i))$, portanto a regra da cadeia propaga o gradiente da perda através de $g$ até os parâmetros de $f$. Descartar $g$ depois do treino remove apenas o cabeçalho usado pela tarefa pretexto; não desfaz as atualizações que o encoder já recebeu.
5. Compare em uma frase a margem explícita de uma perda siamesa clássica com o denominador de classificação da NT-Xent.
Solução: A perda siamesa clássica pode exigir que um negativo ultrapasse uma distância fixa definida por uma margem, enquanto a NT-Xent não fixa esse limiar e faz o positivo competir, por softmax, com todos os candidatos presentes no denominador.
2. Aumentos são uma declaração de invariância
Recorte, redimensionamento, distorção de cor e borramento não são decoração. Ao declarar duas transformações como positivas, dizemos que a representação deve aproximá-las.
Se remover cor não muda a classe relevante, a invariância ajuda. Se a cor determina o diagnóstico de uma lâmina médica, a mesma transformação pode apagar o sinal. O artigo do SimCLR encontra uma composição forte de recorte e distorção de cor para imagens naturais; isso é evidência naquele domínio, não uma lei que atravessa EEG, áudio e sensoriamento remoto sem revisão.
Uma tarefa autossupervisionada sempre contém conhecimento humano, ainda que nenhum rótulo de classe apareça. Aqui ele mora em $\mathcal{T}$.
2.1 Invariância escolhida e informação destruída
Se uma transformação $t$ deve preservar a identidade relevante, gostaríamos de obter
\[f(t(x))\approx f(x).\]Para um conjunto de transformações que se compõem e possuem inversas, poderíamos falar formalmente em invariância a um grupo $G$: $f(gx)=f(x)$ para todo $g\in G$. Os aumentos do SimCLR não formam necessariamente um grupo. Um recorte destrutivo não possui inversa, e duas distorções aleatórias podem remover informações diferentes. A linguagem de invariância ainda é útil, desde que não esconda essa assimetria.
Considere imagens nas quais a classe $y$ é o sinal da média do canal vermelho. Uma transformação que converte tudo para tons de cinza pode tornar $y$ impossível de recuperar. Se $t(x_a)=t(x_b)$ para entradas de classes diferentes, nenhum encoder determinístico que veja apenas $t(x)$ poderá separar $x_a$ de $x_b$. O aumento criou uma colisão informacional antes que a rede tivesse oportunidade de aprender.
O problema oposto também existe. Se as duas views preservarem uma marca d’água específica de cada fotografia, o modelo pode casar positivos usando esse atalho em vez de forma ou objeto. Um bom aumento remove atalhos que não devem sobreviver e conserva sinais que a tarefa futura exigirá. Essa decisão é uma hipótese de domínio, não um hiperparâmetro inocente.
2.2 Exercícios de lápis e papel
1. Dê um exemplo de transformação invertível e um de transformação destrutiva sobre um vetor de quatro coordenadas.
Solução: Uma transformação invertível é a reversão
\[t_{\mathrm{inv}}(x_0,x_1,x_2,x_3)=(x_3,x_2,x_1,x_0),\]pois aplicá-la novamente recupera o vetor original. Uma transformação destrutiva é
\[t_{\mathrm{dest}}(x_0,x_1,x_2,x_3)=(x_0,x_1,x_2,0),\]que apaga $x_3$ e não permite distingui-lo depois da transformação.
2. Se $t(1,0)=t(0,1)=(1,1)$, prove que qualquer função determinística de $t(x)$ produz a mesma representação para as duas entradas.
Solução: Seja $f$ qualquer função determinística aplicada depois de $t$. Então,
\[f(t(1,0))=f(1,1)=f(t(0,1)).\]Como as duas entradas de $f$ são idênticas, suas saídas também precisam ser. A transformação destruiu a informação que distinguia $(1,0)$ de $(0,1)$.
3. Uma classe depende exclusivamente da cor. Explique por que a conversão obrigatória para cinza viola o contrato da tarefa.
Solução: A conversão para cinza pode mapear cores de classes diferentes para a mesma intensidade. Depois dessa colisão, nenhuma função determinística que receba apenas a imagem convertida consegue recuperar qual cor original estava presente. Declarar as duas imagens como views equivalentes força justamente a invariância à única variável que define a classe.
4. Uma marca d’água identifica cada arquivo, mas não cada objeto. Explique como ela pode virar atalho para reconhecer pares positivos.
Solução: As duas views da mesma fotografia podem conservar a mesma marca d’água, enquanto fotografias diferentes exibem marcas distintas. O modelo consegue então reconhecer o par positivo lendo esse identificador, sem aprender forma, objeto ou cena. A perda diminui, mas a representação não transfere para imagens sem a marca.
5. Proponha duas views para áudio e declare explicitamente uma propriedade que cada transformação pretende tornar invariante.
Solução: Uma view pode deslocar o início do trecho por poucos milissegundos, declarando que a representação deve ser aproximadamente invariante à posição temporal absoluta do evento. Outra pode acrescentar ruído de fundo de baixa intensidade, declarando invariância a pequenas mudanças do ambiente de gravação. As duas escolhas só são válidas se posição absoluta e ruído de fundo forem irrelevantes para a tarefa posterior.
3. NT-Xent, símbolo por símbolo
Normalizamos $z_i$ e medimos similaridade de cosseno:
\[s_{ij}= \frac{z_i^\top z_j}{\lVert z_i\rVert_2\lVert z_j\rVert_2}.\]Para uma âncora $i$, seu positivo $j$ e uma temperatura $\tau>0$ que controla a concentração da distribuição, usaremos $\mathbf 1_{[k\ne i]}$ como indicador: ele vale $1$ para candidatos diferentes da própria âncora e $0$ para a diagonal. A perda é
\[\ell_{i,j} =-\log \frac{\exp(s_{ij}/\tau)} {\sum_{k=0}^{2B-1}\mathbf{1}_{[k\ne i]}\exp(s_{ik}/\tau)},\]na qual $\tau>0$ é a temperatura. O denominador contém um positivo e $2B-2$ negativos. A perda final mede as duas direções de cada par.
Essa é a NT-Xent, de normalized temperature-scaled cross entropy (entropia cruzada normalizada e escalada por temperatura), uma forma de InfoNCE. A derivação de InfoNCE aplicada a texto e o laboratório de geometria vivem em Do Cosseno à Borda. Aqui a proprietária é a tarefa visual: aumentos, duas views e custo do lote.
3.1 NT-Xent como classificação
Fixe a âncora $i$. Para cada candidato $k\ne i$, defina o logit
\[a_{ik}=\frac{s_{ik}}{\tau}.\]A softmax transforma esses logits em uma distribuição categórica sobre os $2B-1$ candidatos:
\[p_i(k) =\frac{e^{a_{ik}}} {\sum_{r\ne i}e^{a_{ir}}}.\]O rótulo fabricado pela tarefa é $\pi(i)$. A entropia cruzada com um alvo one-hot vale
\[-\sum_{k\ne i} \mathbf{1}_{[k=\pi(i)]}\log p_i(k) =-\log p_i(\pi(i)),\]que é exatamente $\ell_{i,\pi(i)}$. O contraste não é uma força mística entre vetores; é uma classificação em que a resposta correta é “qual candidato veio da mesma imagem?”.
Para estabilidade numérica, escolhemos $m_i=\max_{k\ne i}a_{ik}$ e calculamos
\[\log\sum_{k\ne i}e^{a_{ik}} =m_i+\log\sum_{k\ne i}e^{a_{ik}-m_i}.\]Subtrair o máximo não muda as probabilidades, pois multiplica numerador e denominador pelo mesmo $e^{-m_i}$. Evita, porém, que exponenciais grandes excedam a faixa do tipo numérico.
Sob a construção específica da InfoNCE, sejam $X$ e $Y$ as variáveis pareadas e $N$ o número de candidatos formado por um positivo da distribuição conjunta e negativos amostrados do produto das marginais. Obtém-se o limite
\[I(X;Y)\ge \log N-\mathcal{L}_{\mathrm{InfoNCE}},\]na qual $N$ é o número de candidatos. A condição de amostragem importa. No SimCLR, aumentos, dependências do lote e falsos negativos tornam imprudente interpretar cada valor de NT-Xent como medidor exato de informação mútua. O limite explica a origem probabilística; alinhamento e uniformidade explicam melhor parte da geometria prática.
3.2 Exercícios de lápis e papel
1. Para logits $(2,1,0)$ e positivo no primeiro índice, calcule a probabilidade positiva e a entropia cruzada.
Solução: A probabilidade positiva é
\[p_+ =\frac{e^2}{e^2+e+1} \approx0{,}665241.\]A entropia cruzada com alvo no primeiro índice vale
\[-\log p_+ \approx0{,}407606.\]2. Subtraia $2$ de todos os logits do exercício anterior e confirme que as probabilidades não mudam.
Solução: Os novos logits são $(0,-1,-2)$. A probabilidade do primeiro índice é
\[\frac{1}{1+e^{-1}+e^{-2}}.\]Multiplicando numerador e denominador por $e^2$, recuperamos
\[\frac{e^2}{e^2+e+1}.\]O mesmo fator comum cancela para as outras coordenadas, portanto toda a distribuição permanece igual.
3. Com $B=2$, escreva explicitamente o denominador da âncora $0$ quando seu positivo é $1$.
Solução: Há quatro views, com índices de $0$ a $3$. Excluindo a própria âncora, o denominador é
\[\exp(s_{01}/\tau) +\exp(s_{02}/\tau) +\exp(s_{03}/\tau).\]O primeiro termo corresponde ao positivo; os outros dois, aos negativos.
4. Se $N=8$ e $\mathcal{L}_{\mathrm{InfoNCE}}=1$, calcule o limite inferior $\log N-\mathcal{L}$ em nats.
Solução: Usando logaritmo natural,
\[I(X;Y) \ge\log8-1 \approx2{,}079442-1 =1{,}079442\ \text{nats}.\]5. Explique por que excluir a diagonal $s_{ii}$ é necessário: qual candidato trivial venceria se ela permanecesse?
Solução: Para representações normalizadas, a auto-similaridade é $s_{ii}=1$, o maior valor possível do cosseno. Se a própria âncora permanecesse entre as candidatas, ela poderia vencer a classificação apenas por ser uma cópia idêntica, em vez de obrigar o modelo a reconhecer a outra view da mesma imagem.
4. Temperatura transforma margem em pressão
Considere similaridade positiva $s_+=0{,}7$, negativos com $s_-=0{,}2$, lote $B=64$ e $\tau=0{,}1$. A razão entre a exponencial positiva e cada negativa é
\[\exp\left(\frac{s_+-s_-}{\tau}\right)=e^5\approx148.\]Parece confortável, mas existem $2B-2=126$ negativos. Sob a simplificação de que todos possuem o mesmo $s_-$, a probabilidade do positivo é
\[p_+=\frac{e^{s_+/\tau}} {e^{s_+/\tau}+126e^{s_-/\tau}} \approx0{,}54,\]e a perda permanece perto de $0{,}62$. Um único negativo é fraco; uma multidão soma.
Temperatura baixa concentra gradiente nos negativos difíceis. Baixá-la demais pode tornar a otimização sensível a pequenas diferenças e falsos negativos.
4.1 A temperatura aparece no gradiente
Escrevendo $\ell_i=\ell_{i,\pi(i)}$ para a perda da âncora $i$ e $p_i(k)$ para a softmax da Seção 3.1, a derivada em relação à similaridade de um candidato é
\[\frac{\partial\ell_i}{\partial s_{ik}} =\frac{p_i(k)-\mathbf{1}_{[k=\pi(i)]}}{\tau}.\]Para o positivo,
\[\frac{\partial\ell_i}{\partial s_{i\pi(i)}} =\frac{p_+-1}{\tau}<0,\]de modo que a descida do gradiente aumenta sua similaridade. Para cada negativo $k$,
\[\frac{\partial\ell_i}{\partial s_{ik}} =\frac{p_i(k)}{\tau}>0,\]e a descida a reduz. Um negativo difícil recebe probabilidade maior e, por isso, gradiente maior. A temperatura atua duas vezes: altera as probabilidades por meio da softmax e multiplica diretamente a magnitude por $1/\tau$.
Vamos voltar ao exemplo da Seção 4. Se $p_+\approx0{,}54$ e $\tau=0{,}1$, a derivada positiva é aproximadamente $-4{,}6$. Cada um dos 126 negativos idênticos tem probabilidade $(1-0{,}54)/126\approx0{,}00365$ e derivada $0{,}0365$. Individualmente são pequenos; somados, equilibram a força positiva. A conservação do gradiente da softmax, $\sum_{k\ne i}\partial\ell_i/\partial s_{ik}=0$, torna essa conta inevitável.
4.2 Exercícios de lápis e papel
1. Para $p_+=0{,}8$ e $\tau=0{,}2$, calcule a derivada em relação à similaridade positiva.
Solução: Para o positivo,
\[\frac{\partial\ell}{\partial s_+} =\frac{p_+-1}{\tau} =\frac{0{,}8-1}{0{,}2} =-1.\]2. Para um negativo com probabilidade $0{,}1$ e a mesma temperatura, calcule a derivada correspondente.
Solução: Para o negativo,
\[\frac{\partial\ell}{\partial s_-} =\frac{p_-}{\tau} =\frac{0{,}1}{0{,}2} =0{,}5.\]3. Repita os dois exercícios com $\tau=0{,}1$ mantendo as probabilidades fixas e compare as magnitudes.
Solução: Mantendo $p_+=0{,}8$ e $p_-=0{,}1$,
\[\frac{p_+-1}{0{,}1}=-2\]e
\[\frac{p_-}{0{,}1}=1.\]As magnitudes dobram em relação às obtidas com $\tau=0{,}2$, pois o fator direto $1/\tau$ dobrou.
4. Com um positivo de probabilidade $0{,}6$ e quatro negativos idênticos, calcule a probabilidade e a derivada de cada negativo para $\tau=0{,}2$.
Solução: A massa total dos negativos é $1-0{,}6=0{,}4$. Dividida igualmente,
\[p_- =\frac{0{,}4}{4}=0{,}1.\]Cada derivada negativa vale
\[\frac{p_-}{\tau} =\frac{0{,}1}{0{,}2} =0{,}5.\]5. Verifique no exercício anterior que a soma das cinco derivadas é zero.
Solução: A derivada positiva é
\[\frac{0{,}6-1}{0{,}2}=-2.\]As quatro derivadas negativas somam $4\cdot0{,}5=2$. Portanto,
\[-2+2=0.\]5. O custo quadrático
Empilhe as $2B$ representações como linhas de $Z\in\mathbb{R}^{2B\times D}$, em que $D$ é o número de coordenadas de cada representação. Elas formam a matriz de similaridades
\[S=ZZ^\top\in\mathbb{R}^{2B\times2B}.\]Ela contém $4B^2$ entradas. Com $B=4096$, são $8192^2=67\,108\,864$ similaridades. Em FP32, somente essa matriz ocupa cerca de $256$ MiB, antes de gradientes, ativações e comunicação entre dispositivos.
A GEMM custa aproximadamente
\[2(2B)^2D=8B^2D\]FLOPs para representações de dimensão $D$. Distribuir o lote exige reunir negativos entre GPUs ou usar mecanismos alternativos, como fila e momentum encoder no MoCo. O SimCLR simplifica a arquitetura, mas paga em lote e duração de treino.
5.1 Contagem exata e alternativas de memória
A matriz $S$ possui $(2B)^2=4B^2$ entradas, mas a diagonal contém $2B$ auto-similaridades excluídas da perda. Restam
\[4B^2-2B=2B(2B-1)\]logits válidos. Entre eles, $2B$ são positivos direcionais e $2B(2B-2)$ são negativos direcionais. Uma mesma similaridade $s_{ij}=s_{ji}$ pode aparecer nas duas direções da perda, mas cada âncora possui seu próprio denominador.
Materializar $S$ custa $4B^2s$ bytes para um tipo de $s$ bytes. Para $B=4096$ e FP16, são $128$ MiB; em FP32, $256$ MiB. O cálculo pode ser feito em blocos sem guardar a matriz inteira, mantendo acumuladores de log-sum-exp por linha. Isso reduz a memória intermediária, mas não apaga o trabalho $O(B^2D)$ nem a necessidade de acessar todas as comparações.
Em treinamento distribuído, se cada uma de $G$ GPUs possui lote local $b$, o lote global é $B=Gb$. Reunir as representações por all-gather oferece negativos globais, mas comunica aproximadamente $2BD$ elementos por passo, além do custo do gradiente. A fila do MoCo troca a dependência do lote atual por um dicionário persistente e um encoder de momento; muda a engenharia e a idade dos negativos, não a necessidade de diversidade.
5.2 Exercícios de lápis e papel
1. Para $B=4$, conte entradas totais, logits válidos, positivos direcionais e negativos direcionais.
Solução: Há $2B=8$ views. A matriz contém
\[(2B)^2=8^2=64\]entradas. Excluindo as oito entradas da diagonal, restam
\[64-8=56\]logits válidos. Existem $2B=8$ positivos direcionais e
\[2B(2B-2)=8\cdot6=48\]negativos direcionais.
2. Calcule a memória de $S$ para $B=1024$ em FP32.
Solução: A matriz possui lado $2B=2048$ e
\[2048^2=4\,194\,304\]entradas. Em FP32,
\[4\,194\,304\cdot4=16\,777\,216\ \text{bytes}=16\ \text{MiB}.\]3. Para $G=8$, $b=256$ e $D=128$, calcule quantos elementos de representação formam o lote global com duas views.
Solução: O lote global possui
\[B=Gb=8\cdot256=2048\]imagens. Com duas views e $D=128$ coordenadas,
\[2BD=2\cdot2048\cdot128=524\,288\]elementos de representação.
4. Se esses elementos forem FP16, converta o resultado anterior em MiB.
Solução: Cada elemento FP16 ocupa dois bytes:
\[524\,288\cdot2=1\,048\,576\ \text{bytes}=1\ \text{MiB}.\]5. Explique por que calcular $S$ em blocos reduz memória de pico, mas não muda a ordem assintótica do número de produtos internos.
Solução: A blocagem materializa apenas um subconjunto das linhas ou colunas de $S$ por vez e conserva acumuladores de log-sum-exp, reduzindo o intermediário residente. Entretanto, cada uma das $2B$ representações ainda precisa ser comparada com todas as demais. Continuamos executando $O(B^2)$ produtos internos de dimensão $D$, portanto o trabalho permanece $O(B^2D)$.
6. Falsos negativos
O denominador presume que outras imagens são incompatíveis. Duas fotografias de cães diferentes podem compartilhar semântica útil e ainda serem afastadas. Esse é um falso negativo.
O problema não significa que a perda falha sempre. Em lotes grandes e dados diversos, a pressão global ainda pode organizar boas representações. Significa que a supervisão criada pelo lote contém erros estruturais e que aumentar $B$ oferece mais negativos e mais oportunidades de incluir parentes semânticos.
O contraste com negative sampling no SkipGram também merece precisão. Ambos amostram eventos negativos, mas os objetos, distribuições e objetivos são diferentes. No SimCLR, as outras views do lote entram em uma classificação contrastiva por âncora.
6.1 Alinhamento, uniformidade e probabilidade de colisão
Wang e Isola mostraram que perdas contrastivas sobre a hiperesfera podem ser entendidas por duas propriedades. Se $p_{\mathrm{pos}}$ é a distribuição dos pares positivos, o alinhamento mede sua proximidade, por exemplo
\[\mathcal{L}_{\mathrm{align}} =\mathbb{E}_{(x,y)\sim p_{\mathrm{pos}}} \lVert f(x)-f(y)\rVert_2^2.\]Se $p_{\mathrm{data}}$ é a distribuição dos dados, a uniformidade penaliza concentrações globais na esfera:
\[\mathcal{L}_{\mathrm{uniform}} =\log \mathbb{E}_{x,y\sim p_{\mathrm{data}}} \exp\!\left(-2\lVert f(x)-f(y)\rVert_2^2\right).\]Somente alinhamento aceita colapso: se $f(x)=c$ para todo $x$, a distância positiva é zero. A pressão dos negativos favorece espalhamento e impede que a mesma constante vença. O preço é tratar como incompatíveis pares que podem compartilhar semântica.
Podemos quantificar uma versão simples do falso negativo. Suponha $C$ classes, com probabilidades $p_1,\ldots,p_C$, e amostragem independente. A probabilidade de duas imagens aleatórias pertencerem à mesma classe é
\[P_{\mathrm{mesma}}=\sum_{c=1}^{C}p_c^2.\]Com dez classes balanceadas, o valor é $10(0{,}1)^2=0{,}1$. Se uma âncora encontra $M$ negativos independentes, o número esperado de negativos da mesma classe é $M\sum_c p_c^2$. Para $M=126$, são $12{,}6$. “Negativo” descreve a construção da perda, não certifica diferença semântica.
6.2 Exercícios de lápis e papel
1. Mostre que uma representação constante zera $\mathcal{L}_{\mathrm{align}}$.
Solução: Se $f(x)=c$ para toda entrada, então qualquer par positivo satisfaz
\[\lVert f(x)-f(y)\rVert_2^2 =\lVert c-c\rVert_2^2 =0.\]Como todas as parcelas da esperança são zero, $\mathcal{L}_{\mathrm{align}}=0$.
2. Para quatro classes balanceadas, calcule $P_{\mathrm{mesma}}$.
Solução: Cada classe possui probabilidade $1/4$. Logo,
\[P_{\mathrm{mesma}} =4\left(\frac14\right)^2 =\frac14 =0{,}25.\]3. Com $30$ negativos e o valor anterior, calcule o número esperado de falsos negativos de classe.
Solução: O número esperado é
\[30\cdot0{,}25=7{,}5.\]Esse valor é uma média sobre muitos lotes; um lote individual contém uma contagem inteira.
4. Para probabilidades de classe $(1/2,1/4,1/4)$, calcule $P_{\mathrm{mesma}}$ e compare com três classes balanceadas.
Solução: Na distribuição desigual,
\[P_{\mathrm{mesma}} =\left(\frac12\right)^2 +\left(\frac14\right)^2 +\left(\frac14\right)^2 =\frac38 =0{,}375.\]Com três classes balanceadas,
\[P_{\mathrm{mesma}}=3\left(\frac13\right)^2=\frac13\approx0{,}333.\]O desequilíbrio aumentou a probabilidade de colisão semântica.
5. Explique por que maior desequilíbrio de classes tende a aumentar $\sum_c p_c^2$.
Solução: Elevar ao quadrado dá peso desproporcional às classes mais frequentes. Transferir massa de uma classe menor para uma maior aumenta mais o quadrado da maior do que reduz o da menor. Assim, para um número fixo de classes, a soma é mínima na distribuição uniforme e cresce quando a massa se concentra.
7. NT-Xent em C++23
O programa calcula a perda de uma âncora. Os vetores já estão normalizados; por isso, o produto interno é o cosseno.
#include <algorithm>
#include <array>
#include <cmath>
#include <cstddef>
#include <iostream>
#include <span>
#include <stdexcept>
#include <vector>
double dot(
const std::span<const double> a,
const std::span<const double> b) {
if (a.size() != b.size()) {
throw std::invalid_argument("dimensões incompatíveis");
}
double result = 0.0;
for (std::size_t d = 0; d < a.size(); ++d) {
result += a[d] * b[d];
}
return result;
}
double ntxent_anchor(
const std::span<const std::array<double, 2>> embeddings,
const std::size_t anchor,
const std::size_t positive,
const double temperature) {
if (embeddings.size() < 2 || anchor >= embeddings.size()
|| positive >= embeddings.size() || anchor == positive
|| temperature <= 0.0) {
throw std::invalid_argument("par contrastivo inválido");
}
std::vector<double> logits(embeddings.size());
for (std::size_t i = 0; i < embeddings.size(); ++i) {
logits[i] = i == anchor
? -1e30
: dot(embeddings[anchor], embeddings[i]) / temperature;
}
const double maximum =
*std::max_element(logits.begin(), logits.end());
double denominator = 0.0;
for (const double logit : logits) {
denominator += std::exp(logit - maximum);
}
return -(logits[positive] - maximum - std::log(denominator));
}
int main() {
const std::array<std::array<double, 2>, 4> z{{
{1.0, 0.0}, {0.8, 0.6}, {-1.0, 0.0}, {-0.8, -0.6}
}};
const double forward = ntxent_anchor(z, 0, 1, 0.1);
const double reverse = ntxent_anchor(z, 1, 0, 0.1);
std::cout << "perda simétrica do primeiro par="
<< 0.5 * (forward + reverse) << '\n';
}
Em produção, normalizamos uma matriz inteira, calculamos $ZZ^\top$ por GEMM e aplicamos uma entropia cruzada com os índices dos positivos. O código escalar serve para verificar o índice excluído e a simetria, dois lugares onde implementações erradas continuam produzindo perdas que diminuem com grande serenidade.
No MSVC 19.51, compilamos com cl /std:c++latest /permissive- /W4 /EHsc /utf-8 /O2 simclr.cpp. A saída é aproximadamente 1.27765e-07. Ela é tão pequena porque o positivo possui cosseno $0{,}8$, enquanto os dois negativos possuem $-1$ e $-0{,}8$; com $\tau=0{,}1$, a separação é enorme. O exemplo verifica a função. A Seção 4, com 126 negativos moderados, mostra por que um lote real raramente oferece esse sossego.
7.1 Exercícios de rastreamento manual
1. Calcule os quatro produtos internos entre a âncora $(1,0)$ e os vetores do programa.
Solução: Os produtos são
\[(1,0)\cdot(1,0)=1,\] \[(1,0)\cdot(0{,}8,0{,}6)=0{,}8,\] \[(1,0)\cdot(-1,0)=-1\]e
\[(1,0)\cdot(-0{,}8,-0{,}6)=-0{,}8.\]2. Divida as três similaridades válidas por $\tau=0{,}1$ e identifique o maior logit.
Solução: Excluindo a auto-similaridade, os logits são
\[\frac{0{,}8}{0{,}1}=8, \qquad \frac{-1}{0{,}1}=-10, \qquad \frac{-0{,}8}{0{,}1}=-8.\]O maior é $8$, correspondente ao positivo de índice $1$.
3. Explique por que o valor -1e30 exclui a diagonal depois da exponenciação estabilizada.
Solução: O máximo entre os candidatos válidos é finito, como $8$ no exemplo. A contribuição da diagonal torna-se
\[\exp(-10^{30}-8),\]que sofre underflow para zero em ponto flutuante. Ela não acrescenta massa ao denominador e fica numericamente excluída.
4. Troque mentalmente positive=1 por positive=2 na primeira chamada e determine se a perda aumenta ou diminui.
Solução: O positivo original possui logit $8$ e domina o denominador. O índice $2$ possui logit $-10$. Marcá-lo como positivo transforma uma candidata de probabilidade quase nula na resposta correta, portanto $-\log p_+$ aumenta drasticamente.
5. Mostre que a média de forward e reverse implementa somente o primeiro par; quantas chamadas seriam necessárias para a perda simétrica completa das quatro views?
Solução: forward usa a âncora $0$ com positivo $1$, e reverse usa a âncora $1$ com positivo $0$. Logo, apenas o par $(0,1)$ aparece nas duas direções. Para a perda completa, também precisamos das chamadas $2\to3$ e $3\to2$. São quatro chamadas no total, uma para cada view como âncora.
8. Laboratório: a multidão no denominador
Altere lote, temperatura e similaridades. A barra verde é a probabilidade do positivo; a vermelha agrega todos os negativos. Observe que aumentar $B$ pode elevar a perda sem mudar a geometria de nenhum par.
9. O que fica quando retiramos os negativos
SimCLR mostra que uma tarefa de comparação simples, aumentos fortes e um cabeçalho não linear aprendem representações competitivas. Também deixa duas contas: $O(B^2)$ em similaridades e uma dependência forte da transformação que define o positivo.
O próximo artigo retirará os negativos. O BYOL manterá duas views, mas colocará uma rede online diante de um alvo lento e pedirá que um preditor case suas representações. A perda ficará simples; o problema do colapso, não.
Os negativos impedem que todos ocupem o mesmo ponto. Retirá-los exige outra razão para o espaço permanecer aberto.
Acrônimos e Abreviações neste artigo
A seguir está a lista de todos os acrônimos e abreviações identificados no texto, organizados em ordem alfabética com o termo original em inglês e a tradução para o português:
| Acrônimo / Abreviação | Definição em Inglês | Tradução em Português |
|---|---|---|
BLAS |
Basic Linear Algebra Subprograms | Subprogramas Básicos de Álgebra Linear |
CPU / CPUs |
Central Processing Unit | Unidade Central de Processamento |
FLOPs |
Floating Point Operations | Operações de Ponto Flutuante |
FP32 |
32-bit Floating Point | Ponto Flutuante de 32 bits |
GEMM |
General Matrix Multiply | Multiplicação Geral de Matrizes |
GPU |
Graphics Processing Unit | Unidade de Processamento Gráfico |
IA |
Artificial Intelligence | Inteligência Artificial |
I-JEPA |
Image Joint-Embedding Predictive Architecture | Arquitetura Preditiva de Incorporação Conjunta de Imagem |
JEPA |
Joint-Embedding Predictive Architecture | Arquitetura Preditiva de Incorporação Conjunta |
KiB |
Kibibyte | Kibibyte |
MAE |
Masked Autoencoder | Autocodificador Mascarado |
MSE |
Mean Squared Error | Erro Quadrático Médio |
MSVC |
Microsoft Visual C++ | Microsoft Visual C++ |
PCA |
Principal Component Analysis | Análise de Componentes Principais |
SIMD |
Single Instruction, Multiple Data | Instrução Única, Múltiplos Dados |
SimCLR |
Simple Framework for Contrastive Learning of Visual Representations | Estrutura Simples para Aprendizado Contrastivo de Representações Visuais |
Referências
CHEN, T.; KORNBLITH, S.; NOROUZI, M.; HINTON, G. A Simple Framework for Contrastive Learning of Visual Representations. ICML, 2020. Disponível em: https://proceedings.mlr.press/v119/chen20j.html. Acesso em: 28 jul. 2026.
HADSELL, R.; CHOPRA, S.; LECUN, Y. Dimensionality Reduction by Learning an Invariant Mapping. Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition, v. 2, p. 1735-1742, 2006. Disponível em: https://doi.org/10.1109/CVPR.2006.100. Acesso em: 29 jul. 2026.
HE, K.; FAN, H.; WU, Y.; XIE, S.; GIRSHICK, R. Momentum Contrast for Unsupervised Visual Representation Learning. CVPR, 2020. Disponível em: https://openaccess.thecvf.com/content_CVPR_2020/html/He_Momentum_Contrast_for_Unsupervised_Visual_Representation_Learning_CVPR_2020_paper.html. Acesso em: 28 jul. 2026.
OORD, A. van den; LI, Y.; VINYALS, O. Representation Learning with Contrastive Predictive Coding. 2018. Disponível em: https://arxiv.org/abs/1807.03748. Acesso em: 28 jul. 2026.
WANG, T.; ISOLA, P. Understanding Contrastive Representation Learning through Alignment and Uniformity on the Hypersphere. Proceedings of the 37th International Conference on Machine Learning, p. 9929-9939, 2020. Disponível em: https://proceedings.mlr.press/v119/wang20k.html. Acesso em: 29 jul. 2026.
Índice da Série: Representações e Modelos de Mundo
- 1. Representações e Modelos de Mundo: o Mapa da Série
- 2. Autoencoders: o Gargalo, a Reconstrução e o Latente
- 4. Difusão Latente: Comprimir Antes de Gerar
- 5. SimCLR: Aprender por Contraste e Pagar pelos Negativos (Você está aqui)
- 6. BYOL: Aprender sem Negativos sem Entregar Tudo ao Colapso
- 7. DINO: Autodestilação e Objetos que Emergem da Atenção
- 8. MAE: Mascarar 75% da Imagem e Reconstruir o que Falta
- 9. Prever, não gerar: o template JEPA e o problema do colapso
(Updated: )