数据是这个时代的核心,基于数据所构建的模型和决策为工业自动化贡献了很多,也已经改变了很多企业的商业模式、产品等,改变了世界也收益颇丰。这也是时下大数据、人工智能炒作得如此火爆,甚至一些机器人智能威胁论也层出不穷。但实际上机器学习、深度学习和深度强化学习的能力实在很有限的,近日来在NLP任务中大杀四方的BERT就被开始质疑是否真的学习到了推理能力,是否只是依靠大量数据集本身特点,如一些线索词来进行工作,而一旦加入干扰和对抗,效果就与盲猜无异。不说废话了,这也是需要人的原因,多少人工才能创造多少智能。
为什么需要AutoML?
过去几年在AutoML上的研究无不是从机器学习步骤中的某些环节进行优化,特征工程(feature engineering),元学习(meta-learning),神经网络架构搜索(architecture search),组合模型选择(Combined Model Selection),超参优化(Hyperparameter optimization)。
特征工程(feature engineering)
传统的特征选择往往会用类似于过滤法、包裹法等,目前主要有一些方法是:
元学习(meta-learning)
字面上就是学会如何学习,重点是对学习本身的理解和适应,而不是为了某个特定的任务。它能够评估自己的学习方法,并根据特定的学习任务对自己的学习方法进行调整。
神经网络架构搜索(architecture search)
如何学习到更好的神经网络架构?即生成更深或更宽的网络架构。
Learning Transferable Architectures for Scalable Image Recognition,https://arxiv.org/pdf/1707.07012.pdf
用积木组合的方法,并大获成功。
Progressive Neural Architecture Search,https://arxiv.org/pdf/1712.00559.pdf
基于序列模型的优化(SMBO),先各模块按照复杂性递增的顺序排序,从简单的做起,再逐一测试搜索结构。实验证明这样并不会缩小搜索空间,取得了不错的效果。
Efficient Neural Architecture Search via Parameter Sharing,https://arxiv.org/pdf/1802.03268.pdf
ENAS算法强制将所有模型的权重共享,而非从零开始训练模型到收敛,所有曾经探索过的模块都将使用这些学习过的共享权重。所以每次训练新模型是都进行迁移学习,收敛速度也更快。
超参优化(Hyperparameter optimization)
有做过实际项目的人应该都清楚,对于超参的选择是非常重要的“撞大运”游戏,所以也被戏称为“深度学习调参师”,有时候一个细微的参数差值就能改变所有,所有,所有。
一般常规做超参搜索主要有1.网格搜索,尝试所有的参数选择;2.贝叶斯优化,在函数方程不知的情况下,根据采样点来预估函数的最大值;3.随机搜索,简单的对参数设定固定次数的随机搜索要比网格更加有效;4.基于梯度,计算相对于超参的梯度,然后使用梯度下降来优化超参。
流程优化(Pipeline Optimization)
组合更好的组合上述的各个模块?目前已经有集成好了的几个平台:
#以auto_ml例子为例
#首先需要pip install auto_ml
from auto_ml import Predictor
from auto_ml.utils import get_boston_dataset #boston数据集
from auto_ml.utils_models import load_ml_model
# 载入数据
df_train,df_test = get_boston_dataset()
# 需要表述数据中哪个属性为output,以及数据特性
# 如 Examplesinclude ['nlp', 'date', 'categorical', 'ignore']
column_descriptions= {
'MEDV': 'output' ,
'CHAS': 'categorical'
}
#建立回归模型
ml_predictor =Predictor(type_of_estimator='regressor',column_descriptions=column_descriptions)
ml_predictor.train(df_train)
# 对模型的测试评分
test_score =ml_predictor.score(df_test, df_test.MEDV)
#保存模型和重载模型
file_name =ml_predictor.save()
trained_model =load_ml_model(file_name)
#利用模型进行预测
predictions =trained_model.predict(df_test)
print(predictions)
#如果使用tpot
from tpot import TPOTClassifier
form sklearn.datasets import loard_digits
from sklearn.model_selection import train_test_split
#载入并切分数据集
digits=load_digits()
X_train,X_test,y_train,y_test=train_test_split(digits.data,digits.target,train_size=0.75,test_size=0.25)
tpot=TPOTClassifier(generation=5,population_size=50,verbosity=2,n_jobs=-1)
topt.fit(X_train,y_train)
print(tpot.score(X_test,y_test))
#导出
tpot.export('topt_minist_pipeline.py')