Stanford Pratical Machine Learning-超参数优化
本文最后更新于:1 年前
这一章主要介绍超参数优化,HPO algorithms
Search Space
常用可服用的搜索空间
- Specify range for each hyperparameter
The search space can be exponentially large
- Need to carefully design the space to improve efficiency
summary:
- backBone:【合理的区间:MobileNetV2_0.25,MobileNetV3_small,MobileNetV3_large,ResNet18_V1b,ResNet18_V1b,ResNet34_V1b,ResNet50_V1b,ResNet101_V1b,VGG16_bn,se_ResNext50_32*4d,ResNest50,ResNest200】(从模型的小到大排序的一个categorical(从一堆东西里面随机挑一个出来)的分布)根据自己的任务来选择,要求耗时比较严的话,可以选择比较小一点的网络;要求比较好的精度的话,可以选择比较大的网络;
- learning rate:【合理的区间:1e-6,1e-1】(是一个log-uniform(先把值做一次log,将值落到小的区间内,在这个区间内均匀的随机取,取完之后再做指数回去))这个东西可以在比较大的区间内选取一些数;
- batch size:【合理的区间:8,16,32,64,128,256,512】,做小批量随机梯度下降时取的批量的大小,采用的也是categorical,一般值会取2的n次方的整数,这样的话会在做计算的时候比较方便(矩阵是2的某个次方,计算的线程数也是2的某个次方,如果不能整除最后计算性能会打一点折扣),但是从优化的最后那个收敛来说其实取什么数值都差不多;
- momentum:【合理的区间:0.85,0.98】(是一个uniform的分布,就是随机采样取一个值出来);
- weight decay:【合理的区间:1e-6, 1e-2】,是一个正则化的东西;
- detector:【合理的区间:faster-rcnn,ssd,yolo-v3,center-net】,在目标检测时用的是什么算法;
这些值的选取需要有领域知识才能做很好的选取
上面这些搜索空间具有一定的通用性(换一个不同的数据集,很有可能比较好的超参数也在这个搜索空间中)
基本上搜索空间不可以太大(搜起来比较贵,指数级增长),也不能太小(可能会找不到想要的值,导致效果比较差)
HPO algorithms: Black-box or Multi-fidelity
- Black-box: treats a training job as a black-box in HPO:
- Completes the training process for each trial
- Multi-fidelity: modifies the training job to speed up the search
- Train on subsampled datasets
- Reduce model size (e.g less #layers, #channels)
- Stop bad configuration earlier
目的是实验,找出好用的参数!!!所以这里可以不用全部的数据,只是试一试,探索一下参数!找到好用的超参数之后,再全量训练(隐含思想:一个超参数在全量表现好的话,在子集应该也不错的捏!!!)
- summary
- black-box:每次一个训练任务 当作一个黑盒(每挑一组超参数,然后拿去训练,然后看模型的关键的衡量指标(精度、误差),再去选下一个怎么做)【可以适用于各种机器学习算法】;
- Multi-fidelity(讨论比较多):因为训练一个模型太贵了(数据集很大,完整跑完很耗时间,还要试很多的话,太耗时了),所以可以不用把整个数据集给跑完(不关心最后的精度怎么样,只关心超参数之间的效果怎么样);以下是做法:
- 对数据集下采样(超参数如果在小数据集上效果比较好的话,在完整数据集上也不差);
- 将模型的变小(SGD的超参数在resnet18上效果差不多的话,在resnet152上也可能是不错的);
- 在训练时会对数据扫很多遍,但是对于不好的超参数来说,它训练一遍就知道它的效果怎么样了,所以不需要等到完全训练完,看到效果不好的,及时停止;
- 上面三点就是说,通过比较比较便宜点的但又跟完整训练有关系的任务来近似一个值,然后对超参数进行排序;
- Black-box 虽然会贵一点但是任务计算量比较小或优化算法不知道的话,这个方法会比较好;Multi-fidelity知道一些任务的细节,可以将任务弄小一点,这样每次试验的时候成本没有那么高。
HPO algorithms
Image Credit: Automated Machine Learning: State-of-The-Art and Open Challenges
- Black-Box:
- Grid Search:
- Random Search:
- Bayesian Optimization:
- Simulated Annealing
- Genetic Algorithms
- Multi-Fidelity:
- Modeling Learning Curve
- Bandit Based(Successive Halving & Hyperband)
Two most common HPO strategies
Grid search: 暴力穷举
for config in search_space: train_and_eval(config) return best_result
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- All combinations are evaluated
- Guarantees the best results
- Curse of dimensionality
- Random search: 随机搜索
- ```python
for _ in range(n):
config = random_select(search_space)
train_and_eval(config)
return best_resultRandom combinations are tried
More efficient than grid search (empirically and in theory, shown in Random Search for Hyper-Parameter Optimization)
Grid性能要求太大,简单的可以,复杂的不行。Random实现超级简单,建议Random去搜索,尤其是机器或者性能不够的情况下。时间到了停了就行,拿目前最好的超参数来用就行昂!!!
Earlier Stopping策略:当在一段时间内(比如十分钟),Random搜索到的参数,没有在同样情况下,使模型精度提升,我们就停下来。不保证能够搜索到最好的,但是这种设计实现简单有效!
Bayesian Optimization (BO)
- BO: Iteratively learn a mapping from HP to objective function. Based on previous trials. Select the next trial based on the current estimation.
- Surrogate model
- Estimate how the objective function depends on HP
- Probabilistic regression models: Random forest, Gaussian process, …
- Acquisition function
- Acquisition max means uncertainty and predicted objective are high.
- Sample the next trial according to the acquisition function
- Trade off exploration and exploitation
- Limitation of BO:
- In the initial stages, similar to random search
- Optimization process is sequential
T = 2代表采样了两个点,图中黑色的两个点。横轴是Search Space,竖轴是我们的目标函数。
- 黑色表示实际的数据,紫色代表我们的概率预测,虚线是我们预测的均值,上下的$\mu + \sigma$和$\mu - \sigma$是我们预测的置信度。
- 见过的t,我们是确定的,因此就是具体的点。两条线之间,代表的就是我们预测不好的地方。随着采样的点越来越多,我们的预测就越来越准了昂!!!
- Summary:
- 在实际中用的不是那么多,因为相对来说比较复杂,但是是比较活跃的研究方向;
- BO(贝叶斯优化),是会学从一个超参数HP到目标函数(精度、损失)的一个函数【机器学习是数据到我们想要东西之间的一个映射的关系】,这里是说每一个数据点是一个模型;
- 就每做一个实验就会得到一个数据点,然后再拟合一个曲线出来;它在选下一个超参数去试的时候,会根据当前的评估,来的出数据点;
- Surrogate模型:就是拟合超参数与目标函数之间关系的模型,可以采用概率的一些regression模型,可以使用随机森林或者是高斯过程;
- 随着采样的越来越多,对整个模型的进步会越来越准。
- 获取函数(Acquisition function)是贝叶斯优化中另一个要建模的模型,它会去评估下一个点应该去取谁(对每一个超参数都会去预测一个值);
- 如果值大说明置信度没有那么高,就需要被拟合,所以下一个采样值,就是获取函数值最大的那个点;
- 这边是一个exploration(到未知的地方看看)和exploitation(知道某一块位置不错,在那个位置上多看看)的一个过程【很多机器学习算法都是这个两个的权衡】
- 在一开始的时候其实跟random search差不多(获取函数还不够好,就只能随机挑值来做),再后期的时候(建模比较准)会比较好一点;
- 随机搜索是并行的算法,贝叶斯优化是顺序的算法(采下一个点需要等上一个完成才行)
- 到底是什么时候会好一点,如果预算不够的话(搜的质量跟随机搜索的差不多),这样是划不来的;如果贝叶斯能在前期就做的比随机搜索好,那这样的划得来的。
- 通常贝叶斯优化比随机搜索好的时候,一般来说是模型比较简单(模型比较简单的话,随机搜索也不差),或者是超参数的那个空间不那么复杂,或者有足够多的样本(需要很多的预算)
Multi-Fidelity
以下这两个算法在现实生活中用的比较多
Successive Halving
- Save the budget for most promising config
- Randomly pick configurations to train epochs
- Repeat until one configuration left:
- Keep the best n/2 configuration to train another m epochs
- Keep the best n/4 configuration to train another 2m epochs
- ……
- Select n and m based on training budget and #epoch needed for a full training
- Summary:
- 有很多超参数的选择,但是大部分超参数没有必要把它训练完,所以只需要把最靠谱的超参数给训练完就行了,剩下的早期就被淘汰了
- 首先选取n个超参数,然后每个超参数训练m个epoch(把数据扫个m遍)【通常n会取大一点,m取小一点】;然后把好的超参数留下一半,剩下的一半不要,epoch还是m;在下一次迭代,超参数还是留下一半,而epoch变成了原来的两倍;这样的过程一直重复,直至留下一个超参数为止。【这样也就是说靠谱的超参数我们给多点资源】
- n与m的选取要基于预算而言的(预算多n就取大一点);但是n与m不好取,这其实是一个exploration和exploitation的过程,在下一个算法会做改进。
Hyperband
In Successive Halving:
- exploration
- exploitation
Hyperband runs multiple Successive Halving, each time decreases n and increases m
More exploration first, then do more exploit
- Summary
- 这个是在HPO上用的比较多的算法,所以我们在实践中是可以使用它的;
- 在Successive Halving中n是一个exploration的过程(n越大每次试的东西就越多),而m是exploitation(m取决于每一个参数说跑的时间,跑的越长也就看的越准);nm代表的是每一次迭代中计算复杂度的多少;在计算的预算是固定的时候,nm应该是一个固定的数,所以在SH(Successive Halving)中每次都要调这个东西;
- Hyperband就是跑多个SH,一开始会选大一点的n和小一点的m,但后面会逐渐的讲n变小m变大;
- hyperband的好处是说,对n与m的选取不会那么敏感(会多跑几次,多几个组合),这样就不用怎么操心n还有算法在exploration与exploitation的权衡,这个算法都算了一遍;
Summary
Black-box HPO: grid/random search, bayesian optimization
Multi-fidelity HPO: Successive Halving, Hyperband
In practice, start with random search
Beware there are top performers
- You can find them by mining your training logs, or what common configurations used in paper/code
在HPO中有两种主流的算法:黑盒与Multi-fidelity
黑盒:一个超参数进去一个模型出来,然后知道模型的好坏,里面有暴力搜索,随机搜索(用得比较多的,没有什么特别好的方法的话,用这个准没错),和贝叶斯优化(研究的一个大方向)
Multi-fidelity(通常在深度学习用得比较多):如果训练时间过长会选择一个相对来说比较小的做法,包括采样一个小数据集,小版本的网络,具体说的算法是SH与Hyperband,这些是说,在训练了一些轮数的时候,把不靠谱的给淘汰掉;
注意一些Top performers(看看比赛中那些做的很好的人是怎么做的,看看那些算的最高分的论文在超参数的选择都差不多),在跑过很多数据集之后,会发现总有那么几个模型和几组参数在各个地方都跑的比较好,所以很有可能试那几个就行了;