EdmondFrank's 时光足迹

この先は暗い夜道だけかもしれない それでも信じて進むんだ。星がその道を少しでも照らしてくれるのを。
或许前路永夜,即便如此我也要前进,因为星光即使微弱也会我为照亮前途。
——《四月は君の嘘》

谈谈Google自动编程框架AutoML



谈谈Google自动编程框架AutoML

背景

首先,近年在Google AI First 的战略领导之下,Google 陆陆续续发布了不少AI相关产品。那么,我们今天就来看看最近许多公众号和报道中提到的AutoML系统。

据最新的报道:Google AutoML 系统自主编写机器学习代码,其效率在某种程度上竟然超过了专业的研发工程师。

但AutoML的目标并不是要将人类从开发过程中剥离出去,也不是要开发全新的人工智能,而是让人工智能继续维持某种速度来改变世界。

看完这篇报道后许多程序员开始担心未来程序员的工作将很快会被替代。但在笔者看来,AutoML的出现更像是机器学习领域中早就该出现的一个“编译器”,而对于被替代的担心,纯属无稽之谈。就像人写的汇编代码几乎都不可能好过由编程自动生成的优化后的汇编代码一样。

下面就让我们一起来看看AutoML到底是何方神圣吧。

什么是AutoML?

根据AutoML官网上的介绍:
机器学习(Machine Learning, ML)近年来取得了相当大的成功,越来越多的学科需要依赖它。然而,这个成功的关键是需要人类机器学习工程师完成以下的工作:

  • 预处理数据
  • 选择适当的功能
  • 选择一个适当的模型选择系列
  • 优化模型超参
  • 后处理机器学习模型
  • 严格分析所得的结果

由于这些任务的复杂性通常超过了非机器学习专家的能力,机器学习应用的快速增长产生了对于现成的机器学习方法的需求,而且这些现成的机器学习方法简单易使用且不需要专业的知识。我们称以机器学习的渐进自动化为目标的研究领域为AutoML(Automatic Machine Learning, AutoML)

​虽然它的最终用户面向那些没有专业机器学习知识的人,但AutoML依然向机器学习专业人士提供一些新的工具,如:

  • 执行深层表示的架构搜索
  • 分析超参数的重要性

遵循优化编程的范例,AutoML主张开发可以用数据驱动的方式自动实例化的灵活软件包。

AutoML的架构

AutoML网络的设计从卷积架构的初始版本进行多年的仔细实验和细化完成的。

在团队一个名为「AutoML」的项目中(如图所示),左边有一个名为「控制器」(the controller)的 RNN,它设计出一个「child」的模型架构,而后者能够通过某些特定任务进行训练与评估。随后,反馈的结果(feedback)得以返回到控制器中,并在下一次循环中提升它的训练设定。这一过程重复上千次——生成新的架构、测试、再把反馈输送给控制器再次学习。最终,控制器会倾向于设计那些在数据集中能获得更高准确性的架构,而反之亦然。

谷歌团队将这一方法应用于深度学习的两大数据集中,专注图像识别的 CIFAR-10 与语言建模的 Penn Treebank。在两个数据集上,系统自行设计的模型性能表现与目前机器学习专家所设计的领先模型不相上下。

让机器自行选择架构(machine-chosen architecture),与人类在设计神经网络的时候有一些共通之处,比如都采用了合并输入,并借鉴了此前的隐藏层。但其中也有一些亮点,比如机器选择的架构包含乘法组合 ( multiplicative combination),如右图最左边(机器设计)的蓝色标签为「elem_mult」。对于循环神经网络而言,出现组合的情况并不多见,可能因为人类研究者并没有发现明显的优势。有意思的地方在于,此前人类设计者也提议过机器采用的乘法组合,认为这种方法能够有效缓解梯度消失/爆炸问题。这也就意味着,机器选择的架构能够对发现新的神经架构大有裨益。

此外,机器还能教会人类为何某些神经网络的运行效果比较好。上图右边的架构有非常多的渠道,梯度可以向后流动,这也解释了为何 LSTM RNNs 的表现比标准 RNN 的性能要好。

「从长远看来,我们对于机器所设计的架构进行深入的分析和测试,这能够帮助我们重新定义原本自身对架构的看法。如果我们成功,这意味着将会启发新的神经网络的诞生,也能让一些非专家研究人员根据自己的需要创造神经网络,让机器学习造福每一个人。」

AutoML的案例应用

AutoML旨在创建可以由ML新手”开箱即用“的软件。

  • AutoWEAK:就是是一种可以同时选择机器学习算法和其对应超参数的方法;通过使用WEKA包,可以为各种数据集自动生成良好的模型。
  • auto-sklearn:则是一个自动化的机器学习工具包,甚至可以直接替换scikit-learn estimator模块。

测试结果

既然,AutoML说的这么厉害,笔者这里就使用auto-sklearn来测试下分类模型的效果。(使用MNIST数据集)
有关AutoML的具体使用教程,日后再放出,这里就先简单贴个结果,评测个模型准确率和性能。

首先,是笔者的LogisticRegression模型+特征工程:

LogisticRegression(PolynomialFeatures(input_matrix, degree=2, include_bias=False, interaction_only=False), C=0.5, dual=False, penalty=l2)
Accuracy score 0.988888888889

然后是auto-sklearn框架的自生成模型:

import autosklearn.classification
import sklearn.model_selection
import sklearn.datasets
import sklearn.metrics
X, y = sklearn.datasets.load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = \
sklearn.model_selection.train_test_split(X, y, random_state=1)
automl = autosklearn.classification.AutoSklearnClassifier()
automl.fit(X_train, y_train)
y_hat = automl.predict(X_test)
print(“Accuracy score”, sklearn.metrics.accuracy_score(y_test, y_hat))
[Out] Accuracy score 0.993333333333

小结

看到结果,心情复杂。辛辛苦苦的特征工程果然还是干不过AutoML。不过,AutoML生成模型的耗时也是相当高的。
PS 说个题外话。微软一样的服务(不用写代码,不用调参数,会拖控件就能帮你训练深度学习模型)已经发布快一年了。
网站:https://www.customvision.ai/
新闻报道:https://thenextweb.com/dd/2017/05/10/microsofts-custom-vision-lets-build-computer-vision-ai-models-minutes/
只能说Google不愧是IT界的”广告公司“,这公关的对决高下立判。