我的背景是机械工程,所以请原谅我对此领域的无知。
我真的很喜欢编程和软件开发。另外,最近,我强烈推荐由斯坦福大学教授吴国安(Andrew Ng)教授的免费在线机器学习(ML)课程。链接到这里。
我听说这位教授说很难找到ML永远不会影响的领域。
题
所以我的问题是,迄今为止在将机器学习应用于代码开发方面进行了哪些研究?调试如何?
如果可能,请包括资源/资源/科学论文。
我没有运气搜索,因为经常搜索ML 和软件开发(或编程)最终导致ML应用程序的软件开发(或编程)的结果。
我的背景是机械工程,所以请原谅我对此领域的无知。
我真的很喜欢编程和软件开发。另外,最近,我强烈推荐由斯坦福大学教授吴国安(Andrew Ng)教授的免费在线机器学习(ML)课程。链接到这里。
我听说这位教授说很难找到ML永远不会影响的领域。
题
所以我的问题是,迄今为止在将机器学习应用于代码开发方面进行了哪些研究?调试如何?
如果可能,请包括资源/资源/科学论文。
我没有运气搜索,因为经常搜索ML 和软件开发(或编程)最终导致ML应用程序的软件开发(或编程)的结果。
Answers:
模糊测试是一种可以应用机器学习的测试方法。模糊测试是自动探索性测试领域中的一种测试方法。它尝试通过运行大量输入并查找错误来查找软件中的缺陷。未处理的异常是最简单的类别,但是智能实现可以使用ML查找可疑输出。ML在此领域中大量使用,以使过程更有效。通过使用ML可以避免训练“有趣的”输入,从而避免测试所有可能的输入。(不同的输入可能会导致故障。)
是。这个区域现在很热。它被称为“大代码”,DARPA向其中投入了4000万美元:http://www.darpa.mil/program/mining-and-understanding-software-enclaves。该赠款产生了一些令人印象深刻的结果,例如Fan Long的Prophet和Genesis系统,该系统可以通过使用学习到的正确补丁模型自动修复程序中的错误。Martin Vechev和他的学生Veselin Raychev也是该领域的先驱。他们最令人印象深刻的结果可能是JSNice(http://jsnice.org/),它可以“最小化JavaScript代码。
总体而言,大代码的想法没有兑现其诺言:数据太稀疏了,无法学习比变量名更有趣的东西。尽管我仍获得DARPA计划的部分资助,但我的实验室基本上已停止从事该计划。关于这一点,我听到的有关DeepCoder的最后一件事是,与程序综合的最新技术相比,它获得了相当可悲的结果。
大多数成功的自动化编程工具仍然依赖SML求解器等非ML方法。看看任何PL会议(例如:PLDI,POPL,OOPSLA)或任何学术软件工程会议(例如:ICSE,FSE,ISTA,ASE)的会议记录,您都会看到很多示例。
Microsoft一直在开发DeepCoder,以使用深度学习从给定的输入和输出预测方法主体。那是我知道的唯一例子。
我可以告诉您,Meta-Genetic Programming是一个具有类似野心的研究领域,但是我不能说我对它了解的足够多,以至于知识渊博。
当2015年muScalpel开发出一种将功能从一个程序移植到另一个程序的解决方案时,遗传编程就成为新闻。
所以我的问题是,迄今为止在将机器学习应用于代码开发方面进行了哪些研究?调试如何?
一个相关的问题是关于机器学习技术的代码生成和编译(因为你能想象transpilers和编译器,以此来自动地“开发代码” -actually一些高级语言编写代码- )。
对此已有几篇论文,例如MILEPOST GCC。
您也可以在Google上搜索有关机器学习技术的论文,以进行调试或进行静态源代码分析(或进行任何静态程序分析)。
另请参阅J.Pitrat的有关引导人工智能的博客,该博客与您的问题有关。
在ACM通讯部关于使用数学赚钱的最新文章中,Erik Meijer引用了系统和基础架构小组Google高级研究员Jeff Dean的话:
如果Google是今天从头开始创建的,那么其中的许多内容都是可以学习的,而无需编写代码。
本文概述了该研究领域的近期活动。它是有偿的,但是如果您对编码和机器学习/统计之间的理论相似性感兴趣,可能值得一读。也许本文结尾处的参考列表也会有所帮助。
作为示例,本文涉及WebPPL,即Web的概率编程。
这是一个使用机器学习调试微服务的用例。我记录了一些在机器学习中分析微服务性能数据的工作,其中我从对微服务进行负载测试收集的性能数据中训练了决策树,然后研究了决策树,这使我对环境问题有了深刻的了解,并帮助我诊断和修复了性能错误。
如您所见,人们一直在尝试将机器学习应用于编码,但总是在非常狭窄的领域中进行,而不仅仅是一台可以处理所有编码或调试方式的机器。
该答案的其余部分集中于您使用范围相对较广的“调试”机器,以及为何尚未真正尝试进行调试(据我对这一主题的研究显示)。
我编辑了很长一部分答案。总结一下(这对于下一部分很重要):按照当前的机器学习方法,人类可以学习的任何东西,机器也可以学习。我们仅受物理领域(CPU速度,机器大小等)的限制,而不是学习算法本身的有限适用性。
迄今为止,在将机器学习应用于代码开发方面进行了哪些研究?调试如何?
这里的问题不是不可能,而是一个非常复杂的话题。
人类甚至还没有接近定义每个人都同意的通用编码标准。甚至像SOLID这样得到最广泛认可的原则仍然是人们讨论其必须深入实施的依据。出于所有实际目的,除非您没有任何财务(或时间)约束,否则完全遵守SOLID是不可能的。在发生大多数发展的私营部门中,这根本是不可能的。SOLID是准则,不是硬性限制。
在缺乏对与错的客观衡量的情况下,我们如何才能给机器正面/负面的反馈以使其学习?
充其量,我们可以让很多人对机器发表自己的意见(“这是好/不好的代码”),然后机器的结果将成为“平均意见”。但这不一定与正确的解决方案。可以,但是不能保证是。
其次,特别是对于调试,重要的是要认识到特定的开发人员倾向于引入特定类型的错误/错误。错误的性质在某些情况下可能会受到引入错误的开发人员的影响。
例如,由于我经常在工作中修正他人的代码,因此我对每个开发人员容易犯什么样的错误有一种期望。给定一个问题,我知道开发人员A可能会忘记更新配置文件,而开发人员B通常会编写错误的LINQ查询。基于开发人员,我可能首先考虑配置文件或LINQ。
同样,我现在已经在多家公司担任顾问,并且我可以清楚地看到,错误的类型可能会偏向某些类型的公司。我可以得出结论,这不是一条硬性规定,但是有一定趋势。
机器可以学到吗?它是否可以意识到开发人员A更有可能搞乱配置,而开发人员B更有可能搞乱LINQ查询?当然可以。就像我之前说的,人类可以学习的任何东西,机器也可以学习。
但是,您怎么知道您已经教会了机器所有可能性呢?您如何才能为它提供一个小的(即不是全局的)数据集,并且知道它代表了所有错误的事实?或者,您是否会创建特定的调试器来帮助特定的开发人员/公司,而不是创建通用的调试器?
要求使用机器学习的调试器就像要求使用机器学习的Sherlock Holmes。创建一个并不是不可能的,但是通常,成为调试器/ Sherlock的核心理由取决于主观评估,而主观评估因主题而异,并且涉及到各种各样的知识/可能的缺陷。
缺少快速可证明的正确/不正确结果导致难以轻松教授机器并验证其进展良好。