我认为可能会获得飞速发展的 AI 相关子领域是程序综合(program synthesis),特别是神经网络程序综合。程序综合在于通过使用搜索算法(可能是遗传搜索,如遗传编程)自动生成简单的程序来探索大量的可能的程序。当找到符合所需规格的程序时,搜索就会停止,通常作为一组输入 - 输出对进行提供。正如你所看到的,它是否高度让人联想到机器学习:给出作为输入 - 输出对提供的“训练数据”,我们找到一个将输入与输出进行匹配的“程序”,并将其推广到新的输入之中。不同之处在于,我们不用在硬编码程序(神经网络)中学习参数值,而是通过离散搜索过程生成源代码。
我肯定期望这个子领域在未来几年内会迎来新一波的热潮。
特别是,我期望在深度学习和程序综合之间出现一个交叉子域,在这里我们不是用通用语言生成通用程序,而是用丰富的算法基元,如for循环等等生成神经网络(几何数据处理流)。
这应该比直接生成源代码要容易得多,而且它会大大扩展机器学习可以解决的问题的范围 - 我们可以自动生成给定适当的培训数据的程序的空间——这是一种符号AI和几何AI的混合。当代RNN可以被看作是这种混合算法几何模型的史前祖先。
超越反向传播和可微分层
如果机器学习模型变得更像程序,那么它们将几乎不再是可微分的。当然,这些程序仍然会将连续的几何图层用作子程序,这些是可微分的,但是整个模型不会是这样。因此,在一个固定的、硬编码的网络中,使用反向传播来调整权重值,将不能成为未来训练模型的首选方法, 至少不全部使用这一方法。
我们需要找到如何能有效地训练不可微系统。目前的方法包括遗传算法,“进化策略”,某些强化学习方法和ADMM(乘法器的交替方向法)。自然地,梯度下降不会受影响 - 梯度信息对于优化可微分参数函数将永远是有用的。但是,比起仅仅使用可微分参数的函数,我们的模型肯定会变得越来越强大,因此它们的自动开发(“机器学习”中的“学习”)将不仅仅需要反向传播。
此外,反向传播是端到端的,这对于学习良好的链接变换是一件好事,但是,这种方法计算效率低下,因为它不能充分利用深层网络的模块化。为了使事情更有效率,有一个通用的配方:引入模块化和层次结构。因此,我们可以通过引入具有一些同步机制的解耦训练模块,以分级方式组织,从而使反向传播本身更有效率。 DeepMind最近在“合成梯度”方面的工作,反映了这一策略。我希望在不久的将来会有更多的这方面的工作。
人们可以想象这样一个未来:模型从全局上看是不可微分的(但是会对可微分的部分做特征处理),这些模型会在训练中得到成长,使用一个高效的搜索过程,而不用梯度。同时,可微分的部分将会通过利用梯度的优势,得以更快地训练,其方法是使用一些更有效率的反向传播方法。
自动化的机器学习
未来, 模型架构将会通过机器自身的学习来获得,而不是由工程师手写编码来设计。自动地学习架构将与更丰富的基元和类似程序的机器学习模型的使用共同发展。
目前,深度学习工程师的大部分工作就是用Python脚本清洗数据,然后对深层网络的体系结构和超参数进行长时间的调优,以获得一个可用的模型 ,甚至是获得最先进的模型,如果工程师野心足够大的话。毫无疑问,这不是一个最优的设置。AI 在这方面也可以提供帮助。不幸的是,数据清洗部分很难自动化,因为它通常需要专业领域知识,以及对工程师想要实现的工作有明确的高度的理解。然而,超参数调优是一个简单的搜索过程,我们已经知道工程师在这种情况下需要实现什么:它由被调整的网络中的损失函数进行定义。设置基本的“AutoML”系统,来处理大部分的模型旋钮已经是常见的做法。多年前,我甚至自己做了一个这样的系统,赢得了Kaggle的比赛。
在最基本的层次上,这样的系统将简单地调整堆栈中的层数、它们的顺序以及每一层中的单元或过滤器的数量。这通常是使用诸如Hyperopt一类的库,我们在第7章(注意:使用Python深度学习)中讨论过。但是我们也可以更有野心,尝试从头开始学习一个适当的架构,尽可能减少约束。这可以通过加强学习,例如遗传算法来实现。