开发者文档¶
本文档总结了 AutoPyTorch 代码的工作原理,旨在为开发者贡献代码提供指导。
AutoPyTorch 依赖于 SMAC 库来构建独立模型,这些模型随后通过 Caruana 等人 (2004) 的集成选择方法组合成一个集成模型。因此,代码主要分为两部分:作为 SMAC 接口的 AutoMLSMBO,以及在固定时间间隔内机会性地构建 SMAC 发现的独立算法集成模型的 EnsembleBuilder。以下章节将详细介绍这两个主要代码块。
构建独立模型¶
- AutoPyTorch 依赖于 Scikit-Learn 的 Pipeline 来构建独立算法。
换句话说,SMAC 拟合的每个独立模型都符合 Scikit-Learn 的 pipeline 和框架。
- Pipeline 可以包含各种预处理步骤,包括填充、编码、缩放、特征预处理以及算法设置和训练。关于训练,Auto-PyTorch 可以拟合 3 种类型的 pipeline:一个 dummy pipeline、传统的分类 pipeline 和 PyTorch 神经网络。dummy pipeline 基于 sklearn.dummy 构建一个使用简单规则进行预测的估计器。这个预测用作基线,用于定义可以拟合的最差性能模型。此外,Auto-PyTorch 还拟合传统的机器学习模型(包括 LightGBM、CatBoost、RandomForest、ExtraTrees、K-Nearest-Neighbors 和 Support Vector Machines),这些模型对于小型数据集至关重要。最后一类机器学习 pipeline 对应于神经网络骨干(特征提取)和网络头(用于最终预测)的神经架构搜索。Pipeline 还可能包含额外的训练组件,例如学习
率调度器、优化器以及执行神经架构搜索所需的数据加载器。
在表格分类/回归的情况下,训练数据使用 scikit-learn.compose.ColumnTransformer 按列进行预处理。数据预处理是根据数据集属性动态创建的。例如,对于仅包含浮点型特征的数据集,不需要进行独热编码。此外,我们通过 TabularColumnTransformer 类封装 ColumnTransformer,以支持 torchvision 转换并处理列重新排序(如果使用 ColumnTransformer,分类列会左移)。
拟合 pipeline 后,我们使用 pickle 将其保存到磁盘,如此处所述。SMAC 运行一个基于贝叶斯优化的优化循环,提出新的配置,这些配置符合 ConfigSpace 包的要求。这些配置随后被转换为 AutoPyTorch pipeline,拟合,最后使用函数评估器 ExecuteTaFuncWithQueue 保存到磁盘。后者本质上是一个工作进程,它从磁盘读取数据集,拟合 pipeline,并收集性能结果,然后通过 Queue 通信回主进程。这个工作进程使用 Pynisher 管理资源,通常通过创建一个具有受限内存 (memory_limit API 参数) 和时间限制 (func_eval_time_limit_secs API 参数) 的新进程来实现。
Scikit-learn pipeline 继承自 BaseEstimator,这意味着我们必须遵循Scikit-Learn 开发指南。特别是,任何估计器的类构造函数参数必须定义为类的属性(参见上述文档中的 get_params 和 set_params)。
为了加速搜索,AutoPyTorch 和 SMAC 使用 Dask.distributed 多进程方案。我们只向 Dask.distributed.Client 提交不超过工作进程数量的作业,并在有工作进程可用时才继续搜索更多 pipeline。
SMAC 运行结束后,结果将保存在提供给 API 运行的 temporary_directory 中,特别是位于 <temporary_directory>/smac3-output/run_<SEED>/ 目录下。可以使用该区域中的 runhistory.json 文件调试独立模型的性能。每个独立模型将存储在 <temporary_directory>/.autoPyTorch/runs 中。在这个 runs 目录中,我们存储拟合的模型(在交叉验证期间,我们存储单个 Voting Classifier/Regressor,它是 k-Fold 交叉验证的软投票结果)、用于构建集成的 Out-Of-Fold 预测,以及该模型的测试预测。
构建集成模型¶
在每次 SMAC 迭代时,如果新的模型被写入磁盘,我们会提交一个回调函数来创建集成。如果没有新的模型可用,则不会触发集成选择。我们使用 OutOfFold 预测通过 EnsembleSelection 构建集成。这个过程也提交给 Dask。每个新拟合的集成也会写入磁盘,这个对象主要是一个容器,指定用于组合独立模型预测的权重。
AutoML 部分¶
集成构建器和独立模型构建都由 BaseTask 调节。这个实体本质上调用上述任务,并等待直到时间资源耗尽。
我们还依赖于 ConfigSpace 包来构建配置空间并从中采样配置。在此上下文中,配置决定了 pipeline 的内容(例如,最终估计器将是 MLP,或者将使用 PCA 作为预处理)。有效配置的集合由配置空间确定。配置空间是根据数据集特征构建的,例如特征类型(分类、数值)或目标类型(分类、回归)。