贝叶斯优化如何工作?
本文来自,Duane Rich。Answer: Duane Rich, Researcher Scientist at Lyft
问题
目标是为一些”昂贵的“函数找到近似最小值。这些函数接受一个实数向量,然后计算很长时间后才返回一个标量。所以我们可以在这里想象一个一维的情形:
点状线表示一个我们无法确定的函数,我们仅能通过函数上的一些点来评估这个函数。但是这个评估过程是很耗时的,不妨设我们只有10次机会来评估。那么你怎么来找到这个函数的潜在最小点呢?
Here is a dumb idea:
随机采样
随机选择10个点进行评估。
这么做确实有用,但是我们可能找不到最小点。或许我们可以有更好的方法。
那么我们可以根据已知的点来选择接下来的点么?
贝叶斯优化(使用高斯过程)
采样一些输入(x)-输出(y)(少于10),然后用它们来猜测出一个真实的函数以及所谓的高斯过程。然后用这个猜测出的函数来决定接下来在哪里进行评估。评估这个点,然后将这个点加入我们的输入-输出集中,再一次推测出一个新的函数。不断重复直到我们使用完了我们的评估机会。如果高斯过程能更好的猜测出真实的函数,那么我么肯定能比随机采样做的更好。
如果您不知道高斯过程是什么,我可以告诉你一些重要的信息。 这是从其输入和输出样本中推论出一个函数(就像我们在上面看到的那样)的一种方式。 不仅如此,它还提供了输出的分布。 因此,当您猜测某个给定x处的函数输出时,GP也会告诉我们在给定范围内找到它的可能性。 如果您想了解更多,这里有一些更深入的内容。
接下来我们从我们那“昂贵的函数”中采样出4个数据点,把它们交给高斯过程,我们就可以推测出其余的函数,他们大致长这样:
那条很粗的绿线就是推测出的真实的函数。每个绿色的条子就是标准置信区间。
那么问题来了,有了这些猜测出来的信息。我们应该从哪个点开始检验呢?首先我们需要关注两个事情:
- 我们应该评估我们认为会产生低输出值的点,也就是说,我们应该对实线低的点进行评估。
- 我们应该检查那些我们把握不那么大的区域。在上图中,我们明显对0.6-0.8的区间比[0.15, 0.3]小。换句话说,我们应该检查将最大程度地减少方差的区域。
对于以上两点是关于“探测-开发”之间的平衡。你是想去寻找新的区域还是开发现有区域中的金矿?我们将开发偏好表示为一个函数叫做"acquisition function"。这个函数是关于的,它会产生一个数值来告诉我们如何在这两种偏好之间进行选择。这个函数的计算量很小,因此我们可以对它进行优化,然后使用这个来指导我们的下一个搜索目标。
讲了这么多,那么"acquisition function"是什么样子的呢?其实有很多选择,但是我会使用expectation of improvement的函数。 即,评估下一个预期改进最高的点。
如果:
- 是推测出的函数值,即绿线在上的值。
- 是在点的输出的标准偏差(即成比例的绿色带子)。
那么我们的acquisition/expectation of improvement 为():
其中, Φ(⋅)和分别是一个标准正态分布的分布函数和概率密度函数。其实理不理解这个式子并不重要。只需要知道它是对的平衡即可。
让我来看看这个函数是怎么工作的,你可以在下图中看到在各个点中对应的值。
由上图可知,我们应该检查x=1这一点。
然后不断重复上述过程。‘
我们遗漏了什么?
虽然这个例子展示了这种方法的核心部分,但是并没有展现这个方法的全貌:
- 通常,我们会在多个维度上进行最优化。高斯过程可以很自然的拓展到多个维度,但是随着维度的增加太高,实验的效率会显著降低。
- 我们坚持假设我们对真实函数的评估是有噪音的。噪音可以很轻易的建模进高斯过程中。高斯过程会找到跟所有点最接近的函数。
- 对高斯过程的本身的参数进行微调是一种艺术。