[work] 拟合目标函数后验分布的调参利器:贝叶斯优化

2023-11-05 02:32

本文主要是介绍[work] 拟合目标函数后验分布的调参利器:贝叶斯优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何优化机器学习的超参数一直是一个难题,我们在模型训练中经常需要花费大量的精力来调节超参数而获得更好的性能。因此,贝叶斯优化利用先验知识逼近未知目标函数的后验分布从而调节超参数就变得十分重要了。本文简单介绍了贝叶斯优化的基本思想和概念,更详细的推导可查看文末提供的论文。

超参数

超参数是指模型在训练过程中并不能直接从数据学到的参数。比如说随机梯度下降算法中的学习速率,出于计算复杂度和算法效率等,我们并不能从数据中直接学习一个比较不错的学习速度。但学习速率却又是十分重要的,较大的学习速率不易令模型收敛到较合适的较小值解,而较小的学习速率却又常常令模型的训练速度大大降低。对于像学习速率这样的超参数,我们通常需要在训练模型之前设定。因此,对于超参数众多的复杂模型,微调超参数就变得十分痛苦。

超参数的选择同样对深度神经网络十分重要,它能大大提高模型的性能和精度。寻找优良的超参数通常需要解决这两个问题:

  1. 如何高效地搜索可能的超参数空间,在实践中至少会有一些超参数相互影响。
  2. 如何管理调参的一系列大型试验。

 

简单方法调参

在介绍如何使用贝叶斯优化进行超参数调整前,我们先要了解调参的朴素方法。

执行超参数调整的传统方法是一种称之为网格搜索(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 维向量。

[Image: file:///-/blob/RYFAAA1FF4g/9ESrR8DT3ddY6ssP9w-aMQ] 上面的概率分布表明在拟合数据后,样本点 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

这篇关于[work] 拟合目标函数后验分布的调参利器:贝叶斯优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/346825

相关文章

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos