智能代码完成? AI是否通过学习编写代码?

时间:2009-04-02 17:48:26

标签: machine-learning artificial-intelligence computer-science genetic-algorithm

我问的是这个问题,因为我知道这里有很多读得很好的CS类型可以给出明确的答案。

我想知道这样的AI是否存在(或正在研究/开发),它通过生成和编译代码来编写程序,然后通过从以前的迭代中学习来进步。我正在谈论努力使我们,程序员,过时。我正在想象通过反复试验来学习编程语言中哪些有效和哪些无效的东西。

我知道这听起来像是在天空中,所以我要求找出已做过的事情,如果有的话。

当然,即使是人类程序员也需要输入和规范,因此这样的实验必须有精心定义的参数。就像人工智能将探索不同的计时功能一样,必须明确定义这一方面。

但是通过复杂的学习AI,我很想知道它会产生什么。

我知道计算机无法像我们的判断,品味和偏见那样复制人类的品质。但是我的想象力喜欢一个程序的想法,这个程序在经过一天的思考后会吐出一个网站,让我看看它是什么产生的,甚至我常常认为它是垃圾;但也许每天一次,我可能会给它反馈并帮助它学习。

这个想法的另一个途径是提供像“菜单网站”或“图像工具”这样的高级描述会很好,它会产生足够深度的代码,这对我来说可以作为代码完成模块使用细节中的代码。但我想这可以设想为非智能静态分层代码完成方案。

怎么样?

2 个答案:

答案 0 :(得分:12)

存在这样的工具。它们是名为Genetic Programming的学科的主题。您如何评估他们的成功取决于他们的应用范围。

他们非常成功(数量级比人类更高效),可以为工业过程,自动医疗诊断或集成电路设计的管理设计最佳方案。这些过程受到很好的约束,具有明确且不可改变的成功度量,以及大量的“宇宙知识”,这是关于什么是有效的,有效的,有效的,什么不是有效的大量规则。

他们在尝试构建需要用户交互的主流程序时完全无用,因为学习需求的系统的主要项目是明确的“fitness function”,或评估当前解决方案的质量我想出了。

在处理“程序学习”时可以看到的另一个领域是Inductive Logic Programming,尽管它更多地用于提供自动演示或语言/分类学习。

答案 1 :(得分:8)

免责声明:我不是英语母语人士,也不是该领域的专家,我是 amateur - 期待不确定和/或错误跟随。因此,本着stackoverflow的精神,不要害怕纠正和改进我的散文和/或我的内容。另请注意,这是automatic programming技术的完整调查(code generation(CG)来自Model-Driven Architectures(MDA),至少值得一提。)< / p>

我想在Varkhan回答的内容中添加更多内容(基本上是正确的)。

Genetic Programming {GP} Automatic Programming方法与其fitness functions混淆了两个不同的问题(“自我编译”在概念上是不言而喻的):

  • 自我改进/适应 - 合成程序,如果需要的话,合成器本身;和
  • program synthesis

w.r.t。 自我提升/适应性指JürgenSchmidhuber的Goedel machines自我引用的普遍问题解决者,可以证明最佳的自我提升。 (作为旁注:有趣的是他在artificial curiosity上的工作。)与此讨论相关的还有Autonomic Systems

w.r.t。 program synthesis ,我认为可以对3个主要分支进行分类: stochastic (概率 - 如上所述GP),归纳 em>和演绎

GP 本质上是 stochastic 因为它产生了可能程序的空间,具有启发式,如交叉,随机变异,基因复制,基因删除等...(比用fitness function测试程序,让适者生存和繁殖)。

归纳程序合成通常称为Inductive Programming(IP),其中Inductive Logic Programming(ILP)是子字段。也就是说,通常该技术不限于logic program合成或用逻辑编程语言编写的合成器(两者都不限于“ ..自动演示或语言/分类学习” )。

IP通常确定性(但也有例外):从不完整规范(例如示例输入/输出对)开始,并使用它来约束满足此类规范的可能程序的搜索空间,然后测试它(生成和测试方法)或直接合成检测给定示例中的重现的程序,然后进行推广(数据驱动的分析方法)。整个过程基本上是statistical induction/inference - 即考虑将不完整的规范包含在内的内容类似于随机抽样。

Generate-and-test and data-driven/analytical§方法可以非常快,所以两者都很有希望(即使现在只公开演示了很少的合成程序),但生成和测试(如GP) )是embarrassingly parallel,然后可以预期显着的改进(缩放到实际的程序大小)。但请注意,Incremental Inductive Programming(IIP)§本质上是连续的,已证明对非增量方法更有效。

§这些链接直接指向PDF文件:抱歉,我无法找到摘要。

Programming by Demonstration(PbD)和Programming by Example(PbE)是已知的end-user development技术,可以实际利用归纳程序合成

Deductive program synthesis 以(假定的)完整(正式)规范(逻辑条件)开头。其中一种技术利用automated theorem provers:合成一个程序,它构造了一个符合规范的对象存在的证明;因此,通过Curry-Howard-de Bruijn isomorphism(证明程序对应和公式 - 类型对应),它从证明中提取程序。其他变体包括使用constraint solvingdeductive composition of subroutine libraries

在我看来,归纳演绎合成在实践中正在通过两个不同的角度攻击同一个问题,因为它构成了一个完整的规范是有争议的(此外,今天的完整规范明天可能会变得不完整 - 世界不是静态的。)

当(如果)这些技术(自我改进/适应和程序综合)成熟时,他们承诺提高declarative programming提供的自动化量(这种设置应被视为“编程“是sometimes debated):我们将更多地关注Domain EngineeringRequirements Analysis and Engineering,而不是软件手册设计和开发,手动调试,手动系统性能调整等等(可能与与当前手册中引入的相比,accidental complexity更少,而不是自我改进/适应技术)。这也将提升agility的水平,但尚未通过现有技术证明。