Mineração de Negativos Difíceis
Visão geral
Mineração de negativos difíceis (hard negative mining, HNM) é uma técnica de treinamento usada em aprendizado métrico (metric learning) e objetivos contrastivos (contrastive objectives) para tornar os vetores de embedding (embeddings) mais discriminativos. Em vez de treinar igualmente com todos os exemplos “negativos” (exemplos que não deveriam corresponder à âncora), a HNM seleciona os negativos mais confusos — tipicamente aqueles que estão mais próximos da âncora no espaço de embeddings — e concentra o aprendizado neles.
Isso é importante porque, na maioria dos conjuntos de dados reais, a maioria dos negativos é trivial: já estão muito distantes, contribuem com perda quase zero e fornecem pouco sinal de gradiente. Negativos difíceis, por outro lado, revelam onde o modelo falha (ou está incerto), o que pode acelerar a convergência e melhorar a qualidade final de recuperação/verificação.
A mineração de negativos difíceis aparece com frequência em:
- Modelos siameses / de duas torres usados para busca e recomendação
- Configurações de perda tripla (triplet loss) para verificação e recuperação
- Métodos modernos de aprendizado contrastivo (contrastive learning) com negativos no lote (in-batch negatives) (por exemplo, perdas no estilo InfoNCE)
Conceitos relacionados que vale a pena conhecer incluem Aprendizado Contrastivo, Perda Tripla, Redes Siamesas e Espaço Latente.
Por que negativos difíceis ajudam (intuição e teoria)
Objetivos do aprendizado métrico
No aprendizado de representações (representation learning), frequentemente aprendemos uma função de embedding ( f(x) \in \mathbb{R}^d ) tal que:
- Itens semelhantes (mesma identidade/classe/significado semântico) tenham alta similaridade (ou pequena distância)
- Itens diferentes tenham baixa similaridade (ou grande distância)
Isso é central em tarefas de recuperação: os vizinhos mais próximos no espaço de embeddings devem corresponder a correspondências verdadeiras.
O problema dos “negativos fáceis”
Considere um objetivo baseado em margem (margin): você quer que a âncora (a) esteja mais próxima do seu positivo (p) do que de qualquer negativo (n) por pelo menos uma margem (m):
[ d(a,p) + m < d(a,n) ]
Se um negativo já satisfaz isso com ampla folga, sua contribuição para a perda é ~0, o que significa:
- Sem gradiente (ou gradiente minúsculo)
- O treinamento desperdiça computação em exemplos que não mudam o modelo
Negativos difíceis ficam próximos da fronteira de decisão (decision boundary); eles se comportam como “vetores de suporte (support vectors)” no raciocínio ao estilo máquina de vetores de suporte (support vector machine, SVM): são os pontos que definem a fronteira.
Visão contrastiva: melhor sinal de gradiente
Em perdas do tipo InfoNCE (comuns em Aprendizado Contrastivo), um par âncora-positivo compete contra muitos negativos em uma softmax. Negativos com maior similaridade com a âncora dominam o denominador, gerando gradientes maiores. A mineração de negativos difíceis aumenta explicitamente a probabilidade de amostrar tais negativos influentes, o que frequentemente melhora a eficiência amostral.
Definições centrais
Âncora, positivo, negativo
- Âncora (a): exemplo de referência
- Positivo (p): deve corresponder à âncora (mesma classe/identidade, texto-legenda alinhados, mesmo produto etc.)
- Negativo (n): não deve corresponder à âncora
Negativos difíceis, semi-difíceis e fáceis
Suponha que usamos distância (d(\cdot,\cdot)) (menor é mais semelhante), ou similaridade (s(\cdot,\cdot)) (maior é mais semelhante).
- Negativo fácil: claramente distante da âncora
( d(a,n) \gg d(a,p) ) (ou ( s(a,n) \ll s(a,p) )) - Negativo difícil: muito próximo da âncora — possivelmente mais próximo do que o positivo
( d(a,n) \le d(a,p) ) - Negativo semi-difícil: mais distante do que o positivo, mas ainda dentro da margem e, portanto, informativo
( d(a,p) < d(a,n) < d(a,p) + m )
Negativos semi-difíceis são populares porque são informativos sem serem maximamente adversariais.
Onde a mineração de negativos difíceis é usada
Perda tripla (caso clássico de uso)
Uma formulação comum:
[ \mathcal{L} = \max(0,\ d(a,p) - d(a,n) + m) ]
Se (d(a,n)) é enorme, a perda é 0. A mineração busca negativos com (d(a,n)) pequeno, idealmente aqueles que violam a margem.
Perdas contrastivas / InfoNCE
Uma variante comum de entropia cruzada normalizada escalonada por temperatura (NT-Xent, de normalized temperature-scaled cross entropy):
[ \mathcal{L}i = -\log \frac{\exp(s(a_i,p_i)/\tau)}{\exp(s(a_i,p_i)/\tau) + \sum{j \ne i}\exp(s(a_i, n_j)/\tau)} ]
Negativos difíceis são aqueles com (s(a_i,n_j)) grande. Muitos sistemas usam negativos no lote, e a mineração de negativos difíceis vira “escolher os top-k negativos mais similares no lote (ou no banco de memória).”
Perdas de ranqueamento em recuperação
Em sistemas de recuperação (por exemplo, busca de produtos), os negativos podem ser:
- Itens aleatórios que não correspondem (fáceis)
- Itens recuperados por um sistema baseline (mais difíceis)
- Itens recuperados pelo modelo atual (os mais difíceis, mas arriscados)
A HNM frequentemente é integrada em um loop iterativo “recuperar → treinar → recuperar”.
Variantes comuns de mineração de negativos difíceis
Mineração online vs. offline
Mineração online de negativos difíceis (online hard negative mining, OHNM)
Negativos são minerados durante o treinamento, tipicamente dentro do minilote atual (ou de um buffer de memória). Padrão:
- Passagem direta (forward pass) → computar embeddings
- Computar similaridades/distâncias par a par
- Selecionar negativos difíceis/semi-difíceis
- Computar a perda nos pares/triplas selecionados
- Retropropagar (Retropropagação)
Prós:
- Sempre usa o estado atual do modelo
- Não precisa de um pipeline extra de mineração
Contras:
- Limitado ao lote (a menos que use métodos com memória/entre lotes)
- Pode ser instável se você sempre escolher os negativos mais difíceis
Mineração offline de negativos difíceis
Negativos são minerados periodicamente usando um snapshot do modelo:
- Rodar o modelo sobre um corpus para construir um índice de embeddings
- Recuperar os vizinhos mais próximos para cada âncora
- Armazenar negativos difíceis
- Treinar com esses negativos minerados por uma época (ou várias)
- Repetir
Prós:
- Pode minerar a partir do conjunto de dados inteiro (não apenas de um lote)
- Frequentemente produz negativos mais fortes, especialmente em recuperação em escala
Contras:
- Exige infraestrutura extra (indexação, recuperação)
- Os negativos podem ficar defasados conforme o modelo muda
Mineração de negativos semi-difíceis
Em vez de escolher o negativo absolutamente mais próximo, escolha negativos que:
- Ainda estejam mais distantes do que o positivo (para que não sejam “impossíveis”)
- Violem a margem (para que contribuam com perda não nula)
Isso frequentemente melhora a estabilidade do treinamento e reduz colapso no início do treinamento.
Top-k e amostragem ponderada pela distância
Em vez de sempre pegar o único negativo mais difícil, muitas implementações:
- Pegam os top-k negativos mais difíceis (mais robusto do que top-1)
- Amostram negativos com probabilidade enviesada em direção à dificuldade, por exemplo, amostragem ponderada pela distância (distance-weighted sampling), que evita dar ênfase excessiva a outliers e quase-duplicatas ruidosas
Memória entre lotes / bancos de memória
Tamanhos de lote podem limitar a diversidade de negativos. Uma correção comum é manter uma fila/banco de memória (queue/memory bank) de embeddings de lotes recentes (popular em aprendizado auto-supervisionado), permitindo mineração em um conjunto muito maior de candidatos.
No treinamento distribuído, outro truque comum é fazer all-gather (all-gather) de embeddings entre GPUs para aumentar o lote efetivo para negativos no lote.
Padrões de implementação
Configuração siamesa / de duas torres (pareada)
Um modelo de duas torres codifica consultas e itens separadamente (mas muitas vezes com arquitetura compartilhada). O treinamento usa pares positivos ((q, i^+)) e pares negativos ((q, i^-)).
Escolhas de mineração de negativos difíceis:
- Negativos no lote: tratar outros itens no lote como negativos para uma consulta
- Negativos difíceis no lote: restringir a perda aos negativos mais similares
- Negativos recuperados: para cada consulta, recuperar os principais candidatos de um índice; filtrar correspondências verdadeiras; usar o restante como negativos difíceis
Isso é comum em busca semântica e recomendação.
Construção de triplas em um minilote (perda tripla lote-difícil)
Uma estratégia popular (frequentemente chamada de lote-difícil (batch-hard)) para dados rotulados:
- Amostrar um lote contendo (P) classes e (K) exemplos por classe
- Para cada âncora:
- positivo = positivo mais distante dentro de sua classe (positivo difícil (hard positive))
- negativo = negativo mais próximo de outras classes (negativo difícil (hard negative))
Isso fornece um sinal de treinamento forte sem um pipeline externo de mineração.
Exemplo prático ao estilo PyTorch: mineração de negativos difíceis no lote (InfoNCE)
Abaixo está um padrão simplificado para embeddings com um positivo por âncora (por exemplo, visões aumentadas, pares consulta-documento). Ele seleciona os top-k negativos mais difíceis por âncora a partir do lote.
import torch
import torch.nn.functional as F
def hard_inbatch_infonce(z_a, z_p, temperature=0.07, k=32):
"""
z_a: (B, d) anchor embeddings
z_p: (B, d) positive embeddings aligned by index
"""
B = z_a.size(0)
z_a = F.normalize(z_a, dim=1)
z_p = F.normalize(z_p, dim=1)
# Similarities between anchors and all positives in batch
sim = z_a @ z_p.T # (B, B)
# Positive logits are diagonal
pos = sim.diag() # (B,)
# Mask self (true positive) to get negatives
neg_sim = sim.masked_fill(torch.eye(B, device=sim.device).bool(), -1e9)
# Select top-k hardest negatives per anchor
k = min(k, B - 1)
hard_negs, _ = torch.topk(neg_sim, k=k, dim=1) # (B, k)
# Build logits: [pos | hard_negs]
logits = torch.cat([pos.unsqueeze(1), hard_negs], dim=1) / temperature
labels = torch.zeros(B, dtype=torch.long, device=logits.device) # positive is index 0
return F.cross_entropy(logits, labels)
Notas:
- Isso é mineração online dentro do lote.
- Usar apenas os negativos mais difíceis pode fazer o treinamento focar demais em ruído; misturar negativos aleatórios frequentemente ajuda (veja armadilhas).
Exemplo prático: mineração semi-difícil em triplas
A seleção semi-difícil exige verificar a relação de margem. Na prática, as pessoas frequentemente:
- computam uma matriz de distâncias
- para cada par âncora-positivo, escolhem um negativo com distância no intervalo semi-difícil, se disponível; caso contrário, recorrem a um mais difícil/mais fácil
Pseudológica:
- Encontrar negativos que satisfaçam: ( d(a,p) < d(a,n) < d(a,p)+m )
- Amostrar um (ou pegar o mais próximo dentro desse conjunto)
- Se nenhum existir, escolher o negativo mais próximo (difícil) ou pular
Esse desenho de “fallback” é importante para um treinamento estável.
Aplicações práticas
Reconhecimento facial e reidentificação de pessoas
Sistemas como FaceNet popularizaram a perda tripla com mineração semi-difícil. Em re-ID, a perda tripla lote-difícil é amplamente usada porque aproveita naturalmente rótulos de identidade e produz negativos difíceis dentro do lote.
Busca de produtos e recuperação semântica
Negativos difíceis frequentemente vêm de:
- cliques de usuários (impressões não clicadas são negativos “mais difíceis” do que aleatórios)
- resultados de recuperação lexical (BM25) que são semanticamente próximos, mas errados
- checkpoints anteriores do modelo (mineração iterativa)
Isso geralmente é mais eficaz do que negativos aleatórios porque treina o modelo em itens facilmente confundíveis.
Aprendizado contrastivo auto-supervisionado e fracamente supervisionado
No aprendizado auto-supervisionado, “negativos” tipicamente são outras amostras no lote/fila, o que cria risco de falso negativo (false negative) quando duas imagens diferentes na verdade são semanticamente relacionadas. A mineração de negativos difíceis pode amplificar esse risco ao focar nos itens mais similares (e, portanto, mais propensos a serem semanticamente relacionados).
Como resultado, muitos métodos modernos reduzem a dependência de negativos difíceis explícitos, ou usam estratégias para mitigar falsos negativos (veja abaixo).
Armadilhas típicas (e como mitigá-las)
1) Falsos negativos (o modo de falha mais comum)
Um falso negativo é rotulado ou tratado como negativo, mas na verdade é uma correspondência verdadeira (mesma classe/identidade/intenção semântica).
Por que piora com mineração de difíceis:
- Os negativos mais similares têm maior probabilidade de serem positivos ocultos (quase-duplicatas, mesma categoria, mesma pessoa, paráfrases)
Sintomas:
- A perda de treinamento pode diminuir, mas a qualidade de recuperação estagna ou piora
- Embeddings separam itens semanticamente similares desnecessariamente
Mitigações:
- Rotulagem / deduplicação melhores (especialmente para quase-duplicatas)
- Usar treinamento multi-positivo (multi-positive) quando possível (por exemplo, múltiplos documentos relevantes por consulta)
- Usar rótulos suaves (soft labels) / perdas contrastivas desenviesadas (debiased contrastive losses) em cenários com muitos positivos latentes
- Filtrar negativos minerados usando regras de metadados (mesma família de produto, mesmo cluster de identidade, mesma sessão)
2) Instabilidade de treinamento por negativos “difíceis demais”
Sempre escolher o negativo mais difícil no início do treinamento pode causar:
- explosão de gradientes
- colapso para mínimos locais ruins
- oscilação (o modelo “persegue” erros adversariais)
Mitigações:
- Preferir negativos semi-difíceis em vez dos mais difíceis
- Usar currículo (curriculum): começar com negativos aleatórios/fáceis → aumentar gradualmente a dificuldade
- Misturar negativos: por exemplo, 50% difíceis, 50% aleatórios
- Usar top-k em vez de top-1, ou amostrar proporcionalmente
3) Outliers e ruído de rótulo dominam a perda
Os negativos “mais difíceis” podem ser:
- dados rotulados incorretamente
- entradas corrompidas
- casos extremos raros que não deveriam dominar o aprendizado
Mitigações:
- Aplicar clipping de gradientes; usar perdas robustas
- Limitar dificuldade: ignorar negativos acima de um limiar de similaridade (suspeitamente próximos)
- Usar amostragem ponderada pela distância em vez de sempre pegar o mais difícil
4) Viés de amostragem e baixa cobertura
A mineração de difíceis superenfatiza regiões próximas à fronteira de decisão e pode reduzir a exposição à distribuição completa de negativos, prejudicando a generalização.
Mitigações:
- Combinar negativos minerados com negativos aleatórios
- Garantir que a composição do lote seja diversa
- Atualizar periodicamente os negativos minerados offline para evitar overfitting a um conjunto fixo
5) Negativos defasados em pipelines offline
Negativos minerados offline ficam desatualizados conforme o modelo melhora, tornando-se menos “difíceis” ao longo do tempo.
Mitigações:
- Reminerar regularmente (a cada N passos/épocas)
- Usar uma janela móvel de checkpoints
- Usar mineração híbrida online+offline
6) Sobrecarga de computação e memória
Mineração exige cálculos de similaridade:
- Similaridade no lote é (O(B^2))
- Filas/bancos de memória grandes adicionam computação extra
Mitigações:
- Manter a mineração dentro de pools de candidatos gerenciáveis (top-k sobre um subconjunto)
- Usar busca aproximada de vizinhos mais próximos (approximate nearest neighbor search) para mineração offline em escala
- Em configurações distribuídas, ponderar o benefício de all-gather vs. o custo de largura de banda
Decisões de projeto e boas práticas
Escolha a estratégia de mineração pela supervisão e pela tarefa
- Identidades de classificação totalmente supervisionada (faces, re-ID): triplas lote-difícil / semi-difíceis frequentemente funcionam bem.
- Recuperação de informação (information retrieval) (consulta-documento): mineração offline baseada em recuperação é muito eficaz; combine com negativos no lote.
- Auto-supervisionado: seja cauteloso com negativos difíceis devido a falsos negativos; confie mais em grandes negativos no lote, positivos multi-crop, ou métodos projetados para reduzir a dependência de negativos.
Monitore a distribuição de “dificuldade”
Uma técnica prática de depuração é registrar estatísticas como:
- Similaridade de positivos vs. negativos minerados
- Fração de negativos minerados que violam a margem
- Contribuição para a perda pelos top-k negativos
Se quase todos os negativos forem fáceis (perda≈0), a mineração pode estar fraca demais. Se a maioria for “impossível” (negativos mais próximos do que positivos), você pode ter falsos negativos ou mineração agressiva demais.
Ajuste margens e temperaturas em conjunto
A mineração de difíceis interage fortemente com:
- a margem da perda tripla (m)
- a temperatura contrastiva (\tau)
Negativos mais difíceis efetivamente aumentam a dificuldade, então você pode precisar de:
- uma margem um pouco menor no início
- uma temperatura mais alta (softmax menos “pontuda”) para estabilidade
Isso é uma aplicação de dinâmicas de treinamento semelhantes às discutidas no comportamento do Gradiente Descendente com gradientes ruidosos.
Um exemplo concreto de fluxo de trabalho (recuperação com mineração offline)
Suponha que você esteja treinando um modelo de busca de produtos.
- Aquecimento (warm start) com negativos aleatórios e negativos no lote para estabilidade.
- Construir um índice de embeddings para o catálogo usando o checkpoint atual do modelo.
- Para cada consulta:
- recuperar os top 200 candidatos
- remover positivos conhecidos (itens clicados/comprados)
- manter os top 5–20 como negativos difíceis
- Treinar por 1 época usando uma mistura:
- 1 positivo
- 5 negativos difíceis minerados
- 10 negativos aleatórios
- Reminerar a cada época ou a cada poucas épocas.
Isso normalmente produz um grande ganho versus apenas negativos aleatórios, porque o treinamento foca em confusões realistas que o sistema encontrará na inferência.
Resumo
A mineração de negativos difíceis é uma técnica poderosa para melhorar a discriminatividade de embeddings em aprendizado métrico e contrastivo, ao focar o treinamento nos negativos mais confusos. Na prática, os melhores resultados vêm de:
- Escolher um regime de mineração apropriado (online, offline, híbrido)
- Frequentemente preferir mineração semi-difícil ou top-k em vez de sempre o mais difícil
- Mitigar ativamente falsos negativos e instabilidade
- Misturar negativos minerados com negativos aleatórios para cobertura e robustez
Quando implementada com cuidado, a mineração de negativos difíceis pode melhorar significativamente sistemas reais de recuperação, verificação e aprendizado de representações, ao moldar o Espaço Latente para refletir melhor a noção de similaridade da tarefa.