por

Las computadoras pueden aprender a programar

Desde la publicación del famoso artículo “Por qué el software se está comiendo al mundo” de Marc Andreessen en el Wall Street Journal, el consenso era que las únicas personas que no debían temer por sus trabajos eran los programadores, sin embargo parece ser que el avance en deep learning de los últimos años nos puede llevar a reconsiderar esa suposición.

Las redes neuronales profundas (Deep Neural Networks), están resolviendo muchos problemas difíciles y ayudando a automatizar cada día más tareas. Pero, ¿pueden aprender programación? Microsoft Research y la Universidad de Cambridge piensan que es totalmente posible y están teniendo cierto éxito en enseñar a programar a las computadoras, claro recien se están dando los primeros pasos. Así que por el momento parece que los trabajos de los programadores están seguros, pero no se puede saber por cuánto tiempo más.

El trabajo comenzó hace ya unos años, pero los últimos resultados se han presentado en la Conferencia Internacional sobre Representaciones de Aprendizaje (ICLR, 2017).

Hay muchos problemas con el machine learning aplicado a la programación pero el más grande es el hecho que la salida objetivo no es differentiable. Es decir. Un pequeño cambio en el texto de un programa no hace una pequeña diferencia en la salida. De hecho, un pequeño cambio en la salida a menudo hace que el programa no sea válido y así pasamos de algo que funciona y tal vez sea eficaz, a algo que no tiene sentido.

El enfoque más común es tratar de hacer la conexión de entrada/salida del lenguaje de alguna manera diferenciable. Sin embargo este no es el enfoque utilizado en el trabajo de investigación realizado por Matej Balog, Alexander L. Gaunt, Marc Brockschmidt, Sebastian Nowozin, Daniel Tarlow:

Argumentamos que el aprendizaje automático puede aportar un valor significativo a la solución de la Síntesis de Programas Inductivos (IPS) volviendo a plantear el problema como un gran problema de datos. Se muestra que el entrenamiento de una red neuronal en un gran número de problemas generados IPS para predecir las señales de la descripción del problema puede ayudar a una técnica basada en la búsqueda.

Sin embargo, todavía hay la necesidad de utilizar un lenguaje simplificado especial – un lenguaje específico de dominio o DSL, por sus siglas en inglés. Estos lenguajes son en algo como SQL o LINQ y son capaces de abordar problemas del mundo real. Las funciones que utiliza se limitan a trabajar con números enteros o matrices de números enteros. Usted puede ver en el siguiente ejemplo el lenguaje de programación usado por los investigadores y que es presentado en el trabajo de investigación llamado “DeepCoder: Aprendiendo a escribir programas“, como se puede observer este sigue el paradigma de programación funcional:

A continuación, se utilizó la gramática del lenguaje para generar un conjunto de datos de programas que conectan las entradas a las salidas. A la red neuronal se les dieron los conjuntos de entrada de salida y se les entrenó para predecir la presencia o ausencia de funciones individuales en el lenguaje.

Esto produjo una red neuronal que podría tomar los conjuntos de entrada-salida y predecir las características del programa que los produjo. Esto se utilizó entonces para guiar un algoritmo de búsqueda para encontrar un programa que produce los conjuntos de entrada y salida deseados. Además de trabajar con programas de tamaño fijo, el equipo también intentó entrenar a la red neuronal para producir programas más cortos y usarlos para encontrar programas más grandes como prueba de su generalización.

Sin embargo el proceso de encontrar el programa que permite generar las salidas deseadas en base a unos datos de entrada es aún muy lento, es por ello que los investigadores están trabajando en optimizar las búquedas y de esa forma poder reducir el tiempo necesario en 1 a 3 ordenes de magnitud.

Así que puede que no sea el final del trabajo de programador, pero podría ser el final del camino para un tipo particular de programadores.