Llegamos a ustedes gracias a:



Reportajes y análisis

Aprendizaje automático: Cómo crear un motor de recomendación

[10/09/2018] ¿Qué tienen que ver los trols rusos, Facebook y las elecciones de EE.UU. con el aprendizaje automático? Los motores de recomendaciones están en el corazón del bucle de retroalimentación central de las redes sociales y del contenido generado por el usuario (UGC, por sus siglas en inglés). Los usuarios se unen a la red y se enganchan con los usuarios y contenido recomendados. Los motores de recomendación se pueden programar porque amplifican los efectos de las burbujas de pensamiento. Las elecciones presidenciales del 2016 en los Estados Unidos mostraron la importancia de comprender cómo funcionan los motores de recomendaciones, y las limitaciones y fortalezas que ofrecen.

Los sistemas basados en inteligencia artificial (IA) no son una panacea que solo crea cosas buenas; más bien, ofrecen un conjunto de capacidades. Puede ser increíblemente útil obtener una recomendación de producto adecuada en un sitio de compras, pero puede ser igualmente frustrante obtener contenido recomendado que más tarde resulta ser falso (tal vez generado por una potencia extranjera motivada para sembrar la discordia en su país).

Este capítulo del libro "Pragmatic AI" cubre los motores de recomendaciones y el procesamiento del lenguaje natural (NLP, por sus siglas en inglés), tanto desde un nivel alto como desde un nivel de codificación. También proporciona ejemplos de cómo usar frameworks, el motor de recomendación basado en Python Surprise, así como instrucciones sobre cómo construir uno propio. Algunos de los temas tratados incluyen el premio Netflix, la descomposición de valores singulares (SVD, por sus siglas en inglés), filtrado colaborativo, problemas del mundo real con motores de recomendaciones, PNL y análisis del sentimiento de producción utilizando APIs en la nube.

El premio Netflix no se implementó en producción

Antes de que la "ciencia de los datos" fuera un término común y Kaggle estuviera presente, el premio Netflix sorprendió al mundo. El premio Netflix fue un concurso creado para mejorar la recomendación de nuevas películas. Muchas de las ideas originales del concurso se convirtieron luego en inspiración para otras compañías y productos. La creación de un concurso de ciencia de datos de un millón de dólares en el 2006 provocó una emoción que prefiguraría la edad actual de la IA. En el 2006, irónicamente, la era de la informática en la nube también comenzó con el lanzamiento de Amazon EC2.

La nube y el amanecer de la IA generalizada se han entrelazado. Netflix también ha sido uno de los mayores usuarios de la nube pública a través de Amazon Web Services. A pesar de todas estas interesantes notas históricas al pie de página, el algoritmo ganador del premio Netflix nunca se implementó en la producción. Los ganadores en el 2009, el equipo Pragmatic Chaos de BellKor, logró una mejora de más del 10% con un RMS de prueba de 0,867. El documento del equipo, ProgressPrize2008_BellKor.pdf, describe que la solución es una combinación lineal de más de cien resultados. Una cita en el documento, que es particularmente relevante, es la que dice: "Una lección aquí es que tener muchos modelos es útil para los resultados incrementales necesarios con el fin de ganar competiciones, pero en la práctica, se pueden construir sistemas excelentes con solo unos pocos modelos bien seleccionados".

El enfoque ganador para la competencia de Netflix no se implementó en su producción porque la complejidad de ingeniería se consideró demasiado grande en comparación con las ganancias producidas. Un algoritmo central utilizado en las recomendaciones, SVD, como se señala en "SVD rápida para matrices de gran escala", "aunque es factible para pequeños conjuntos de datos o procesamiento fuera de línea, muchas aplicaciones modernas implican aprendizaje en tiempo real y/o dimensionalidad y tamaño de conjunto de datos masivos. En la práctica, este es uno de los grandes desafíos del aprendizaje automático de producción: el tiempo y los recursos computacionales necesarios para producir resultados.

Tuve una experiencia similar al construir motores de recomendaciones en las empresas. Cuando un algoritmo se ejecuta por lotes, y es simple, puede generar recomendaciones útiles. Pero si se adopta un enfoque más complejo, o si los requisitos van de lote a tiempo real, la complejidad de ponerlo en producción y/o mantenerlo explota. La lección aquí es que lo más simple es mejor: elegir hacer un aprendizaje automático basado en lotes versus en tiempo real. O elegir un modelo simple versus un conjunto de técnicas múltiples. Además, decida si tiene sentido llamar a una API de motor de recomendación, o crear la solución usted mismo.

Conceptos clave en sistemas de recomendaciones

La Figura 1 muestra un ciclo de retroalimentación de recomendaciones de red social. Cuantos más usuarios tiene un sistema, más contenido crea. Cuantos más contenidos se creen, más recomendaciones creará para nuevos contenidos. Este ciclo de retroalimentación, a su vez, impulsa a más usuarios y más contenido. Como se mencionó al comienzo de este capítulo, estas capacidades se pueden usar para las características positivas y negativas de una plataforma.

Figura 1: El circuito de retroalimentación de recomendaciones de red social.

Usando el marco Surprise en Python

Una forma de explorar los conceptos detrás de los motores de recomendaciones es usar el marco Surprise. Algunas de las cosas útiles sobre el marco son que tiene conjuntos de datos integrados: MovieLens y Jester, e incluye SVD y otros algoritmos comunes que incluyen medidas de similitud. También incluye herramientas para evaluar el rendimiento de las recomendaciones en forma de error cuadrático medio (RMSE, por sus siglas en inglés) y error absoluto medio (MAE, por sus siglas en inglés), así como también el tiempo que llevó entrenar al modelo.

Aquí hay un ejemplo de cómo se puede usar en una situación de pseudo producción ajustando uno de los ejemplos proporcionados.

Primero son las importaciones necesarias para cargar la biblioteca:

Aprendizaje automático

Se crea una función auxiliar para convertir identificadores en nombres:

Aprendizaje automático

Las similitudes se calculan entre los elementos:

Aprendizaje automático

Finalmente, se proporcionan diez recomendaciones, que son similares a otro ejemplo en este capítulo:

Aprendizaje automático
Aprendizaje automático

Al explorar este ejemplo, considere los problemas del mundo real, al implementar esto en producción. Aquí hay un ejemplo de una función API de pseudocódigo que se le podría pedir a alguien en su empresa:

Aprendizaje automático

Algunas preguntas que se debe hacer al implementar esto son: ¿Qué compensaciones está haciendo al escoger la parte superior de un grupo de selecciones versus solo una película? ¿Qué tan bien funcionará este algoritmo en un conjunto de datos muy grande? No hay respuestas correctas, pero estas son cosas que debe considerar al implementar motores de recomendaciones en producción.

Soluciones en la nube para sistemas de recomendaciones

Google Cloud Platform tiene un ejemplo de cómo usar el aprendizaje automático en Compute Engine para hacer recomendaciones de productos que vale la pena explorar. En el ejemplo, PySpark y el algoritmo ALS se usan junto con el SQL propietario de la nube. Amazon también tiene un ejemplo de cómo construir un motor de recomendación usando su plataforma, Spark y Elastic Map Reduce (EMR, por sus siglas en inglés).

En ambos casos, Spark se usa para aumentar el rendimiento del algoritmo al dividir el cálculo en un grupo de máquinas. Finalmente, AWS está presionando fuertemente a SageMaker, que puede hacer trabajos Spark distribuidos de forma nativa o hablar con un clúster de EMR.

Problemas de producción en el mundo real con las recomendaciones

La mayoría de los libros y artículos sobre recomendaciones se centran exclusivamente en los aspectos técnicos de los sistemas de recomendación. Este libro trata sobre el pragmatismo, por lo que hay algunos temas a mencionar cuando se trata de sistemas de recomendaciones. Algunos de estos temas se tratan en esta sección: rendimiento, ETL, experiencia del usuario (UX) y shills/bots.

Uno de los algoritmos más populares que se discute es O ( n_samples ^ 2 * n_features) o cuadrático. Esto significa que es muy difícil entrenar un modelo en tiempo real y obtener una solución óptima. Por lo tanto, la capacitación de un sistema de recomendación tendrá que realizarse como un trabajo por lotes en la mayoría de los casos, sin algunos trucos como usar una heurística codiciosa y/o crear solo un pequeño subconjunto de recomendaciones para usuarios activos, productos populares, etc.

Cuando creé un sistema de recomendaciones de seguimiento de usuario desde el principio para una red social, descubrí que muchos de estos problemas eran prioritarios. Entrenar el modelo llevó horas, por lo que la única solución realista era ejecutarlo todas las noches. Además, más tarde creé una copia en memoria de nuestros datos de entrenamiento, por lo que el algoritmo solo estaba vinculado a la CPU, no a la E/S.

El rendimiento no es una preocupación trivial en la creación de un sistema de recomendación de producción tanto a corto como a largo plazo. Es posible que el enfoque que usa inicialmente no se amplíe a medida que su empresa crece en usuarios y productos. Tal vez inicialmente, un Jupyter Notebook, Pandas y SciKit-Learn fueron aceptables cuando tenía 10 mil usuarios en su plataforma, pero puede resultar que no sea una solución escalable.

En cambio, un algoritmo de entrenamiento de máquinas de vectores de soporte basado en PySpark, puede mejorar drásticamente el rendimiento y disminuir el tiempo de mantenimiento. Y luego, una vez más, es posible que deba cambiar a chips dedicados al aprendizaje automático, como TPU o Nvidia Volta. Tener la capacidad de planificar esta capacidad sin dejar de hacer las soluciones de trabajo iniciales, es una habilidad crítica para implementar soluciones pragmáticas de IA que realmente lleguen a la producción.

Problemas de recomendaciones en el mundo real: Integración con API de producción

Descubrí muchos problemas del mundo real en la producción en emprendimientos que generan recomendaciones. Estos son problemas que no son tan discutidos en los libros de aprendizaje automático. Uno de esos problemas es el problema del arranque en frío. En los ejemplos que utilizan el marco Surprise, ya existe una base de datos masiva de "respuestas correctas". En el mundo real, tiene tan pocos usuarios o productos que no tiene sentido formar un modelo. ¿Qué puede hacer?

Una solución decente es hacer que la ruta del motor de recomendación siga tres fases. Para la primera fase, tome los usuarios, contenido o productos más populares y publíquelos como recomendación. A medida que se crea más UGC en la plataforma, para la fase dos, use la puntuación de similitud (sin entrenar un modelo). Aquí hay un código codificado a mano que he usado en producción un par de veces diferentes que hicieron justamente eso. Primero, tengo un puntaje de Tanimoto, o distancia de Jaccard, con otro nombre.

Aprendizaje automático

El siguiente es HBD: Here Be Dragons. Las relaciones del seguidor se descargan y se convierten en un marco de datos de Pandas.

Aprendizaje automático
Aprendizaje automático
Aprendizaje automático
Aprendizaje automático

Para usar esta API, debe interactuar con ella siguiendo esta secuencia:

Aprendizaje automático
Aprendizaje automático

Esta recomendación basada en la puntuación de similitud de "fase 2" con la implementación actual necesitaría ejecutarse como una API por lotes. Además, los pandas finalmente se encontrarán con algunos problemas de rendimiento a gran escala. Abandonarlo en algún momento por PySpark o Pandas on Ray será una buena jugada.

Para la "fase 3", finalmente es hora de sacar las armas grandes y usar algo como Surprise y/o PySpark para entrenar un modelo basado en SVD y descubrir la precisión del modelo. Sin embargo, en la primera parte de la historia de su compañía, ¿por qué preocuparse cuando hay poco o ningún valor en hacer un entrenamiento modelo de aprendizaje automático?

Otro problema de API de producción es cómo lidiar con las recomendaciones rechazadas. No hay nada más irritante para un usuario que seguir recibiendo recomendaciones de cosas que no quiere o que ya tiene. Entonces, es otro problema de producción que necesita ser resuelto.

Idealmente, se le da al usuario la capacidad de hacer clic en "no volver a mostrar" para obtener una lista de recomendaciones, o rápidamente su motor de recomendaciones se convierte en basura. Además, el usuario le está diciendo algo, entonces ¿por qué no tomar esa señal y volver a alimentarla en su modelo de motor de recomendaciones?

Cloud NLP y análisis de sentimiento

Los tres proveedores de servicios en la nube dominantes: Amazon Web Services (AWS), Google Cloud Platform (GCP) y Microsoft Azure, tienen motores NLP sólidos que se pueden llamar a través de una API. En esta sección, se explorarán ejemplos de PNL en las tres nubes. Además, se creará una línea de producción de IA del mundo real para el engranaje NLP en AWS utilizando tecnología sin servidor.

NLP en Microsoft Azure

Microsoft Cognitive Services tiene la API de análisis de texto que tiene detección de idioma, extracción de frase clave y análisis de sentimiento. En la Figura 2, el punto final se crea para que se puedan hacer llamadas a la API. Este ejemplo tiene una colección negativa de reseñas de películas del conjunto de datos de Ciencias de la computación de Cornell en las reseñas de películas, y lo usa para recorrer la API.

Figura 2: La API de Servicios Cognitivos de Microsoft Azure.
Aprendizaje automático

Primero, las importaciones se hacen en este primer bloque en Jupyter Notebook:

Aprendizaje automático

A continuación, se toma una clave API del entorno. Esta clave API se obtuvo de la consola que se muestra en la Figura 2 debajo de las claves de sección, y se exportó como una variable de entorno, por lo que no está codificada en código. Además, la URL de API de texto que se usará más adelante se asigna a una variable.

Aprendizaje automático

A continuación, una de las revisiones negativas está formateada de la manera que espera la API:

Aprendizaje automático

Se crea la estructura de datos con la siguiente forma:

Aprendizaje automático

Finalmente, la API análisis de sentimiento se usa para calificar los documentos individuales:

Aprendizaje automático

En este punto, los puntajes de retorno se pueden convertir en un marco de datos de Pandas para hacer algo de EDA. No es sorprendente que el valor mediano de los sentimientos para una revisión negativa sea 0.23 en una escala de 0 a 1, donde 1 es extremadamente positivo y 0 es extremadamente negativo:

Aprendizaje automático

Esto se explica adicionalmente haciendo un diagrama de densidad. La Figura 3 muestra la mayoría de los sentimientos altamente negativos.

Figura 3: una gráfica de densidad de puntuaciones de sentimiento.
Aprendizaje automático

NLP en Google Cloud Platform

Hay mucho que me gusta de la API de Google Cloud Natural Language. Una de las características convenientes de la API es que puede usarla de dos maneras diferentes: para analizar el sentimiento en una cadena, y también analizar el sentimiento de Google Cloud Storage. Google Cloud también tiene una herramienta de línea de comandos tremendamente poderosa que facilita la exploración de su API. Finalmente, tiene algunas APIs de IA fascinantes, algunas de las cuales serán exploradas en este capítulo: analizar el sentimiento, analizar entidades, analizar la sintaxis, analizar el sentimiento de la entidad y clasificar el contenido.

Explorando la API de Entidad

El uso de la API línea de comandos gcloud es una excelente manera de explorar lo que hace una de las API. En el ejemplo, se envía una frase a través de la línea de comando sobre LeBron James y Cleveland Cavaliers:

Aprendizaje automático
Aprendizaje automático

Una segunda forma de explorar la API es usar Python. Para obtener una clave API y autenticarse, debe seguir las instrucciones de Google. A continuación, inicie Jupyter Notebook en el mismo shell en el que se exporta la variable GOOGLE_APPLICATION_CREDENTIALS:

Aprendizaje automático

Una vez que se completa este proceso de autenticación, el resto es sencillo. Primero, se debe importar la API de Python. (Esto se puede instalar a través de pip si aún no lo está: instalación de pip -upgrade google-cloud-language).

Aprendizaje automático

A continuación, se envía una frase a la API y los metadatos de la entidad se devuelven con un análisis:

Aprendizaje automático

La salida tiene un aspecto similar a la versión de línea de comandos, pero vuelve como una lista de Python:

Aprendizaje automático
Aprendizaje automático

Algunas de las conclusiones son que esta API podría fusionarse fácilmente con algunas de las otras exploraciones hechas en el Capítulo 6, "Predicción de la influencia de los medios sociales en la NBA". No sería difícil imaginar la creación de una aplicación de IA que encontrara amplia información sobre personas influyentes en los medios sociales mediante el uso de estas APIs de NLP como punto de partida. Otra conclusión es que la línea de comandos que le otorgan las APIs GCP Cognitive es bastante poderosa.

Canalización de AI sin servidores de producción para NLP en AWS

Una cosa que hace bien AWS, quizá mejor que cualquiera de las tres grandes nubes, es facilitar la creación de aplicaciones de producción que sean fáciles de escribir y administrar. Una de sus innovaciones en el cambio de juego es AWS Lambda. Está disponible tanto para organizar engranajes como para servir puntos finales HTTP, como en el caso de cáliz. En la Figura 4, se describe un engranaje de producción del mundo real para crear una red NLP.

Figura 4: Una red NLP sin servidores de producción en AWS.
Aprendizaje automático

Para comenzar con el análisis de opinión de AWS, deben importarse algunas bibliotecas:

Aprendizaje automático

A continuación, se crea una prueba simple:

Aprendizaje automático

El resultado muestra un SentimentScore:

Aprendizaje automático

Ahora, en un ejemplo más realista, usaré el anterior "documento de reseñas de películas negativas" del ejemplo de Azure. El documento se lee en:

Aprendizaje automático

A continuación, se puntúa uno de los "documentos" (recuerde que cada línea es un documento de acuerdo con las APIs de NLP):

Aprendizaje automático

No sorprende que ese documento tuviera un puntaje de sentimiento negativo, ya que se calificó previamente de esta manera. Otra cosa interesante que puede hacer esta API es calificar todos los documentos dentro como un puntaje gigante. Básicamente, da el valor de sentimiento medio. Esto es lo que parece:

Aprendizaje automático

Una conclusión interesante es que la API de AWS tiene algunos trucos ocultos bajo la manga y tiene una molestia que falta en la API de Azure. En el ejemplo anterior de Azure, la salida de Seaborn mostraba que, de hecho, había una distribución bimodal, ya que a una minoría de comentarios les gustaba la película y a la mayoría no les gustaba la película. La manera en que AWS presenta los resultados como sumas "mixtas" es bastante agradable.

Lo único que queda por hacer es crear una aplicación de cáliz simple que tomará las entradas anotadas que están escritas en Dynamo y las atenderá. Esto es lo que parece:

Aprendizaje automático
Aprendizaje automático
Aprendizaje automático
Aprendizaje automático

Resumen

Si los datos son el nuevo petróleo, entonces UGC son los pozos de alquitrán de arena. Los pozos de alquitrán de arena han sido históricamente difíciles de convertir en oleoductos de producción, pero el aumento de los costos de energía y los avances en la tecnología han permitido que su extracción sea factible. Del mismo modo, las APIs de AI que salen de los proveedores de las tres grandes nubes han creado nuevos avances tecnológicos al examinar los "datos arenosos". Además, los precios de almacenamiento y computación han disminuido constantemente, lo que hace mucho más factible convertir el CGU en un activo para extraerle valor extra. Otra innovación que reduce el costo para procesar UGC es aceleradores de IA. Las mejoras masivas de paralelización de los chips ASIC como TPU, GPU y arreglos gráficos programables en campo (FPGA, por sus siglas en inglés) pueden hacer que algunos de los problemas de escala discutidos sean aún menos problemáticos.

Este capítulo mostró muchos ejemplos de cómo extraer valor de estos pozos de alquitrán, pero también hay riesgos y desventajas reales, como con los pozos reales de arena de alquitrán. Los circuitos de retroalimentación de UGC a IA pueden ser engañados y explotados de manera tal que crean consecuencias de escala global. Además, en un nivel mucho más práctico, hay consideraciones que considerar cuando los sistemas se ponen en marcha. Tan fácil como que la nube y las APIs de IA crean soluciones, las ventajas y desventajas reales no pueden abstraerse, como UX, el rendimiento y las implicaciones comerciales de las soluciones implementadas.