另一个重要的AutoML方向是与模型权重一起学习模型架构。因为每次尝试一个稍微不同的架构时,都会从头开始训练一个新的模型,所以一个真正强大的AutoML系统将通过对训练数据的反馈来调整模型的特征,同时管理体系结构,以消除所有计算冗余。这些方法已经开始出现,因为我正在写类似的代码。
当这种情况开始发生时,机器学习工程师的工作不会消失,相反,工程师将在价值创造链上走高。他们将开始更多地努力制定真正反映业务目标的复杂损失函数,并深入了解他们的模型如何影响其部署的数字生态系统——目前,只有最大的公司才会考虑这些问题。
终身学习(AGI)和反复利用模块化子程序
如果模型变得更加复杂,并且建立在更加丰富的算法原语之上,那么这种增加的复杂性将需要在任务之间有更高的重用,而不是每当有一个新任务或一个新的数据集时都需要从头开始训练一个新的模型。实际上,很多数据集是没有包含足够的信息来从头开发新的复杂模型的,需要利用先前的数据集的信息。就像你每次打开一本新的书都不会从头开始学习英语——这是不可能的。此外,由于当前的任务与先前的任务之间有很大的重叠,每个新任务都要从头开始训练模型是非常低效的。
此外,近年来出现的一个值得注意的观察是,训练同一个模型去同时做多个有松散关联的任务,能产生一个在每项任务上都表现更好的模型。例如,训练同一个神经机器翻译模型去同时做英语-德语翻译和法语-意大利语翻译,将得到一个在每个语言对上都表现更好的模型。训练一个图像分类和图像分割的模型,两个任务共享同一个卷积base,得到一个在两个任务上都表现更好的模型。等等。这是非常直观的:在这些似乎没有关联的任务之间总是存在一些重叠的信息,因此,联合模型相比仅针对一个特定任务训练的模型能访问更多有关各个任务的信息。
我们目前跨任务做类似模型重用的方式是利用执行常见功能的模型的预训练权重,例如视觉特征提取。将来,我希望这一方法的通用性版本能够变得常用:我们不仅利用先前学习的特征(子模型权重),还利用模型架构和训练程序。随着模型变得越来越像程序,我们将开始重用程序子例程(program subroutines),例如人类编程语言中的函数(function)和类(class)。
想想今天的软件开发过程:一旦工程师解决了一个特定的问题(例如Python中的HTTP查询),他们就将它封装成一个抽象且可重用的库。后来面临类似问题的工程师可以简单地搜索现有的库,下载并在自己的项目中使用它们。以类似的方式,将来,元学习系统将能够通过筛选高级可重用block的全局库来组装一个新的程序。当系统发现自己为几个不同的任务开发类似的程序子例程时,如果出现一个“抽象的”可重用子例程版本,系统会将它存储在全局库中。这样的过程将实现抽象的能力,这是实现“极端泛化”( extreme generalization)的必要组件:一个被发现在不同任务和域中有用的子例程可以说是“抽象化”问题解决的一些方面。“抽象”( abstraction)的定义与软件工程中抽象的概念相似。这些子例程可以是几何的(具有预训练的表征的深度学习模块)或算法的(更接近当代软件工程师操作的库)。
(一个能够使用可重用原语(包括算法的和几何的)快速开发任务特定模型的元学习器(meta-learner),从而实现“极端泛化”(extreme generalization))
总结:长期的展望
作为总结:以下是我对机器学习的长期展望
1.模型将更像程序,并且具有远远超出我们目前使用的输入数据的连续几何变换的能力。这些程序可以说是更接近于人类对周围环境和自身的抽象思维模式,而且由于其丰富的算法性质,它们将具有更强的泛化能力。
2.尤其,模型将被混合起来提供正式推理,搜索和抽象功能的算法模块,并提供具有非正式直觉和模式识别功能的几何模块。AlphaGo(一个需要大量人工软件工程和人类决策的系统)提供了一个早期的例子,展示象征和几何AI之间的混合的可能样子。
3.它们将自动成长,而不是由人类工程师人工制作,使用存储在可重复使用子程序的全局库中的模块化组件——这是通过在数千个先前任务和数据集上学习高性能模型演变而来的库。由于常见的问题解决模式是通过元学习系统识别的,它们将变成可重用的子例程——非常像当代软件工程中的函数和类——并被添加到全局库中。这就实现了抽象的能力。