SimCLR: Aprender por Contraste e Pagar pelos Negativos

por Frank de Alcantara em 28/07/2026

SimCLR: Aprender por Contraste e Pagar pelos Negativos

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.

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.

Seis views agrupadas em três pares positivos e a matriz de similaridades com diagonal excluída, positivos simétricos e negativos restantes

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.

(Updated: )