关键要点
本文展示了贝叶斯优化如何成为探索超参数以提升模型性能的最有效方法。深度学习中的超参数优化可以通过多种方式完成——手动搜索、网格搜索、随机搜索和贝叶斯优化。
注意!本文旨在:
- 对深度学习算法的工作原理以及正则化等方法有基本了解
- 对 Python 和 TensorFlow 有基本了解
本文的目的并不是让您深入理解贝叶斯优化,而是让您对贝叶斯优化有基本的了解,以便您可以将其无缝应用于深度学习模型中的超参数优化。因此,我们在解释贝叶斯优化的一般原理时,将尽量避免引用深度学习之外的数学知识,但请注意,为了便于解释,我们可能会使用一些数学表达。
简介
超参数优化指的是如何探索超参数最优值的问题,超参数是执行学习时必须事先设置的值。在这里,超参数的最优值指的是可以使训练后的学习模型获得最优泛化性能的超参数值。
例如,在训练深度学习模型时,学习率、子集大小、L2 正则化系数等都是典型的超参数。当然,这些超参数严格限定为与学习算法或正则化相关,而在某些情况下,决定深度学习模型结构的因素(如层数、卷积滤波器大小等)也可视为超参数,并被添加为探索对象。
手动搜索
如果您至少训练过一次深度学习模型,那么在确定这些关键超参数的值时,您肯定经历过大量的试错过程。例如,当我们完成 AlexNet 模型的执行后,一开始通常会采用原始 AlexNet 论文中引入的超参数,并在学习中应用这些超参数。然而,在大多数情况下,原始 AlexNet 论文中使用的数据集并非您希望使用的数据集。因此,对于您试图解决的问题,原始论文中引入的超参数值在绝大多数情况下并非最优解决方案。
遇到这种情况时,您通常会依靠直觉或常用的处理方法来选择下一步要尝试的候选超参数值,使用它们进行学习,并记录根据验证集测得的性能结果。重复执行此过程数次后,您很可能会在所有尝试的值中选出在验证集中表现优秀的超参数值,并将这些超参数值用于训练深度学习模型,以最终提交结果。这种探索最优超参数值的方法也称为手动搜索。
虽然手动搜索是很直观的超参数优化方法,但这种方法存在一些问题。首先,寻找“最优”超参数的过程在某种程度上要靠运气。举个例子,想象一下我们执行手动搜索为深度学习模型找到最优学习率的过程。这个过程很可能需要在限定时间内完成,您可能会非常不耐烦,心里想着:
我需要让这个深度学习模型快速执行,我的教授/老板一直在催我,但我没有足够时间…… 我遇到大麻烦了 :’(
假设您训练深度学习模型并依次应用 9 种不同的学习率值来衡量其性能的时间有限:0.01、0.05、0.03、0.02、0.025、0.0225、0.0275、0.015、0.04,结果如上图中的最高结果所示,因此选择 0.0025
作为最终学习率值。在这个探索过程中,您可能在每次学习中都严谨地应用了自己的直觉,而人们通常认为这一艰苦过程得出的结果便是理想的结果。
然而,如果“学习率函数对应的(未知)泛化性能函数”实际上是上面第二张图片所示的那样呢? 虽然 0.0025 实际上并非最优学习率值(0.003 至 0.0035 之间的值才是最优值),但我们可以推测,您在现有手动探索过程中的急躁和偏见导致了令人失望的结果。我们可能无意中指出了您在过去可能犯过的错误,但这并不完全是您的错。如前文示例所示,基于主观性判断与直觉进行人工参数搜索的弊端在于:我们难以确保最终找到的超参数最优值,在客观上“真正”达到了最优水平。
手动搜索的第二个问题是,当您想同时探索多种类型的超参数时,该过程就会变得更加复杂。典型例子是学习率和 L2 正则化系数之间的关系。
L(W)=1N∑i=1NLi(f(xi,W),yi)+λ⋅R(W)
上述损失函数中的第二项是 L2 正则化项,当改变 L2 正则化系数 λ 的值时,(在深度学习模型的整个参数 W 空间中)损失函数 L(W) 的形状也会发生变化。因此,我们可以认为,能够获得最优性能的最优学习率值也会随之发生变化。
由于部分超参数之间存在相互影响,因此当一次探索多个超参数时,很难将直觉应用于每个超参数。
网格搜索与随机搜索
与手动搜索相比,网格搜索和随机搜索是相对系统化的超参数优化方法。
网格搜索在特定范围内按一定间隔选择候选超参数值进行探索,记录每个超参数值测得的性能,然后选择展现最优性能的超参数值。虽然这种方法仍然需要人工来决定搜索多少个区间、设置区间长度等,但与手动搜索相比,它的优点是探索范围更宽广、更均匀。不过,这种方法的代价是,随着待探索的目标超参数数量增加,总探索时间也会呈指数级增长。
随机搜索与网格搜索大致类似,不同之处在于它使用随机抽样的方式在探索区间内选择候选超参数值。众所周知,随机搜索能比网格搜索更快找到最优超参数值,因为它大幅减少了不必要的重复次数,同时仍然能够以概率方式探索位于指定网格之间的值。
(在区间
[0.01,0.05 | 内运行 Python 随机函数 10 次的结果;random.seed=0)
尽管如此,也许仍然有这样一种感觉:即使是随机搜索,“似乎仍存在一些不必要的探索过程”。这是因为,在网格搜索和随机搜索中,选择下一步要尝试的候选超参数值的过程并不反映任何与在上一次研究中获得的超参数值性能有关的先验知识,反观手动搜索,先验知识会在每一个环节中被潜移默化地加以运用。
[Bergstra 和 Bengio(2012 年)]
贝叶斯优化法可以系统地执行整个探索过程,同时还能反映足够的先验知识,让您每次都能有效地研究新的超参数值。
贝叶斯优化
本质上,贝叶斯优化旨在找到最优解
x(给定一个未知的目标函数 f,该函数在给定某些输入值 x∗ 的情况下最大化函数
f(x))。我们通常假设我们并不明确知道目标函数的表达式(即黑盒函数),并且计算一个函数值 f(x) 需耗费较长时间。在这种情况下,主要目标是通过按顺序检查尽可能少的候选输入值的函数值,快速高效地找到使 f(x) 最大化的最优解 x*。
贝叶斯优化有两个基本要素。首先,代理模型会根据输入值和迄今为止已研究的函数值点 (x1,f(x1)),...,(xt,f(xt)) 对未知目标函数的形状进行概率估计。然后,采集函数会根据目标函数的当前概率估计,推荐下一个“最可能有助于找到最优输入 x∗”候选输入值 xt+1。
代理模型
基于迄今为止所检查的输入值和函数值点 (x1,f(x1)),...,(xt,f(xt)),对未知目标函数的近似形式进行概率估计的模型称为代理模型。通常用作代理模型的概率模型是高斯过程 (GP)。
高斯过程
与普通概率模型(表示任何给定变量的概率分布)不同,GP 表示函数集合的概率分布,其特点是各组成部分之间的联合分布遵循高斯分布。GP 使用均值函数 μ 和协方差函数 k 来表示函数的概率分布。
f(x)∼GP(μ(x),k(x,x′))。
要正确理解和使用 GP,您需要对贝叶斯概率有基本的了解,并能够理解复杂的随机/线性代数公式。本文的目的并非详细介绍这些知识,我们将重点介绍 GP 的运行特点以及如何将其用于超参数优化。
给定迄今为止所研究的输入值-函数值点 (x1,f(x1)),...,(xt,f(xt)),GP 会对目标函数进行概率估计,如下图所示。
(黑色虚线:实际目标函数;黑色实线:估计均值函数;蓝色阴影:估计标准偏差;黑点:迄今为止所研究的输入值和函数值点;底部绿色实线:采集函数)[Brochu 等人,(2010 年)]
在上图中,如果我们将水平轴视为输入值
x,将垂直轴视为函数值 f(x),然后根据迄今为止所检查的点 (x1,f(x1)),...,(xt,f(xt)) 估计黑色实线,用于显示每个 μμ(x) 位置处的“平均值”x,而蓝色阴影线对应于每个 σσ(x) 位置处的“标准偏差”。对于 μ μ(x) 而言,形状通过必然经过迄今为止已研究的点 (x1,f(x1)),...,(xt,f(xt)) 来确定,越靠近研究点的位置,σ(x) 越小,越远离研究点的位置,σ σ(x) 越大。这自然意味着x 离研究点越远,该点估计平均值的“不确定性”就越大。
在上图中,当 t=2 时,由于只研究了两个输入值点,我们可以观察到,在离这两个点至少有一定距离的大部分区域中,σ(x) 都很大。与此同时,随着研究点数逐渐增加至 t=3 t=4,具有较大 σ σ(x) 的区域的大小逐渐减小,对实际目标函数的估计也逐渐收敛。这表明,随着研究点数的增加,目标函数估计值的“不确定性”降低。我们可以假设,随着这一趋势的加强,找到使目标函数分子最大化的输入值 X∗ 的可能性会持续增加。
除 GP 以外的其他代理模型
除 GP 模型外,任何能够根据目前研究的输入值和函数值点估算目标函数的不确定性的模型都可用作代理模型。除 GP 外,常用的代理模型还包括树状结构帕尔森估计器 (TPE) 和深度神经网络。
在与 GP 相同的使用场景下,即使您对这些代理模型没有深入了解,如果您了解贝叶斯优化的原理,仍然可以使用相关库执行贝叶斯优化。
采集函数
根据目前代理模型对目标函数的概率估计,推荐下一步研究的候选输入值 xt+1
的函数被称为采集函数。如前所述,选择 xt+1 最终是为了在寻找目标函数的最优输入值 x∗ 时“最有用”。我们来思考一下,这里的“有用”是什么意思。为便于说明,我们重现了使用 GP 进行目标函数估计期间,t = 2 时的状态示意图。
鉴于迄今为止仅研究了点 (x,f(x)),那么预测“真正的最优输入值 x∗ 更有可能在函数值较大的点(图中右侧的点)附近找到”是有一定道理的。很显然,进行下一步尝试的合理策略是,在目前研究的点中,测试函数值最大的点周围区域。该过程的正式名称为“利用 (exploitation)”。
这次,我们从另一个角度来考虑这个问题。直观地讲,您可以感觉到,对于迄今为止所研究的两个点之间并且具有较大标准偏差(= 不确定性)Σ Σ(X) 的区域,将很难保证该部分的估计均值函数值与实际目标函数值相似。从这个角度来看,认为最优输入值 X∗ 有可能存在于该不确定区域,我们应该进一步探索���的想法是有点道理的,因此,合理的策略是在目前估算的目标函数标准偏差最大的点旁边进行尝试。该过程的正式名称为“探索 (exploration)”。
虽然探索和利用策略都是有效找到最优输入值 x∗ 的同等重要方法,这两种策略的本质存在相互权衡的关系。因此,适当调整探索-利用权衡的相对强度,对于成功识别实际目标函数的最优输入值至关重要。
预期改进 (EI)
预期改进 (EI) 函数的设计包含了一些方面的探索和利用策略,通常被用作采集函数。基于迄今为止所估计的目标函数,对于任何候选输入值 x,考虑到产生大于迄今为止所检查的点的最大输出值 f(x+)=maxif(xi) 的函数值 f(x1),...,f(xt) 的改进概率 (PI) 以及该函数值与 F(X+) 之间的差值大小,EI 输出一个数值,用于表征该输入值 x 的“有用性”。下面,我们通过下图来理解 PI 概念。
在上图中,迄今为止所研究的点中,最大函数值 f(x+) 出现在最右边的那个点。在此,对于更右侧的候选输入值 x3,基于概率估计的
f(x3) 的概率分布(沿垂直轴)可以表示为偏态高斯分布,如图所示。
同时,在图中,f(x3) 的概率分布中对应于大于 f(x+) 的值的区域以绿色阴影标注。此区域的较大尺寸表明 f(x3) 更可能大于 f(x+),这导致得出以下结论:将 x3 作为下一个输入值更可能产生比现有点更大的函数值,并且对于找到目标函数的最优输入 x∗,x3 是“最有用”的候选值。
对于输入值 x3 计算出的 PI 值,然后通过平均值 μ μ(x3) 与 f
(x+),f(x3)−f(x+) 之间的差值对函数 f(x3) 进行加权,以最终计算 x3 的 EI 值。找到有更大概率比现有点获得更大函数值的点很重要,但假设存在这种概率,也要考虑它实际上高出多少,这种计算方法就是为了反映这一点。
作为参考,(经过漫长的推导过程)使用 GP 时的 EI 计算公式可以总结并表达如下。在下面的公式中,
Φ 和 ϕϕ 分别表示标准正态分布的累积分布函数 (CDF) 和概率分布函数 (PDF),而 ξ 是控制探索和利用之间相对强度的参数。ξ 越大,探索越强;ξ越小,利用越强。
在上述使用 GP 进行目标函数估计的过程中,对于 t=4 的情况,利用上述 EI 公式计算每个输入值 x 的 EI 值的结果 EI(
x),如图底部的绿色实线所示。
实际上,我们可以在图中同时观察到,在迄今为止所研究的点中具有最大函数值的点 x+ 附近,EI 值较大(利用策略),并且在迄今为止所估计的目标函数的标准偏差 σσ(x) 最大的点附近,EI 值也较大(探索策略)。
EI(x)=E[max(f(x)−f(x+),0)]={(μ(x)−f(x+)−ξ)Φ(Z)+σ(x)ϕ(Z) ifσ(x)>00ifσ(x)=0
除 EI 之外的其他采集函数
改进概率 (PI) 是一种比 EI 更早提出的采集函数,在 EI 的考虑因素中,该函数仅反映了“得出大于目前所研究点的最大函数值的概率”。其他常用的采集函数还包括置信上限 (UCB) 和熵搜索 (ES)。
执行贝叶斯优化以探索深度学习模型中的超参数
到目前为止,我们已经介绍了贝叶斯优化的基本要素及其基本工作原理。接下来,我们将更详细地展示在实际探索深度学习模型的超参数时应用贝叶斯优化的场景。为方便起见,这里仅讨论将学习率作为要探索的超参数的情况。
(在区间 [0.01,0.09] 上前 3 轮 (n=3) 的结果,共 11 个点 (N=11);
顶部:GP 对目标函数 f(x) 的随机估计结果;底部:对随机估计计算 EI 函数的结果;
使用贝叶斯-优化库,random_seed=1)
- 定义输入值、目标函数和其他设置。
- 输入值 x:学习值目标函数 f(x)
- 应用设定学习率进行学习的深度学习模型在验证集上的性能结果(包括准确率等)
- 已探索输入值 x 的目标区间:(a,b)。
- 首先要研究的输入值和函数值点的数量: n
- 到最后一轮为止要研究的输入值和函数值点的最大数量:N
- 在设定的探索目标区间 (a,b) 内,最初选择的 n 个
输入值被随机抽样和选择。 - 在为所选的 n 个输入 x1,x2,...,xn 分别设置学习率值来训练深度学习模型之后,使用验证集计算所学模型的性能结果。这些值中的每一个都被视为函数值 f(x1),f(x2),...,f(xn)。随机抽取并选择 n 个输入值。
- 使用代理模型对输入值和函数值点集合 (x1,f(x1)),(x2,f(x2)),...,(xn,f(xn)) 进行概率估计。
- 在达到总共 NN 个已检查的输入值和函数值点之前,将针对 t=n,n + 1,...,N − 1 重复执行以下过程。
- 基于代理模型对现有输入值和函数值点集合 (x1,f(x1)),(x2,f(x2)),...,(xt,f(xt)) 的概率估计结果,在输入区间 (a,b) 内计算 EI 值,并选取其中的最大值对应的点,作为下一个候选输入值 xt+1。
- 在以下列候选输入值 xt +1 作为学习率值训练深度学习模型之后,使用验证集计算所学模型的性能结果,并将其视为 f(xt +1) 值。
- 将新点 (xt+1, f(xt+1)) 添加到现有的输入值和函数值点集合中,并在更新后的点集合上再次使用代理模型进行概率估计。
基于对总共 N 个输入值和函数值点进行概率估计的目标函数结果,选择使均值函数 μ μ(x),x∗ 最大化的最优解 x*。之后,如果您使用该 x∗ 值作为学习率对深度学习模型进行训练,即可得到泛化性能最优的模型。
结论
深度学习中的超参数优化是指如何探索超参数最优值的问题,在深度学习模型上进行学习时必须事先设置超参数值。用于训练深度学习模型的典型超参数包括学习率、子集大小和 L2 正则化系数。
常用的手动搜索是简单且直观的超参数优化方法,即在每一轮探索中主观选择候选超参数值进行尝试,使用这些值进行学习,并记录根据验证集测得的性能结果。这种方法的缺点是,由于在寻找最优超参数的过程中会隐含伴随实验者的个人偏见,因此相对很难找到最优超参数值。网格搜索和随机搜索可以弥补手动搜索方法的不足,但它们的局限性在于无法反映超参数研究过程中获得的任何先验知识。
贝叶斯优化法是一种超参数优化方法,可使整个探索过程更加系统化,同时在每次研究新的超参数值时仍能反映足够的先验知识。代理模型是贝叶斯优化的两大组成部分之一,其根据目前所研究的输入值和函数值点对某个未知目标函数进行概率估计,这方面的典型例子是高斯过程 (GP)。与此同时,采集函数会根据目标函数的当前概率估计,推荐下一个最可能有助于找到最优输入值的候选输入值,这方面的典型例子是预期改进 (EI)。
使用贝叶斯优化对深度学习模型进行超参数优化,将用于探索最优值的超参数作为贝叶斯优化法的输入值,将通过应用特定超参数值学习到的深度学习模型在验证集上的性能结果用作目标函数的函数值。
*在下一部分中,我们将在目前所探讨内容的基础上,使用贝叶斯-优化(在实践中用于贝叶斯优化的 Python 库)探索一个简单示例函数的优解方案,然后探索实际应用中的一个深度学习模型的最优超参数。
参考文献
- Shahriari、Bobak 等人 “消除手动操作:贝叶斯优化综述”。IEEE 104.1 论文集(2016 年):148-175.
- Brochu、Eric、Vlad M. Cora 和 Nando De Freitas。“关于成本昂贵函数的贝叶斯优化教程,应用于用户主动建模和分层强化学习。” arXiv 预印本 arXiv:1012.2599(2010 年)。
- Bengio、Yoshua。“关于基于梯度训练深度架构的实用建议。” 神经网络:专业技巧。Springer、Berlin、Heidelberg,2012 年。437-478.
- Goodfellow、Ian 等人 深度学习。第 1. 剑桥:麻省理工大学 (MIT) 出版社,2016 年。
- Bergstra、James 和 Yoshua Bengio。“执行随机搜索以优化超参数。” 《机器学习研究》期刊 2 月 13 日(2012 年):281-305.
- Fernando Nogueira,贝叶斯-优化:通过高斯过程实现 Python 全局优化。
- 寻找最优值,贝叶斯优化的预期改进:推导。