Juanjo Coello

Software Developer & Perpetual Wannabe
I tweet stuff at @jjcoellov

Beers & Talk (I) - Toni Cebrián

Hace un par de días tuve la oportunidad de charlar un rato - birras mediante - con Toni Cebrián (@tonicebrian), que aparte de ser un auténtico crack de Telefónica I+D trabajando ahora mismo con temas de Machine Learning y Sistemas de Recomendación en Tuenti, es mi compañero de equipo de fútbol sala. A continuación dejo algunos temas de los que estuvimos hablando que seguro que a muchos les resultarán interesantes.

(Toni tiene un blog que es la caña: http://www.tonicebrian.com/ y - cómo no - cuenta en GitHub: https://github.com/tonicebrian)

Nombre y Rango, soldado.

Soy Toni Cebrián, y soy especialista en Telefónica I+D

¿Qué estudiaste?

Estudié Ingeniería Técnica Telecomunicaciones, especialidad de Sistemas Electrónicos, porque me quería dedicar a Energías Renovables. Lo que pasa es que al final se me cruzó en medio un profesor que me hizo hacer un proyecto relacionado con Redes Neuronales y SVM, y me gustó tanto el tema que terminé re-enfocando mi carrera, olvidándome de transistores, circuitos y demás para dedicarme a la Informática, el Data Mining y similares.

¿Qué es SVM?

Son las siglas de Support Vector Machine, y es una técnica para hacer clasificación o regresión. En el año 99, que es cuando hice mi PFC, era algo muy novedoso, y este profesor me propuso hacer una comparativa entre redes neuronales y SVM para un problema de Farmacia que tenían, relacionado con la intoxicación por dixogina en tratamientos médicos. La dixogina es nociva a partir de cierta dosis, que no tiene un valor fijo sino que depende de varios factores como la edad, sexo o la constitución física. La idea era utilizar una serie de métodos estadísticos para intentar inferir en función de tus características físicas si ibas a estar intoxicado por una dosis determinada. Hice la comparativa y la verdad es que salió bastante bien. De hecho gané un premio con 500 mil pelas de entonces, que era una pasta para un estudiante y para ser el año que corría.

¿Cuál ha sido tu carrera profesional?

Tras un breve trabajo al salir de la carrera, en el año 2000 entré en Telefónica I+D, pasando 2 años en Madrid. Los primeros 5 años fueron haciendo proyectos de TELCO clásicos: C++, Oracle, sistema de gestión de enrutadores, enlaces… básicamente CRUD para este tipo de cosas. Cuando volví a Barcelona ya me moví a más temas de análisis de datos y similares: data warehouse, business intelligence, etc. Mi primer proyecto fue analizar el Fotolog de Argentina, porque no se sabía si la gente volvía, cuántas visitas tenían, qué hacían… la idea era tener un dashboard de lo que pasaba. Luego pasé a cosas más relacionadas con Data Mining, Machine Learning, y fue cuando empecé a especializarme en Sistemas de Recomendación durante unos 3 o 4 años. En cierto momento, por una serie de razones se consideró que era una tecnología suficientemente madura como para ser comprada a algún vendor en el mercado, por lo que se paró esa línea de trabajo, y me empecé a dedicar a hacer cosas relacionadas con análisis de datos, en proyectos más pequeños.

Actualmente haces la rotación en Tuenti. ¿A qué te has dedicado?

Comencé con un proyecto de recomendación de vídeos, y ahora me dedico a otro proyecto relacionado con mejorar la búsqueda de usuarios, partiendo del sistema que hay actualmente, basado en recuperación de la información textual - con Sphinx - a uno que intenta utilizar además de esa búsqueda textual una ordenación basada en la proximidad en la red social, de tal forma que, por ejemplo, al buscar "María", en lugar de que aparezca cualquier María de la red, aparezcan la más cercanas a ti. Está actualmente en fase de evaluación/evolución, pero al haber un ciclo de desarrollo, despliegue y prueba, estoy a la vez haciendo otra tarea de data mining clásico, intentando descubrir los motivos por los que un usuario cuando entra en la red social, se mantiene activo - porque sube muchas fotos, crea mucho contenido, o habla con muchos amigos, por ejemplo.

¿Intentar establecer por qué un usuario es activo o no?

En efecto

¿A qué llevaría eso?

Si identificas que un usuario es activo porque por ejemplo sube muchas fotos, puedes intentar enfocarte en incentivar esa serie de comportamientos identificados como relevantes para el engagement de usuarios.

Hace poco nos diste una charla sobre proximidad en la red social. Cuéntanos un poco de qué trata.

Si utilizas una aproximación simple, como puede ser en cuántos saltos llegas de un usuario a otro y que podría ser una medida de proximidad válida, te das cuenta enseguida que una red social como Tuenti es muy compacta. De media, lo que se conoce como el diámetro de la red, está en 3 o 4 saltos - es decir, casi todos estamos a 3 o 4 amigos de distancia unos de otros. Eso no da una medida muy fiable para establecer la proximidad. ¿De qué se trata entonces? Se trata de intentar pensar en algo parecido a una "difusión de la influencia" de un usuario basándonos en otros criterios. Por ejemplo, un usuario con muchos contactos le daría poca importancia a todos ellos. Sin embargo, se podría asumir que un usuario con pocos contactos le da mucha importancia a los que están más próximos a él. Dicho de otra forma, si tienes mil amigos, todos ellos no son relevantes para discernir si son próximos a ti o no. En cambio, si solo tienes 5, se puede asumir que esos 5 son muchos más relevantes, a pesar de que en ambos casos la distancia es de tan solo un salto.

¿Cómo distingues la relevancia de la simple inactividad?

Actuamente no se toma en cuenta, pero podría hacerse. Por ahora se utilizan únicamente enlaces duros (en este caso amistad), pero se podrían construir enlaces inferidos, de tal forma que solo se conectan dos usuarios si cumplen una serie de requisitos, como por ejemplo un numero determinado de fotos en los que aparecen ambos etiquetados, o una serie de mensajes enviados en común.

¿Cuál es el mayor problema a la hora de implementarlo en Tuenti?

El mayor problema es no poder realizar una implementación directa, por el tamaño de la base de usuarios. Si por ejemplo se está definiendo una función de medida, que necesita a un usuario A y a un usuario B, y tienes millones de usuarios, terminas manejando una matriz de dimensiones enormes. Aún cuando puedas almacenanarla toda (con mucha capacidad de cómputo) te encontrarías con que no puedes acceder a toda esa información a la vez, porque no es factible. La otra opción es llevarlo a cabo a partir de aproximaciones matemáticas, que es lo que estamos haciendo ahora.

¿Y qué tal han ido?

Ahora mismo estamos haciendo esa aproximación usando el algoritmo Minhash y por lo pronto parece que va bien (aunque aún estamos en proceso de evaluación) Sin embargo, cabe destacar que todo esto es un proceso continuo, al cuál podrías dedicarle horas y horas de investigación. En algún momento, alguien te dirá que ya no te dediques a ello, pues el beneficio que podrías obtener de una mejor aproximación (por ejemplo de un 2%) no compensa un trabajo de 3 meses para conseguirlo. Es necesario llevar siempre un proceso algo ágil o lean, que te permita refinar los objetivos o el rumbo conforme se avanza.

¿Te consta que se esté haciendo algo similar en otro sitio?

Sí. Cuando estuvimos la etapa de research, vimos que se utiliza en muchos sitios: reconocimiento de imágenes, por ejemplo. Hay un paper de Google que lo utiliza para recomendar noticias, por lo que sí, se utiliza en otros sitios.

¿Está en voga?

Yo no diría que está en boga por ser algo muy específico de un nicho; no todos los sitios tienen un problema de estas dimensiones, ni tienen tantos usuarios o no tienen que encontrar similitudes entre usuarios.

Hace poco estuviste en unas conferencias en Japón.

Estuve en el Machine Learning Summer School. Las Summer School son unos eventos que ocurren dos o tres veces al año - aunque no sea verano - al que va gente sobre todo de Universidades a dar un curso enfocado en lo que están trabajando. El formato consiste en dar un curso de unas 3 o 4 horas muy específico en sus avances. Yo por ejemplo estuve 2 semanas y pude atender a cursos de unas 15 áreas de investigación diferentes, y hablar con ellos sobre lo que hacen. La idea no es ir allí esperando volver con algo que puedas aplicar directamente a tu trabajo diario, pero sí para tener una visión general de lo que está ocurriendo y los campos en los que se está avanzando. Si tienes suerte a lo mejor resulta que un método general puedes sacarle provecho en tu área de trabajo.

Hay entonces mucha variedad en los proyectos.

Si, porque no es un curso donde te dan una visión estructurada de la materia - es decir, no es un único curso de Machine Learning perfectamente articulado - sino una serie de tapas de muchas técnicas diferentes. Eso sí, cada una de ellas muy bien explicadas, presentadas normalmente por la persona que está tirando del carro en ese área en particular.

Me comentaste que te sorprendió ser el único asistente que no venía del mundo académico.

Sí. También me llamó la atención la motivación de los asistentes. Cuando haces un doctorado, en cierta forma te estás enfocando en una temática muy concreta, y en una área de especialización, pues el objetivo de tu doctorado es conseguir avanzar el "estado del arte" de la misma. Por esta razón entendía que para un doctorando lo mejor era ir a las conferencias especificas de su área de trabajo, pero luego al charlar con los asistentes me comentaron que su idea era ir allí para tener una visión general, y para ver si lo que de que se está hablando pueden reformular, aplicar, en su día a día. Por otra parte opino que si estás trabajando en algo relacionado con el tema, creo que puede serte de mucha utilidad asistir.

¿Cuáles son los mayores retos a los que se enfrenta el Machine Learning en general?

Es un campo muy grande. En general, la idea es tratar de replicar todas esas acciones en las que los humanos somos buenos y destacamos sobre las máquinas: lenguaje, visión, conceptualización (hay mucha investigación relacionada con hacer resúmenes de texto). Y también, en la también teórica del Machine Learning: qué cosas se pueden aprender y qué no, sabiendo de entrada la viabilidad al abordar un problema. Es un área de investigación interesante.

¿Y en sistemas de recomendación?

Algo que está muy en boga es el tema de la contextalización: tener en cuenta con quién estás, qué hora del día es, etc. Normalmente los sistemas de recomendación se han basado en el triplete <usuario, objeto, valoración>. Sin embargo, esa valoración podría ser dependiente de otras dimensiones basadas en el contexto - localización, estado de ánimo, etc. Poder inclusir esa contextualización a la hora de recomendar podría ser muy interesante. También se solía trabajar en dominios digitales - música, películas - y muy atómicos - una película es lo que es, una canción es lo que es. Ahora hay sistemas de recomendación muy interesantes por ejemplo de ropa (que no es mala o buena por si sola, sino combinadas con otras cosas)

Otra area de trabajo podría ser la de recomendadores especializados en auto aprendizajes. Por ejemplo: quiero un sistema que me enseñe a apreciar la opera. Podría recomendarme aprender armonía, un poco cultura, historia, tipos distintos... O por ejemplo, quiero aprender sobre sistemas de recomendación: que te sugiera aprender álgebra, estadísticas, cálculo… un sistema que en lugar de recomendarte una cosa, te recomiendo un camino. Es otra área que particularmente encuentro muy interesante.

¿Hay alguna relación entre Big Data y Machine Learning?

Realmente no la hay directamente; son campos ortogonales, que no tienen por qué ir juntos - puedes utilizar Big Data sin Machine Learning, y al contrario también, con un sistema de Machine Learning con datos que te caben en memoria. Sin embargo, y creo que cito a Peter Norvig, más datos vencen a mejores modelos: si eres capz de reunir muchos datos - y cuando hablo de muchos estoy hablando de Big Data - consigues mejores resultados con peores modelos. Por tanto esa es la relación, si tiene Big Data, peores modelos de Machine Learing producen mejores resultados.

Me interesa el tema, ¿por donde comienzo?

Lo típico es hacer un master, una carrara relacionada con el tema. Pero por otra parte, los cursos de Coursera o similares están muy bien para comenzar (si estas trabajando por ejemplo). Al final hacer cosas de data análisis es como hacer cosas de matemáticas, estadística y software engineer a la vez. Necesitas tener un background en esas tres áreas, construyéndolo poco a poco - curso de estadística, tener las matematicas frescas, y por supuesto ser buen programador, porque si al final no eres capaz de llevarlo a la practica no sirve de nada.

También son muy interesantes las competiciones de data análisis (tipo TopCoder para programadores) Ahora mismo Kaggle.com es la web de referencia.

¿En qué consisten la competiciones?

Te dan un data set y te dicen qué tiene que conseguir tu modelo. Lo entrenas, y tras el periodo participación, se comprueban con un data set de ellos (distinto al de entrenamiento). El que tiene mejor predicción gana, y suele haber premios monetarios. Esas competiciones están muy bien, al consistir en un problema muy acotado, con datos que suelen estar limpios (cuando estás en la industria hay un trabajo enorme de limpieza, completado, adaptación). Si además has estado participando ello, puedes ver qué tal lo has hecho y compararte con los vencedores. Es un ciclo de hago, aprendo, hago, aprendo, que considero una buena opción para ponerse en marcha.

¿Cuánto informático y cuánto de matemático - u otra cosa - necesitas tener para desempeñarte en Machine Learning o Sistemas de Recomendación?

Si tienes problemas lo suficientemente pequeños para que te quepan en memoria, probablemente primer el ser matemático/estadista. Desde el momento en que no sea así, prima más la parte de programación, relacionado a lo que comentaba de mejores datos vencen mejores modelos: puedes tener unas nociones de estadísticas y aplicar un modelo sencillo, porque lo que importa es que sepas aplicarlo en sistemas grandes, modelos distribuidos, usar Hadoop, etc. Sin embargo, no es una cosa o la otra. En mi caso, y a pesar de usar aproximaciones matemáticas, los cálculos de los valores intermedios tuve que hacerlo distribuidos, usando Scala, actores.. Si lo usara en una sola maquina me hubiera llevado mucho tiempo; no puedes usar Matlab, porque la red de Tuenti no cabe… llega un momento en que hay que conocer que estás haciendo - más allá del plano teórico - y cómo funciona la arquitectura, por lo que la faceta de ingeniería de juega un papel muy importante.

¿Qué lenguajes de programación te gustan?

Los funcionales. Haskell es el que más me gusta, pero es una bestia parda. Scala también, que se queda a mitad, porque permite utilizar librerías de JAva, y también programación funcional, pero me sigue gustando más Haskell.

¿Libros, Blog, Artículos?

Esta entrada de Quora está cargada de material: How do I become a Data Scientist.
Bradford Cross, el creador de Prismatic, hizo un par de entradas en su blog acerca de lo que había que aprender para ser un Data Scientist. Esas entradas eran oro puro, pero no se por qué cerró su blog. Algunos han tratado de recuperar esa información aquí https://sites.google.com/site/mldmda/guide-1

¿Pasaremos a segunda ronda en el equipo de fútbol sala?

Tengo un modelo entrenado con los datos hasta ahora y dice que sí (risas).

Algunas palabras de despedida

Creo que todo esto es un área súper candente. Es como si hace 15 años sabías Java, que eras considerado el Rey del Mambo. Creo que es la misma situación en estos momentos para este tema.

Muchas gracias, caballero.

Igualmente.