PyTorch实战(36)------PyTorch自动机器学习
0. 前言
自动机器学习 (AutoML) 能够为给定神经网络自动寻找最优架构与最佳超参数配置。在本节中,我们将全面地研究 PyTorch 的 AutoML 工具------Auto-PyTorch,该工具能同时执行神经架构搜索和超参数搜索。通过本节学习,即使缺乏领域经验也能设计机器学习模型,同时大幅加速模型选择流程。
1. 使用 AutoML 寻找最佳神经网络架构
我们可以将机器学习算法视为自动化发现输入输出间关联关系的技术。传统软件开发需要人工编写函数来明确定义这些关系,而机器学习模型则能自动推导这些映射函数。虽然这种自动化提高了效率,但仍存在大量人工环节需要处理。除了数据挖掘与清洗外,还包括:
- 选择机器学习模型(或选择一个模型类型,再选择具体的模型)
- 决定模型架构(尤其是在深度学习场景下)
- 选择超参数
- 根据验证集表现调整超参数
这些工作通常需要有丰富深度学习经验的研究人员参与,既耗时又依赖专业经验。面对各行各业日益增长的模型需求,现有专业研究人员资源已明显不足。这正是 AutoML 的价值所在------它致力于将上述流程全面自动化。
本节我们将重点介绍专为 PyTorch 设计的 AutoML 工具 Auto-PyTorch。以手写数字分类任务为例,介绍如何自动寻找最优神经网络架构及超参数配置,本节中我们不再手动设计架构和参数,而是交由 Auto-PyTorch 自动完成。具体流程包括:加载数据集、创建 Auto-PyTorch 模型搜索实例、运行搜索流程并获取最优模型。
2. 使用 Auto-PyTorch 搜索最优模型
接下来,我们将通过 Jupyter notebook 执行模型搜索。
2.1 加载 MNIST 数据集
(1) 首先,我们导入所需库,导入关键 Auto-PyTorch 模块用于帮助我们建立并执行模型搜索任务:
python
import torch
from torchviz import make_dot
from torchvision import datasets, transforms
from autoPyTorch import AutoNetClassification
import matplotlib.pyplot as plt
import numpy as np
(2) 加载训练和测试数据集:
python
train_ds = datasets.MNIST('./data', train=True, download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1302,), (0.3069,))]))
test_ds = datasets.MNIST('./data', train=False,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1302,), (0.3069,))]))
(3) 将这些数据集的张量转换为训练和测试的输入 (X) 和输出 (y) 数组:
python
X_train, X_test, y_train, y_test = train_ds.data.numpy().reshape(-1, 28*28), test_ds.data.numpy().reshape(-1, 28*28) ,train_ds.targets.numpy(), test_ds.targets.numpy()
需要注意的是,本节我们将图像重塑为大小为 784 的展平向量。在下一小节中,我们将定义一个 Auto-PyTorch 模型搜索器,它要求输入扁平化的特征向量,因此需要进行此重塑操作。Auto-PyTorch 支持以 AutoNetClassification 和 AutoNetImageClassification 形式分别处理特征化数据和图像数据。在本节中,我们使用的是特征化数据,我们也可以尝试改用图像数据作为拓展练习。
2.2 使用 Auto-PyTorch 进行神经架构搜索
加载数据集后,我们将使用 Auto-PyTorch 定义模型搜索实例,并执行神经架构搜索与超参数搜索任务。
(1) 定义 autoPyTorch 模型搜索实例:
python
# running Auto-PyTorch
autoPyTorch = AutoNetClassification("tiny_cs", # config preset
log_level='info',
max_runtime=2000,
min_budget=100,
max_budget=1500)
通常 tiny_cs 配置用于快速搜索场景,其对硬件资源需求较低。budget 参数用于设置 Auto-PyTorch 过程的资源消耗限制。默认情况下,该参数以时间为单位------即我们允许模型搜索过程占用的 CPU/GPU 总时长。
(3) 实例化 Auto-PyTorch 模型搜索器后,我们通过在训练数据集上执行拟合来启动搜索流程:
python
autoPyTorch.fit(X_train, y_train, validation_split=0.1)
Auto-PyTorch 内部会运行多个不同模型架构和超参数组合的试验。这些试验都会在 10% 的验证数据集上进行基准测试,最终返回表现最佳的试验结果。输出展示了 Auto-PyTorch 为当前任务找到的最优超参数配置,例如,学习率为 0.068,动量为 0.934,等等。还会显示了所选最优模型配置在训练集和验证集上的准确率。
(4) 在获得最优训练模型后,使用该模型在测试集上进行预测:
python
y_pred = autoPyTorch.predict(X_test)
print("Accuracy score", np.mean(y_pred.reshape(-1) == y_test))
输出结果如下所示:
shell
Accuracy score 0.964
可以看到,最终获得的模型在测试集上达到了 96.4% 的准确率。作为对比,随机猜测的基准准确率仅为 10%。值得注意的是,这一优秀性能是在我们既未定义模型架构也未设置超参数的情况下实现的。若增加搜索预算,更全面的探索有望带来更优异的表现。
此外,性能还会根据执行搜索的硬件(机器)而有所不同。具有更多计算能力和内存的硬件可以在相同的时间预算内运行更多的搜索,从而可能会带来更好的性能。
3. 可视化最优 AutoML 模型
在本节中,我们将查看上一小节的模型搜索过程得到的最佳表现模型。
(1) 在已查看最优超参数的基础上,我们查看 Auto-PyTorch 自动设计的最优模型架构:
python
pytorch_model = autoPyTorch.get_pytorch_model()
print(pytorch_model)
(2) 我们还可以使用 torchviz 工具可视化实际模型结构图:
pythonn
x = torch.randn(1, pytorch_model[0].in_features)
y = pytorch_model(x)
arch = make_dot(y.mean(), params=dict(pytorch_model.named_parameters()))
执行后会在当前工作目录中保存一个名为 convnet_arch.pdf 的文件。
(3) 若要了解模型如何收敛至该解决方案,我们可以通过以下代码查看模型搜索过程中使用的搜索空间:
python
autoPyTorch.get_hyperparameter_search_space()
这段代码实质上列出了构建模型所需的各种要素及其取值范围。例如学习率的搜索范围设定为 0.0001 至 0.1,且采用对数尺度进行采样------这意味着采样过程并非线性而是对数分布。
在运行试验时,我们已经看到 Auto-PyTorch 从这些范围中采样出的、针对当前任务最优的具体超参数值。通过 Auto-PyTorch 模块中的 HyperparameterSearchSpaceUpdates 子模块,我们还可以手动调整这些超参数范围,甚至添加更多超参数。
在本节中,我们完成了对 Auto-PyTorch 的探索。我们成功地在没有指定模型架构和超参数的情况下,使用 Auto-PyTorch 构建了 MNIST 数字分类模型。通过使用 Auto-PyTorch 及其他 AutoML 工具能够自动化构建 PyTorch 模型,类似工具包括:Hyperopt、Tune、skorch、BoTorch 以及 Optuna。
小结
在本节中,我们探讨了 AutoML 技术,其核心目标是提供模型选择与超参数优化的自动化方法。对于缺乏经验的初学者,AutoML 能帮助解决"模型应包含多少层"、"选择哪种优化器"等决策难题;对于经验丰富的研究人员,它既能加速模型训练流程,又能发现那些通过人工调参几乎不可能获得的最优模型架构。
系列链接
PyTorch实战(1)------深度学习(Deep Learning)
PyTorch实战(2)------使用PyTorch构建神经网络
PyTorch实战(3)------PyTorch vs. TensorFlow详解
PyTorch实战(4)------卷积神经网络(Convolutional Neural Network,CNN)
PyTorch实战(5)------深度卷积神经网络
PyTorch实战(6)------模型微调详解
PyTorch实战(7)------循环神经网络
PyTorch实战(8)------图像描述生成
PyTorch实战(9)------从零开始实现Transformer
PyTorch实战(10)------从零开始实现GPT模型
PyTorch实战(11)------随机连接神经网络(RandWireNN)
PyTorch实战(12)------图神经网络(Graph Neural Network,GNN)
PyTorch实战(13)------图卷积网络(Graph Convolutional Network,GCN)
PyTorch实战(14)------图注意力网络(Graph Attention Network,GAT)
PyTorch实战(15)------基于Transformer的文本生成技术
PyTorch实战(16)------基于LSTM实现音乐生成
PyTorch实战(17)------神经风格迁移
PyTorch实战(18)------自编码器(Autoencoder,AE)
PyTorch实战(19)------变分自编码器(Variational Autoencoder,VAE)
PyTorch实战(20)------生成对抗网络(Generative Adversarial Network,GAN)
PyTorch实战(21)------扩散模型(Diffusion Model)
PyTorch实战(22)------MuseGAN详解与实现
PyTorch实战(23)------基于Transformer生成音乐
PyTorch实战(24)------深度强化学习
PyTorch实战(25)------使用PyTorch构建DQN模型
PyTorch实战(26)------PyTorch分布式训练
PyTorch实战(27)------自动混合精度训练
PyTorch实战(28)------PyTorch深度学习模型部署
PyTorch实战(29)------使用TorchServe部署PyTorch模型
PyTorch实战(30)------使用TorchScript和ONNX导出通用PyTorch模型
PyTorch实战(31)------在Android上部署PyTorch模型
PyTorch实战(32)------在iOS上构建PyTorch应用
PyTorch实战(33)------使用fastai进行快速原型开发
PyTorch实战(34)------基于PyTorch Lightning的跨硬件模型训练
PyTorch实战(35)------使用PyTorch Profiler分析模型推理性能