Ya es noviembre. Entre una cosa y otra, el año se pasa volando.
Hoy quiero hacer a un lado todas las entradas pendientes e incompletas que tengo para este blog y hablar un poco de lo que he hecho en poco más de un año.
En julio del año pasado viajé a Singapur, y en su momento escribí al respecto, pero no ahondé mucho en el tema de qué estaba haciendo por razones de manejo de información por acá. Ahora sí puedo al menos decir qué estoy haciendo sin temor a represalias por parte de la compañía en la que laboro.
El proyecto en el que estoy es sobre reconocimiento de escritura a mano usando redes neuronales, o para que suene más fancy, “Deep Learning“. Esa expresión ha cobrado mucha fuerza en los últimos años, al grado de haberse convertido en “Buzzword” y estar en boca de todos, aun en la de muchos que no tienen ni idea de qué onda. ¿No creen? Simplemente les menciono el ejemplo de una persona que quería ponerle Deep Learning a su sitio web para que fuera más llamativo…
Ahora bien: no es que yo haya estado alejado del área de aprendizaje máquina (ML – Machine Learning), puesto que cuando haces procesamiento de lenguaje natural usas algunas de sus técnicas (por ahí tengo un monstruo de código en Scala cuando quise implementar desde cero un clasificador bayesiano ingenuo), pero sí es la primera vez que trabajo con datos que no son palabras, y al mismo tiempo nunca me había metido tan de lleno a redes neuronales. Digamos que soy fan de las Support Vector Machine aunque las comencé a usar mucho después de haberme graduado. Por tanto, es la primera vez que me meto de lleno a las redes neuronales.
El caso es que he estado trabajando en ese proyecto desde hace más de un año, y aunque hemos obtenido avances significativos (nada todavía que sea digno de publicarse), sí tengo que mencionar que la burocracia japonesa (no necesariamente de esta compañía, sino de la forma en la que se hacen negocios en Japón) en general ha hecho que el proyecto vaya muy lento y que, como cualquier proyecto de software, deba de hacer ajustes a la mitad o cambios de esos que eran para ayer.
Ha habido muy buenas ganacias personales y profesionales a lo largo de este tiempo. Entre las más importantes puedo mencionar las siguientes:
- Asistencia a conferencias importantes en el área de procesamiento de lenguaje natural. Este año he ido a 3: la de la sociedad de procesamiento de lenguaje natural de Japón en marzo, en Tsukuba; a la de la sociedad de inteligencia artificial de Japón en mayo; y a EMNLP 2017 en Dinamarca en septiembre. Sí, pisé tierras europeas por primera vez en mi vida. Esto conlleva también conocer a mucha gente, incluyendo a mexicanos que le están echando ganas en el extranjero dentro de la misma área.
- Clase de Deep Learning en la Universidad de Tokio. Tomé la básica y ahora estoy tomando la avanzada, la cual termina en enero de 2018.
También es digno mencionarse que he aprendido a lidiar (léase: “perder toda la motivación”) con administradores de proyecto que se creen expertos en IA y que dicen cada sarta de p… aserciones incorrectas, y que en más de una ocasión me han ocasionado severos dolores de estómago porque a fin de cuentas dentro de la jerarquía japonesa ellos son los jefes y los de arriba solamente los escuchan a ellos… Experiencia amarga, sí, pero experiencia al fin y al cabo.
El título de esta entrada se refiere a que más que estar produciendo he estado del lado del aprendizaje, y ahora con el curso de la Universidad de Tokio ha revivido por completo el alma de estudiante, ya que el proyecto final es precisamente un sistema que use Deep Learning para algo, y todos mis compañeros de equipo son estudiantes de esa universidad; esto no me convierte inmediatamente en un líder, pero aquí sí comienza a pesar la experiencia de haber trabajado, sobre todo a la hora de dividir responsabilidades.
Con sus altibajos como casi cualquier cosa, más o menos en eso se ha resumido mi vida profesional desde julio de 2016 hasta la fecha. Así me he estado divirtiendo. No obstante, debo mencionar también que por obra de la misma burocracia mencionada arriba a veces pierdo todas las ganas de hacer las cosas y ha habido momentos en los que sí quiero mandar todo a la burger, pero luego recapacito, me tranquilizo y recuerdo que todavía no es el momento, pero que llegará.
Ahora nada más como dato cultural, dejo una breve explicación de lo que he aprendido y también referencias para quienes quieran leer más a detalle al respecto. Disculpen la terminología en inglés, pero es más fácil dar con información en ese idioma.
Primero que nada, omitiré todo lo referente a MNIST, puesto que hay infinidad de tutoriales y modelos que funcionan bastante bien. MNIST es como el “¡Hola mundo!” en ML, y curiosamente trata precisamente de reconocimiento de escritura a mano, aunque solamente de números. Si quieren probar por su cuenta, Tensorflow tiene un tutorial básico y uno avanzado al respecto.
Si buscan “Handwriting Recognition Deep Learning”, casi todos los papers que encuentren van a referenciar al trabajo de Alex Graves titulado “Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks”. Esta técnica ha hecho posible reconocer secuencias de caracteres sin necesidad de segmentarlos previamente. En sí, CTC puede ser aplicado al resultado de cualquier RNN, siendo hasta hace años las Bidirectional LSTMs , es decir: LSTM que no solamente toman en cuenta “el pasado”, sino también “el futuro”; conociendo más el contexto, los resultados obtenidos mejoran considerablemente; pero Alex Graves también presentó una alternativa a las BiLSTMs que mejoró todavía más los resultados: Las Multidimensional LSTMs (MDLSTMs), que lo que hacen es no nada más tomar en cuenta adelante y atrás de la secuencia analizada, sino también arriba, abajo, y cualquier otro punto en otra dimensión que colinde con el elemento analizado (una 2D MDLSTM analiza secuencias en 2 dimensiones – como imágenes; una 3D analiza secuencias en 3 dimensiones – como video, etc.). Gracias a que toma en cuenta mucho más contexto que las BiLSTM, las MDLSTMs presentan mejores resultados cuando son aplicadas correctamente.
Ahora bien, es muy importante tener datos para hacer que la computadora “aprenda”. Una buena base de datos para esta tarea es la de IAM. Es gratuita, solamente hay que registrarse para obtenerla.
He estado trabajando en diferentes frameworks:
Si se quieren quitar de broncas, Keras hace la vida muy sencilla. Lo usé durante un tiempo y, de entre los mencionados arriba, es mi framework favorito. Sin embargo, Keras es una librería de alto nivel que corre por encima de Tensorflow, CNTK o Theano, por lo que si necesitan hacer algun cambio significativo a bajo nivel, quizá no es opción.
Aprendí Tensorflow más motivado por conocer más profundamente las opciones que tiene que por obligación. Tensorflow es más difícil de digerir porque maneja un modelo de primero construir todo en grafos y estos se ejecutan solamente cuando es requerido, haciendo más difícil la depuración de los modelos (aunque justamente ayer Tensorflow sacó su versión experimental de Tensorflow Eager para evitar eso). Para que se den una idea muuuuy vaga, aprender Keras es como aprender Visual Basic (sin lo chafa, claro), y aprender Tensorflow es como aprender lenguaje C.
Torch es más por necesidad que por gusto. Aunque existe PyTorch, que es la versión de Python, el lenguaje original de Torch es Lua. Bien… otro lenguaje que aprender :/
En fin. La idea es que la computadora reconozca la escritura a mano de cierto lenguaje. Alex Graves presentó hace años un gran trabajo reconociendo escritura arábica, siendo que él no habla árabe. Las contribuciones de Alex Graves hacen posible omitir la segmentación de caracteres, puesto que los trabajos anteriores generalmente dependían de que cada carácter estuviera previamente segmentado y después se usaba algo como un diccionario o modelo de lenguaje para corregir posibles errores (se sigue haciendo y es recomendable, pero antes la dependencia era mayor).
Como ya he mencionado, aunque no he obtenido resultados dignos de ser publicados, ahí van las cosas. Al momento de escribir esto estoy relegado a hacer talacha en Lua (más programación que investigación), pero espero que sea solamente temporal. Y de pilón, también soy sysadmin de los servidores con los que trabajamos. Digamos que los demás aquí no tienen mucho conocimiento de Linux :/
Qué cosas, que me hacen rememorar que en mi otra vida estudié Prolog con la profesora Mariko en la Esime y luego redes neuronales con ella misma y con su esposo. Un saludo inge desde el ex defectuoso.
Uuuuuy Prolog. Muchos años de no trabajar con programación lógica… y ahí quiero dejarla 😀 No es mi fuerte, para ser sincero. Soy más del lado de la programación funcional, pero lo más cercano que tengo en mi área es Apache Spark en Scala, pero MLLib no es para redes neuronales. Si acaso, DeepLearning4J, que lo puedo usar con Scala, pero aquí le tienen pavor a cualquier cosa que implique estudiar qué es un Functor, Applicative y Monad :/
Saludos.
Hola Manuel, una pregunta. Yo ando metido en esto de la IA en una maestría en CS. Ando trabajando en el área de visión computacional para imágenes médicas usando esto del Deep Learning. Mi pregunta es que tan demandados estan los expertos en Deep Learning allá en Japón, según tengo entendido en el occidente hay mucha demanda por gente con Phd que sepan de esto del Deep Learning. Otra pregunta que quizás puedas responder tu que estas un poco metido en la Universidad de Tokyo. ¿En que estan enfocando la investigación sobre las redes neuronales?, En la aplicación o en investigación básica, porque en Estados Unidos veo que hay mucha investigación respecto al Deep Learning, también se que en China hay mucha investigación en esto.
Quisiera buscar un trabajo de Machine Learning Engineer después de acabar mi master.
Hola Guillermo.
Acá sí hay chamba para gente que sepa DL, pero en muchos casos tienes que saber japonés.
La universidad de Tokio tiene muchas conexiones con las industrias, pero cada laboratorio trabaja en diferentes proyectos, pero si de redes neuronales se trata, sí, todos están trabajando con DL. Conozco gente de robótica que no trabaja con redes neuronales, pero ésa es otra área.
China tiene mucha investigación muy buena gracias a varias compañías que le metieron $$$, entre ellas Baidu.
Saludos, y estoy a tus órdenes.
Hola Manuel, el motivo de este comentario es hacerte varias preguntas acerca de un área en concreto de la AI (utilizaré abreviaturas en inglés): el procesamiento de lenguaje natural.
Antes que nada, mencionar que soy un programador de sistemas de información con amplia experiencia en lenguajes como c# y javascript, interesado en aprender acerca de las técnicas que se usan en inteligencia artificial, en este caso de NLP. Buscando por mi cuenta encontré que python es un lenguaje de programación muy usado para lo que quiero (lo cual me alegra por que desde hace tiempo quería aprenderlo) y un conjunto de bibliotecas en especial llamado NLTK. Las preguntas son:
1. ¿Son muchas las técnicas matemáticas que se emplean para el procesamiento de lenguaje natural?
1.1 Si es así, ¿Como recomiendas abordar estas técnicas?
Nota: tomar en cuenta que tengo una formación matemática básica, ya que soy ingeniero.
1.2¿En que áreas de negocio o investigación es usado el NLP?
y por último otras preguntas, que mas bien serían recomendaciones:
2. ¿Conoces páginas o libros que sirvan de introducción para alguien novato como yo acerca del NLP?
3.¿Conoces tutoriales para las técnicas utilizadas?
NOTA1: algo del estilo que te explique desde la técnica hasta como se programa o por lo menos el pseudocodigo.
NOTA2: no importa si la información viene en inglés.
Unas preguntas podrían sonar demasiado abiertas, pero agradecería que trataras de contestarlas lo mejor posible.
Muchas gracias por leer este comentario y tomar el tiempo de contestarlo.
PD. Saludos al tocayo del primer comentario de esta entrada.
Saludos hasta japón desde la CDMX.
Hola Luis.
Muchas gracias por tu comentario.
Respondiendo a tus dudas.
– Python es muy usado porque hay librerías que te hacen la vida más fácil. NLTK es una, pero cuando haces NLP invariablemente usas técnicas de Machine Learning, scikit-learn es otra muy útil. Más recientemente, y con el cambio de paradigma a redes neuronales en muchos de los problemas de NLP. Tensorflow, Theano y similares librerías en Python hacen el trabajo más fácil.
1. ¿Son muchas las técnicas matemáticas que se emplean para el procesamiento de lenguaje natural?
Hmm… No sé qué tanto consideres muchas. Lo que necesitas tener de forma sólida es álgebra lineal, cálculo, probabilidad y estadística.
Yo también tenía una formación matemática básica. Mis cursos de álgebra lineal y análisis numérico por fin rindieron frutos. De otra forma prácticamente no los usas a menos que sea para problemas muy específicos.
1.2¿En que áreas de negocio o investigación es usado el NLP?
Análisis, búsqueda y clasificación de datos, inferencia de polaridad en escritos, resúmenes automáticos, búsqueda de patrones en texto (algo como clustering)
2. ¿Conoces páginas o libros que sirvan de introducción para alguien novato como yo acerca del NLP?
Libro: Foundations of Statistical Natural Language Processing, Christopher D. Manning y Hinrich Schütze.
Páginas: El curso de Dan Jurafsky y Chris Manning es buenísimo: https://www.youtube.com/playlist?list=PL6397E4B26D00A269
3.¿Conoces tutoriales para las técnicas utilizadas?
Lo mejor para aprender es hacer un proyecto al respecto. Puedes hacer por ejemplo un motor de búsqueda para los archivos de texto en tu computadora (un mini Google); puedes bajar el dataset de Reuters (https://archive.ics.uci.edu/ml/datasets/reuters-21578+text+categorization+collection) y crear un clasificador automático de texto con varias técnicas (intenta primero con Naïve Bayes), y un largo etc. El chiste es que le entres directamente para que veas qué onda, y de ahí vas viendo las técnicas y para qué se utilizan.
Saludos.
Muchas gracias por contestar Manuel, empezaré mi aprendizaje a ver que tal me va. Saludos.