Como criar um sistema de recomendação no TensorFlow: visão geral

Neste artigo, apresentamos uma visão geral de uma série de tutoriais que mostram como implementar um sistema de recomendação com TensorFlow e AI Platform no Google Cloud Platform (GCP).

Nesta visão geral:

  • descreveremos a teoria para sistemas de recomendação baseados em fatoração de matriz;
  • descreveremos o algoritmo de mínimos quadrados ponderados alternados (WALS, na sigla em inglês) usado para realizar a fatoração da matriz;
  • forneceremos um conjunto de tutoriais que oferecem orientações passo a passo para implementar um sistema de recomendação no GCP.

O sistema de recomendações no tutorial usa o algoritmo de mínimos quadrados ponderados alternados (WALS, na sigla em inglês). O WALS está incluído no pacote contrib.factorization da base de código do TensorFlow e é usado para fatorar uma grande matriz de classificações de usuários e itens.

Tutoriais nesta série

Veja os tutoriais que acompanham esta visão geral:

Teoria de base para recomendações

Neste artigo, descreveremos a teoria de base para filtragem colaborativa baseada em fatoração de matrizes aplicada a sistemas de recomendação. Os tópicos a seguir são abordados de maneira detalhada, com alguns links fornecidos para leitura adicional:

  • Filtragem colaborativa. O que é filtragem colaborativa, e como você usa os insights alcançados com ela?
  • Fatoração de matrizes. O que é uma matriz de classificações, quais são os fatores latentes e como você transforma matematicamente a matriz de classificações para contabilizá-los?
  • Método WALS para fatoração de matrizes. Como fazer fatoração de matrizes usando o método WALS?

Filtragem colaborativa para sistemas de recomendação

A técnica de filtragem colaborativa é um método poderoso para gerar recomendações do usuário. A filtragem colaborativa depende apenas do comportamento do usuário observado para fazer recomendações. Nenhum dado de perfil ou acesso ao conteúdo é necessário.

A técnica baseia-se nestas observações:

  • Os usuários que interagem com itens de maneira semelhante (por exemplo, comprando os mesmos produtos ou visualizando os mesmos artigos) compartilham uma ou mais preferências ocultas.
  • Os usuários com preferências compartilhadas provavelmente responderão da mesma maneira aos mesmos itens.

A combinação dessas observações básicas permite que um mecanismo de recomendação funcione sem precisar determinar a natureza precisa das preferências compartilhadas do usuário. Basta que as preferências existam e sejam significativas. A suposição básica é que o comportamento semelhante do usuário reflete preferências fundamentais semelhantes que permitem que um mecanismo de recomendação faça sugestões de maneira apropriada.

Por exemplo, suponha que o usuário 1 tenha visualizado os itens A, B, C, D, E e F. O usuário 2 visualizou os itens A, B, D, E e F, mas não C. Como os dois usuários visualizaram cinco dos mesmos seis itens, é provável que eles compartilhem algumas preferências básicas. O Usuário 1 gostou do item C e é provável que o Usuário 2 também queira o item C se tiver conhecimento da existência dele. É aí que o mecanismo de recomendação entra: ele informa o Usuário 2 sobre o item C, despertando o interesse dele.

Fatoração de matrizes para filtragem colaborativa

O problema de filtragem colaborativa pode ser resolvido usando fatoração de matrizes. Suponha que você tenha uma matriz que consiste em IDs de usuário e as interações deles com seus produtos. Cada linha corresponde a um usuário único e cada coluna corresponde a um item. O item pode ser um produto em um catálogo, um artigo ou um vídeo. Cada entrada na matriz captura a classificação ou preferência de um usuário por um único item. A classificação pode ser explícita, gerada diretamente pelo feedback do usuário, ou implícita, com base nas compras dele ou no tempo gasto interagindo com um artigo ou vídeo.

Se um usuário nunca avaliou um item ou mostrou qualquer interesse implícito nele, a entrada da matriz é zero. A Figura 1 mostra uma representação de uma matriz de classificação MovieLens.

A matriz de classificações MovieLens
Figura 1. A matriz de classificações MovieLens

As classificações no conjunto de dados MovieLens variam de 1 a 5. Entradas de classificação vazias têm valor 0, o que significa que um determinado usuário não classificou o item.

Como definir o método de fatoração de matrizes

Uma matriz de classificações consiste em uma matriz R, em que as entradas \(r_ {ij} \) são classificações de usuário \(i \) para o item \(j \). Para muitas aplicações da Internet, essas matrizes são grandes, com milhões de usuários e milhões de itens diferentes. Elas também são esparsas (em inglês), o que significa que cada usuário normalmente classificou, visualizou ou comprou apenas um pequeno número de itens em relação ao conjunto inteiro. A grande maioria das entradas de uma matriz, geralmente mais de 99%, é zero.

O método de fatoração de matrizes pressupõe que haja um conjunto de atributos comuns a todos os itens, com itens que diferem no grau em que eles expressam esses atributos. Além disso, o método de fatoração de matrizes pressupõe que cada usuário tenha a própria expressão para cada um desses atributos, independentemente dos itens. Dessa forma, a classificação de um item pelo usuário pode ser aproximada pela soma da força do usuário para cada atributo ponderado pelo grau em que o item o expressa. Esses atributos são às vezes chamados de fatores ocultos ou latentes.

Intuitivamente, é fácil ver que esses fatores latentes hipotéticos realmente existem. No caso dos filmes, é claro que muitos usuários preferem certos gêneros, atores ou diretores. Essas categorias representam fatores latentes óbvios, mas que ainda são bastante úteis. Por exemplo, as preferências de gênero se manifestam nos filmes que os usuários tendem a gostar, e é de se supor que pessoas com preferências semelhantes de gênero gostem de filmes similares. Grande parte do poder da abordagem de fatoração de matrizes para a filtragem colaborativa vem do fato de que não é necessário conhecer o número de gêneros, atores ou outras categorias que podem compor a totalidade das preferências de um usuário. Simplesmente se presume que haja um número arbitrário deles.

Como transformar a matriz para representar fatores latentes

Para traduzir a existência de fatores latentes na matriz de classificações, faça o seguinte: para um conjunto de usuários U de tamanho u e itens I de tamanho i, você escolhe um número arbitrário k de fatores latentes e fatora a matriz grande R em duas matrizes menores X (o “fator de linha”) e Y (o "fator de coluna"). A matriz X tem dimensão u × k e Y tem dimensão k × i. Isso é mostrado na figura 2.

Como aproximar a matriz de classificações com fatores de linha e coluna
Figura 2. Aproximação da matriz de classificações com fatores de linha e coluna

Na álgebra linear, isso é chamado de aproximação por matriz de baixo posto (low-rank, link em inglês). É possível ver esse processo compactando as informações esparsas em R nos espaços dimensionais muito mais baixos u × k e k × i. A matriz R', conseguida quando as matrizes de classificação baixa X e Y são multiplicadas, representa uma aproximação de R.

Cada usuário é representado por um vetor neste espaço k tridimensional e cada linha \( \mathbf{x}_{u}\) em X corresponde à força das preferências do usuário para esses fatores k. Da mesma forma, cada item representado por um vetor neste espaço tridimensional k tem uma coluna \(\mathbf{y}_{i}\) em Y correspondente à expressão do item dos mesmos fatores k.

Para calcular a classificação do usuário u para o item i, pegue o produto escalar dos dois vetores:

$$ r_{ui} = \mathbf{x}^{T}_{u} \cdot \mathbf{y}_{i} $$

Este produto é um número real \(r_{ui}\) e representa uma aproximação, ou em termos do ML, uma previsão da classificação do usuário u para o item i. Isso é ilustrado na figura 3.

Como calcular uma classificação prevista dos fatores de linha e coluna
Figura 3. Como calcular uma classificação prevista dos fatores de linha e coluna

É possível definir uma função de perda que mede a precisão da aproximação desta maneira:

$$ L = \sum_{u,i}(r_{ui} - \mathbf{x}^{T}_{u} \cdot \mathbf{y}_{i})^{2} $$

Essa equação faz isto: sobre todos os usuários e itens, soma a diferença quadrática entre a classificação aproximada \(\mathbf{x}^T_{u} \cdot \mathbf{y}_{i}\) e a classificação real do conjunto de treinamento \(r_{ui}\).

É uma prática comum adicionar termos de regularização a essa função de perda para ajudar a evitar o overfitting (links em inglês). Adicionar termos de regularização de L2 (em inglês) nos fatores de linha e coluna tem este resultado:

$$ L = \sum_{u,i}(r_{ui} - \mathbf{x}^{T}_{u} \cdot \mathbf{y}_{i})^{2} + \lambda\sum_{u}\left\lVert\mathbf{x}_{u}\right\rVert^{2} + \lambda\sum_{i}\left\lVert\mathbf{y}_{i}\right\rVert^{2} $$

Aqui, \(\lambda \) é uma constante de regularização, um dos hiperparâmetros do modelo que discutimos na Parte 2 da série de tutoriais.

O método WALS de fatoração de matrizes

Esta seção discute dois métodos de fatoração de matrizes.

Método de mínimos quadrados alternados

O método de mínimos quadrados alternados de fatoração de matrizes é um método iterativo para determinar os fatores ideais X e Y se aproximem de R. Em cada iteração, um dos fatores de linha ou de coluna é mantido fixo e o outro é calculado minimizando a função de perda em relação ao outro fator.

Comece com os fatores de linha:

  1. Defina os fatores da coluna para valores constantes.
  2. Pegue a derivada da função de perda em relação aos fatores da linha.
  3. Defina a equação igual a zero.
$$ \frac{\partial L}{\partial \mathbf{x}_{u}} = -2\sum_{i}(r_{ui} - \mathbf{x}^{T}_{u} \cdot \mathbf{y}_{i})\mathbf{y}^{T}_{i} + 2\lambda\mathbf{x}^{T}_{u} $$
$$ 0 = -(\mathbf{r}_{u} - \mathbf{x}^{T}_{u}Y^{T})Y + \lambda\mathbf{x}^{T}_{u} $$
$$ \mathbf{x}^{T}_{u}(Y^{T}Y + \lambda{I}) = \mathbf{r}_{u}Y $$
$$ \mathbf{x}^{T}_{u} = \mathbf{r}_{u}Y(Y^{T}Y + \lambda{I})^{-1} $$

A iteração segue mantendo os fatores de linha resolvidos fixos e resolvendo a equação análoga para os fatores da coluna. Alternando fatores de linha e coluna, o processo iterativo é repetido até a convergência, que normalmente ocorre dentro de um número pequeno (< 20) de iterações, mesmo para matrizes muito grandes, o que consiste em dezenas de milhões de linhas ou colunas.

Método de mínimos quadrados ponderados alternados (WALS, na sigla em inglês)

A versão ponderada do algoritmo introduz pesos diferentes para as entradas zero ou não observadas e as entradas diferentes de zero na matriz:

$$ L^{w} = \mathbf{W} \cdot \sum_{u,i}(r_{ui} - \mathbf{x}^{T}_{u} \cdot \mathbf{y}_{i})^{2} $$

Nesta equação:

\(w_{ui} = \omega_{0}\) para entradas zero (não observadas) na matriz de classificação e
\(w_{ui} = \omega_{0} + f(c_{i})\) para entradas observadas, em que
\(c_{i} = \sum_{u,i}1 \text{ if } r_{ui} > 0\) é a soma do número de entradas diferentes de zero para a coluna i

O peso é escalonado pela soma das entradas diferentes de zero em uma linha para normalizar o peso para usuários que avaliaram um número diferente de itens.

Esse tipo de ponderação permite um modelo mais flexível das preferências do usuário e produz melhores resultados empíricos do que a versão não ponderada. Para mais detalhes, consulte o artigo Filtragem colaborativa para conjuntos de dados de feedback implícito (em inglês). A função \(f\) varia de acordo com o conjunto de dados e se as classificações são explícitas ou implícitas.

O conjunto de dados MovieLens contém classificações explícitas. Nesse caso, a melhor escolha para \(f\) é aquela que pondera as entradas observadas linearmente:

\(f = \omega_{k}c_{i}\) em que \(\omega_{k}\) é o peso observado.

Para classificações implícitas relacionadas a eventos dinâmicos, em que cada classificação corresponde ao número de vezes que um vídeo foi assistido, um artigo foi lido ou uma página da Web foi visualizada, a classificação em si pode ter uma distribuição exponencial devido ao comportamento do usuário. Haverá muitas classificações de baixo valor quando os usuários clicarem em uma página ou vídeo e os abandonarem rapidamente. Haverá menos classificações implícitas grandes, já que os usuários leem um artigo completo, assistem a um vídeo inteiro ou assistem a um determinado programa agendado várias vezes. Nesse caso, um \(f\) apropriado é aquele que pondera as classificações observadas para considerar essa distribuição:

\(f = \left(\frac{1}{c_{i}}\right)^{e}\) em que \(f\) é o expoente do peso do recurso.

WALS comparado a outras técnicas

Muitas técnicas de fatoração de matrizes são usadas para filtragem colaborativa, incluindo SVD e gradiente descendente estocástico (links em inglês). Em alguns casos, essas técnicas oferecem aproximações de classificação reduzida melhores do que as WALS. Além do escopo deste artigo, é possível comparar os pontos fortes e fracos dos diferentes métodos de filtragem colaborativa, mas vale a pena observar as seguintes vantagens do WALS:

  • Os pesos usados no WALS o tornam adequado para classificações implícitas, mas ele também pode ser aplicado a conjuntos de dados de classificação explícita, como o MovieLens.
  • O WALS inclui otimizações algorítmicas que facilitam a incorporação de pesos e calculam atualizações de fatores de linha e coluna com facilidade. Para detalhes, consulte o artigo Filtragem colaborativa para conjuntos de dados de feedback implícito (em inglês). Essas otimizações são criadas na base de código do TensorFlow do WALS.
  • É relativamente simples criar uma versão distribuída do algoritmo. Versões distribuídas podem processar matrizes muito grandes com centenas de milhões de linhas em potencial. A discussão da versão distribuída do WALS está além do escopo deste artigo.

A seguir

Comece a trabalhar nos tutoriais desta série: