从得分函数中找出哪些输入产生最高值
Finding which inputs yield the highest value from a score function
我有一个函数 returns 根据输入计算的分数。下面是一个非常简单的例子。
def score(i, j):
if i <= 2 and j <= 3:
return i * j
return 0
我们可以看到该函数的理想输入是 i
=2 和 j
=3,给出最高分 6。我想要一种方法,以便我可以搜索对于这些理想的输入值。最简单的是
max_score = 0
ideal_i = ideal_j = None
for i in range(5):
for j in range(5):
s = score(i, j)
if s > max_score:
ideal_i, ideal_j = i, j
max_score = s
print(ideal_i, ideal_j) # prints 2 3
但是如果理想值是浮点数呢?如果它们在 0 和 4 的范围之外怎么办?如果我有 3 个输入要查找怎么办?
这感觉像是一个机器学习和微积分问题,但我不熟悉可行的实现方式。我想象一个在 x 轴和 y 轴上带有 i
和 j
的二维图形,以及一些显示每个坐标的 score(i, j)
值的热图。该算法将在此图中搜索局部最大值(类似于机器学习搜索局部最小损失值)。如果能深入了解这会是什么样子,或者要搜索什么,我们将不胜感激。
您要查找的可能是黑盒优化 或Derivative-free optimization。问题的表述是优化一些你不知道分析形式的函数(一个黑盒子,你只能评估函数的输入)并且你没有(直接)访问导数。请注意,这些方法不保证找到全局最优值。
有多种方法可以做到这一点,最简单的方法对浮点数的作用与对整数示例的作用相似。您定义一个等 spaced 的网格,计算每个网格点的函数并跟踪最大值。但是,如果您不知道函数边界或您的函数是高维的,则此方法的扩展性很差,并且可能无法找到任何“好的”最优值。稍微好一点的方法是定义一个非均匀或随机的点网格,然后将其称为 Monte Carlo method and it scales better in high-dimensions. A more sophisticated version of this inspired by physics is Simulated Annealing。但是不知道边界的问题仍然存在。
更复杂的方法是 Evolution Strategy algorithms like CMA-ES。简而言之,这些 class 算法在每个迭代步骤中提出生成点,select 这些点中最好的点,并根据 selected 点提出下一代点.通常这是通过提出概率函数(例如正态)并使用最大似然法和 selected 点来优化这些函数的参数来完成的。这里的优点是您不必先验地定义或知道函数的边界。
优化此类黑盒函数的第三种方法是 Bayesian optimization,如果评估黑盒函数成本高昂或涉及噪声时,这种方法特别有用。这个想法是为函数提出一个先验函数来优化,在某些点进行测量(这是关键部分)并更新我们对真实函数外观的看法。这是通过使用高斯过程作为 class 函数以迭代方式完成的。老实说,对于您的简单示例,此方法有点矫枉过正。
关于神经网络的最后一点:神经网络是函数逼近器,也就是说它们可以表示任何函数,从一些输入 space 映射到一些输出 space,输入和输出已经给出(数据和标签)。 NN 是参数化的,并且具有已知分析形式的损失函数(例如,均方误差、交叉熵等)。因此,可以使用访问 Stochastic Gradient Descent 等导数的方法来找到最佳参数。在你的情况下,函数已经给出(虽然没有它的分析形式)并且你想找到最大化它的输入。
我有一个函数 returns 根据输入计算的分数。下面是一个非常简单的例子。
def score(i, j):
if i <= 2 and j <= 3:
return i * j
return 0
我们可以看到该函数的理想输入是 i
=2 和 j
=3,给出最高分 6。我想要一种方法,以便我可以搜索对于这些理想的输入值。最简单的是
max_score = 0
ideal_i = ideal_j = None
for i in range(5):
for j in range(5):
s = score(i, j)
if s > max_score:
ideal_i, ideal_j = i, j
max_score = s
print(ideal_i, ideal_j) # prints 2 3
但是如果理想值是浮点数呢?如果它们在 0 和 4 的范围之外怎么办?如果我有 3 个输入要查找怎么办?
这感觉像是一个机器学习和微积分问题,但我不熟悉可行的实现方式。我想象一个在 x 轴和 y 轴上带有 i
和 j
的二维图形,以及一些显示每个坐标的 score(i, j)
值的热图。该算法将在此图中搜索局部最大值(类似于机器学习搜索局部最小损失值)。如果能深入了解这会是什么样子,或者要搜索什么,我们将不胜感激。
您要查找的可能是黑盒优化 或Derivative-free optimization。问题的表述是优化一些你不知道分析形式的函数(一个黑盒子,你只能评估函数的输入)并且你没有(直接)访问导数。请注意,这些方法不保证找到全局最优值。
有多种方法可以做到这一点,最简单的方法对浮点数的作用与对整数示例的作用相似。您定义一个等 spaced 的网格,计算每个网格点的函数并跟踪最大值。但是,如果您不知道函数边界或您的函数是高维的,则此方法的扩展性很差,并且可能无法找到任何“好的”最优值。稍微好一点的方法是定义一个非均匀或随机的点网格,然后将其称为 Monte Carlo method and it scales better in high-dimensions. A more sophisticated version of this inspired by physics is Simulated Annealing。但是不知道边界的问题仍然存在。
更复杂的方法是 Evolution Strategy algorithms like CMA-ES。简而言之,这些 class 算法在每个迭代步骤中提出生成点,select 这些点中最好的点,并根据 selected 点提出下一代点.通常这是通过提出概率函数(例如正态)并使用最大似然法和 selected 点来优化这些函数的参数来完成的。这里的优点是您不必先验地定义或知道函数的边界。
优化此类黑盒函数的第三种方法是 Bayesian optimization,如果评估黑盒函数成本高昂或涉及噪声时,这种方法特别有用。这个想法是为函数提出一个先验函数来优化,在某些点进行测量(这是关键部分)并更新我们对真实函数外观的看法。这是通过使用高斯过程作为 class 函数以迭代方式完成的。老实说,对于您的简单示例,此方法有点矫枉过正。
关于神经网络的最后一点:神经网络是函数逼近器,也就是说它们可以表示任何函数,从一些输入 space 映射到一些输出 space,输入和输出已经给出(数据和标签)。 NN 是参数化的,并且具有已知分析形式的损失函数(例如,均方误差、交叉熵等)。因此,可以使用访问 Stochastic Gradient Descent 等导数的方法来找到最佳参数。在你的情况下,函数已经给出(虽然没有它的分析形式)并且你想找到最大化它的输入。