🚀 Prueba Zilliz Cloud, el Milvus completamente gestionado, gratis—¡experimenta un rendimiento 10 veces más rápido! Prueba Ahora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Aceleración de la generación de candidatos en sistemas de recomendación mediante Milvus emparejado con PaddlePaddle

Aceleración de la generación de candidatos en sistemas de recomendación mediante Milvus emparejado con PaddlePaddle

  • Scenarios
November 26, 2021
Yunmei

Si tiene experiencia en el desarrollo de un sistema de recomendación, es probable que haya sido víctima de al menos una de las siguientes situaciones:

  • El sistema es extremadamente lento a la hora de devolver resultados debido a la enorme cantidad de conjuntos de datos.
  • Los datos recién introducidos no se pueden procesar en tiempo real para realizar búsquedas o consultas.
  • El despliegue del sistema de recomendación es desalentador.

Este artículo pretende abordar los problemas mencionados anteriormente y proporcionar algunas ideas para usted mediante la introducción de un proyecto de sistema de recomendación de productos que utiliza Milvus, una base de datos vectorial de código abierto, emparejado con PaddlePaddle, una plataforma de aprendizaje profundo.

Este artículo describe brevemente el flujo de trabajo mínimo de un sistema de recomendación. A continuación, se presentan los principales componentes y los detalles de implementación de este proyecto.

El flujo de trabajo básico de un sistema de recomendación

Antes de adentrarnos en el proyecto, echemos un vistazo al flujo de trabajo básico de un sistema de recomendación. Un sistema de recomendación puede ofrecer resultados personalizados en función de los intereses y necesidades de cada usuario. Para hacer esas recomendaciones personalizadas, el sistema pasa por dos etapas: la generación de candidatos y la clasificación.

2.png 2.png

La primera etapa es la generación de candidatos, que devuelve los datos más relevantes o similares, como un producto o un vídeo que coincide con el perfil del usuario. Durante la generación de candidatos, el sistema compara el rasgo del usuario con los datos almacenados en su base de datos, y recupera aquellos similares. A continuación, durante la clasificación, el sistema puntúa y reordena los datos recuperados. Por último, los resultados que encabezan la lista se muestran a los usuarios.

En el caso de un sistema de recomendación de productos, primero compara el perfil del usuario con las características de los productos del inventario para filtrar una lista de productos que se ajusten a las necesidades del usuario. A continuación, el sistema puntúa los productos en función de su similitud con el perfil del usuario, los clasifica y, por último, devuelve al usuario los 10 mejores.

3.png 3.png

Arquitectura del sistema

El sistema de recomendación de productos de este proyecto utiliza tres componentes: MIND, PaddleRec y Milvus.

MIND

MIND, abreviatura de "Multi-Interest Network with Dynamic Routing for Recommendation at Tmall", es un algoritmo desarrollado por Alibaba Group. Antes de que se propusiera MIND, la mayoría de los modelos de inteligencia artificial predominantes para la recomendación utilizaban un único vector para representar los diversos intereses de un usuario. Sin embargo, un único vector dista mucho de ser suficiente para representar los intereses exactos de un usuario. Por ello, se propuso el algoritmo MIND para convertir los múltiples intereses de un usuario en varios vectores.

En concreto, MIND adopta una red multiinterés con enrutamiento dinámico para procesar los múltiples intereses de un usuario durante la fase de generación de candidatos. La red multiinterés es una capa del extractor multiinterés construida sobre un mecanismo de enrutamiento de cápsulas. Puede utilizarse para combinar los comportamientos pasados de un usuario con sus múltiples intereses, a fin de proporcionar un perfil de usuario preciso.

El siguiente diagrama ilustra la estructura de red de MIND.

4.png 4.png

Para representar los rasgos de los usuarios, MIND toma los comportamientos e intereses de los usuarios como datos de entrada y los introduce en la capa de incrustación para generar vectores de usuario, incluidos los vectores de intereses de usuario y los vectores de comportamiento de usuario. A continuación, los vectores de comportamiento de los usuarios se introducen en la capa de extracción de intereses múltiples para generar cápsulas de intereses de los usuarios. Tras concatenar las cápsulas de interés del usuario con las incrustaciones de comportamiento del usuario y utilizar varias capas ReLU para transformarlas, MIND genera varios vectores de representación del usuario. En este proyecto se ha definido que MIND producirá en última instancia cuatro vectores de representación del usuario.

Por otro lado, los rasgos del producto pasan por la capa de incrustación y se convierten en vectores de elementos dispersos. A continuación, cada vector de artículo pasa por una capa de agrupación para convertirse en un vector denso.

Cuando todos los datos se convierten en vectores, se introduce una capa adicional de atención a las etiquetas para guiar el proceso de entrenamiento.

PaddleRec

PaddleRec es una biblioteca de modelos de búsqueda a gran escala para la recomendación. Forma parte del ecosistema Baidu PaddlePaddle. PaddleRec tiene como objetivo proporcionar a los desarrolladores una solución integrada para construir un sistema de recomendación de una manera fácil y rápida.

5.png 5.png

Como se menciona en el párrafo inicial, los ingenieros que desarrollan sistemas de recomendación a menudo tienen que enfrentarse a los retos de una usabilidad deficiente y un despliegue complicado del sistema. Sin embargo, PaddleRec puede ayudar a los desarrolladores en los siguientes aspectos:

  • Facilidad de uso: PaddleRec es una librería de código abierto que encapsula varios modelos populares en la industria, incluyendo modelos para la generación de candidatos, ranking, reranking, multitarea y más. Con PaddleRec, puedes probar instantáneamente la eficacia del modelo y mejorar su eficiencia a través de la iteración. PaddleRec le ofrece una forma sencilla de entrenar modelos para sistemas distribuidos con un rendimiento excelente. Está optimizado para el procesamiento de datos a gran escala de vectores dispersos. Puedes escalar fácilmente PaddleRec horizontalmente y acelerar su velocidad de cálculo. Por lo tanto, puedes construir rápidamente entornos de entrenamiento en Kubernetes utilizando PaddleRec.

  • Soporte para el despliegue: PaddleRec proporciona soluciones de despliegue en línea para sus modelos. Los modelos están inmediatamente listos para su uso después de la formación, presentando flexibilidad y alta disponibilidad.

Milvus

Milvus es una base de datos vectorial con una arquitectura nativa en la nube. Es de código abierto en GitHub y puede utilizarse para almacenar, indexar y gestionar vectores de incrustación masiva generados por redes neuronales profundas y otros modelos de aprendizaje automático (ML). Milvus encapsula varias bibliotecas de búsqueda aproximada de vecinos más cercanos (RNA) de primera clase, como Faiss, NMSLIB y Annoy. También puede ampliar Milvus según sus necesidades. El servicio Milvus está altamente disponible y admite el procesamiento unificado por lotes y en flujo. Milvus se compromete a simplificar el proceso de gestión de datos no estructurados y a proporcionar una experiencia de usuario coherente en diferentes entornos de despliegue. Presenta las siguientes características

  • Alto rendimiento al realizar búsquedas vectoriales en conjuntos de datos masivos.

  • Una comunidad de desarrolladores que ofrece soporte multilingüe y una cadena de herramientas.

  • Escalabilidad en la nube y alta fiabilidad incluso en caso de interrupción.

  • Búsqueda híbrida lograda combinando el filtrado escalar con la búsqueda de similitud vectorial.

Milvus se utiliza para la búsqueda de similitud vectorial y la gestión de vectores en este proyecto porque puede resolver el problema de las actualizaciones frecuentes de datos manteniendo la estabilidad del sistema.

Implementación del sistema

Para construir el sistema de recomendación de productos en este proyecto, es necesario seguir los siguientes pasos:

  1. Procesamiento de datos
  2. Entrenamiento del modelo
  3. Prueba del modelo
  4. Generación de productos candidatos
    1. Almacenamiento de datos: los vectores de artículos se obtienen a través del modelo entrenado y se almacenan en Milvus.
    2. Búsqueda de datos: cuatro vectores de usuario generados por MIND se introducen en Milvus para la búsqueda de similitud de vectores.
    3. Clasificación de datos: cada uno de los cuatro vectores tiene sus propios vectores de artículos similares en top_k, y se clasifican cuatro conjuntos de vectores de top_k para obtener una lista final de los vectores más similares en top_k.

El código fuente de este proyecto está alojado en la plataforma Baidu AI Studio. A continuación se explica en detalle el código fuente de este proyecto.

Paso 1. Procesamiento de datos Procesamiento de datos

El conjunto de datos original procede del conjunto de datos de libros de Amazon proporcionado por ComiRec. Sin embargo, este proyecto utiliza los datos descargados y procesados por PaddleRec. Consulta el conjunto de datos AmazonBook en el proyecto PaddleRec para obtener más información.

Se espera que el conjunto de datos para el entrenamiento tenga el siguiente formato, en el que cada columna representa:

  • Uid: ID de usuario.
  • item_id: ID del producto en el que ha hecho clic el usuario.
  • Time: La marca de tiempo u orden de clic.

Se espera que el conjunto de datos para las pruebas tenga el siguiente formato, en el que cada columna representa:

  • Uid: ID de usuario.

  • hist_item: ID del elemento del producto en el comportamiento histórico de clics del usuario. Cuando hay varios hist_item, se ordenan según la marca de tiempo.

  • eval_item: La secuencia real en la que el usuario hace clic en los productos.

Paso 2. Entrenamiento del modelo Entrenamiento del modelo

El entrenamiento del modelo utiliza los datos procesados en el paso anterior y adopta el modelo de generación de candidatos, MIND, construido sobre PaddleRec.

1. Entrada del modelo

En dygraph_model.py, ejecuta el siguiente código para procesar los datos y convertirlos en entrada del modelo. Este proceso ordena los elementos pulsados por el mismo usuario en los datos originales según la marca de tiempo, y los combina para formar una secuencia. A continuación, selecciona aleatoriamente un item``_``id de la secuencia como target_item, y extrae los 10 elementos anteriores a target_item como hist_item para la entrada del modelo. Si la secuencia no es lo suficientemente larga, puede establecerse como 0. seq_len debe ser la longitud real de la secuencia 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 el script /home/aistudio/recommend/model/mind/mind_reader.py para ver el código de lectura del conjunto de datos original.

2. Red de modelos

El siguiente código es un extracto de net.py. class Mind_Capsual_Layer define la capa extractora multi-interés construida sobre el mecanismo de enrutamiento de cápsulas de interés. La función label_aware_attention() implementa la técnica de atención consciente de etiquetas en el algoritmo MIND. La función forward() en class MindLayer modela las características del usuario y genera los vectores de peso correspondientes.

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

Consulte el script /home/aistudio/recommend/model/mind/net.py para conocer la estructura de red específica de MIND.

3. Optimización del modelo

Este proyecto utiliza el algoritmo Adam como optimizador del 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

Además, PaddleRec escribe los hiperparámetros en config.yaml, por lo que basta con modificar este archivo para ver una comparación clara entre la eficacia de los dos modelos para mejorar la eficiencia del modelo. Al entrenar el modelo, el pobre efecto del modelo puede ser el resultado de un ajuste insuficiente o excesivo del modelo. Por lo tanto, puede mejorarlo modificando el número de rondas de entrenamiento. En este proyecto, sólo necesita cambiar el parámetro epochs en config.yaml para encontrar el número perfecto de rondas de entrenamiento. Además, también puedes cambiar el optimizador del modelo, optimizer.class,o learning_rate para depuración. A continuación se muestra parte de los parámetros en 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 el script /home/aistudio/recommend/model/mind/dygraph_model.py para una implementación detallada.

4. Entrenamiento del modelo

Ejecute el siguiente comando para iniciar el entrenamiento del modelo.

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

Consulte /home/aistudio/recommend/model/trainer.py para el proyecto de entrenamiento del modelo.

Paso 3. Prueba del modelo Prueba del modelo

En este paso se utiliza un conjunto de datos de prueba para verificar el rendimiento del modelo entrenado, como la tasa de recuperación.

Durante la prueba del modelo, todos los vectores de ítems se cargan desde el modelo y luego se importan a Milvus, la base de datos de vectores de código abierto. Lea el conjunto de datos de prueba a través del script /home/aistudio/recommend/model/mind/mind_infer_reader.py. Cargar el modelo en el paso anterior, e introducir el conjunto de datos de prueba en el modelo para obtener cuatro vectores de interés del usuario. Busque los 50 vectores de elementos más similares a los cuatro vectores de interés en Milvus. Puede recomendar los resultados obtenidos a los usuarios.

Ejecute el siguiente comando para probar el modelo.

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

Durante la prueba del modelo, el sistema proporciona varios indicadores para evaluar la eficacia del modelo, como Recall@50, NDCG@50 y HitRate@50. En este artículo sólo se presenta la modificación de un parámetro. Sin embargo, en su propio escenario de aplicación, necesitará entrenar más épocas para mejorar el efecto del modelo. También puede mejorar la efectividad del modelo utilizando diferentes optimizadores, estableciendo diferentes tasas de aprendizaje y aumentando el número de rondas de pruebas. Se recomienda que guarde varios modelos con diferentes efectos, y luego elija el que tenga el mejor rendimiento y se adapte mejor a su aplicación.

Paso 4. Generación de candidatos a producto

Para construir el servicio de generación de candidatos a producto, este proyecto utiliza el modelo entrenado en los pasos anteriores, emparejado con Milvus. Durante la generación de candidatos, se utiliza FASTAPI para proporcionar la interfaz. Cuando se inicia el servicio, puede ejecutar directamente comandos en el terminal a través de curl.

Ejecute el siguiente comando para generar candidatos preliminares.

uvicorn main:app

El servicio proporciona cuatro tipos de interfaces:

  • Insertar: Ejecute el siguiente comando para leer los vectores de elementos de su modelo e insertarlos en una colección en Milvus.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/insert_data' \
  -H 'accept: application/json' \
  -d ''
  • Generar candidatos preliminares: Introduzca la secuencia en la que el usuario hace clic en los productos y descubra el siguiente producto en el que el usuario puede hacer clic. También puede generar candidatos a productos en lotes para varios usuarios a la vez. hist_item en el siguiente comando es un vector bidimensional, y cada fila representa una secuencia de los productos que el usuario ha pulsado en el pasado. Se puede definir la longitud de la secuencia. Los resultados devueltos son también conjuntos de vectores bidimensionales, y cada fila representa los item ids devueltos por los usuarios.
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 el número total de artículos: Ejecute el siguiente comando para devolver el número total de vectores de artículos almacenados en la base de datos de Milvus.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/count' \
  -H 'accept: application/json' \
  -d ''
  • Borrar: Ejecute el siguiente comando para eliminar todos los datos almacenados en la base de datos de Milvus .
curl -X 'POST' \
  'http://127.0.0.1:8000/qa/drop' \
  -H 'accept: application/json' \
  -d ''

Si ejecuta el servicio de generación de candidatos en su servidor local, también puede acceder a las interfaces anteriores en 127.0.0.1:8000/docs. Puede jugar haciendo clic en las cuatro interfaces e introduciendo el valor de los parámetros. A continuación, haga clic en "Probar" para obtener el resultado de la recomendación.

6.png 6.png

7.png 7.png

Recapitulación

Este artículo se centra principalmente en la primera etapa de generación de candidatos en la construcción de un sistema de recomendación. También proporciona una solución para acelerar este proceso combinando Milvus con el algoritmo MIND y PaddleRec y, por lo tanto, ha abordado la cuestión propuesta en el párrafo inicial.

¿Qué ocurre si el sistema es extremadamente lento a la hora de devolver resultados debido a la enorme cantidad de conjuntos de datos? Milvus, la base de datos vectorial de código abierto, está diseñada para una búsqueda de similitudes rapidísima en conjuntos de datos vectoriales densos que contienen millones, miles de millones o incluso billones de vectores.

¿Y si los datos recién insertados no pueden procesarse en tiempo real para su búsqueda o consulta? Puede utilizar Milvus, ya que admite el procesamiento unificado por lotes y por flujos y le permite buscar y consultar datos recién insertados en tiempo real. Además, el modelo MIND es capaz de convertir nuevos comportamientos de usuario en tiempo real e insertar los vectores de usuario en Milvus instantáneamente.

¿Y si el complicado despliegue resulta demasiado intimidante? PaddleRec, una potente librería que pertenece al ecosistema PaddlePaddle, puede proporcionarte una solución integrada para desplegar tu sistema de recomendación u otras aplicaciones de forma fácil y rápida.

Sobre el autor

Yunmei Li, Ingeniero de Datos de Zilliz, se licenció en Informática por la Universidad de Ciencia y Tecnología de Huazhong. Desde que se unió a Zilliz, ha estado trabajando en la exploración de soluciones para el proyecto de código abierto Milvus y ayudando a los usuarios a aplicar Milvus en escenarios del mundo real. Su principal interés se centra en la PNL y los sistemas de recomendación, y le gustaría profundizar aún más en estas dos áreas. Le gusta pasar tiempo a solas y leer.

¿Buscas más recursos?

Like the article? Spread the word

Sigue Leyendo