Aprendizaje automático aplicado al desarrollo de código.

17

Mi experiencia es en ingeniería mecánica, así que perdone mi ignorancia en esta área.

Realmente disfruto la programación y el desarrollo de software. Además, recientemente tomé una clase gratuita en línea de Machine Learning (ML), que recomiendo encarecidamente, impartida por el profesor de Stanford Andrew Ng. Enlace aquí .

He escuchado a este profesor decir que es difícil encontrar áreas en las que el ML nunca afecte.

Pregunta

Entonces mi pregunta es, ¿qué investigación se ha realizado hasta ahora en la aplicación del aprendizaje automático al desarrollo de código? ¿Qué hay de la depuración?

Incluya recursos / fuentes / documentos científicos si es posible.

No he tenido suerte buscando esto porque a menudo buscar ML y el desarrollo (o programación) de software termina dando lugar a resultados en el desarrollo (o programación) de aplicaciones ML.

Charles
fuente
¿Es su pregunta sobre el código que escribe código, o está preguntando sobre las técnicas de codificación para implementar el aprendizaje automático?
Robert Harvey
Código (código ML) que escribe código, o mejora el código, o busca errores en el código (ya sea para desarrollo web, solucionador numérico, etc.). No son técnicas para implementar el aprendizaje automático.
Charles
No quiere decir que esto nunca sucederá, pero los lenguajes de programación de alto nivel están diseñados para facilitar la instrucción de la computadora a los humanos con unidades de control lentas activadas químicamente. En el nivel más fundamental, ML es máquinas que determinan qué máquinas deben hacer. En el futuro, los idiomas diseñados para bolsas de agua blandas serán tan innecesarios como los propios humanos.
JimmyJames
Se supone que esta pregunta se migrará al sitio de Inteligencia Artificial. ¿Pueden los que votaron arriba decirnos por qué?
quintumnia
¡Esta es realmente una pregunta genial!
Rhys Johns

Respuestas:

6

Fuzzing es un método de prueba donde el aprendizaje automático puede y ha sido aplicado. Fuzzing es un método de prueba en el ámbito de las pruebas exploratorias automatizadas. Intenta encontrar defectos en el software ejecutando una gran cantidad de entradas y buscando errores. Las excepciones no controladas son la categoría más simple, pero una implementación inteligente puede usar ML para encontrar resultados sospechosos. Sin embargo, ML se usa en gran medida en este dominio para hacer que el proceso sea más eficiente. Esto funciona mediante el uso de ML para evitar probar cada entrada posible al entrenar entradas "interesantes". (Entradas no similares que probablemente causen fallas).

RubberDuck
fuente
Interesante. Entonces, este tipo cae en la categoría de prueba de código, ¿verdad? Me gusta un poco más la respuesta de RJB, ya que se refiere al desarrollo, en lugar de las pruebas. Pero la prueba / depuración ciertamente sigue siendo útil.
Charles
Si. Definitivamente está en el ámbito de las pruebas, y no hay suficientes personas que lo hayan intentado, pero está ganando impulso como una técnica viable a medida que la computación en la nube se vuelve más y más normal. Es más fácil obtener un grupo de máquinas, ejecutar pruebas durante una semana y luego descartar el grupo hasta la próxima vez.
RubberDuck
4

Si. Esta área está de moda en este momento. Se llama "código grande", y DARPA puso $ 40 millones en él: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Se han obtenido algunos resultados impresionantes de esta subvención, como los sistemas Prophet y Genesis de Fan Long, que pueden corregir automáticamente los errores en los programas mediante el uso de un modelo aprendido de parches correctos. Martin Vechev y su alumno Veselin Raychev también han sido pioneros en esta área. Quizás su resultado más impresionante es JSNice ( http://jsnice.org/ ), que puede "minimizar el código JavaScript".

En general, la idea del código grande no ha cumplido su promesa: los datos son demasiado escasos para aprender algo mucho más interesante que los nombres de variables. Si bien todavía estoy financiado en parte por este programa DARPA, mi laboratorio ha dejado de trabajar en él. En esa nota, lo último que escuché sobre DeepCoder es que obtiene resultados bastante patéticos en comparación con el estado del arte en la síntesis de programas.

Las herramientas más exitosas para la programación automatizada aún dependen de métodos que no son de ML como los solucionadores SMT. Eche un vistazo a las actas de cualquier conferencia PL (por ejemplo: PLDI, POPL, OOPSLA) o cualquier conferencia académica de ingeniería de software (por ejemplo: ICSE, FSE, ISSTA, ASE), y verá muchos ejemplos.

James Koppel
fuente
3

Microsoft ha estado desarrollando DeepCoder para utilizar el aprendizaje profundo para predecir el cuerpo de un método a partir de una entrada y salida dadas. Ese es el único ejemplo que conozco de improviso.

Puedo decirle que la Programación Metagenética es un campo de estudio con una ambición similar, pero no puedo decir que sepa lo suficiente para estar bien informado.

La Programación Genética apareció en las noticias en 2015 cuando muScalpel desarrolló una solución para trasplantar una función de un programa a otro, utilizando las pruebas unitarias para ambos como una especie de conjunto de entrenamiento.

RJB
fuente
Esto es como generar algoritmos usando un modelo genético, ¿verdad? ¿Conoces alguna aplicación para ayudar al desarrollo del código? Estoy pensando en la máquina humana trabajando juntos, en lugar de una máquina puramente (modelo genético). Sé que esto puede sonar específico, pero tengo curiosidad porque soy nuevo en esta área.
Charles
Claro que tienes razón, leí mal, estaba pensando demasiado recursivamente sobre el uso de ML para hacer ML :) #editado
RJB
2

Entonces mi pregunta es, ¿qué investigación se ha realizado hasta ahora en la aplicación del aprendizaje automático al desarrollo de código? ¿Qué hay de la depuración?

Una pregunta relacionada es acerca de las técnicas de aprendizaje automático para la generación y compilación de código (ya que se podría imaginar a los transpiladores y compiladores como una forma de "desarrollar código" automáticamente, de hecho escribiendo código, desde algún lenguaje de nivel superior).

Ha habido varios documentos sobre eso, por ejemplo MILEPOST GCC .

También puede buscar documentos sobre técnicas de aprendizaje automático para la depuración o para el análisis de código fuente estático (o cualquier tipo de análisis de programa estático ).

Vea también el blog de J.Pitrat sobre bootstrapping de inteligencia artificial que está relacionado con su pregunta.

Basile Starynkevitch
fuente
1

En un artículo reciente en Comunicaciones de la ACM sobre Ganar dinero usando las matemáticas, Erik Meijer citó a Jeff Dean, Miembro Senior de Google, Grupo de Sistemas e Infraestructura:

Si Google se creara desde cero hoy, gran parte se aprendería, no se codificaría.

El artículo ofrece una descripción general de las actividades recientes en el área de investigación. Está detrás de un muro de pago, pero podría valer la pena leerlo si le interesan los paralelos teóricos entre la codificación y el aprendizaje automático / estadísticas. Quizás la lista de referencias al final del artículo también podría ser útil.

Como ejemplo, el artículo hace referencia a WebPPL, programación probabilística para la web .

Claude
fuente
0

Aquí hay un caso de uso sobre el uso del aprendizaje automático para depurar microservicios. Documenté algunos esfuerzos en el análisis de datos de rendimiento de microservicios con aprendizaje automático donde entrené un árbol de decisión a partir de los datos de rendimiento recopilados de las pruebas de carga de un microservicio y luego estudié el árbol que me dio una idea sobre un problema ambiental y me ayudó a diagnosticar y corregir un error de rendimiento.

Glenn
fuente
0

Encontré una lista de lectura bastante extensa sobre todos los temas de aprendizaje automático relacionados con la codificación .

Como puede ver, la gente ha estado tratando de aplicar el aprendizaje automático a la codificación, pero siempre en campos muy estrechos, no solo en una máquina que puede manejar todo tipo de codificación o depuración.
El resto de esta respuesta se centra en su máquina de "depuración" de alcance relativamente amplio y por qué esto aún no se ha intentado realmente (hasta donde mi investigación sobre el tema muestra).


Redacté una larga parte de la respuesta. Para resumir (es importante para la siguiente parte): siguiendo la metodología actual de aprendizaje automático, cualquier cosa que un humano pueda aprender, una máquina también puede hacerlo. Solo estamos limitados por el ámbito físico (velocidad de CPU, tamaño de una máquina, ...), no una supuesta aplicabilidad limitada del algoritmo de aprendizaje en sí.

¿Qué investigación se ha realizado hasta ahora para aplicar el aprendizaje automático al desarrollo de código? ¿Qué hay de la depuración?

El problema aquí no es que sea imposible, sino que es un tema increíblemente complejo.

Los humanos ni siquiera se han acercado a definir un estándar de codificación universal con el que todos estén de acuerdo. Incluso los principios más ampliamente acordados como SOLID siguen siendo una fuente de discusión sobre cuán profundamente debe implementarse. A todos los efectos prácticos, es imposible adherirse perfectamente a SOLID a menos que no tenga ninguna restricción financiera (o de tiempo); lo cual simplemente no es posible en el sector privado donde ocurre la mayor parte del desarrollo. SOLID es una guía, no un límite estricto.

En ausencia de una medida objetiva de lo correcto y lo incorrecto, ¿cómo vamos a poder dar retroalimentación positiva / negativa a una máquina para que aprenda?
En el mejor de los casos, podemos hacer que muchas personas den su propia opinión a la máquina ("este es un código bueno / malo"), y el resultado de la máquina será una "opinión promedio". Pero eso no es necesariamente lo mismo que una solución correcta . Puede ser, pero no se garantiza que lo sea.

En segundo lugar, para la depuración en particular, es importante reconocer que los desarrolladores específicos son propensos a introducir un tipo específico de error / error. La naturaleza del error puede en algunos casos ser influenciada por el desarrollador que lo introdujo.

Por ejemplo, como a menudo participo en la corrección de errores del código de otros en el trabajo, tengo una especie de expectativa sobre qué tipo de error es propenso a cometer cada desarrollador. Dado un cierto problema, sé que es probable que el desarrollador A se olvide de actualizar el archivo de configuración, mientras que el desarrollador B a menudo escribe consultas LINQ incorrectas. Según el desarrollador, primero puedo mirar hacia el archivo de configuración o el LINQ.
Del mismo modo, he trabajado en varias empresas como consultor ahora, y puedo ver claramente que los tipos de errores pueden estar sesgados hacia ciertos tipos de empresas. No es una regla dura y rápida que pueda señalar de manera concluyente, pero hay una tendencia definitiva.

¿Puede una máquina aprender esto? ¿Puede darse cuenta de que es más probable que el desarrollador A estropee la configuración y que el desarrollador B estropee una consulta LINQ? Por supuesto que puede. Como dije antes, cualquier cosa que un humano pueda aprender, una máquina también puede hacerlo.
Sin embargo, ¿cómo sabe que le ha enseñado a la máquina toda la gama de posibilidades? ¿Cómo puede proporcionarle un conjunto de datos pequeño (es decir, no global) y saber con certeza que representa el espectro completo de errores? ¿O, en su lugar, crearía depuradores específicos para ayudar a desarrolladores / compañías específicas, en lugar de crear un depurador que sea universalmente utilizable?

Pedir un depurador aprendido por la máquina es como pedir un Sherlock Holmes aprendido por la máquina. No es probable que sea imposible crear uno, pero a menudo el razonamiento central para ser un depurador / Sherlock depende de evaluaciones subjetivas que varían de un sujeto a otro y tocan una variedad increíblemente amplia de conocimiento / posibles fallas.
La falta de resultados correctos / incorrectos comprobables rápidamente hace que sea difícil enseñar fácilmente a una máquina y verificar que esté progresando bien.

Flater
fuente