Aprendizaje automático aplicado al desarrollo de código

15

Mi experiencia es en ingeniería mecánica, así que perdona 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 ampliamente, 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 ML nunca afectará.

Pregunta

Entonces, mi pregunta es, ¿qué investigación se ha hecho hasta ahora para aplicar el aprendizaje automático al desarrollo de código? ¿Qué hay de la depuración?

Por favor, incluya recursos / fuentes / artículos científicos si es posible.

No he tenido la suerte de buscar esto porque a menudo, al buscar el desarrollo de software (o programación) ML y se obtienen resultados en el desarrollo (o programación) de software de aplicaciones ML.

    
pregunta Charles 18.06.2017 - 04:17
fuente

7 respuestas

6

Fuzzing es un método de prueba en el que el aprendizaje automático puede & 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 manejadas 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 que el proceso sea más eficiente. Esto funciona mediante el uso de ML para evitar probar cada entrada posible al entrenar en entradas "interesantes". (Las entradas des-similares que pueden causar fallos).

    
respondido por el RubberDuck 19.06.2017 - 20:17
fuente
4

Sí. Esta área está caliente ahora mismo. Se llama "código grande" y DARPA pone $ 40 millones en él: enlace . 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 sea JSNice ( enlace ), que puede "minimizar el código JavaScript".

En general, la idea de 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. Aunque todavía estoy financiado en parte por este programa DARPA, mi laboratorio casi ha dejado de trabajar en él. En ese sentido, lo último que escuché sobre DeepCoder es que obtiene resultados bastante patéticos en comparación con el estado del arte en síntesis de programas.

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

    
respondido por el James Koppel 23.06.2017 - 06:30
fuente
3

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

Te puedo decir que Programación Meta-Genética es un campo de estudio con una ambición similar, pero no puedo decir que sé 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 un tipo de conjunto de entrenamiento.

    
respondido por el RJB 19.06.2017 - 19:33
fuente
2
  

Entonces, mi pregunta es, ¿qué investigación se ha hecho hasta ahora para aplicar el aprendizaje automático al desarrollo de código? ¿Qué hay de la depuración?

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

Ha habido varios artículos sobre eso, por ejemplo MILEPOST GCC .

También puede buscar en Google artículos sobre técnicas de aprendizaje automático para la depuración o el análisis de código fuente estático (o cualquier tipo de análisis estático de programas ).

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

    
respondido por el Basile Starynkevitch 22.06.2017 - 10:31
fuente
1

En un artículo reciente en Communications of the ACM sobre Cómo ganar dinero usando las matemáticas Erik Meijer citó a Jeff Dean , Miembro principal de Google, grupo de sistemas e infraestructura:

  

Si Google se creara desde cero hoy, la mayor 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 puede valer la pena leerlo si está interesado en paralelos teóricos entre la codificación y el aprendizaje automático / las estadísticas. Tal vez la lista de referencias al final del artículo también pueda ser útil.

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

    
respondido por el Claude 22.06.2017 - 10:21
fuente
0

Este es un caso de uso en el uso de aprendizaje automático para depurar microservicios. Documenté algunos esfuerzos en analizando datos de rendimiento de microservicios con aprendizaje automático donde formé un árbol de decisiones a partir de los datos de rendimiento recopilados de probando la carga, un microservicio estudió el árbol, lo que me dio una idea sobre un problema ambiental y me ayudó a diagnosticar y corregir un error de rendimiento.

    
respondido por el Glenn 06.11.2018 - 07:06
fuente
0

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

Como puede ver, las personas han estado tratando de aplicar el aprendizaje automático a la codificación, pero siempre en campos muy estrechos, no solo una máquina que puede manejar todo tipo de codificación o depuración.
El resto de esta respuesta se enfoca en su máquina de "depuración" de amplio alcance y por qué esto todavía no se ha intentado (en lo que respecta a mi investigación sobre el tema).

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

  

¿Qué investigación se ha hecho 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 aceptados, como SOLID, son todavía una fuente de discusión en cuanto a qué tan profundamente se debe implementar. Para todos los propósitos prácticos, es imposible adherirse perfectamente a SOLID a menos que no tenga ninguna restricción financiera (o de tiempo); lo que simplemente no es posible en el sector privado donde ocurre la mayor parte del desarrollo. SOLID es una guía, no un límite difícil.

En ausencia de una medida objetiva de lo correcto y lo incorrecto, ¿cómo podremos dar una retroalimentación positiva / negativa a la máquina para que aprenda?
En el mejor de los casos, muchas personas pueden dar 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 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 ser influenciada en algunos casos por el desarrollador que lo introdujo.

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

¿Puede una máquina aprender esto? ¿Puede darse cuenta de que es más probable que el desarrollador A arruine la configuración y que el B sea más probable que arruine 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 se puede proporcionar un pequeño conjunto de datos (es decir, no global) y saber a ciencia cierta que representa el espectro completo de errores? O, en su lugar, ¿crearía depuradores específicos para ayudar a desarrolladores / compañías específicos, en lugar de crear un depurador que sea universalmente utilizable?

Pedir un depurador aprendido a máquina es como pedir un Sherlock Holmes aprendido a máquina. Provablemente no es posible crear uno, pero a menudo el razonamiento central para ser un depurador / Sherlock depende de evaluaciones subjetivas que varían de un tema a otro y toca una variedad increíblemente amplia de conocimientos / posibles fallas.
La falta Los resultados correctos / incorrectos que se pueden demostrar rápidamente hacen que sea difícil enseñar fácilmente una máquina y verificar que está progresando bien.

    
respondido por el Flater 06.11.2018 - 08:47
fuente

Lea otras preguntas en las etiquetas