机器学习应用于代码开发


17

我的背景是机械工程,所以请原谅我对此领域的无知。

我真的很喜欢编程和软件开发。另外,最近,我强烈推荐由斯坦福大学教授吴国安(Andrew Ng)教授的免费在线机器学习(ML)课程。链接到这里

我听说这位教授说很难找到ML永远不会影响的领域。

所以我的问题是,迄今为止在将机器学习应用于代码开发方面进行了哪些研究?调试如何?

如果可能,请包括资源/资源/科学论文。

我没有运气搜索,因为经常搜索ML 软件开发(或编程)最终导致ML应用程序的软件开发(或编程)的结果。


您是有关编写代码的代码的问题,还是有关实现机器学习的编码技术的问题?
罗伯特·哈维

编写代码,改进代码或检查代码中的错误的代码(ML代码)(无论是用于Web开发,数值求解器等)。不是实现机器学习的技术。
查尔斯(Charles)

并不是说这种情况永远不会发生,但是高级编程语言旨在让具有缓慢化学激活控制单元的人类更容易获得计算机指令。在最基本的层面上,机器学习是机器决定应该做什么。将来,为糊状水袋设计的语言将不再像人类自己那样需要。
JimmyJames

这个问题应该迁移到人工智能网站上。那些投票赞成的人可以告诉我们为什么吗?
quintumnia

这实际上是一个很酷的问题!
Rhys Johns

Answers:


6

模糊测试是一种可以应用机器学习的测试方法。模糊测试是自动探索性测试领域中的一种测试方法。它尝试通过运行大量输入并查找错误来查找软件中的缺陷。未处理的异常是最简单的类别,但是智能实现可以使用ML查找可疑输出。ML在此领域中大量使用,以使过程更有效。通过使用ML可以避免训练“有趣的”输入,从而避免测试所有可能的输入。(不同的输入可能会导致故障。)


有趣。因此,这种方法属于代码测试类别,对吗?我更喜欢RJB的答案,因为它涉及开发而不是测试。但是测试/调试当然仍然有用。
查尔斯

是的 它肯定在测试领域,没有足够的人尝试过,但是随着云计算变得越来越普通,它作为一种可行的技术正越来越流行。让自己拥有一台计算机集群,运行一周的测试然后丢弃该集群直到下一次变得更加容易。
RubberDuck

4

是。这个区域现在很热。它被称为“大代码”,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)的会议记录,您都会看到很多示例。


3

Microsoft一直在开发DeepCoder,以使用深度学习从给定的输入和输出预测方法主体。那是我知道的唯一例子。

我可以告诉您,Meta-Genetic Programming是一个具有类似野心的研究领域,但是我不能说我对它了解的足够多,以至于知识渊博。

当2015年muScalpel开发出一种将功能从一个程序移植到另一个程序的解决方案时,遗传编程就成为新闻。


这就像使用遗传模型生成算法一样,对吧?您是否知道任何辅助代码开发的应用程序?我想到的是人机协同工作,而不是纯粹的机器驱动(基于遗传的模型)。我知道这听起来可能很具体,但是我主要是因为我是这个领域的新手而很好奇。
查尔斯

确保您是对的,我读错了,我在使用ML来做ML时过于递归考虑:) #edited
RJB

2

所以我的问题是,迄今为止在将机器学习应用于代码开发方面进行了哪些研究?调试如何?

一个相关的问题是关于机器学习技术的代码生成和编译(因为你能想象transpilers编译器,以此来自动地“开发代码” -actually一些高级语言编写代码- )。

对此已有几篇论文,例如MILEPOST GCC

您也可以在Google上搜索有关机器学习技术的论文,以进行调试或进行静态源代码分析(或进行任何静态程序分析)。

另请参阅J.Pitrat的有关引导人工智能的博客,博客与您的问题有关。


1

在ACM通讯部关于使用数学赚钱的最新文章中,Erik Meijer引用了系统和基础架构小组Google高级研究员Jeff Dean的话:

如果Google是今天从头开始创建的,那么其中的许多内容都是可以学习的,而无需编写代码。

本文概述了该研究领域的近期活动。它是有偿的,但是如果您对编码和机器学习/统计之间的理论相似性感兴趣,可能值得一读。也许本文结尾处的参考列表也会有所帮助。

作为示例,本文涉及WebPPL,即Web的概率编程


0

这是一个使用机器学习调试微服务的用例。我记录了一些在机器学习分析微服务性能数据的工作,其中我从对微服务进行负载测试收集的性能数据中训练了决策树,然后研究了决策树,这使我对环境问题有了深刻的了解,并帮助我诊断和修复了性能错误。


0

我发现 了所有与编码相关的机器学习主题的大量阅读清单

如您所见,人们一直在尝试将机器学习应用于编码,但总是在非常狭窄的领域中进行,而不仅仅是一台可以处理所有编码或调试方式的机器。
该答案的其余部分集中于您使用范围相对较广的“调试”机器,以及为何尚未真正尝试进行调试(据我对这一主题的研究显示)。


我编辑了很长一部分答案。总结一下(这对于下一部分很重要):按照当前的机器学习方法,人类可以学习的任何东西,机器也可以学习。我们仅受物理领域(CPU速度,机器大小等)的限制,而不是学习算法本身的有限适用性。

迄今为止,在将机器学习应用于代码开发方面进行了哪些研究?调试如何?

这里的问题不是不可能,而是一个非常复杂的话题。

人类甚至还没有接近定义每个人都同意的通用编码标准。甚至像SOLID这样得到最广泛认可的原则仍然是人们讨论其必须深入实施的依据。出于所有实际目的,除非您没有任何财务(或时间)约束,否则完全遵守SOLID是不可能的。在发生大多数发展的私营部门中,这根本是不可能的。SOLID是准则,不是硬性限制。

在缺乏对与错的客观衡量的情况下,我们如何才能给机器正面/负面的反馈以使其学习?
充其量,我们可以让很多人对机器发表自己的意见(“这是好/不好的代码”),然后机器的结果将成为“平均意见”。但这不一定与正确的解决方案。可以,但是不能保证是。

其次,特别是对于调试,重要的是要认识到特定的开发人员倾向于引入特定类型的错误/错误。错误的性质在某些情况下可能会受到引入错误的开发人员的影响。

例如,由于我经常在工作中修正他人的代码,因此我对每个开发人员容易犯什么样的错误有一种期望。给定一个问题,我知道开发人员A可能会忘记更新配置文件,而开发人员B通常会编写错误的LINQ查询。基于开发人员,我可能首先考虑配置文件或LINQ。
同样,我现在已经在多家公司担任顾问,并且我可以清楚地看到,错误的类型可能会偏向某些类型的公司。我可以得出结论,这不是一条硬性规定,但是有一定趋势。

机器可以学到吗?它是否可以意识到开发人员A更有可能搞乱配置,而开发人员B更有可能搞乱LINQ查询?当然可以。就像我之前说的,人类可以学习的任何东西,机器也可以学习。
但是,您怎么知道您已经教会了机器所有可能性呢?您如何才能为它提供一个小的(即不是全局的)数据集,并且知道它代表了所有错误的事实?或者,您是否会创建特定的调试器来帮助特定的开发人员/公司,而不是创建通用的调试器?

要求使用机器学习的调试器就像要求使用机器学习的Sherlock Holmes。创建一个并不是不可能的,但是通常,成为调试器/ Sherlock的核心理由取决于主观评估,而主观评估因主题而异,并且涉及到各种各样的知识/可能的缺陷。
缺少快速可证明的正确/不正确结果导致难以轻松教授机器并验证其进展良好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.