超参数优化,应该是所有机器学习模型都必须要经历的一个过程。很早以前训练模型,比如分类,认为精度达到90%或者自己觉得足够的精度就已经OK,但这其实是远远不够的。在Kaggle比赛中,寻找好的特征是一方面,有最佳的超参数也必不可少。尤其是现在使用集成学习比如随机森林、XGBoost等,超参数对模型的性能影响很大,必须要考虑。
超参数优化超参数优化(Hyperparameter Optimization)主要存在两方面的困难:
(1)超参数优化是一个组合优化问题,无法像一般参数那样通过梯度下降方法来优化,而且,没有一种通用有效的优化方法,即每个人认为的最佳优化方法不同。
(2)评估一组超参数配置(Configuration)的时间代价非常高,从而导致一些优化方法(深度神经网络)在超参数优化中难以应用,一组超参数意味着要训练一次深度神经网络,这将极大地的提高成本。
假设一个机器学习模型中总共有个超参数,每个超参数配置表示为一个向量
x ∈ , ⊂ 是超参数配置的取值空间. 超参数优化的目标函数定义为
(x) ∶ → R,(x) 是衡量一组超参数配置x 效果的函数,一般设置为测试集上的错误率. 目标函数(x) 可以看作是一个黑盒(black-box)函数,不需要知道其具体形式。虽然在神经网络的超参数优化中,(x) 的函数形式已知,但(x) 不是关于x的连续函数,并且x不同,(x)的函数形式也不同,因此无法使用梯度下降等优化方法。
比较常用的方法有网格搜索、随机搜索、贝叶斯优化、动态资源分配、神经架构搜索等。这里可以介绍一下网络搜索和随机搜索,贝叶斯优化在之前的博文中提到,下次更新动态资源分配和神经架构。
网格搜索(Grid Search)
是一种通过尝试所有超参数的组合来寻址合适一组超参数配置的方法.。假设总共有个超参数,第个超参数的可以取个值。那么总共的配置组合数量为1 × 2 × ⋯ × . 如果超参数是连续的,可以将超参数离散化,选择几个“经验”值。比如学习率,我们可以设置∈{1,2,3,4,5},一般而言,对于连续的超参数,我们不能按等间隔的方式进行离散化,需要根据超参数自身的特点进行离散化。网格搜索根据这些超参数的不同组合分别训练一个模型,然后测试这些模型在测试集上的性能,选取一组性能最好的配置。
网格搜索的弊端在于过于耗时,如果有三个超参数,每个参数有10个取值,那就要训练1000次模型。其优势也很明显,相当于枚举,最佳的超参数是肯定能够被找到的。
随机搜索(Random Search)
不同超参数对模型性能的影响有很大差异。有些超参数(比如正则化系数)对模型性能的影响有限,而另一些超参数(比如学习率)对模型性能影响比较大。在这种情况下,采用网格搜索会在不重要的超参数上进行不必要的尝试。一种在实践中比较有效的改进方法是对超参数进行随机组合,然后选取一个性能最好的配置,这就是随机搜索(Random Search)。随机搜索在实践中更容易实现,一般会比网格搜索更加有效。网格搜索和随机搜索都没有利用不同超参数组合之间的相关性,即如果模型的超参数组合比较类似,其模型性能也是比较接近的。
随机搜索的优势在于可以使用更少的计算成本来得到看似最佳的超参数,这种又与奥卡姆剃刀原则相关联,我们可以选择一个精度较高、计算成本更低的模型,那就用随机搜索。
更理想的是使用贝叶斯优化,在之前的博文有专门讲到,既然把(x)当成黑盒子,那模型的性能与超参数之间也是一个黑盒子的关系,这个时候用贝叶斯最合适不过。