2019-05-19 更新:
我的问题是关于教 AI 解决问题,而不是让 AI 教人类开发人员解决问题。
原帖:
我是一名软件开发人员,但对 AI 很陌生。
今天我和朋友聊了聊人工智能的发展。其中一个主题是关于实现“给定问题、分析问题和设计解决方案”的能力。
由于我们都是软件开发人员,因此我们在讨论中使用了一个简单的示例问题来了解 AI 如何可能找到解决方案:
Print the following three lines on the console:
*
***
*****
我和我的朋友认为我们可以使用一些正式的方法来描述我们想要什么,而不是我们如何实现它。找出解决方案是人工智能的工作。
然后我们来到了我在这里要问的问题:由于我和我的朋友都是人工智能研究的局外人,我们不知道是否有任何现有的研究(我们相信这样的研究一定存在于某个地方)教人工智能分析问题(正式定义)并使用给定的工具设计解决方案。
对于我们人类来说,我们对问题的分析和设计可能如下所示:
- 让我选择一种编程语言。例如,C.
- 让我看看我选择的编程语言有哪些工具。哦,他们在这里:
putchar(ch)
在控制台上打印一个字符。printf(str)
在控制台上打印一个字符串。- for循环;如果别的; 支持子程序;等等。
- 我看到结果有三行字符:第 1、2 和 3 行。
- 我看到三行中 '*' 的数字是等差数列,并且行号和字符号之间存在联系:给定行号i,字符号是2*i-1,其中i是 1, 2 , 和 3. 这是重复,我可以使用 for 循环。
- 每一行都是'*'的重复,所以我可以实现一个函数来做到这一点。
void print_line(int N) {
for (int i = 0; i < N; i++) {
putchar('*');
}
putchar('\n');
}
int main(int argc, char * argv[]) {
for (int i = 1; i <=3; i++) {
print_line(2 * i - 1);
}
return 0;
}
或者,我可以设计一个简单的解决方案,使用printf()
三次并对每个字符串进行硬编码:
printf("*\n");
printf("***\n");
printf("*****\n");
我们认为能够做到这一点的人工智能可能会遵循与人类开发人员类似的分析和设计方法。总的来说,我们认为:
- 这个 AI 应该有一个工具箱,它可以使用它来解决一些问题(可能不是所有问题)。在我上面的例子中,这个工具箱可能是一种编程语言及其对应的库。
- 这个 AI 应该了解一些概念(如上例中的控制台和字符串)及其关系。
- 该 AI 应该具有连接工具箱和概念的知识,因此 AI 知道工具如何操纵概念的属性。
- 最重要的是,该 AI 应该能够使用工具箱找出将输入连接到所需输出的一条或多条路径。我们认为,这个过程需要“分析”和“设计”的能力。
如果描述仍然含糊不清,请原谅我们。我和我的朋友都是 AI 新手,所以事实上,我们甚至不知道“分析”和“设计”是否合适。如果需要,我们将很高兴澄清。
顺便说一句,我们对此类 AI 进行了一些快速搜索:
- 莱斯大学的 Bayou似乎也不理解这个问题。
- DeepCoder使用深度学习,我怀疑它是否理解问题。
- AI-Programmer使用遗传算法在 BrainFuck 中生成所需的字符串。但这个人工智能看起来并不像理解这个问题。它看起来像是一个带有反馈的试错法。