如何优化机器学习的超参数一直是一个难题,我们在模型训练中经常需要花费大量的精力来调节超参数而获得更好的性能。因此,贝叶斯优化利用先验知识逼近未知目标函数的后验分布从而调节超参数就变得十分重要了。本文简单介绍了贝叶斯优化的基本思想和概念,更详细的推导可查看文末提供的论文。
超参数
超参数是指模型在训练过程中并不能直接从数据学到的参数。比如说随机梯度下降算法中的学习速率,出于计算复杂度和算法效率等,我们并不能从数据中直接学习一个比较不错的学习速度。但学习速率却又是十分重要的,较大的学习速率不易令模型收敛到较合适的较小值解,而较小的学习速率却又常常令模型的训练速度大大降低。对于像学习速率这样的超参数,我们通常需要在训练模型之前设定。因此,对于超参数众多的复杂模型,微调超参数就变得十分痛苦。
超参数的选择同样对深度神经网络十分重要,它能大大提高模型的性能和精度。寻找优良的超参数通常需要解决这两个问题:
- 如何高效地搜索可能的超参数空间,在实践中至少会有一些超参数相互影响。
- 如何管理调参的一系列大型试验。
简单的调参法
在介绍如何使用贝叶斯优化进行超参数调整前,我们先要了解调参的朴素方法。
执行超参数调整的传统方法是一种称之为网格搜索(Grid search)的技术。网格搜索本质上是一种手动指定一组超参数的穷举搜索法。假定我们的模型有两个超参数 learning_rate 和 num_layes,表格搜索要求我们创建一个包含这两个超参数的搜索表,然后再利用表格中的每一对(learning_rate,num_layes)超参数训练模型,并在交叉验证集或单独的验证集中评估模型的性能。网格搜索***会将获得***性能的参数组作为***超参数。
网格搜索穷举地搜索整个超参数空间,它在高维空间上并不起作用,因为它太容易遇到维度灾难了。而对于随机搜索来说,进行稀疏的简单随机抽样并不会遇到该问题,因此随机搜索方法广泛地应用于实践中。但是随机搜索并不能利用先验知识来选择下一组超参数,这一缺点在训练成本较高的模型中尤为突出。因此,贝叶斯优化能利用先验知识高效地调节超参数。
贝叶斯优化的思想
贝叶斯优化是一种近似逼近的方法。如果说我们不知道某个函数具体是什么,那么可能就会使用一些已知的先验知识逼近或猜测该函数是什么。这就正是后验概率的核心思想。本文的假设有一系列观察样本,并且数据是一条接一条地投入模型进行训练(在线学习)。这样训练后的模型将显著地服从某个函数,而该未知函数也将完全取决于它所学到的数据。因此,我们的任务就是找到一组能***化学习效果的超参数。
具体来说在 y=mx+c 中,m 和 c 是参数,y 和 x 分别为标注和特征,机器学习的任务就是寻找合适的 m 和 c 构建优秀的模型。
贝叶斯优化可以帮助我们在众多模型中选取性能***的模型。虽然我们可以使用交叉验证方法寻找更好的超参数,但是我们不知道需要多少样本才能从一些列候选模型中选出性能***的模型。这就是为什么贝叶斯方法能通过减少计算任务而加速寻找***参数的进程。同时贝叶斯优化还不依赖于人为猜测所需的样本量为多少,这种***化技术是基于随机性和概率分布而得出的。
简单来说,当我们馈送***个样本到模型中的时候,模型会根据该样本点构建一个直线。馈送第二个样本后,模型将结合这两个点并从前面的线出发绘制一条修正线。再到第三个样本时,模型绘制的就是一条非线性曲线。当样本数据增加时,模型所结合的曲线就变得更多。这就像统计学里面的抽样定理,即我们从样本参数出发估计总体参数,且希望构建出的估计量为总体参数的相合、无偏估计。
下面我们绘制了另外一张非线性目标函数曲线图。我们发现对于给定的目标函数,在馈送了所有的观察样本后,它将搜寻到***值。即寻找令目标函数***的参数(arg max)。
我们的目标并不是使用尽可能多的数据点完全推断未知的目标函数,而是希望能求得***化目标函数值的参数。所以我们需要将注意力从确定的曲线上移开。当目标函数组合能提升曲线形成分布时,其就可以称为采集函数(Acquisition funtion),这就是贝叶斯优化背后的思想。
因此,我们的目标首要就是确定令目标函数取***值的参数,其次再选择下一个可能的***值,该***值可能就是在函数曲线上。
上图是许多随机集成曲线,它们都由三个黑色的观察样本所绘制而出。我们可以看到有许多波动曲线,它表示给定一个采样点,下一个采样点可能位于函数曲线的范围。从下方的蓝色区域可以看出,分布的方差是由函数曲线的均值得出。
因为我们叠加未知函数曲线的观察值而进行估计,所以这是一种无噪声的优化方法。但是当我们需要考虑噪声优化方法时,我们未知的函数将会因为噪声误差值而轻微地偏离观察样本点。
贝叶斯优化的目标
我们一般希望能选取获得***性能的超参数,因此超参数选择就可以看作为一种***化问题,即***化超参数值为自变量的性能函数 f(x)。我们可以形式化为以下表达式:
许多优化设定都假设目标函数 f(x) 是已知的数学形式,同时还假定它为容易评估的凸函数。但是对于调参来说,目标函数是未知的,且它为计算昂贵的非凸函数。所以常用的优化方法很难起到作用,我们需要专门的贝叶斯优化方法来解决这一类问题。
贝叶斯优化方法在目标函数未知且计算复杂度高的情况下极其强大,该算法的基本思想是基于数据使用贝叶斯定理估计目标函数的后验分布,然后再根据分布选择下一个采样的超参数组合。
贝叶斯优化充分利用了前一个采样点的信息,其优化的工作方式是通过对目标函数形状的学习,并找到使结果向全局***提升的参数。贝叶斯优化根据先验分布,假设采集函数而学习到目标函数的形状。在每一次使用新的采样点来测试目标函数时,它使用该信息来更新目标函数的先验分布。然后,算法测试由后验分布给出的最值可能点。
高斯过程
为了使用贝叶斯优化,我们需要一种高效的方式来对目标函数的分布建模。这比直接对真实数字建模要简单地多,因为我们只需要用一个置信的分布对 f(x) 建模就能求得***解。如果 x 包含连续型超参数,那么就会有无穷多个 x 来对 f(x) 建模,即对目标函数构建一个分布。对于这个问题,高斯过程(Gaussian Process)实际上生成了多维高斯分布,这种高维正态分布足够灵活以对任何目标函数进行建模。
逼近目标函数的高斯过程
在上图中,假定我们的目标函数(虚线)未知,该目标函数是模型性能和超参数之间的实际关系。但我们的目标仅仅是搜索令性能达到***的超参数组合。
开发和探索之间的权衡
一旦我们对目标函数建了模,那么我们就能抽取合适的样本尝试计算,这就涉及到了开发(exploitation)和探索(exploration)之间的权衡,即模型到底是在当前***解进一步开发,还是尝试探索新的可能解。
对于贝叶斯优化,一旦它找到了局部***解,那么它就会在这个区域不断采样,所以贝叶斯优化很容易陷入局部***解。为了减轻这个问题,贝叶斯优化算法会在探测和开发 (exploration and exploitation) 中找到一个平衡点。
探测(exploration)就是在还未取样的区域获取采样点。开发(exploitation)就是根据后验分布,在最可能出现全局***解的区域进行采样。我们下一个选取点(x)应该有比较大的均值(开发)和比较高的方差(探索)。
选择下一个可能的***点,并在方差和均值间权衡。因为我们在高方差分布中搜索下一点,这意味着探测新的点 x。高均值意味着我们在较大偏移/偏差下选择下一点(x)。
在给定前 t 个观察样本,我们可以利用高斯过程计算出观察值的可能分布,即:
μ和σ的表达式如下,其中 K 和 k 是由正定核推导出的核矩阵和向量。具体来说,K_ij=k(x_i,x_j) 为 t 乘 t 阶矩阵,k_i=k(x_i,x_t+1) 为 t 维向量。***,y 为观察样本值的 t 维向量。
上面的概率分布表明在拟合数据后,样本点 x 的预测值 y 成高斯分布。并且该高斯分布有样本均值和样本方差这两个统计量。现在为了权衡开发和探索,我们需要选择下一点到底是均值较高(开发)还是方差较大(探索)。
采集函数
为了编码开发探索之间的权衡,我们需要定义一个采集函数(Acquisition function)而度量给定下一个采样点,到底它的效果是怎样的。因此我们就可以反复计算采集函数的极大值而寻找下一个采样点。
随着样本增加,不同的采集函数和曲线拟合的对比。
上置信边界
也许最简单的采集函数就是采取有较高期望的样本点。给定参数 beta,它假设该样本点的值为均值加上 beta 倍标准差,即:
通过不同的 beta 值,我们可以令算法倾向于开发还是探索。
提升的概率
提升采集函数概率背后的思想,即我们在***化提升概率(MPI)的基础上选择下一个采样点。
高斯过程的提升概率
在上图中,***观察值是在 x*上的 y*,绿色区域给出了在 x_3 点的提升概率,而 x_1 和 x_2 点的提升概率非常小。因此,在 x_3 点抽样可能会在 y*的基础上得到提升。
其中Φ(x) 为标准正态分布函数。
贝叶斯优化过程
上图可以直观地解释贝叶斯优化。其中红色的曲线为实际的目标函数,并且我们并不知道该函数确切的表达式。所以我们希望使用高斯过程逼近该目标函数。通过采样点(上图有 4 个抽样点),我们能够得出直观或置信曲线以拟合观察到的样本点。所以上图绿色的区域为置信域,即目标曲线最有可能处于的区域。从上面的先验知识中,我们确定了第二个点(f+)为***的样本观察值,所以下一个***点应该要比它大或至少与之相等。因此,我们绘制出一条蓝线,并且下一个***点应该位于这一条蓝线之上。因此,下一个采样在交叉点 f+和置信域之间,我们能假定在 f+点以下的样本是可以丢弃的,因为我们只需要搜索令目标函数取极大值的参数。所以现在我们就缩小了观察区域,我们会迭代这一过程,直到搜索到***解。下图是贝叶斯优化算法的伪代码:
论文:Taking the Human Out of the Loop: A Review of Bayesian Optimization
地址:http://ieeexplore.ieee.org/document/7352306/
摘要:大数据应用通常和复杂系统联系到一起,这些系统拥有巨量用户、大量复杂性软件系统和大规模异构计算与存储架构。构建这样的系统通常也面临着分布式的设计选择,因此最终产品(如推荐系统、药物分析工具、实时游戏引擎和语音识别等)涉及到许多可调整的配置参数。这些参数通常很难由各种开发者或团队具体地编入软件中。如果我们能联合优化这些超参数,那么系统的性能将得到极大的提升。贝叶斯优化是一种联合优化超参数的强力工具,并且最近也变得越来越流行。它能自动调节超参数以提升产品质量和人类生产力。该综述论文介绍了贝叶斯优化,并重点关注该算法的方法论和列举一些广泛应用的案例。
原文:
- https://cloud.google.com/blog/big-data/2017/08/hyperparameter-tuning-in-cloud-machine-learning-engine-using-bayesian-optimization
- https://medium.com/towards-data-science/shallow-understanding-on-bayesian-optimization-324b6c1f7083
【本文是51CTO专栏机构“机器之心”的原创译文,微信公众号“机器之心( id: almosthuman2014)”】