🚀 Experimente o Zilliz Cloud, o Milvus totalmente gerenciado, gratuitamente—experimente um desempenho 10x mais rápido! Experimente Agora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Aceleração da geração de candidatos em sistemas de recomendação usando Milvus emparelhado com PaddlePaddle

Aceleração da geração de candidatos em sistemas de recomendação usando Milvus emparelhado com PaddlePaddle

  • Scenarios
November 26, 2021
Yunmei

Se tem experiência no desenvolvimento de um sistema de recomendação, é provável que tenha sido vítima de pelo menos uma das seguintes situações:

  • O sistema é extremamente lento no retorno dos resultados devido à enorme quantidade de conjuntos de dados.
  • Os dados recentemente inseridos não podem ser processados em tempo real para pesquisa ou consulta.
  • A implementação do sistema de recomendação é assustadora.

Este artigo tem como objetivo abordar as questões acima mencionadas e fornecer algumas ideias, apresentando um projeto de sistema de recomendação de produtos que utiliza o Milvus, uma base de dados vetorial de código aberto, emparelhada com o PaddlePaddle, uma plataforma de aprendizagem profunda.

Este artigo tem como objetivo descrever brevemente o fluxo de trabalho mínimo de um sistema de recomendação. Em seguida, apresenta os principais componentes e os detalhes de implementação deste projeto.

O fluxo de trabalho básico de um sistema de recomendação

Antes de nos debruçarmos sobre o projeto propriamente dito, vamos primeiro analisar o fluxo de trabalho básico de um sistema de recomendação. Um sistema de recomendação pode apresentar resultados personalizados de acordo com os interesses e as necessidades únicas do utilizador. Para fazer essas recomendações personalizadas, o sistema passa por duas fases, a geração de candidatos e a classificação.

2.png 2.png

A primeira fase é a geração de candidatos, que devolve os dados mais relevantes ou semelhantes, como um produto ou um vídeo que corresponda ao perfil do utilizador. Durante a geração de candidatos, o sistema compara as caraterísticas do utilizador com os dados armazenados na sua base de dados e recupera os dados semelhantes. Em seguida, durante a classificação, o sistema pontua e reordena os dados recuperados. Finalmente, os resultados no topo da lista são mostrados aos utilizadores.

No nosso caso de um sistema de recomendação de produtos, o sistema começa por comparar o perfil do utilizador com as caraterísticas dos produtos em stock para filtrar uma lista de produtos que satisfaçam as necessidades do utilizador. Em seguida, o sistema pontua os produtos com base na sua semelhança com o perfil do utilizador, classifica-os e, finalmente, devolve os 10 melhores produtos ao utilizador.

3.png 3.png

Arquitetura do sistema

O sistema de recomendação de produtos deste projeto utiliza três componentes: MIND, PaddleRec e Milvus.

MIND

OMIND, abreviatura de "Multi-Interest Network with Dynamic Routing for Recommendation at Tmall" (rede de interesses múltiplos com encaminhamento dinâmico para recomendação no Tmall), é um algoritmo desenvolvido pelo Alibaba Group. Antes de o MIND ser proposto, a maioria dos modelos de IA predominantes para recomendação utilizavam um único vetor para representar os interesses variados de um utilizador. No entanto, um único vetor está longe de ser suficiente para representar os interesses exactos de um utilizador. Por conseguinte, o algoritmo MIND foi proposto para transformar os múltiplos interesses de um utilizador em vários vectores.

Especificamente, o MIND adopta uma rede de interesses múltiplos com encaminhamento dinâmico para processar os interesses múltiplos de um utilizador durante a fase de geração de candidatos. A rede de interesses múltiplos é uma camada de extrator de interesses múltiplos baseada no mecanismo de encaminhamento de cápsulas. Pode ser utilizada para combinar os comportamentos anteriores de um utilizador com os seus múltiplos interesses, de modo a obter um perfil de utilizador preciso.

O diagrama seguinte ilustra a estrutura de rede do MIND.

4.png 4.png

Para representar as caraterísticas dos utilizadores, o MIND utiliza os comportamentos e os interesses dos utilizadores como entradas e, em seguida, alimenta-os na camada de incorporação para gerar vectores de utilizadores, incluindo vectores de interesses e vectores de comportamento dos utilizadores. Em seguida, os vectores de comportamento dos utilizadores são introduzidos na camada de extração de interesses múltiplos para gerar cápsulas de interesses dos utilizadores. Depois de concatenar as cápsulas de interesse do utilizador com os embeddings do comportamento do utilizador e utilizar várias camadas ReLU para os transformar, o MIND produz vários vectores de representação do utilizador. Este projeto definiu que o MIND produzirá, em última análise, quatro vectores de representação do utilizador.

Por outro lado, as caraterísticas dos produtos passam pela camada de incorporação e são convertidas em vectores de itens esparsos. Em seguida, cada vetor de item passa por uma camada de agrupamento para se tornar um vetor denso.

Quando todos os dados são convertidos em vectores, é introduzida uma camada de atenção adicional sensível às etiquetas para orientar o processo de formação.

PaddleRec

A PaddleRec é uma biblioteca de modelos de pesquisa em grande escala para recomendação. Faz parte do ecossistema Baidu PaddlePaddle. O objetivo do PaddleRec é fornecer aos programadores uma solução integrada para criar um sistema de recomendação de forma fácil e rápida.

5.png 5.png

Como mencionado no parágrafo inicial, os engenheiros que desenvolvem sistemas de recomendação têm frequentemente de enfrentar os desafios de uma fraca usabilidade e de uma implantação complicada do sistema. No entanto, o PaddleRec pode ajudar os programadores nos seguintes aspectos:

  • Facilidade de uso: PaddleRec é uma biblioteca de código aberto que encapsula vários modelos populares na indústria, incluindo modelos para geração de candidatos, classificação, reranking, multitarefa e muito mais. Com o PaddleRec, pode testar instantaneamente a eficácia do modelo e melhorar a sua eficiência através da iteração. O PaddleRec oferece uma maneira fácil de treinar modelos para sistemas distribuídos com excelente desempenho. Ele é otimizado para o processamento de dados em larga escala de vetores esparsos. Pode facilmente escalar o PaddleRec horizontalmente e acelerar a sua velocidade de computação. Portanto, você pode criar rapidamente ambientes de treinamento no Kubernetes usando o PaddleRec.

  • Suporte para implantação: O PaddleRec fornece soluções de implantação online para seus modelos. Os modelos estão imediatamente prontos para utilização após a formação, apresentando flexibilidade e elevada disponibilidade.

Milvus

Milvus é um banco de dados vetorial com uma arquitetura nativa da nuvem. É de código aberto no GitHub e pode ser utilizada para armazenar, indexar e gerir vectores de incorporação maciços gerados por redes neurais profundas e outros modelos de aprendizagem automática (ML). O Milvus encapsula várias bibliotecas de pesquisa de vizinho mais próximo (ANN) aproximado de primeira classe, incluindo Faiss, NMSLIB e Annoy. Também pode escalar o Milvus de acordo com as suas necessidades. O serviço Milvus é altamente disponível e suporta processamento unificado em lote e fluxo. O Milvus está empenhado em simplificar o processo de gestão de dados não estruturados e em proporcionar uma experiência de utilizador consistente em diferentes ambientes de implementação. Possui as seguintes caraterísticas:

  • Elevado desempenho na realização de pesquisas vectoriais em conjuntos de dados maciços.

  • Uma comunidade de programadores que dá prioridade ao suporte multilingue e à cadeia de ferramentas.

  • Escalabilidade na nuvem e elevada fiabilidade, mesmo em caso de interrupção.

  • Pesquisa híbrida conseguida através do emparelhamento da filtragem escalar com a pesquisa de semelhanças vectoriais.

O Milvus é utilizado para a pesquisa por semelhança de vectores e para a gestão de vectores neste projeto porque pode resolver o problema das actualizações frequentes de dados, mantendo a estabilidade do sistema.

Implementação do sistema

Para construir o sistema de recomendação de produtos deste projeto, é necessário seguir as seguintes etapas:

  1. Processamento de dados
  2. Treino do modelo
  3. Teste do modelo
  4. Geração de candidatos a itens de produtos
    1. Armazenamento de dados: os vectores de itens são obtidos através do modelo treinado e armazenados no Milvus.
    2. Pesquisa de dados: quatro vectores de utilizadores gerados pelo MIND são introduzidos no Milvus para pesquisa de semelhança de vectores.
    3. Classificação dos dados: cada um dos quatro vectores tem os seus próprios top_k vectores de itens semelhantes, e os quatro conjuntos de top_k vectores são classificados para obter uma lista final de top_k vectores mais semelhantes.

O código-fonte deste projeto está alojado na plataforma Baidu AI Studio. A secção seguinte apresenta uma explicação detalhada do código-fonte deste projeto.

Passo 1. Processamento de dados

O conjunto de dados original provém do conjunto de dados de livros da Amazon fornecido pela ComiRec. No entanto, este projeto utiliza os dados que são descarregados e processados pelo PaddleRec. Consulte o conjunto de dados AmazonBook no projeto PaddleRec para mais informações.

Espera-se que o conjunto de dados para treino apareça no seguinte formato, com cada coluna a representar:

  • Uid: ID do utilizador.
  • item_id: ID do item do produto que foi clicado pelo utilizador.
  • Time: O carimbo de data/hora ou a ordem do clique.

Espera-se que o conjunto de dados para teste apareça no seguinte formato, com cada coluna representando:

  • Uid: ID do utilizador.

  • hist_item: ID do item de produto no comportamento histórico de cliques do utilizador. Quando há vários hist_item, eles são ordenados de acordo com o carimbo de data/hora.

  • eval_item: A sequência real em que o utilizador clica nos produtos.

Passo 2. Treino do modelo

O treino do modelo utiliza os dados processados na etapa anterior e adopta o modelo de geração de candidatos, MIND, baseado no PaddleRec.

1. Entrada do modelo

Em dygraph_model.py, execute o seguinte código para processar os dados e transformá-los em entrada de modelo. Este processo ordena os itens clicados pelo mesmo utilizador nos dados originais de acordo com o carimbo de data/hora e combina-os para formar uma sequência. Em seguida, seleciona aleatoriamente um item``_``id da sequência como target_item e extrai os 10 itens anteriores a target_item como hist_item para a entrada do modelo. Se a sequência não for suficientemente longa, pode ser definida como 0. seq_len deve ser o comprimento real da sequência hist_item.

def create_feeds_train(self, batch_data):
    hist_item = paddle.to_tensor(batch_data[0], dtype="int64")
    target_item = paddle.to_tensor(batch_data[1], dtype="int64")
    seq_len = paddle.to_tensor(batch_data[2], dtype="int64")
    return [hist_item, target_item, seq_len]

Consulte o script /home/aistudio/recommend/model/mind/mind_reader.py para obter o código de leitura do conjunto de dados original.

2. Modelo de rede

O código seguinte é um extrato de net.py. class Mind_Capsual_Layer define a camada de extração de múltiplos interesses baseada no mecanismo de encaminhamento de cápsulas de interesse. A função label_aware_attention() implementa a técnica de atenção com reconhecimento de etiquetas no algoritmo MIND. A função forward() em class MindLayer modela as caraterísticas do utilizador e gera os vectores de peso correspondentes.

class Mind_Capsual_Layer(nn.Layer):
    def __init__(self):
        super(Mind_Capsual_Layer, self).__init__()
        self.iters = iters
        self.input_units = input_units
        self.output_units = output_units
        self.maxlen = maxlen
        self.init_std = init_std
        self.k_max = k_max
        self.batch_size = batch_size
        # B2I routing
        self.routing_logits = self.create_parameter(
            shape=[1, self.k_max, self.maxlen],
            attr=paddle.ParamAttr(
                name="routing_logits", trainable=False),
            default_initializer=nn.initializer.Normal(
                mean=0.0, std=self.init_std))
        # bilinear mapping
        self.bilinear_mapping_matrix = self.create_parameter(
            shape=[self.input_units, self.output_units],
            attr=paddle.ParamAttr(
                name="bilinear_mapping_matrix", trainable=True),
            default_initializer=nn.initializer.Normal(
                mean=0.0, std=self.init_std))
                
class MindLayer(nn.Layer):

    def label_aware_attention(self, keys, query):
        weight = paddle.sum(keys * query, axis=-1, keepdim=True)
        weight = paddle.pow(weight, self.pow_p)  # [x,k_max,1]
        weight = F.softmax(weight, axis=1)
        output = paddle.sum(keys * weight, axis=1)
        return output, weight

    def forward(self, hist_item, seqlen, labels=None):
        hit_item_emb = self.item_emb(hist_item)  # [B, seqlen, embed_dim]
        user_cap, cap_weights, cap_mask = self.capsual_layer(hit_item_emb, seqlen)
        if not self.training:
            return user_cap, cap_weights
        target_emb = self.item_emb(labels)
        user_emb, W = self.label_aware_attention(user_cap, target_emb)

        return self.sampled_softmax(
            user_emb, labels, self.item_emb.weight,
            self.embedding_bias), W, user_cap, cap_weights, cap_mask

Consultar o guião /home/aistudio/recommend/model/mind/net.py para conhecer a estrutura específica da rede MIND.

3. Otimização do modelo

Este projeto utiliza o algoritmo Adam como optimizador do modelo.

def create_optimizer(self, dy_model, config):
    lr = config.get("hyper_parameters.optimizer.learning_rate", 0.001)
    optimizer = paddle.optimizer.Adam(
        learning_rate=lr, parameters=dy_model.parameters())
    return optimizer

Além disso, o PaddleRec escreve hiperparâmetros em config.yaml, pelo que basta modificar este ficheiro para ver uma comparação clara entre a eficácia dos dois modelos e melhorar a eficiência do modelo. Ao treinar o modelo, o mau efeito do modelo pode resultar do subajuste ou sobreajuste do modelo. Por conseguinte, é possível melhorá-lo modificando o número de rondas de treino. Neste projeto, basta alterar o parâmetro epochs em config.yaml para encontrar o número ideal de rondas de formação. Além disso, pode também alterar o optimizador do modelo, optimizer.class, ou learning_rate para depuração. O seguinte mostra parte dos parâmetros em config.yaml.

runner:
  use_gpu: True
  use_auc: False
  train_batch_size: 128
  epochs: 20
  print_interval: 10
  model_save_path: "output_model_mind"

# hyper parameters of user-defined network
hyper_parameters:
  # optimizer config
  optimizer:
    class: Adam
    learning_rate: 0.005

Consulte o guião /home/aistudio/recommend/model/mind/dygraph_model.py para uma implementação detalhada.

4. Treino do modelo

Execute o seguinte comando para iniciar o treino do modelo.

python -u trainer.py -m mind/config.yaml

Consulte /home/aistudio/recommend/model/trainer.py para obter o projeto de treino do modelo.

Passo 3. Teste do modelo

Esta etapa utiliza o conjunto de dados de teste para verificar o desempenho, como a taxa de recuperação do modelo treinado.

Durante o teste do modelo, todos os vectores de itens são carregados a partir do modelo e, em seguida, importados para Milvus, a base de dados de vectores de código aberto. Leia o conjunto de dados de teste através do script /home/aistudio/recommend/model/mind/mind_infer_reader.py. Carregue o modelo na etapa anterior e introduza o conjunto de dados de teste no modelo para obter quatro vectores de interesse do utilizador. Procurar os 50 vectores de itens mais semelhantes aos quatro vectores de interesse em Milvus. Pode recomendar os resultados devolvidos aos utilizadores.

Execute o seguinte comando para testar o modelo.

python -u infer.py -m mind/config.yaml -top_n 50

Durante o teste do modelo, o sistema fornece vários indicadores para avaliar a eficácia do modelo, tais como Recall@50, NDCG@50 e HitRate@50. Este artigo apenas apresenta a modificação de um parâmetro. No entanto, no seu próprio cenário de aplicação, é necessário treinar mais épocas para obter um melhor efeito do modelo. Também é possível melhorar a eficácia do modelo utilizando diferentes optimizadores, definindo diferentes taxas de aprendizagem e aumentando o número de rondas de teste. Recomenda-se que guarde vários modelos com efeitos diferentes e, em seguida, escolha o que tem o melhor desempenho e se adequa melhor à sua aplicação.

Passo 4. Geração de candidatos a itens de produtos

Para construir o serviço de geração de candidatos a produtos, este projeto utiliza o modelo treinado nos passos anteriores, emparelhado com o Milvus. Durante a geração de candidatos, o FASTAPI é utilizado para fornecer a interface. Quando o serviço é iniciado, é possível executar comandos diretamente no terminal através de curl.

Execute o seguinte comando para gerar candidatos preliminares.

uvicorn main:app

O serviço fornece quatro tipos de interfaces:

  • Inserir: Execute o seguinte comando para ler os vectores de itens do seu modelo e inseri-los numa coleção em Milvus.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/insert_data' \
  -H 'accept: application/json' \
  -d ''
  • Gerar candidatos preliminares: Introduza a sequência em que os produtos são clicados pelo utilizador e descubra o próximo produto em que o utilizador pode clicar. Também pode gerar candidatos a itens de produtos em lotes para vários utilizadores de uma só vez. hist_item no comando seguinte é um vetor bidimensional e cada linha representa uma sequência de produtos em que o utilizador clicou no passado. É possível definir o comprimento da sequência. Os resultados devolvidos são também conjuntos de vectores bidimensionais, cada linha representando os item ids devolvidos para os utilizadores.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/recall' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "top_k": 50,
  "hist_item": [[43,23,65,675,3456,8654,123454,54367,234561],[675,3456,8654,123454,76543,1234,9769,5670,65443,123098,34219,234098]]
}'
  • Consultar o número total de itens do produto: Execute o seguinte comando para retornar o número total de vetores de itens armazenados no banco de dados Milvus.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/count' \
  -H 'accept: application/json' \
  -d ''
  • Eliminar: Execute o seguinte comando para eliminar todos os dados armazenados na base de dados Milvus.
curl -X 'POST' \
  'http://127.0.0.1:8000/qa/drop' \
  -H 'accept: application/json' \
  -d ''

Se executar o serviço de geração de candidatos no seu servidor local, pode também aceder às interfaces acima referidas em 127.0.0.1:8000/docs. Pode experimentar clicando nas quatro interfaces e introduzindo os valores dos parâmetros. Em seguida, clique em "Try it out" para obter o resultado da recomendação.

6.png 6.png

7.png 7.png

Recapitulação

Este artigo centra-se principalmente na primeira fase da geração de candidatos na construção de um sistema de recomendação. Também fornece uma solução para acelerar este processo, combinando o Milvus com o algoritmo MIND e o PaddleRec e, por conseguinte, abordou a questão proposta no parágrafo inicial.

E se o sistema for extremamente lento a devolver resultados devido à enorme quantidade de conjuntos de dados? Milvus, a base de dados vetorial de código aberto, foi concebida para uma pesquisa de semelhanças extremamente rápida em conjuntos de dados vectoriais densos que contêm milhões, milhares de milhões ou mesmo triliões de vectores.

E se os dados recentemente inseridos não puderem ser processados em tempo real para pesquisa ou consulta? Pode utilizar o Milvus, uma vez que este suporta o processamento unificado de fluxos e lotes e permite-lhe pesquisar e consultar dados recentemente inseridos em tempo real. Além disso, o modelo MIND é capaz de converter o novo comportamento do utilizador em tempo real e inserir os vectores do utilizador no Milvus instantaneamente.

E se a implementação complicada for demasiado intimidante? PaddleRec, uma biblioteca poderosa que pertence ao ecossistema PaddlePaddle, pode fornecer-lhe uma solução integrada para implementar o seu sistema de recomendação ou outras aplicações de uma forma fácil e rápida.

Sobre o autor

Yunmei Li, engenheira de dados da Zilliz, licenciou-se em ciências informáticas na Universidade de Ciência e Tecnologia de Huazhong. Desde que se juntou à Zilliz, tem trabalhado na exploração de soluções para o projeto de código aberto Milvus e tem ajudado os utilizadores a aplicar o Milvus em cenários do mundo real. O seu foco principal é a PNL e os sistemas de recomendação, e gostaria de aprofundar ainda mais o seu foco nestas duas áreas. Gosta de passar tempo sozinha e de ler.

Está à procura de mais recursos?

Like the article? Spread the word

Continue Lendo