前言
automl, 简单来说,就是将机器学习应用于现实问题的端到端流程自动化的过程,其产生的主要原因就是因为机器学习的应用需要大量的人工干预,这些人工干预表现在:特征分析、模型选择、参数调节等机器学习的各个方面。AutoML视图将这些与特征、模型、优化、评价有关的重要步骤进行自动化地学习,使得机器学习模型无需人工干预即可被应用。
参考paper:
Automated Machine Learning Methods, Systems, Challenges.pdf
换言之,不管是HPO,还是NAS,我们可以简单的将问题抽象成如下示意图:
- 首先构建好搜索空间,这个搜索空间可以是一个算法的超参数组合,可以是各种数据预处理方法的列表,可以是nas中各种cell的排列情况
- 基于上面我们构建好了海量的候选人之后,我们需要用到一个搜索模块,用于在海量候选人中搜索到最优(相对最优)的候选人
那automl中如何构建这个搜索模块,就将直接影响到整个框架的搜索效率。所以下面简单的介绍一些常见的提升automl搜索效率的几种方式。
一、高效的搜索算法
网格搜索 ×
随机搜索 ×
贝叶斯搜索 √
进化搜索 √
那主流的调参框架optuna就使用的是贝叶斯搜索算法,而hypergbm使用的是进化搜索算法
贝叶斯参考: 点击跳转
进化搜索参考:点击跳转
二、引入元学习器
- auto-sklearn 基于元学习选择若干个配置来用于优化贝叶斯搜索, 称之为热启动优化方法
- hypergbm 通过引入元学习器进一步提升进化搜索算法效率。称之为学习搜索方向
auto-sklearn元学习器参考: 点击跳转
hypergbm元学习器参考参考:点击跳转
三、引入搜索判别器
在optuna中这个概念被叫做剪枝操作,就是在搜索过程中,将一些明显训练完成后性能也很差的trial提前停止训练,从而节省搜索时间,而在hypergbm中被叫做判别器,即判断当前trial是否有必要进行训练下去。这里以hypergbm中常用的两种判别器进行举例。
如上图所示,我们使用hypergbm在某一数据集上搜索10次trials,那对于准确度最低的3个trials我们希望找到一种方式,可以提前预估出该参数组合的最终性能,然后可以提前停止掉这些trials, 因为明显目前的最优性能已经逼近了1,但是对于那些训练完成性能也只能徘徊在0.8附近的trials我们没有理由让它一直训练。
方式一: PercentileDiscriminator
顾名思义,就是判断当前trial的中间训练结果和历史trials的训练结果的一个百分位比作为判断标准(默认50%),即,如果当前trials在iteration=10的时候的性能在历史记录 iteration=10的性能集合中,排不上前50%,那我们就无需等该trial全部训练完成即可停止训练。
如上图所示,蓝色线trials表示的是基准trilas,即我们需要有一定的观测样本我们才可以进行准确的判别,而红色线trials表示可以被提前终止的trials。具体伪代码如下:
- 搜索,直到trials数超过5,并将最开始的5个trials作为历史参考样本集合
- 计算历史参考集合的50百分位的性能(eg:在iteration=10的时候开始计算),我们称之为判别阈值
- 如果当前trial在iteration=10时的性能低于判别阈值,即立即停止当前trial的训练。反之,更新到历史参考样本集合中去
- 重复2,3步骤,直到搜索结束
但是该方法极具攻击性,容易停止一些很有潜力trial。比如因为学习率的不同,那么学习曲线的涨势是大不相同的,那么在iteration=10的时候表现不行的trial在iteration=300的时候可能达到历史最优性能,而该trial已经被停止了。通常建议当学习率相同的情况下,采用该方法。
方式二: OncePercentileDiscriminator
当任务的学习曲线比较混乱,走势差异较大的时候,建议使用OncePercentileDiscriminator的判别方式。一般来说学习率曲线一般是先急后缓的这种走势,在训练至一半的时候大概就可以推断出最终性能情况,那么我们可以修改上面的判别逻辑为<当前trial训练到一半的时候的性能是否能够超过历史50百分位的性能>,也就是我们只在最有把握的时候判别一次就可以,从绝对位置的判断变成相对位置的判断。这样可以极大的保留住所有优秀的模型,代价就是整体耗时会增加。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)