Automl Acemyzoe

AutoML

  1. 自动特征工程AutoFeatureEng
  2. 自动调参AutoTuning,超参数的搜索。
  3. 自动神经网络探索NAS,模型的选择。

当一个领域有足够大和全面的基准数据和pretrained模型时(预训练模型时),基本上这个领域调参的价值就相对比较低了。

一个传统的机器学习流程,就是给定一个任务(task),人(human expert)来下选择模型(model),并根据模型的表现和反馈进行调整。首先我们需要了解数据以及要解决的问题,其次我们要根据已有的经验来选择一筐子模型和参数进行选择,最后再进行评估。AutoML其实就是用数据驱动的方法来代替人为的先验

AutoML流程综述

  1. 数据准备
    1. 数据收集Data Collection:开源、爬虫、GAN生成
    2. 数据清洗:清洗数据中的噪声、脏数据(例如,冗余,不完整或不正确的数据),被广泛使用的数据清理操作包括标准化,缩放,定量特征二值化,one-hot编码定性特征,用平均值填充缺失值等。
    3. 数据增强Data Cleaning:增加新数据,防止模型过拟合
  2. 特征工程:
    1. 特征选择Feature Selection:通过减少不相关或冗余特征,基于原始特征集构建特征子集的过程
    2. 特征构建Feature Construction:从基本特征空间或原始数据构造新特征的过程,常见的方法是预处理转换,这些转换也应用于数据预处理,例如标准化、规范化和特征离散化等。
    3. 特征提取Feature Extraction:通过一些映射函数的降维过程,其根据一些特定度量提取信息和非冗余特征。特征提取将改变原始特征。 特征提取的核心是映射函数,可以以多种方式实现,如PCA和LDA等等。
    4. 数据和特征决定了机器学习的上界,而模型和算法只是为了去近似这个上界
    5. DL模型可以自己从数据中学出特征,很少需要手动构造特征
  3. 模型生成
    1. 搜索空间
      1. ML模型
      2. DL模型:针对不同的任务定义一个搜索空间
    2. 优化方法
      1. 超参数优化Hyperparameter Optimization, HPO:
        1. 网格搜索、随机搜索、
        2. 贝叶斯优化:贝叶斯优化(BO)是一种建立目标函数概率模型的算法,然后使用该模型选择最有希望的超参数,最后在真实目标函数上评估所选择的超参数。
        3. 梯度优化:基于梯度下降(GD)的方法
        4. 强化学习:基于RL的算法由两部分组成。一是控制器,它是一个RNN,用于在不同的时期生成不同的子网络;二是奖励网络,用于训练和评估生成的子网络并使用 更新RNN控制器的奖励(例如准确性)
        5. 进化算法:选择,交叉,变异和更新。
      2. 结构优化
  4. 模型评估:指导架构优化模块生成更好的架构。最一般的方法就是从头开始训练到收敛
    1. 低保真度Low fidelity:评估时降低数据集的分辨率,降低cell堆叠的层数,使用小数据集等等
    2. 权重共享:如ENAS
    3. 代理Surrogate
    4. early stop

NAS的话主要涉及到DL模型的搜索空间定义、结构优化和模型评估策略这三块。

假设:如果一个神经网络能在结构相似的小规模数据集上得到更好的成绩,那么它在更大更复杂的数据集上同样能表现得更好。

限制:搜索空间有限,NAS设计目的是构建和当前最先进的架构风格(ResNet)非常类似的网络。

NAS方法分为一阶段和两阶段。

两阶段是一般做法,第一个阶段就是搜索评估阶段,选出最好的架构,第二个阶段就是retrain这个最优架构,在验证集上评估。

而一阶段就是只需要训练一次超网络,联合优化架构参数和模型权重,之后不需要再retrain了。

机器学习模型和系统的设计

提升对程序设计与开发、机器学习系统的理解。对于一个机器学习工程师而言,工程能力是数据为先模型的设计(data intensive design)。

机器学习模型的开发跟数据交互更加频繁,数据的吞吐量更大,且不确定性更多。故需要考虑到:

  1. 模型开销(运行时间、储存开销),有些信息不能储存在内存或者需要分布的去做
  2. 性能与开销的取舍(在有限的资源下完成可接受的成果)
  3. 对于不确定性的鲁棒性(如果预测超出范围,如果输入数据有很多异常)
  4. 模型的可扩展性(比如数据量成十倍的增加,比如需要及时更新模型,比如需要在线更新模型)
  5. 模型的安全性(防止针对机器学习模型的攻击,比如根据返回结果来倒推模型等)

NNI

NNI (Neural Network Intelligence) 是一个轻量但强大的工具包,帮助用户自动的进行 特征工程神经网络架构搜索超参调优以及模型压缩

NNI工作流程

输入:搜索空间,试用代码,配置文件 输出:一种最佳的超参数配置

1:对于t = 0、1、2,…,maxTrialNum,

2:超参数=从搜索空间中选择一组参数

3:最终结果= run_trial_and_evaluate(超参数)

4:向NNI报告最终结果

5:如果达到上限时间,停止实验

返回具有最佳最终结果的超参数值

mnist示例

直接运行mnist_nni.py一次只能尝试一组参数。如果要调整学习率,则需要手动修改超参数并一次又一次地开始试验。

  1. 使用JSON编写文件,包括需要搜索的所有超参数(离散值或连续值)

    search_space.json

  2. 修改代码以从NNI获取超参数集,并将最终结果报告给NNI。

    mnist_nni.py 已修改

  3. `定义一个config.yml文件,该文件包括路径搜索空间和文件声明,还提供其他信息,例如调整算法、最大持续时间参数等。

    config.yml

命令行运行config.yml文件以开始MNIST实验。

nnictl create --config ./nni/config.yml
# The Web UI urls are: http://127.0.0.1:8080

更多命令nnictl

# 恢复已停止的实验
nnictl resume [experiment_id]
# 查看已停止的实验
nnictl view [experiment_id]
# 停止正在运行的实验或多个实验
nnictl stop [experiment_id]
## 显示所有(运行中)实验的信息。##
nnictl experiment list --all
# 删除一个或所有实验,其中包括日志,结果,环境信息和缓存。
nnictl experiment delete [experiment_id]
###将实验的结果和超参数导出到csv或json文件中。###
nnictl experiment export [experiment_id] --filename [file_path] --type json --intermediate
# 导入
nnictl experiment import [experiment_id] -f experiment_data.json
# 保存nni实验元数据和代码数据。
nnictl experiment save [experiment_id] --saveCodeDir
# 载入nni实验。
nnictl experiment load --path [path] --codeDir [codeDir]
####显示实验的WebUI网址###
nnictl webui url