Aprendizado de máquina aplicado ao desenvolvimento de código

16

Minha formação é em engenharia mecânica, então, por favor, perdoe minha ignorância nessa área.

Eu realmente gosto de programação e desenvolvimento de software. Além disso, recentemente participei de uma aula on-line de aprendizado de máquina (ML), que eu recomendo, ministrada pelo professor Andrew Ng, de Stanford. Link aqui .

Ouvi esse professor dizer que é difícil encontrar áreas que o ML nunca terá impacto.

Questão

Então, minha pergunta é: que pesquisa foi feita até agora na aplicação do aprendizado de máquina ao desenvolvimento de código? Que tal depuração?

Inclua recursos / fontes / artigos científicos, se possível.

Não tive sorte em pesquisar isso porque, muitas vezes, pesquisando ML e desenvolvimento de software (ou programação) acaba levando a resultados no desenvolvimento de software (ou programação) de aplicativos ML.

Charles
fonte
Sua pergunta é sobre código que escreve código ou você está perguntando sobre técnicas de codificação para implementar o aprendizado de máquina?
Robert Harvey
Código (código ML) que escreve código, ou melhora código, ou verifica se há erros no código (seja para desenvolvimento web, solucionador numérico etc.). Não são técnicas para implementar o aprendizado de máquina.
Charles
Para não dizer que isso nunca vai acontecer, mas as linguagens de programação de alto nível foram projetadas para facilitar as instruções do computador para humanos com unidades de controle lentas ativadas quimicamente. No nível mais fundamental, ML é máquinas determinando o que as máquinas devem fazer. No futuro, os idiomas projetados para sacos de água mole serão tão desnecessários quanto os próprios humanos.
JimmyJames
Esta pergunta deve ser migrada para o site de Inteligência Artificial.
quintumnia
Esta é realmente uma pergunta muito legal!
Rhys Johns

Respostas:

6

Fuzzing é um método de teste em que o aprendizado de máquina pode e foi aplicado. Fuzzing é um método de teste no campo do teste exploratório automatizado. Ele tenta encontrar defeitos no software executando um grande número de entradas e procurando erros. Exceções não tratadas são a categoria mais simples, mas uma implementação inteligente pode usar o ML para encontrar resultados suspeitos. O ML é amplamente utilizado nesse domínio, a fim de tornar o processo mais eficiente. Isso funciona usando o ML para evitar testar todas as entradas possíveis treinando entradas "interessantes". (Entradas não semelhantes que provavelmente causam falhas.)

Pato de borracha
fonte
Interessante. Então esse tipo de cai na categoria de teste de código, certo? Gosto mais da resposta da RJB, no que diz respeito ao desenvolvimento, ao invés de testar. Mas testar / depurar certamente ainda é útil.
Charles
Sim. Definitivamente, está no campo dos testes, e poucas pessoas já tentaram, mas está ganhando força como técnica viável à medida que a computação em nuvem se torna cada vez mais normal. Tornou-se mais fácil adquirir um cluster de máquinas, executar testes por uma semana e descartar o cluster até a próxima vez.
precisa
4

Sim. Esta área está quente agora. É chamado de "código grande" e a DARPA investiu US $ 40 milhões: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Alguns resultados impressionantes surgiram dessa concessão, como os sistemas Profeta e Genesis da Fan Long, que podem corrigir erros automaticamente em programas usando um modelo aprendido de correções corretas. Martin Vechev e seu aluno Veselin Raychev também foram pioneiros nessa área. Talvez o resultado mais impressionante seja o JSNice ( http://jsnice.org/ ), que pode "minimizar o código JavaScript.

No geral, a idéia de código grande não cumpriu sua promessa: os dados são muito escassos para aprender algo muito mais interessante do que nomes de variáveis. Enquanto ainda sou financiado em parte por esse programa da DARPA, meu laboratório parou de trabalhar nele. Na mesma nota, a última coisa que ouvi sobre o DeepCoder é que ele obtém resultados bastante patéticos em comparação com o estado da arte na síntese de programas.

As ferramentas mais bem-sucedidas para programação automatizada ainda se baseiam em métodos que não são de ML, como os solucionadores SMT. Veja os procedimentos de qualquer conferência PL (por exemplo: PLDI, POPL, OOPSLA) ou de qualquer conferência acadêmica de engenharia de software (por exemplo: ICSE, FSE, ISSTA, ASE) e você verá muitos exemplos.

James Koppel
fonte
3

A Microsoft desenvolveu o DeepCoder para usar o aprendizado profundo para prever um corpo de método a partir de uma determinada entrada e saída. Esse é o único exemplo que conheço de improviso.

Posso dizer que a Programação Meta-Genética é um campo de estudo com uma ambição semelhante, mas não posso dizer que conheço o suficiente para ter conhecimento.

A programação genética foi notícia em 2015 quando o muScalpel desenvolveu uma solução para transplantar um recurso de um programa para outro, usando os testes de unidade para ambos como uma espécie de conjunto de treinamento.

RJB
fonte
É como gerar algoritmos usando um modelo genético, certo? Você conhece algum aplicativo para ajudar no desenvolvimento de código? Estou pensando em máquina humana trabalhando em conjunto, em vez de ser puramente acionado por máquina (modelo baseado em genética). Sei que isso pode parecer específico, mas estou principalmente curioso porque sou novo nessa área.
Charles
Claro que você está certo, eu descaracterizou, eu estava pensando também de forma recursiva sobre o uso ML fazer ML :) #edited
RJB
2

Então, minha pergunta é: que pesquisa foi feita até agora na aplicação do aprendizado de máquina ao desenvolvimento de código? Que tal depuração?

Uma pergunta relacionada é sobre técnicas de aprendizado de máquina para geração e compilação de código (já que você pode imaginar transpilers e compiladores como uma maneira de "automaticamente desenvolver código" - na verdade, escrevendo código - a partir de uma linguagem de nível superior).

Houve vários artigos sobre isso, por exemplo, MILEPOST GCC .

Você também pode procurar no Google por documentos sobre técnicas de aprendizado de máquina para depuração ou para análise estática de código-fonte (ou qualquer tipo de análise estática de programa ).

Veja também o blog de J.Pitrat sobre inicialização de inteligência artificial, relacionado à sua pergunta.

Basile Starynkevitch
fonte
1

Em um artigo recente da Communications of the ACM sobre como ganhar dinheiro usando a matemática, Erik Meijer citou Jeff Dean, pesquisador sênior do Google, Systems and Infrastructure Group:

Se o Google fosse criado do zero hoje, muito disso seria aprendido, não codificado.

O artigo fornece uma visão geral das atividades recentes na área de pesquisa. Está atrás de um muro de pagamento, mas pode valer a pena ler se você estiver interessado em paralelos teóricos entre codificação e aprendizado de máquina / estatística. Talvez a lista de referências no final do artigo também possa ser útil.

Como exemplo, o artigo se refere à WebPPL, programação probabilística para a web .

Claude
fonte
0

Aqui está um caso de uso do aprendizado de máquina para depurar microsserviços. Documentei alguns esforços na análise de dados de desempenho de microsserviço com aprendizado de máquina, onde treinei uma árvore de decisão a partir dos dados de desempenho coletados do teste de carga de um microsserviço e, em seguida, estudei a árvore, que me deu informações sobre um problema ambiental e me ajudou a diagnosticar e corrigir um bug de desempenho.

Glenn
fonte
0

Encontrei uma lista de leitura bastante extensa sobre todos os tópicos de aprendizado de máquina relacionados à codificação .

Como você pode ver, as pessoas têm tentado aplicar o aprendizado de máquina à codificação, mas sempre em campos muito estreitos, não apenas uma máquina que pode lidar com todos os tipos de codificação ou depuração.
O restante desta resposta se concentra na sua máquina de "depuração" de escopo relativamente amplo e por que isso ainda não foi realmente tentado (tanto quanto mostra minha pesquisa sobre o tópico).


Eu redigi uma parte longa da resposta. Para resumir (é importante para a próxima parte): seguir a metodologia atual de aprendizado de máquina, qualquer coisa que um humano possa aprender, uma máquina também. Estamos limitados apenas pelo domínio físico (velocidade da CPU, tamanho de uma máquina, ...), não uma suposta aplicabilidade limitada do próprio algoritmo de aprendizado.

Que pesquisa foi feita até agora na aplicação do aprendizado de máquina ao desenvolvimento de código? Que tal depuração?

A questão aqui não é que seja impossível, mas que é um tópico incrivelmente complexo.

Os seres humanos nem sequer chegaram perto de definir um padrão de codificação universal com o qual todos concordam. Mesmo os princípios mais amplamente aceitos, como o SOLID, ainda são uma fonte de discussão sobre a profundidade em que deve ser implementado. Para todos os fins práticos, é impossível aderir perfeitamente ao SOLID, a menos que você não tenha nenhuma restrição financeira (ou de tempo); o que simplesmente não é possível no setor privado, onde ocorre o maior desenvolvimento. O SOLID é uma diretriz, não um limite rígido.

Na ausência de uma medida objetiva do certo e do errado, como poderemos dar um feedback positivo / negativo a uma máquina para fazê-la aprender?
Na melhor das hipóteses, podemos fazer com que muitas pessoas dêem sua própria opinião à máquina ("este é um código bom / ruim"), e o resultado da máquina será então uma "opinião média". Mas isso não é necessariamente o mesmo que uma solução correta . Pode ser, mas não é garantido que seja.

Em segundo lugar, para depuração em particular, é importante reconhecer que desenvolvedores específicos tendem a introduzir um tipo específico de bug / erro. A natureza do erro pode, em alguns casos, ser influenciada pelo desenvolvedor que o introduziu.

Por exemplo, como estou frequentemente envolvido na correção de códigos de outras pessoas no trabalho, tenho uma espécie de expectativa de que tipo de erro cada desenvolvedor está propenso a cometer. Dado um certo problema, eu sei que o dev A provavelmente esquece de atualizar o arquivo de configuração, enquanto o dev B geralmente escreve consultas LINQ ruins. Baseado no desenvolvedor, posso olhar primeiro para o arquivo de configuração ou para o LINQ.
Da mesma forma, já trabalhei em várias empresas como consultor agora e posso ver claramente que tipos de bugs podem ser direcionados a certos tipos de empresas. Não é uma regra rígida e rápida que eu possa apontar conclusivamente, mas há uma tendência definida.

Uma máquina pode aprender isso? Consegue perceber que é mais provável que o dev A atrapalhe a configuração e o dev B atrapalhe uma consulta LINQ? Claro que pode. Como eu disse antes, qualquer coisa que um humano pode aprender, uma máquina também pode.
No entanto, como você sabe que ensinou à máquina toda a gama de possibilidades? Como você pode fornecer um conjunto de dados pequeno (isto é, não global) e saber que ele representa todo o espectro de bugs? Ou, você criaria depuradores específicos para ajudar desenvolvedores / empresas específicos, em vez de criar um depurador universalmente utilizável?

Pedir um depurador aprendido a máquina é como pedir um Sherlock Holmes aprendido a máquina. Não é comprovadamente impossível criar um, mas muitas vezes o principal raciocínio de ser um depurador / Sherlock depende de avaliações subjetivas que variam de assunto para assunto e tocam em uma variedade incrivelmente ampla de conhecimentos / possíveis falhas.
A falta de resultados corretos / incorretos, comprováveis ​​rapidamente, dificulta o ensino fácil de uma máquina e a verificação de que ela está fazendo um bom progresso.

Flater
fonte