一、模型调参
本章主要讲如何对超参数进行调节,得到比较好的结果
1. 手工调节超参数
- 从一个比较好的基准线(baseline)开始
- eg:高质量的工具包的默认参数、别人论文的超参数
- 调一个值,重新训练一个模型,去看看损失、精度
- 重复前面的步骤多次,得到一些直觉,就能知道:
- 哪些超参数比较重要
- 模型对超参数对超参数的敏感度
- 比较好的超参数的范围
- 需要妥善管理实验,做笔记
- 记录下所有的日志、超参数,之后可以进行比较区别
- 把log存在txt文件,把超参数和一些指标放在excel
- 使用tensorboard和weight&bias
- 重复一个实验很难,关系到:
- 环境(硬件、库)
- 代码
- 随机性(随机种子)
2. 自动调节超参数
- 计算成本在减少,人力成本在增加
- 使用算法调参,当训练超过1000次,算法能够打败90%的数据科学家调参
2.1 AutoML自动机器学习
- 用ML去解决问题的时候,把每一个步骤(数据清理、特征抽取、模型选择)都自动化
- 在模型选择这块,AutoML效果不错
2.1.1 超参数优化 HPO:通过搜索算法找到一个很好的超参数的集合
2.1.2 神经网络架构NAS:构造一个比较好的神经网络模型使得能够拟合到我的数据上
3. HPO算法
3.1 搜索空间
- 为每个超参数指定一个范围
- 搜索空间不能太大
3.2 HPO算法分类
3.2.1 Black-box黑盒
- 每挑一组超参数去做训练,每次训练都是完成了的
- 优点:适用于任何机器学习算法
3.2.2 Multi-fidelity 多精度(只需要关注超参数哪个更好,关注于他的排序)
-
在完整数据集上进行采样,然后训练
-
缩小模型大小(eg:减少层数#layers、通道数#channels)
-
不需要等完全训练完,提早结束不好的超参数
3.3 最常见的两个HPO策略(属于黑盒优化)
3.3.1 网格搜索
for config in search_space:
train_and_eval(config)
return best_result
- 搜索空间的所有的组合都训练和评价一次
- 保证结果是最好的
- 搜索空间大的话,任务不可能完成
3.3.2 随机搜索(最优先选择)
for _ in range(n):
config = random_select(search_space)
train_and_eval(config)
return best_result
-
最多选择n次,每次从搜索空间随机选择一个config
-
通常很有效,当遇到没什么进度(eg:精度不提升)了,就停止
3.3.3 贝叶斯优化(BO)
- 学习一个从超参数到目标函数(eg:损失函数、评估精度)的函数
- 根据当前的评估,来选择下一次训练的超参数
3.3.3.1 代理模型(Surrogate model)
- 拟合超参数到目标函数的模型
- 概率回归模型:随机森林回归、高斯过程回归
3.3.3.2 获取函数(Acquisition function):评估我下一个点采样谁
- 值大表示我不那么置信
- 下一个采样的超参数是获取函数最大的点
- 权衡exploration(探索未知)和exploitation(深处挖掘)
3.3.3.3 BO的局限性
- 刚开始的阶段,和随机搜索差不多,后期比较好
- 参数优化过程是顺序的(采集下一个点需要等前一个点完成)
3.4 Successive Halving(SH)
- 把最靠谱的超参数训练的足够长,不好的超参数早期淘汰掉,节约钱
- 随机取n个超参数,每个超参数训练m轮(epochs)
- 一直重复下面的步骤,直到只剩下一个超参数
- 保留最好的一半超参数,丢掉剩下的一半
- 每个超参数训练的epoch翻倍
- 根据预算来选择n、m、迭代次数#epochs
- 钱多n可以大一些
3.4.1 问题:n不太好取
3.5 Hyperband
- 在SH中
- n代表exploration
- m代表exploitation
- Hyperband运行多次SH,每次都减少n增加m
- 刚开始关注于exploration,然后关注于exploitation
4. NAS算法(用于NN)
-
神经网络(NN)有各种不同的超参数
- 拓扑结构:resnet、mobilenet、每个网络的层数
- 每一层:核窗口大小、卷积层输出通道数、全连接层或者RNN输出的隐藏单元的个数
-
NAS使得整个神经网络的设计更加自动化
- 指定NN的搜索空间
- 如何在搜索空间进行搜索
- 如何判断NN架构的好坏
4.1 通过强化学习实现NAS
-
用一个RNN来生成网络架构
- 然后在我的数据集上训练,得到验证的精度
- 把精度反馈给RNN(强化学习)
-
强化学习很贵,加速NAS的方法
- 不要训练完整的网络
- 重用参数,不用重新训练(EAS、ENAS)
4.2 One-Shot 方法实现NAS
- 既学习模型架构也学习其中的超参数
- 训练一个巨大的模型,其中包含很多个子模型
- 评估候选架构
- 只需要关心候选架构的好坏,以此排序
- 使用近似的指标:训练一些轮就好了,选出精度好的架构
- 选出最好的候选架构,再到完整的数据上做一次训练
4.3 可微的架构搜索(属于One-shot方法)
- 把选择谁做成一个可以学习的softmax参数
- 每一层有多个候选的层(比如kernel size是3x3还是5x5)
- 第 l l l层的第 i i i个候选输出是 o i l o_i^l oil
- 每一个候选有一个可学习的参数对其进行softmax操作 α l = s o f t m a x ( α l ) \alpha^l = softmax(\alpha^l) αl=softmax(αl)
- 下一层的输入是上一层的进行加权求和 ∑ a i l o i l \sum{a_i^lo_i^l} ∑ailoil,然后复制几份给下一层做select
- 选择每一层最大的那个 α i \alpha_i αi
4.4 Scaling CNNs(伸缩CNN)
- CNN可以通过3种办法调节
- 更深:更多层
- 更宽:更多的输出通道
- 更大输入:输入更大的图片分辨率
- EfficientNet提出三个东西要一起动(compound scale)
- 四个可调节参数 α , β , γ , ϕ \alpha,\beta,\gamma,\phi α,β,γ,ϕ
- 伸缩大小: α ϕ 控 制 深 度 , β ϕ 控 制 宽 度 , γ ϕ 控 制 分 辨 率 \alpha^\phi控制深度,\beta^\phi控制宽度,\gamma^\phi控制分辨率 αϕ控制深度,βϕ控制宽度,γϕ控制分辨率
- α β 2 γ 2 ≈ 2 \alpha\beta^2\gamma^2\approx2 αβ2γ2≈2,只需要调节 ϕ \phi ϕ就可以了
4.5 NAS研究方向
-
网络长得很奇怪,解释下差
-
在边缘设备上应用(eg:手机)
- 边缘设备越来越强大,隐私保护比较好,延迟低
- 设备性能高低不平、功耗限制
- 最小化 l o s s ∗ l o g ( l a t e n c y ) β loss * log(latency)^\beta loss∗log(latency)β, β \beta β 控制我更关心延迟还是更关心精度