En Parte 1Te presenté el reto de las recomendaciones personalizadas de recetas en Cookidoo y cubrió el Selección de modelos fase. Este artículo aborda la Selección de candidatos y Puntuación y clasificación componentes de nuestro sistema de recomendación. Les mostraré algunos de los retos a los que nos enfrentamos, las decisiones que tomamos y las lecciones que aprendimos al crear la primera iteración de nuestro sistema de recomendación de recetas. Al final, compartiré algunos de los pasos que hemos planeado para futuras mejoras de nuestro sistema de recomendación de recetas para Cookidoo.
Selección de candidatos
Obsérvese la diferencia entre Selección de candidatos y el Selección de datos de entrenamiento fase. En la primera, excluimos los elementos que no queremos que influyan en nuestra formación (véase, Selección de datos de entrenamiento - Global vs. Local en la Parte 1). En este último caso, filtramos los artículos que queremos incluir en el entrenamiento del algoritmo pero que no queremos recomendar a un usuario concreto o en un momento determinado. Otra razón para incluir un componente de selección de candidatos podría ser que su catálogo de artículos es demasiado grande para ser puntuado en su totalidad. En este caso, puede entrenar modelos de selección de candidatos que sean más baratos de puntuar para preseleccionar artículos. Este sistema en dos fases se describe a menudo en blogs y artículos de grandes empresas de plataformas (por ejemplo, Pinterest, Instagram, Netflix). En nuestro caso, basta con unas simples reglas de filtrado para reducir el conjunto de elementos candidatos; no es necesario mantener otro modelo de aprendizaje automático.
El grado en que se emplean reglas de filtrado sencillas y lógica empresarial en los sistemas de recomendación suele sorprender a los recién llegados a este campo. Además, los blogs y los artículos no suelen describir la lógica empresarial de sus aplicaciones (quizá porque requieren un profundo conocimiento del dominio o porque los sistemas basados en reglas no son lo "suficientemente guays"). Sin embargo, para que se haga una idea, aquí tiene algunos de los filtros y heurísticas cruciales que empleamos:
- Filtrar recetas para diferentes franjas de recetas
- Excluir recetas que el usuario ya ha cocinado
- Excluir las recetas fuera de temporada
- Excluir recetas que no se ajusten a la configuración regional preferida del usuario, por ejemplo, para evitar una mala experiencia del usuario causada por un sistema de medición diferente.
- Excluir las recetas que nos parecen "demasiado aburridas" para recomendarlas, por ejemplo, los huevos cocidos o las cebollas picadas.
- Introducir cierta aleatoriedad en los resultados para aumentar la variedad de recetas recomendadas a lo largo del tiempo.
Profundicemos un poco más en los tres primeros:
Filtra las recetas para diferentes franjas de recetas: Presentamos las recetas al usuario en diferentes franjas temáticas. En la captura de pantalla anterior, puedes ver un ejemplo de página "Para ti" para un usuario con recetas agrupadas temáticamente en diferentes franjas de recetas (debido a las mejoras constantes, la localización y las pruebas A/B en curso, tu Cookidoo podría tener un aspecto diferente). Por ahora, la selección de recetas candidatas para estas franjas sigue reglas de filtrado sobre metadatos de recetas como categorías, valoraciones y etiquetas. Estas reglas van desde simples filtros en categorías, como en la categoría de postres para producir la franja "Süßes für dich" (en español "Postres para ti"), a una lógica de negocio más compleja como para la franja "Easy Alltagsrezepte für dich" (en español "Recetas de todos los días para ti"). Esta última requiere un sistema heurístico más amplio para clasificar las recetas sencillas para las sesiones de cocina diarias.
Excluir recetas que el usuario ya ha cocinado: Filtramos las recetas que el usuario ya ha cocinado porque queremos que nuestras recomendaciones de recetas inspiren a los usuarios a probar algo nuevo. Idealmente, el usuario acude a nuestras recomendaciones para descubrir recetas que son a su gusto, ajustarse a su presupuesto de tiempoy al mismo tiempo son nuevos para ellos - algo que no habrían buscado por su cuenta.1
Excluya las recetas que estén fuera de temporada: También filtramos las recetas en función de la época del año. La cocina es muy estacional debido a las preferencias de los usuarios y a la disponibilidad de ingredientes. Por ejemplo, los usuarios de Alemania solo cocinan platos que incluyan espárragos entre abril y junio (compara El ritmo de los alimentos - Espárragos), y recetas como el helado hecho por uno mismo, las sopas frías y los cócteles se cocinan sobre todo en verano. Sin excluir estas recetas de las candidatas a recomendación, nuestro modelo podría recomendar recetas que podrían ajustarse al gusto del usuario, pero no a la temporada ni a la disponibilidad de ingredientes.
Puntuación y clasificación
Consideraciones sobre el rendimiento
Los retos de las fases de puntuación y clasificación son principalmente de ingeniería. Para obtener una lista clasificada de las mejores recetas por usuario, utilizamos el modelo entrenado para puntuar los elementos candidatos de la fase anterior y clasificarlos en consecuencia. La puntuación se obtiene multiplicando la incrustación del usuario por la incrustación de la receta de todas las recetas candidatas y clasificándolas por la puntuación resultante. Cuando un usuario entra en Cookidoo, ejecutar este paso en tiempo real puede llevar un tiempo prohibitivo si se implementa de forma ingenua. Hemos considerado varias opciones para afrontar este reto:
- Utilizando una base de datos como ElasticSearch o un índice de búsqueda aproximado de vecinos más próximos como Molestar o Faiss recuperar resultados (aproximados) lo suficientemente rápido como para puntuar en directo
- Reducir aún más el número de candidatos a puntuar en el Selección de candidatos construir un segundo modelo de puntuación más rápido para preseleccionar los elementos relevantes para la puntuación en directo.
- Evitar la puntuación en directo calculando previamente un conjunto de recomendaciones por usuario y almacenándolas en una base de datos para un acceso rápido.
La opción de precalcular las recomendaciones no ofrece la mayor flexibilidad, pero era la más razonable de aplicar desde el punto de vista de la relación coste-beneficio. Dado que la mayoría de nuestros usuarios sólo cocinan una vez al día, una mayor frecuencia de actualización de nuestras recomendaciones no beneficiaría a los usuarios.2
También tiene otras ventajas:
- No tenemos que preocuparnos en absoluto por la velocidad en el momento de la inferencia porque todo lo que hacemos es una simple búsqueda en la base de datos
- Podemos precalcular fácilmente diferentes conjuntos de recomendaciones por usuario y realizar pruebas A/B con ellos.
La implementación es sencilla: tenemos un trabajo diario en AWS Batch que calcula las principales recomendaciones de los usuarios y las guarda en DynamoDB. Cada vez que un usuario inicia sesión en Cookidoo, recibimos una solicitud de API y buscamos las recomendaciones del usuario.
La actualidad importa
La forma en que creamos las puntuaciones a partir de las incrustaciones de nuestro algoritmo de factorización matricial es un poco atípica. Nos enfrentábamos al reto de que las recomendaciones no variaran mucho con el tiempo, es decir, aunque los usuarios cocinaran nuevas recetas, sus recomendaciones no cambiarían mucho en función de estas nuevas interacciones.
Para abordar este problema, decidimos ignorar las incrustaciones de usuario aprendidas por el modelo y construir nuevas incrustaciones de usuario promediando las incrustaciones de receta de la última muestra aleatoria del usuario. t interacciones culinarias. De este modo, las incrustaciones de usuario reflejan el comportamiento más reciente del usuario en lugar de incluir todo el historial de sus interacciones culinarias. Al mismo tiempo, podemos seguir entrenando las incrustaciones de recetas con el conjunto completo de datos históricos. Además, este enfoque requiere una menor frecuencia de entrenamiento, ya que las nuevas incrustaciones de usuario pueden actualizarse sin necesidad de volver a entrenar o entrenar parcialmente el modelo.
Este cambio en la lógica de puntuación fue fácil de implementar y hemos visto mejoras interesantes en las pruebas A/B y posteriormente en producción para todos nuestros usuarios.3
Hacia dónde queremos ir
Los pasos futuros de nuestro equipo giran en torno a la mejora de las recomendaciones para los usuarios de Cookidoo y el aumento de nuestra capacidad de pruebas en línea. Construir la primera iteración de nuestro sistema de recomendación en producción fue un reto de ingeniería considerable. Nos esforzamos mucho en integrar nuestro sistema integral con la plataforma general y en crear un excelente canal de CI/CD para permitir una iteración rápida. Con esta base firme, podemos centrarnos en mejorar nuestro algoritmo. También nos gustaría aumentar constantemente la velocidad de iteración desde la idea hasta la prueba de usuario. Creemos que la iteración rápida es clave para crear productos que gusten a los usuarios. Optimización de la velocidad de iteración.
En cuanto a los algoritmos, tenemos muchos retos e ideas pendientes; algunos ejemplos:
- Mejorar la diversidad de las recomendaciones para ayudar al usuario a disfrutar de toda la gama de recetas disponibles en Cookidoo.
- Probar más temas para nuestras Recipe Stripes y personalizar la composición del sitio por usuario
- Empezamos a experimentar con arquitecturas de Deep Learning como Two Tower Networks o Redes profundas y cruzadaspero es demasiado pronto para hablar de mejoras
- Recomendaciones calibradasEl nicho de gustos de un usuario es esencial y no debe ser desplazado por nuestro sistema de recomendación. Estamos pensando en implantar algo parecido al Recomendaciones calibradas de Harald Steck (si tienes experiencia con recomendaciones calibradas en producción, me encantaría conocer tu opinión).
- Recomendaciones para una alimentación sana¿Cómo puede Cookidoo ayudar a los usuarios a alcanzar sus objetivos de alimentación saludable? ¿Qué papel desempeña el sistema de recomendación en estos objetivos? ¿Cómo podemos hacer ajustes hacia una alimentación sana sin ser demasiado paternalistas al respecto?
Resumen
Espero que hayas aprendido algo nuevo de nuestra experiencia con la creación de un sistema de recomendación de recetas para Cookidoo. Por supuesto, hay muchos temas que no he tocado, especialmente cuestiones más pesadas de ingeniería en torno a la arquitectura de la nube, el despliegue y garantizar el cumplimiento de GDPR. Tal vez continuaremos esta serie con más entradas de blog en el futuro y seguiremos con nuestros aprendizajes de la arquitectura, despliegue y pruebas de sistemas de recomendación.
Si tienes algún comentario o quieres hablar de alguno de los temas mencionados, no dudes en ponerte en contacto conmigo a través de Twitter o LinkedIn.
Agradecimientos
Soy yo quien pone esto por escrito, pero todo lo que he escrito lo he puesto en práctica con un equipo fantástico: Bora Kiliclar, Stephan Geuter, Andreas Hausmann, Carsten Böhm, Michael Gehring, Felix Althammer, Stefan Schaub, León Luithlen
Disfruto enormemente enfrentándome a todo tipo de retos con el increíble equipo de Vorwerk Elektrowerke GmbH & Co. KG y Alexander Thamm GmbH. Si a usted también le entusiasman estos retos y quiere trabajar con nosotros, eche un vistazo al puestos vacantes en Vorwerk y puestos vacantes en Alexander Thamm.
- En la literatura sobre recomendación de recetas, esta última parte se denomina serendipity. No medimos ni optimizamos explícitamente la serendipia, pero filtrar las recetas ya cocinadas es un paso fácil en esa dirección.
- El aprendizaje automático en tiempo real puede ser un problema difícil de resolver. Chip Huyen y Eugene Yan escribieron grandes artículos sobre el problema: El aprendizaje automático en tiempo real, Aprendizaje automático en tiempo real: retos y soluciones, Aprendizaje automático en tiempo real para recomendaciones
- Por supuesto, hay otras formas de garantizar la recurrencia, por ejemplo, reduciendo las puntuaciones de interacción antes del entrenamiento o entrenando un modelo de recomendación basado en secuencias independiente como GRU4Rec.
0 comentarios