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 :/