技术日新月异的当下,人工智能编程日益成熟,它的发展能有助于人类制造更多智能机器吗?
程序合成是指基于规范自动生成程序的概念。它不同于程序验证。程序验证依赖于正式的证明来证实程序按照正式的规范运行。
1957年,在康奈尔大学符号逻辑协会举行夏季会议期间,阿隆佐·邱奇试图基于数学要求合成程序。20世纪60年代,人工智能相关研究人员详细阐述了程序合成的概念,并将其应用于典型的人工智能研究。
近年来,深度学习已经改变了人工智能完成任务的方式。这种进步促使研究人员尝试教授人工智能人类擅长的工作。其中一个重要领域就是创建元学习系统,让人工智能学习人类擅长的各种工作。神经程序合成和机器人技术的相关研究初步展现了利用程序合成来教授机器人精准执行任务的能力。
程序合成最常用于使计算机编程更容易实现。诸如AutoProf、FlashFill、Storyboard编程工具等应用程序允许学生通过直接操作某些概念以更直观的方式编写程序,而无需编写代码。
在人工智能研究人员弗朗索瓦·乔莱的论文《智力测试》中,他将程序合成作为一种用于解决智力测试问题后建模的ARC任务的技术。
在接受Verge网站关于其论文的采访时,乔莱说:“关键点是,在任何任务中,获得高技能都不是智力的表现。除非这个任务是一个元任务,涉及到从大量此前未知的问题上获得新的技能。这正是我所认为的智力基准。”
从本质上讲,系统智力应通过以下方式测试, 正如乔莱所说“这意味着只使用系统之前不知道的新任务,测量系统开始时对该任务之前的知识,以及测量系统的采样效率(即学习完成该任务需要多少数据)。达到某一技能水平所需的信息(先前的知识和经验)越少,就说明越智能。如今的人工智能系统一点也不智能。”
他后来将ARC任务作为问题发布,来解决Kaggle的抽象和推理问题挑战。解决这一问题将涉及到利用编程综合的力量来学习以前未知的ARC任务。
分解编程合成问题
对于每一个看似不可能解决的问题,可以先把问题分解成小问题。如果您从未学习过编程合成,那么就在开始工作前了解一下存在什么问题以及怎么解决。
1.程序空间问题
每个编程合成问题最终都要在整个程序空间中进行搜索。搜索方法必须是有效的。想象一下,若使用树算法,就必须有办法砍下这棵树的枝干,否则,在它生长的过程中,它有无限生长的潜力。
2. 用户意向问题
在测试用户意图的逻辑之间常常存在模糊领域。当用户与环境交互时人们有了一方面的发现,在用户参与时,新的数据可能会将问题转化为用户眼中的全新问题。
若要成功解决Kaggle挑战必然涉及解决这两个问题。
用于程序合成的实用工具
在Python中,Z3是用于程序合成的Python包。这里是阿德里安·桑普森为Z3提供的优秀教程。
其文章中的例子如下:
构建泛型求解器,如下所示:
代码源于阿德里安·桑普森博客
然后,定义要运行的公式。
代码源于阿德里安·桑普森博客
运行:print(solve(formula)) 来解决任何问题。您可以阅读他的教程了解更多细节和例子。
想要了解更多有关程序合成的知识吗?
下面是几个程序合成相关学习资源.
1. 程序合成之深度学习(DeepLearning for Program Synthesis)https://sunblaze-ucb.github.io/program-synthesis/index.html
2. 深度编码器:学习编写程序(Deep Coder: Learning To WritePrograms)
https://openreview.net/pdf?id=ByldLrqlx
3. 深度学习程序合成微软研究(Deep Learning Program SynthesisMicrosoft Research)
https://www.microsoft.com/en-us/research/blog/deep-learning-program-synthesis/
如果您正在着手解决弗朗索瓦·乔莱提出的Kaggle挑战,那么本文将为您提供帮助。
“任何问题都不可能从创造它的同一层次的意识中得到解决。”——爱因斯坦
每一个“不可能”的挑战都是由不放弃解决问题的人一步一步解决的。
加油,你是最棒的!