7

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

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

我知道这听起来像是天方夜谭,所以我想知道已经做了什么,如果有的话。

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

但是有了一个复杂的学习人工智能,我很想知道它会产生什么。

我知道有很多人类品质是计算机无法复制的,比如我们的判断、品味和偏见。但是我的想象力喜欢这样的想法:一个程序经过一天的思考后会吐出一个网站,让我看看它想出了什么,即使如此,我仍然经常认为它是垃圾;但也许每天一次,我可能会给它反馈并帮助它学习。

这种想法的另一个途径是提供一个高级描述,如“菜单式网站”或“图像工具”,它会生成足够深度的代码,作为代码完成模块,然后我可以在细节。但我想这可以设想为一种非智能的静态分层代码完成方案。

这个怎么样?

4

2 回答 2

12

存在这样的工具。它们是称为遗传编程的学科的主题。您如何评估它们的成功取决于它们的应用范围。

他们在设计用于管理工业过程、自动医疗诊断或集成电路设计的最佳程序方面非常成功(比人类效率高出几个数量级)。这些过程受到很好的约束,具有明确且不可变的成功衡量标准,以及大量的“宇宙知识”,即关于什么是有效的、有效的、什么是无效的程序的大量规则。

他们在尝试构建需要用户交互的主流程序时完全没有用,因为学习的系统需要的主要项目是明确的“适应度函数”,或者评估它提出的当前解决方案的质量。

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

于 2009-04-02T18:03:45.080 回答
8

免责声明:我不是以英语为母语的人,也不是该领域的专家,我是业余爱好者- 期待以下内容不精确和/或错误。因此,本着 stackoverflow 的精神,不要害怕纠正和改进我的散文和/或我的内容。另请注意,这不是对自动编程技术的完整调查(来自模型驱动架构(MDA)的代码生成(CG)至少值得一提)。

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

自动编程遗传编程(GP) 方法结合其适应度函数,将两个不同的问题(“自编译”在概念上是显而易见的):

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

wrt self-improvement/adaptation参考 Jürgen Schmidhuber 的Goedel 机器自我参照的通用问题解决者,可证明最佳的自我改进。(附带说明:有趣的是他在人工好奇心方面的工作。)与本次讨论相关的是自主系统

wrt程序综合,我认为可以分为 3 个主要分支:随机(概率 - 像上面提到的 GP)、归纳演绎

GP本质上是随机的,因为它通过交叉、随机突变、基因复制、基因删除等启发式方法生成可能程序的空间……(而不是使用适应度函数测试程序并让适者生存和繁殖)。

归纳程序综合通常被称为归纳编程(IP),其中归纳逻辑编程(ILP)是一个子领域。也就是说,一般而言,该技术不限于逻辑程序合成或以逻辑编程语言编写的合成器(也不限于“ ..自动演示或语言/分类学习”)。

IP通常是确定性的(但也有例外):从不完整的规范(例如输入/输出对示例)开始,并使用它来限制满足此类规范的可能程序的搜索空间,然后对其进行测试(生成和测试)方法)或直接合成一个程序来检测给定示例中的重复,然后对其进行概括(数据驱动分析方法)。整个过程本质上是统计归纳/推理——即考虑将什么包含在不完整的规范中类似于随机抽样。

生成和测试数据驱动/分析§方法可以相当快,所以两者都是有希望的(即使直到现在只有很少的综合程序被公开展示),但是生成和测试(如 GP)是令人尴尬的并行然后可以预期显着的改进(缩放到实际的程序大小)。但请注意,本质上是顺序的增量归纳编程(IIP)§ 已证明比非增量方法更有效几个数量级。

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

演示编程(PbD) 和示例编程(PbE) 是已知可实际利用归纳程序综合的最终用户开发技术。

演绎程序综合从(假定的)完整(正式)规范(逻辑条件)开始。其中一种技术利用了自动定理证明器:为了合成一个程序,它构造一个满足规范的对象存在的证明;因此,通过Curry-Howard-de Bruijn 同构(证明作为程序对应和公式作为类型对应),它从证明中提取程序。其他变体包括使用约束求解子程序库的演绎组合

在我看来,实践中的归纳演绎综合是从两个稍微不同的角度来解决同一个问题,因为什么构成了完整的规范是有争议的(此外,今天的完整规范明天可能会变得不完整——世界不是静止的)。

When (if) these techniques (self-improvement/adaptation and program synthesis) will mature, they promise to rise the amount of automation provided by declarative programming (that such setting is to be considered "programming" is sometimes debated): we will concentrate more on Domain Engineering and Requirements Analysis and Engineering than on software manual design and development, manual debugging, manual system performance tuning and so on (possibly with less accidental complexity compared to that introduced with current manual, not self-improving/adapting techniques). This will also promote a level of agility yet to be demonstrated by current techniques.

于 2009-10-16T18:17:15.550 回答