社交数据那么多,看Facebook如何实时用贝叶斯优化后端
选自Facebook,作者:Ben Letham、Brian Karrer、Guilherme Ottoni、Eytan Bakshy,机器之心编译,参与:刘晓坤、张倩、思源。
Facebook 每天依赖一套大型后端系统服务于数十亿人。这些系统中大部分都具有大量内部参数,如支持 Facebook 的 web 服务器使用 HipHop 虚拟机(HHVM)来满足请求,HHVM 有几十个参数来控制实时编译器。另一方面,机器学习系统可用来执行很多预测任务。这些系统通常包含预测模型的多个层,其中有大量参数,用于决定模型如何连接以输出最终推荐。这些参数必须通过使用实时的随机实验来仔细调整,也就是所谓的 A/B 测试。每个实验可能花费一周或更长时间,因此难点在于用尽可能少的实验优化一套参数。
A/B 测试通常被用作改进产品的一次性实验。在论文《Constrained Bayesian Optimization with Noisy Experiments》(现已刊登在《Bayesian Analysis》杂志)中,Facebook 描述了如何使用一种名为「贝叶斯优化」的 AI 技术,根据先前测试的结果自适应地设计一轮 A/B 测试。与网格搜索或手工调参相比,贝叶斯优化可以用更少的实验联合调整更多的参数,并找到更好的值。Facebook 已经使用该技术在一大批后端系统中进行了数十次调参实验,发现该技术在机器学习系统调参方面非常有效。
针对 A/B 测试的贝叶斯优化
在线系统调参的典型方法是手动运行小规模网格搜索来分别优化每个参数。贝叶斯优化构建了参数和兴趣在线结果之间的统计模型,并使用该模型来决定进行哪些实验。这种基于模型的方法有几个关键优势,尤其是在优化在线机器学习系统方面:
更好地利用参数维度进行缩放:由于运行在线实验存在数量限制,网格搜索或手工调参不能用于同时调整多个参数。模型的使用使得贝叶斯优化可以扩展到更多的参数,通常联合优化的参数可以达到 20 个。这对机器学习系统至关重要,因为在这些系统中,参数之间经常存在相互作用,需要联合优化。
实验次数减少:贝叶斯优化使得我们可以从多轮实验中获得信息:连续空间中的一次参数值的测试不仅可以提供有关该测试结果的信息,还能提供周围点的信息。因此,探索空间所需的实验次数可以大大减少。
实验结果更好:模型可以识别空间中可能无法提供良好结果的部分,避免在那些参数值上运行测试。这种做法改进了实验组内的经验。
理解参数空间:模型帮助我们可视化并更好地理解参数如何影响感兴趣的结果。下图显示了一个 8 参数实验的二维切片,是为了更好地理解参数空间而进行的可视化的典型例子:
下文将提供贝叶斯优化的深入介绍,并讨论来自论文的工作及其中的一些实验结果。
贝叶斯优化
贝叶斯优化是一种解决最优化问题的技术,其中未知形式的目标函数(即在线度量)不会有解析解,且它只能通过一些耗时的运算(即随机试验)评估出来。通过有限的试验数高效探索多维空间的关键是建模:真实的目标函数是未知的,但是我们能令模型拟合已有的观察样本,并使用模型预测参数空间中更好的部分,而这一部分应该需要运行更多的试验。
高斯过程(GP)是一种非参数的贝叶斯模型,因为它能提供优秀的不确定性估计和简便的分析,所以高斯过程非常适用于贝叶斯优化。高斯过程为目标函数提供了一种估计,它用来判断随着参数的变化在线度量到底会怎么变化:
上图中每一个数据标记对应于该参数值的 A/B 测试结果。通过平衡探索(很大的不确定性)和利用(良好的模型估计),我们能使用高斯过程来决定接下来要测试的参数。这一过程可以通过计算采集函数(Acquisition Function)完成,该函数用任何给定的参数值来估计执行试验后的观察值。
假设我们正尝试决定是否应该使用参数配置 x 执行一次实验,那么在 x 的情况下观察值有多大的价值?这个问题的答案依赖于效用函数。现在假设在观察到 x 后就结束优化,那么这些参数的效用就仅仅只是它所找到的最优解的值。在这种情况下,观察到 x 的效用就是 f(x),相当于当前最优的改进程度,我们可以称为 x*(假设我们在做最大化):I(x) = max(0, f(x) – f(x*))。
由于 f(x) 是一个随机变量,I(x) 同样也为随机变量,但是 f(x) 的后验是从高斯过程模型中分析得出的。基于期望改进(EI)的采集函数会选择参数点 x 以最大化 I(x) 的期望值,这一过程会基于高斯过程后验。EI 是一种流行的采集函数,因为这种期望具有易计算的分析形式,且在实践中也有非常好的表现。下图展示了上述模型的 EI:
最大化 EI(红色虚线)的参数在下一个实验中会进行测试。模型随后用该实验的结果进行更新,并重新计算 EI 以选择新的候选参数。这一循环会持续到搜索结束,上图展示了几次迭代的结果。
高斯过程假设响应表面是平滑的,这将允许我们参考参数空间的近邻观察值,从而确定可能的下一组参数是怎么样的。高斯过程使我们相信已经彻底探索了空间,因此不需要如网格搜索那样实际测试每个可能的参数值。
将贝叶斯优化应用到在线实验
贝叶斯优化方法应用于调整在线系统时需要面对几项挑战,在 Facebook 的论文中对此进行了描述。
噪声:通过随机化实验获取的观察结果通常有很高的噪声等级,特别是相对于贝叶斯优化的典型机器学习应用而言,例如超参数调整。
约束:除了需要优化的指标,还有必须要满足的约束。这些约束通常本身是带噪声的指标,因此我们必须考虑它们的可行的后验分布。
批量实验:由于在线实验相当耗时间,它们通常不是按线性序列运行,如上动图所示,它们是以大批量在并行测试中运行。在我们的实验中,我们每次频繁地评估 50 个配置,因此需要可以返回大批量可评估点的贝叶斯优化过程。
EI 拥有可以解决这些问题的扩展,然而当噪声等级达到 A/B 测试的典型等级时,使用启发式方法处理噪声的结果很糟糕。由于观察结果中的噪声,不仅对 f(x) 值存在不确定,而且对哪个 x*和 f(x*) 是目前最佳的观察结果也存在不确定。处理观察结果噪声的常用方法是忽略它,并通过插件式的估计器替换 f(x*) 的高斯过程均值估计。
在论文中,Facebook 描述了一种贝叶斯方法来处理观察噪声,其中包括了 EI 期望值噪声引入的后验不确定性。即,我们在 f(x) 和 f(x*) 的联合后验下计算 I(x) 的期望值,而不是在 f(x) 的后验下计算它。这个期望值不再拥有相近 EI 的形式,然而我们可以轻易地从 GP 后验中采样过去观察 f(x_1), …, f(x_n) 的值,并且条件分布 f(x) | f(x_1), …, f(x_n) 有相近的形式。因此该期望值服从蒙特卡罗近似,其中我们采样 f(x_1), …, f(x_n) 然后以相近的形式求条件期望 E[I(x) | f(x_1), …, f(x_n)]。论文中展示了拟蒙特卡罗方法(quasi-Monte Carlo)的结合如何为该期望提供了很好的估计,并可以高效地对其进行优化。
Facebook 利用贝叶斯优化得到的结果
研究者使用论文中描述的方法来优化 Facebook 中的数个系统,并在论文中描述了两种优化案例。第一个案例是优化 Facebook 一个排序系统的 6 个参数。这些特定参数和索引器相关,该索引器聚集了要被发送到预测模型的内容。第二个案例是为 HHVM 优化 7 个数值编译器 flag。优化的目标是减少网页服务器的 CPU 占用,并满足不增加峰值内存占用的约束。下面这张来自论文中的图展示了每个测试配置的 CPU 占用(总共 100 个配置)随迭代次数的变化,以及每个点满足内存约束的概率。
前面 30 次迭代(绿线之前的部分)是随机生成的配置,之后使用了贝叶斯优化来识别用于评估的参数配置。在这项以及很多其它的实验中,研究者发现贝叶斯优化可以找到更好的且更容易满足约束的配置。该优化中找到的编译器 flag 设置在开源 HHVM 中已被设定成了新的默认值。
研究者发现,结合论文中的方法,贝叶斯优化在随机实验优化中是一种高效、鲁棒的工具。通过取代多维空间的手工探索,它能让工程师的工作变得更加高效,并提升后端系统和机器学习基础建设的在线性能。