NNI中目前已经实现的Tunner算法分类:
目前Tunner算法:
- 基于暴力搜索的方法:
- GridSearch,定义参数空间,逐个搜索,浪费资源,但是可以搜索到所有的空间
- Batch tuner,
- 基于序列模型优化的方法:
- TPE
- SMAC
- 基于搜索空间的方法:
- Random
- Anneal:搜索空间,采用启发式策略
- Naive Evolution:朴素进化
- 基于贝叶斯优化的方法:
- Hyperband
- 其他的:
- Network Morphism,可以选择和设计网络结构的,主要用于视觉任务,目前支持keras和pytorch
- Metis Tuner ,可以根据精度选择下一次配置
参考上一篇博客中统计的部分实验数据:
算法 | 最高分数 | 最低分数 | >0.80次数 | >0.90次数 | >0.95次数 | 总次数 |
---|---|---|---|---|---|---|
TPE | 0.9834 | 0.0958 | 7 | 5 | 3 | 10 |
Random | 0.9823 | 0.0982 | 3 | 3 | 2 | 10 |
Anneal | 0.9837 | 0.0892 | 2 | 2 | 2 | 10 |
Naive Evolution | 0.9692 | 0.0958 | 2 | 1 | 1 | 10 |
Batch Tuner | 0.9877 | 0.1135 | 3 | 3 | 2 | 6 |
Grid Search | 0.988 | 0.0892 | 343 | 274 | 162 | 600 |
SMAC | 0.9733 | 0.098 | 5 | 4 | 1 | 10 |
Hyperband | 0.9831 | 0.0958 | 5 | 5 | 4 | 10 |
可以看到在Mnist数据集上做实验的话,几乎所有的Tunner算法都可以达到0.95+的分数。
- 显然基于暴力搜索的GridSearch和BatchTuner效率更低下,GridSearch会对所有的数据进行排列组合,显然是最低效的,而且也并没有明显的性能指标的提升。BatchTuner只支持
combine_params
,类似人工调参的升级版,对于有经验的程序员是一个很不错的工具。 - 从以上的小数据量的实验来看(如果条件允许,进行大数据量实验的话会更可靠),TPE应该是首选,得分高,而且大于0.80的次数多。
- SMAC使用
nnictl package install
安装起来着实费劲,github的这个服务器是挂在了美国亚马逊上,所以如果网速不是很理想的服务器基本在装的时候每次都是timeout,如果可以直接用pip install smac
安装就好了。