Cómo aprendimos a recomendar películas y por qué no debes confiar solo en las calificaciones



Imagine que quiere pasar la tarde viendo una película, pero no sabe cuál elegir. Los usuarios de Yandex a menudo se encuentran en la misma situación, por lo que nuestro equipo desarrolla recomendaciones que se pueden encontrar en Search y Air. Parece que esto es complicado: tomamos calificaciones de los usuarios, con su ayuda entrenamos el automóvil para encontrar películas que probablemente den 5 puntos, obtenemos una lista de películas listas para usar. Pero este enfoque no funciona. ¿Por qué? De eso es de lo que te hablaré hoy.

Un poco de historia. En 2006, Netflix lanzó el concurso de aprendizaje automático Netflix Prize. Si de repente lo olvidó, la compañía aún no ha transmitido en Internet, sino que alquiló películas en DVD. Pero incluso entonces, era importante para ella predecir la calificación del usuario para recomendarle algo. Por lo tanto, la esencia de la competencia: predecir las calificaciones de los espectadores es un 10% mejor (según la métrica RMSE) que Cinematch, el sistema de recomendación de Netflix. Esta fue una de las primeras competiciones masivas de este tipo. El interés aumentó un enorme conjunto de datos (más de 100 millones de calificaciones), así como un premio de $ 1 millón.

La competencia terminó en 2009. Los equipos de BellKor's Pragmatic Chaos y The Ensemble llegaron a la meta con el mismo resultado (RMSE = 0.8567), pero The Ensemble ocupó el segundo lugar porque enviaron la solución 20 minutos más tarde que los competidores. Los resultados y el trabajo se pueden encontrar aquí . Pero lo más interesante es diferente. Si cree en las historias repetidas en conferencias especializadas, los algoritmos ganadores no aparecieron en producción en el servicio de transmisión de video que se lanzó pronto. No puedo hablar sobre los motivos de las decisiones de otras personas, pero les diré por qué hicimos lo mismo.

Valoración personal


Desde hace bastante tiempo, los usuarios de Yandex pueden calificar las películas que han visto. Y no solo en KinoPoisk, sino también en los resultados de búsqueda. Con el tiempo, hemos acumulado cientos de millones de estimaciones de decenas de millones de personas. En algún momento, decidimos usar estos datos para ayudar a los usuarios a comprender cuánto les gustaría una película. De hecho, resolvimos el mismo problema que en el concurso del Premio Netflix, es decir, predijimos qué calificación le daría el usuario a la película. En ese momento, las calificaciones de KinoPoisk e IMDB ya existían, que se construyeron sobre la base de las calificaciones de las personas. Creamos una calificación personal, por lo que decidimos usar una escala separada como porcentaje para evitar similitudes y confusión visual.



Por cierto, la necesidad de correlacionar la escala de puntos y el porcentaje es un dolor de cabeza independiente y no obvio, por lo que hablaré brevemente al respecto. Parece que para una escala de 10 puntos, tome el 10% para cada punto, y el punto está en el sombrero. Pero no. La razón es psicología y hábitos. Por ejemplo, desde el punto de vista de los usuarios, una calificación de 8/10 es mucho mejor que el 80%. ¿Cómo correlacionar esto? Con crowdsourcing! Y así lo hicimos: lanzamos la tarea en Tolok, en la que los tiradores describieron las expectativas de las películas con un cierto puntaje o porcentaje de calificación personal. En base a este marcado, seleccionamos una función que traduce la predicción de la puntuación de punto a porcentaje para que se mantengan las expectativas del usuario.

Ejemplos de misiones en Tolok


Es útil predecir las expectativas de la película, pero también sería bueno crear recomendaciones. Es decir, mostrarle inmediatamente a la persona una lista de buenas películas. En ese momento, muchos de ustedes podrían pensar: "Y clasifiquemos las películas que el usuario no ha visto por calificación personal". Nosotros también lo pensamos al principio. Pero luego tuve que resolver dos problemas.

Problema de la herramienta


Cuando un usuario busca una película en particular (o quiere alquilar un DVD específico), el servicio debe predecir la calificación de esta película en particular. Exactamente este problema se resolvió en el concurso del Premio Netflix, donde se utilizó la métrica RMSE. Pero las recomendaciones resuelven un problema diferente: no necesita adivinar la calificación, sino encontrar una película que eventualmente se verá. Y la métrica RMSE hace un mal trabajo en esto. Por ejemplo, la penalización por predecir una calificación de 2 en lugar de 1 es exactamente la misma que para 5 en lugar de 4. ¡Pero nuestro sistema nunca debería recomendar películas en las que el usuario ponga 2! Las métricas basadas en listas son mucho más adecuadas para esta tarea, como Precision @ K, Recall @ K, MRR o NDCG. No puedo evitar contarte un poco más sobre ellos (pero si no estás interesado en las métricas, solo omite el siguiente párrafo).

Comencemos con la métrica.MRR (rango recíproco medio). Veremos qué posición en el ranking será la película con la que el usuario interactuó (por ejemplo, visto o alabado) en el período de prueba. La métrica MRR es la posición inversa promediada por el usuario de dicha película. Es decirMRR=1|U|u=1|U|1ranku. Tal métrica, a diferencia de RMSE, evalúa la lista completa, pero, desafortunadamente, solo mira el primer elemento adivinado. Sin embargo, es fácil modificar la métrica para deshacerse de este inconveniente. Podemos calcular la suma de las posiciones inversas de todas las películas con las que interactuó el usuario. Esta métrica se llama Rango de golpe recíproco promedio. Esta métrica tiene en cuenta todas las películas adivinadas en el tema. Tenga en cuenta que la posición k en el pago recibe un peso de 1 / k para una película adivinada y un peso de 0 para otra película. A menudo, se usa 1 / log (k) en lugar de 1 / k: es más probable que esto se corresponda con la probabilidad de que el usuario se desplace a la posición k. El resultado es una métrica DCG (ganancia acumulada con descuento)DCG=1|U|u=1|U|pos=1Ngainposmax(1,log(pos)). Pero la contribución de diferentes usuarios a la métrica es diferente: para alguien adivinamos todas las películas, para alguien que no adivinamos nada. Por lo tanto, como regla, esta métrica está normalizada. Divida el DCG de cada usuario en el mejor DCG de clasificación para ese usuario. La métrica resultante se llama NDCG (ganancia acumulada descontada normalizada). Es ampliamente utilizado para evaluar la calidad de la clasificación.

Entonces, cada tarea tiene su propia métrica. Pero el siguiente problema no es tan obvio.

Problema de elección


Es bastante difícil de describir, pero lo intentaré. Resulta que las personas dan altas calificaciones no a las películas que suelen ver. Las obras maestras de películas raras, los clásicos, las obras de arte obtienen las mejores calificaciones, pero esto no detiene a las personas en la noche después del trabajo con el placer de ver una buena comedia, una nueva película de acción o una espectacular ópera espacial. Agregue a esto que los usuarios de Yandex no apreciaron todas las películas que habían visto alguna vez. Y si nos centramos solo en las calificaciones más altas, corremos el riesgo de obtener un feed de película recomendado que se verá lógico, los usuarios incluso pueden reconocer su calidad, pero al final no verán nada.

Por ejemplo, así es como se vería mi feed de películas si lo clasificáramos por calificación personal y no supiéramos nada sobre mis vistas en el pasado. Grandes peliculas. Pero no quiero revisarlos hoy.



Resulta que en las condiciones de calificaciones dispersas y la escasez de películas con altas calificaciones, vale la pena mirar no solo la calificación. Bueno, entonces entrenamos el auto para predecir la visualización de la película recomendada, y no la calificación. Parecería lógico, porque el usuario quiere esto. ¿Qué puede salir mal? El problema es que la cinta estará llena de películas, cada una de las cuales es bastante adecuada para un pasatiempo fácil en la noche, pero su calificación personal será baja. Los usuarios, por supuesto, prestarán atención al hecho de que no hay "obras maestras" en la cinta, lo que significa que la credibilidad de las recomendaciones se verá socavada, no verán lo que de otro modo verían.

Como resultado, llegamos a la comprensión de que se necesita un equilibrio entre los dos extremos. Es necesario entrenar la máquina para que se tenga en cuenta tanto el potencial de visualización como la percepción de la recomendación de una persona.

Cómo funcionan nuestras recomendaciones


Nuestro sistema es parte de la búsqueda, por lo que debemos elaborar recomendaciones muy rápidamente: el tiempo de respuesta del servicio debe ser inferior a 100 milisegundos. Por lo tanto, intentamos realizar tantas operaciones pesadas como sea posible sin conexión, en la etapa de preparación de datos. Todas las películas y usuarios en el sistema de recomendación están representados por perfiles (es importante no confundirlos con la cuenta), que incluyen claves de objetos, contadores e incrustaciones (en otras palabras, vectores en un espacio determinado). Los perfiles de películas se preparan todos los días en YT ( leídos como "Yt" ) y se cargan en la RAM de las máquinas que responden a las solicitudes. Pero con los usuarios, todo es un poco más complicado.

Todos los días también creamos el perfil de usuario principal en YT y lo enviamos a la tienda Yandex, desde donde puede obtener el perfil en un par de decenas de milisegundos. Pero los datos se vuelven obsoletos rápidamente si una persona mira y evalúa activamente el video. No es bueno si las recomendaciones comienzan a retrasarse. Por lo tanto, leemos el flujo de eventos del usuario y formamos la parte dinámica del perfil. Cuando una persona ingresa una solicitud, combinamos el perfil del repositorio con un perfil dinámico y obtenemos un perfil único, que puede retrasarse con respecto a la realidad por solo unos segundos.

Esto ocurre sin conexión (es decir, de antemano), y ahora pasamos directamente al tiempo de ejecución. Aquí el sistema de recomendación consta de dos pasos. Para clasificar la base de datos completa de películas durante demasiado tiempo, entonces, en el primer paso, simplemente seleccionamos varios cientos de candidatos, es decir, encontramos películas que pueden ser de interés para el espectador. Esto incluye tanto pinturas populares como aquellas cercanas al usuario en algunas incrustaciones. Hay varios algoritmos para encontrar rápidamente a los vecinos más cercanos, utilizamos HNSW (Hierarchical Navigable Small World). Con él, encontramos las películas más cercanas al usuario en solo unos pocos milisegundos.

En el segundo paso, extraemos características (a veces también se les llama factores) por películas, usuario y par de usuarios / películas y clasificamos a los candidatos usando CatBoost. Permítame recordarle: ya nos dimos cuenta de que necesitamos centrarnos no solo en las vistas, sino también en otras características de calidad de las recomendaciones, por lo que para la clasificación llegamos a una combinación de varios modelos CatBoost capacitados para varios objetivos.

Para encontrar candidatos, utilizamos incrustaciones de varias descomposiciones matriciales: desde la versión clásica de ALS, que predice la evaluación, hasta variaciones más complejas basadas en SVD ++. Como características para la clasificación, se utilizan tanto contadores de eventos de usuario simples como películas, CTR para varios eventos, así como modelos pre-entrenados más complejos. Por ejemplo, la predicción de ALS también actúa como una característica. Uno de los modelos más útiles es la red neuronal DSSM del Recomendador, de la que probablemente hablaré un poco más.

Recomendador DSSM


DSSM es una red neuronal de dos torres. Cada torre construye su propia incrustación, luego se considera la distancia del coseno entre las incrustaciones, este número es la salida de la red. Es decir, la red aprende a evaluar la proximidad de los objetos en las torres izquierda y derecha. Se utilizan redes neuronales similares, por ejemplo, en una búsqueda web para encontrar documentos relevantes para una consulta. Para la tarea de búsqueda, se envía una solicitud a una de las torres y un documento a la otra. Para nuestra red, el papel de la solicitud es desempeñado por el usuario, y las películas actúan como documentos.

La torre de la película construye incrustaciones basadas en los datos sobre la película: este es el título, la descripción, el género, el país, los actores, etc. Esta parte de la red es bastante similar a la de búsqueda. Sin embargo, para el espectador queremos usar su historia. Para hacer esto, agregamos la incorporación de películas de la historia con el desvanecimiento en el tiempo desde el momento del evento. Luego, además de la incrustación total, aplicamos varias capas de la red y, como resultado, obtenemos una incrustación de tamaño 400.



Si tiene en cuenta de inmediato todo el historial del usuario en la inserción, esto ralentizará en gran medida la capacitación. Por lo tanto, vamos al truco y aprendemos la red en dos etapas. Primero, aprenda el InnerDSSM más simple. En la entrada, recibe solo los últimos 50 eventos del historial del usuario sin dividirlos en tipos de eventos (vistas, calificaciones ...). Luego volvemos a entrenar el InnerDSSM resultante a lo largo del historial del usuario, pero con un desglose por tipos de eventos. Entonces obtenemos OuterDSSM, que se usa en tiempo de ejecución.

El uso de una red en tiempo de ejecución en la frente requiere muchos recursos informáticos. Por lo tanto, guardamos las incrustaciones de la torre de películas en la base de datos, y las incrustaciones de acuerdo con el historial del usuario se actualizan casi en tiempo real. Por lo tanto, durante el procesamiento de la solicitud, debe aplicar solo una pequeña parte de OuterDSSM y calcular los cosenos, esto no lleva mucho tiempo.

Conclusión


Ahora nuestras recomendaciones ya están disponibles en nuestra búsqueda (por ejemplo, por solicitud [qué ver] ), en el servicio Yandex.Air, y también se usa una versión adaptada de esta tecnología en Yandex.Stations. Pero esto no significa que podamos relajarnos. Capacitamos constantemente nuevos modelos, aplicamos más y más datos, probamos nuevos enfoques de capacitación y nuevas métricas de calidad. En mi opinión, cuanto más antigua es el área, más difícil es desarrollarla. Pero este es el principal interés para los especialistas.

All Articles