Sistemas de Recomendação
O que são sistemas de recomendação?
Um sistema de recomendação (recommender system) é um sistema de aprendizado de máquina (machine learning, ML) que personaliza o que um usuário vê — produtos, vídeos, posts, notícias, vagas, ou até pessoas — ao prever com o que o usuário provavelmente vai se engajar, comprar ou avaliar bem. Diferentemente do aprendizado supervisionado (supervised learning) padrão, em que os rótulos (labels) são exemplos independentes, sistemas de recomendação aprendem a partir de um grafo de interações usuário–item (user–item interaction graph), em que o histórico de cada usuário molda previsões futuras.
Dois objetivos amplos aparecem na prática:
- Predição de avaliação (rating prediction) (estimar a avaliação de um usuário para um item)
- Recomendação Top‑K / ranqueamento (top‑K recommendation / ranking) (produzir uma lista ordenada de itens com os quais um usuário tem maior probabilidade de interagir)
Este artigo foca em filtragem colaborativa (collaborative filtering) e abordagens relacionadas: métodos que usam padrões entre muitos usuários para fazer previsões personalizadas.
Dados de interação e tipos de feedback
Sistemas de recomendação são movidos por dados de interação. Sinais comuns incluem:
Feedback explícito (explicit feedback)
Usuários expressam preferência diretamente.
- Avaliações por estrelas (1–5)
- Curtidas/não curtidas (joinha para cima/para baixo)
- Marcações de “Não tenho interesse”
Prós: sinal de preferência claro.
Contras: esparso (poucos usuários avaliam muitos itens), enviesado para usuários mais motivados.
Feedback implícito (implicit feedback)
A preferência é inferida a partir do comportamento.
- Cliques, visualizações, tempo de exibição, profundidade de rolagem
- Compras, adição ao carrinho, salvamentos
- Pulos, pouco tempo de permanência, “bounce”
Prós: abundante.
Contras: ambíguo — não interagir com um item não significa necessariamente que o usuário não gosta (pode simplesmente não tê-lo visto).
Em cenários implícitos, normalmente você modela eventos positivos e trata eventos ausentes como “desconhecidos”, em vez de negativos, usando técnicas como amostragem negativa (negative sampling).
Contexto e restrições
Sistemas modernos frequentemente incorporam:
- Contexto: horário, localização, dispositivo, sazonalidade
- Restrições de negócio: estoque, preço, elegibilidade, frescor
- Restrições de política: controle parental, restrições legais
Isso geralmente entra como atributos (features), filtros ou etapas de re-ranqueamento.
Formulação do problema
Seja (U) o conjunto de usuários e (I) o conjunto de itens. A matriz de interação (R \in \mathbb{R}^{|U|\times|I|}) geralmente é esparsa.
- Explícito: (R_{ui}) é uma avaliação (por exemplo, 1–5)
- Implícito: (R_{ui}\in{0,1}) indica um evento, ou uma contagem / confiança (por exemplo, reproduções)
Modelos de recomendação estimam uma pontuação ( \hat{s}(u,i) ) para que itens possam ser ranqueados por pontuação para um usuário: [ \text{recommend}(u) = \operatorname{TopK}_{i \in I \setminus \text{seen}(u)} \hat{s}(u,i) ]
Desafio-chave: dados ausentes não ao acaso (missing-not-at-random). Usuários só interagem com itens aos quais foram expostos, então o conjunto de dados reflete tanto preferências quanto viés de exposição/posição.
Filtragem colaborativa (FC)
Filtragem colaborativa usa similaridades e padrões entre usuários e itens. A intuição central:
Se dois usuários se comportaram de forma semelhante no passado, eles podem gostar de itens semelhantes no futuro.
Se dois itens são frequentemente consumidos pelos mesmos usuários, eles podem ser substituíveis ou relacionados.
Métodos de filtragem colaborativa vêm em duas grandes famílias:
- FC baseada em memória (vizinhança) (memory-based (neighborhood) CF): calcula similaridade entre usuários ou itens diretamente
- FC baseada em modelo (model-based CF): aprende representações latentes (latent representations) (incorporações) ou modelos preditivos a partir das interações
FC baseada em memória (usuário–usuário e item–item)
FC usuário–usuário
- Encontrar usuários mais similares ao usuário (u)
- Recomendar itens de que esses vizinhos gostaram
Medidas de similaridade:
- Similaridade do cosseno em vetores de avaliação
- Correlação de Pearson (para avaliações centralizadas pela média)
- Similaridade de Jaccard (comum em implícito)
Prós:
- Simples e interpretável (“porque usuários semelhantes gostaram”)
- Sem etapa de treino além do cálculo de similaridade
Contras:
- Difícil de escalar para muitos usuários (a matriz de similaridade usuário–usuário pode ser enorme)
- Sofre quando usuários têm poucas interações (usuários em partida a frio (cold-start users))
- A qualidade depende de sobreposição; dados esparsos prejudicam
FC item–item
Calcule a similaridade entre itens com base em padrões de co-consumo e, então, recomende itens similares àqueles com os quais o usuário interagiu.
Isso é amplamente usado na prática porque catálogos de itens podem ser mais estáveis do que usuários, e similaridades item–item podem ser armazenadas em cache.
Exemplo: “Usuários que compraram X também compraram Y” frequentemente usa coocorrência item–item com normalização.
Prós:
- Escala bem para grandes bases de usuários
- Funciona bem para módulos de “itens relacionados”
Contras:
- Pode super-recomendar itens muito populares sem normalização cuidadosa
- Ainda é limitada para capturar interações complexas além de coocorrência
FC baseada em modelo: fatoração de matrizes
A fatoração de matrizes (matrix factorization) representa cada usuário e item com um vetor latente de baixa dimensão:
- Vetor de incorporação do usuário (p_u \in \mathbb{R}^d)
- Vetor de incorporação do item (q_i \in \mathbb{R}^d)
Pontuação: [ \hat{r}_{ui} = \mu + b_u + b_i + p_u^\top q_i ] onde (\mu) é um viés global e (b_u, b_i) são vieses de usuário/item.
Isso é conceitualmente relacionado a Redução de Dimensionalidade: a fatoração comprime uma matriz de interação esparsa em uma estrutura latente de baixa ordem, mas o objetivo é preditivo, e não puramente reconstrutivo.
Objetivo com feedback explícito (perda quadrática) (squared loss)
Para avaliações observadas ((u,i)\in \Omega): [ \min_{p,q,b}\sum_{(u,i)\in\Omega} (r_{ui} - \hat{r}_{ui})^2 + \lambda(|p_u|^2+|q_i|^2+b_u^2+b_i^2) ] Otimizado com descida de gradiente estocástica (SGD) ou mínimos quadrados alternados (ALS); veja também Descida do Gradiente.
Fatoração com feedback implícito (ponderada por confiança) (confidence-weighted)
Uma abordagem comum (por exemplo, “ALS implícito (implicit ALS)”) trata todos os pares usuário–item como tendo uma preferência binária (p_{ui}\in{0,1}), com uma confiança (c_{ui}) maior para interações observadas:
- (p_{ui}=1) se o usuário interagiu, caso contrário (0)
- (c_{ui}=1+\alpha \cdot \text{strength}(u,i))
Objetivo: [ \min \sum_{u,i} c_{ui} (p_{ui} - p_u^\top q_i)^2 + \lambda(|p_u|^2+|q_i|^2) ]
Isso incentiva o modelo a explicar positivos com força, sem penalizar demais os desconhecidos.
Objetivo de ranqueamento par-a-par (BPR)
Para feedback implícito, ranquear costuma importar mais do que reconstruir zeros. O Ranqueamento Personalizado Bayesiano (Bayesian Personalized Ranking, BPR) otimiza comparações par-a-par:
Para cada usuário (u), amostre um item positivo (i) e um item negativo/não observado (j): [ \max \sum \log \sigma(\hat{s}(u,i)-\hat{s}(u,j)) - \lambda| \theta |^2 ] O BPR treina diretamente o modelo para ranquear positivos acima de negativos.
Exemplo prático: treinando um modelo simples de FM implícita (estilo BPR)
Abaixo está um exemplo ilustrativo mínimo (não otimizado para produção) mostrando o laço central: amostrar positivos e negativos, atualizar incorporações com SGD.
import random
import numpy as np
# user_pos[u] = set of items user u interacted with (implicit positives)
user_pos = {
0: {1, 3, 7},
1: {0, 2},
2: {3, 4, 5},
}
num_users = len(user_pos)
num_items = 10
d = 16
lr = 0.05
reg = 1e-3
steps = 20000
P = 0.01 * np.random.randn(num_users, d) # user vectors
Q = 0.01 * np.random.randn(num_items, d) # item vectors
def sigmoid(x): return 1.0 / (1.0 + np.exp(-x))
all_items = list(range(num_items))
for _ in range(steps):
u = random.randrange(num_users)
i = random.choice(tuple(user_pos[u])) # positive
j = random.choice(all_items) # negative sample
while j in user_pos[u]:
j = random.choice(all_items)
x_ui = P[u] @ Q[i]
x_uj = P[u] @ Q[j]
x = x_ui - x_uj
s = sigmoid(-x) # gradient factor for -log(sigmoid(x))
# gradients
grad_p = s * (Q[j] - Q[i]) + reg * P[u]
grad_qi = -s * P[u] + reg * Q[i]
grad_qj = s * P[u] + reg * Q[j]
P[u] -= lr * grad_p
Q[i] -= lr * grad_qi
Q[j] -= lr * grad_qj
def recommend(u, k=5):
scores = Q @ P[u]
seen = user_pos[u]
cand = [(i, scores[i]) for i in range(num_items) if i not in seen]
cand.sort(key=lambda x: x[1], reverse=True)
return cand[:k]
print("Top recommendations for user 0:", recommend(0))
Na prática, você adicionaria uma amostragem melhor (por exemplo, negativos baseados em popularidade), processamento em lotes (batching) e usaria bibliotecas otimizadas para dados esparsos.
Além da FC básica: abordagens relacionadas
A filtragem colaborativa é poderosa, mas sistemas reais frequentemente combinam múltiplas técnicas.
Recomendação baseada em conteúdo (content-based recommendation)
Se você tem metadados de itens (texto, categorias, incorporações) ou perfis de usuário, pode recomendar itens similares ao que um usuário gostou com base em atributos de conteúdo.
Exemplos:
- Notícias: recomendar artigos com tópicos/entidades semelhantes
- Vagas: combinar competências e cargos
- E-commerce: combinar atributos como marca, estilo e faixa de preço
Métodos baseados em conteúdo ajudam com itens em partida a frio (cold-start items) (itens novos sem interações). Eles frequentemente usam incorporações aprendidas a partir de Redes Neurais, como codificadores de texto para descrições.
Recomendadores híbridos (hybrid recommenders)
Híbridos combinam sinais colaborativos e de conteúdo. Padrões comuns:
- Fatoração aumentada por atributos (feature-augmented factorization): adicionar atributos de item/usuário (por exemplo, Máquinas de Fatoração)
- Sistemas em dois estágios (two-stage systems): recuperação de candidatos via FC + modelo de ranqueamento rico em atributos
- Combinação/empilhamento (blending/stacking): fazer média de pontuações de múltiplos modelos ou treinar um meta-modelo
Híbridos costumam ser a abordagem mais robusta em produção.
Máquinas de Fatoração (FMs) e variantes com campos
Máquinas de Fatoração (Factorization Machines) modelam interações pareadas entre atributos de forma eficiente: [ \hat{y}(x) = w_0 + \sum_j w_j x_j + \sum_{j<k} \langle v_j, v_k \rangle x_j x_k ] Elas podem incluir:
- ID de usuário, ID de item (como na fatoração de matrizes)
- atributos de contexto (dispositivo, horário)
- atributos de item (categoria, marca)
Máquinas de Fatoração são especialmente úteis para atributos categóricos esparsos e servem como ponte entre filtragem colaborativa pura e modelos supervisionados de ranqueamento. Elas costumam ser baselines fortes e podem ser combinadas com Árvores de Decisão e Conjuntos ou modelos neurais em estágios de ranqueamento.
Recuperação neural baseada em incorporações (modelos de duas torres)
Recomendadores em larga escala frequentemente usam arquiteturas de duas torres (two-tower) (também chamadas de codificador duplo (dual-encoder)):
- Uma torre de usuário produz a incorporação (e_u)
- Uma torre de item produz a incorporação (e_i)
- Similaridade ( \hat{s}(u,i)=e_u^\top e_i )
O treinamento usa sinais implícitos e amostragem negativa (negativos no lote, in-batch negatives, são comuns). Isso é intimamente relacionado a Aprendizado Métrico: você aprende um espaço de incorporações em que itens relevantes ficam próximos dos usuários.
A vantagem é a recuperação rápida: você pode pré-computar incorporações de itens e usar busca aproximada por vizinhos mais próximos (approximate nearest neighbor search, ANN) para recuperar candidatos.
Recomendação baseada em sequência e sessão (sequence- and session-based recommendation)
Quando o comportamento recente importa (música, vídeo curto, sessões de compra), modelos de sequência preveem o próximo item dado um histórico:
- Cadeias de Markov / modelos de transição entre itens
- RNNs, Transformers (codificadores de sessão)
- Processos pontuais temporais (para dinâmicas sensíveis ao tempo)
Esses modelos lidam melhor com mudanças de intenção do que a fatoração de matrizes estática.
Recomendadores baseados em grafos (graph-based recommenders)
Interações usuário–item formam um grafo bipartido; você pode explorar relações de múltiplos saltos:
- Métodos de caminhada aleatória (por exemplo, PageRank personalizado)
- Redes neurais de grafos (graph neural networks, GNNs) para sinais colaborativos em grafos
Métodos de grafo podem capturar uma estrutura de vizinhança mais rica, mas podem ser mais pesados operacionalmente.
Geração de candidatos vs ranqueamento: a arquitetura típica de produção
Sistemas reais raramente pontuam cada item para cada usuário com um único modelo. Em geral, eles dividem em estágios:
1) Geração de candidatos (recuperação) (candidate generation (retrieval))
Objetivo: produzir rapidamente algumas centenas/milhares de itens candidatos a partir de milhões.
Métodos:
- FC item–item (“semelhante aos itens que você viu”)
- Recuperação ANN por incorporações de duas torres
- Popularidade dentro de um segmento
- Candidatos heurísticos/de negócio (itens novos, itens patrocinados)
2) Ranqueamento (ranking)
Objetivo: ordenar candidatos com precisão para o contexto atual.
Frequentemente formulado como aprendizado supervisionado com atributos ricos:
- atributos de usuário, atributos de item, atributos de contexto
- atributos cruzados (por exemplo, afinidade do usuário pela categoria do item)
Modelos:
- Árvores impulsionadas por gradiente (Árvores de Decisão e Conjuntos)
- Ranqueadores neurais
- Máquinas de Fatoração / Máquinas de Fatoração profundas
Problemas de ranqueamento se conectam fortemente a objetivos de Aprendizado para Ranqueamento (pontual, par-a-par, lista; métricas como NDCG).
3) Re-ranqueamento / pós-processamento
Aplicar restrições e otimizar a experiência do usuário:
- diversidade, novidade, cobertura
- restrições de equidade
- remoção de duplicatas
- filtros de política e segurança
Avaliação: métricas offline e testes online
Avaliação offline (métricas comuns)
Para predição de avaliação
- RMSE / MAE em avaliações separadas (held-out)
Útil para feedback explícito, mas frequentemente desalinhado com ranqueamento/experiência do usuário.
Para recomendação Top‑K
Calcule métricas sobre interações separadas (held-out):
- Precisão@K (Precision@K): fração dos itens recomendados que são relevantes
- Revocação@K (Recall@K): fração de itens relevantes recuperados
- MAP@K (MAP@K): média da precisão média
- NDCG@K (NDCG@K): ganho sensível à posição; comum em ranqueamento (Aprendizado para Ranqueamento)
Importante: avaliação offline pode ser enganosa devido a viés de exposição — itens não interagidos podem simplesmente não ter sido vistos.
Avaliação online
Testes A/B ou interleaving medem resultados reais:
- CTR, tempo de exibição, taxa de conversão
- retenção, pesquisas de satisfação
- valor de vida útil (long-term value, LTV), redução de cancelamento (churn)
Testes online são o padrão-ouro, mas exigem desenho cuidadoso para evitar que a otimização de curto prazo prejudique a saúde de longo prazo (por exemplo, clickbait).
Desafios comuns e como são tratados
Partida a frio (novos usuários e novos itens) (cold start)
- Novo usuário: fazer perguntas de onboarding, usar padrões de popularidade/segmento, usar contexto (localização, horário), incorporar sinais de sessão de curto prazo.
- Novo item: usar incorporações de conteúdo, metadados, políticas de exploração, ou informações do lado do fornecedor.
Híbridos geralmente são a melhor opção aqui.
Esparsidade e cauda longa
Muitos itens têm poucas interações. Técnicas:
- regularização, priors bayesianos (Bayesian priors) (Modelos Bayesianos)
- suavização hierárquica/por categoria
- atributos de conteúdo e compartilhamento de incorporações
- amostragem negativa consciente de popularidade
Viés de popularidade e ciclos de retroalimentação
Sistemas de recomendação podem super-recomendar itens já populares, tornando-os ainda mais populares. Mitigações:
- recomendações calibradas (controlar mudança de distribuição)
- diversificar e promover itens de cauda longa
- estratégias de exploração (por exemplo, epsilon-greedy, amostragem de Thompson)
Diversidade, novidade e serendipidade
Relevância pura pode parecer repetitiva. Pós-processamento pode impor:
- diversidade de categorias
- restrições de “frescor”
- penalidades de novidade para conteúdo visto em excesso
Isso costuma ser implementado no re-ranqueamento.
Equidade e representação
Recomendações podem prejudicar sistematicamente criadores ou grupos de usuários. Abordagens incluem:
- medir exposição desigual
- otimização com restrições no re-ranqueamento
- auditoria e avaliação contrafactual
Metas de equidade são específicas do domínio e envolvem tanto política de produto quanto modelagem.
Privacidade e governança de dados
Personalização usa dados comportamentais sensíveis. Práticas comuns:
- minimização de dados e limites de retenção
- privacidade diferencial (differential privacy) para análises/treino em alguns cenários
- aprendizado federado (federated learning) em ecossistemas com forte processamento na borda (quando aplicável)
- controles de acesso fortes e transparência
Aplicações práticas e exemplos
Exemplo 1: recomendações de filmes (FC clássica)
- Dados: avaliações ou assistidos usuário–filme
- Baseline: FC item–item (“porque você assistiu The Matrix”)
- Modelo forte: fatoração de matrizes com vieses
- Melhorias: adicionar dinâmica temporal (gostos recentes), adicionar incorporações de conteúdo de enredos/gêneros
Exemplo 2: recomendações em e-commerce
Módulos típicos:
- “Comprados juntos com frequência” (coocorrência item–item)
- “Recomendado para você” (recuperação por duas torres + ranqueador com preço, disponibilidade, intenção do usuário)
- “Itens similares” (conteúdo + sinais item–item)
Restrições importam: filtragem de fora de estoque, restrições de envio, regras de negócio.
Exemplo 3: feed de vídeos curtos
- Objetivo: maximizar tempo de exibição e satisfação, controlando fadiga
- Usar modelos de sequência para intenção (interações recentes importam)
- Controles fortes de exploração para evitar bolhas de filtro e aprender novas preferências rapidamente
Notas de implementação e boas práticas
- Comece com baselines fortes (popularidade, FC item–item, fatoração de matrizes) antes de modelos profundos.
- Separe dados por tempo para avaliação, para imitar a implantação (treinar no passado, testar no futuro).
- Trate negativos implícitos com cuidado; use amostragem negativa e considere viés de exposição.
- Separe recuperação e ranqueamento para escalabilidade; pré-compute incorporações e atributos de itens.
- Monitore online para mudança de distribuição, ciclos de retroalimentação e resultados não intencionais (por exemplo, redução de diversidade).
Resumo
Sistemas de recomendação personalizam aprendendo a partir de interações usuário–item, com a filtragem colaborativa como abordagem fundamental. Métodos de vizinhança oferecem simplicidade e interpretabilidade, enquanto a fatoração de matrizes e objetivos otimizados para ranqueamento (como BPR) fornecem desempenho forte e escalável. Recomendadores modernos em produção tipicamente são pipelines multiestágio (multi-stage) que combinam sinais colaborativos com conteúdo, contexto e incorporações aprendidas (frequentemente via Redes Neurais), e dependem de avaliação offline rigorosa mais experimentação online. Além de acurácia, sistemas práticos devem lidar com partida a frio, vieses, diversidade, equidade, privacidade e restrições operacionais para entregar valor sustentado ao usuário.